Compare commits

...

58 Commits
0.6.2 ... 0.7.1

Author SHA1 Message Date
Stefan Zermatten
425c42d049 Bumped version 2015-09-25 12:52:28 +02:00
Stefan Zermatten
ab6f0c4f5b Merge branch 'fix-columns' 2015-09-25 12:51:04 +02:00
Stefan Zermatten
5d6e57b896 Wrap cards in padded divs to make columns behave 2015-09-25 12:49:48 +02:00
Stefan Zermatten
7c0a8125f2 Merge branch 'fix-carry-capacity-effectView' 2015-09-04 13:56:06 +02:00
Stefan Zermatten
7481ef08a8 Carry capacity effects no longer show up as "no stat" when viewed 2015-09-04 13:55:42 +02:00
Stefan Zermatten
b578dd5fb0 Merge branch 'feature-carry-capacity-modifier' 2015-09-03 14:09:51 +02:00
Stefan Zermatten
5d6f934d88 Bumped version 2015-09-03 14:09:23 +02:00
Stefan Zermatten
337f0bfa8a Made sure migration touches every character 2015-09-03 14:09:17 +02:00
Stefan Zermatten
c62784894b Made sure encumbered conditions respect carry capacity 2015-09-03 13:53:00 +02:00
Stefan Zermatten
75fff43d7d Gave an effect menu option for carry capacity 2015-09-03 13:52:40 +02:00
Stefan Zermatten
a9eeeac0df Fixed carry capacity bar 2015-09-03 13:52:22 +02:00
Stefan Zermatten
c8af0ff0a9 Fixed carry capacity table 2015-09-03 13:52:06 +02:00
Stefan Zermatten
9e200db7b9 Made carry capacity an attribute, migrations need testing 2015-08-31 15:51:52 +02:00
Stefan Zermatten
c08cf83096 Bumped version 2015-08-27 12:21:23 +02:00
Stefan Zermatten
d9368b06d0 Merge branch 'bugfix-0.6.8' 2015-08-27 12:07:42 +02:00
Stefan Zermatten
2703367681 Proficiencies now get disabled when their features are disabled 2015-08-27 12:05:56 +02:00
Stefan Zermatten
d419442549 Fixed share dialog not finding usernames or email addresses 2015-08-27 11:59:38 +02:00
Stefan Zermatten
99df01c950 Prevented negative temporary hitpoints being added 2015-08-27 11:43:34 +02:00
Stefan Zermatten
d76349b3bb Merge branch 'release-0.6.7a' 2015-07-29 09:57:06 +02:00
Stefan Zermatten
39c061f4e8 Fixed formatting of not found page, now has a toolbar and centered text 2015-07-29 09:55:22 +02:00
Stefan Zermatten
6d167ddb22 Fixed formatting of loading page, more padding 2015-07-29 09:55:01 +02:00
Stefan Zermatten
037acbd459 Added Starter Set Wizard to the front page 2015-07-29 09:54:43 +02:00
Stefan Zermatten
4d3fc3bb09 Fixed accidental back() requests when closing detail dialogs 2015-07-29 09:54:18 +02:00
Stefan Zermatten
4b984d4fac Made analytics show all characters as the same page 2015-07-29 09:53:46 +02:00
Stefan Zermatten
58843613ba Merge branch 'release-0.6.7' 2015-07-27 13:12:42 +02:00
Stefan Zermatten
39b549b24b Bumped version 2015-07-27 13:12:28 +02:00
Stefan Zermatten
c79177de72 Added Google Analytics 2015-07-27 13:10:33 +02:00
Stefan Zermatten
11d09b1487 Fixed effect values not being visible on mobile 2015-07-27 12:16:02 +02:00
Stefan Zermatten
0e4918d57d Merge branch 'hotfix-style' 2015-07-27 12:08:22 +02:00
Stefan Zermatten
949f313af2 removed 1st column of all tables being 100px 2015-07-27 12:08:15 +02:00
Stefan Zermatten
85b63f152f Merge branch 'release-0.6.6' into develop 2015-07-27 11:23:12 +02:00
Stefan Zermatten
2141d52a7a Merge branch 'release-0.6.6' 2015-07-27 11:22:41 +02:00
Stefan Zermatten
4c84235064 Bumped version 2015-07-27 11:22:26 +02:00
Stefan Zermatten
0e194a5408 Added markdown to text areas 2015-07-27 10:21:26 +02:00
Stefan Zermatten
4b60eac330 Fixed typo on change log 2015-07-24 11:52:46 +02:00
Stefan Zermatten
cb017c359d Merge branch 'release-0.6.5' into develop 2015-07-24 11:31:05 +02:00
Stefan Zermatten
15aaaa5c14 Merge branch 'release-0.6.5' 2015-07-24 11:29:50 +02:00
Stefan Zermatten
290bee83b4 Bumped version 2015-07-24 11:29:03 +02:00
Stefan Zermatten
fcd2461205 Merge branch 'master' into release-0.6.5 2015-07-24 11:26:46 +02:00
Stefan Zermatten
52198d0249 Disabled edit buttons for read-only viewers 2015-07-23 15:07:39 +02:00
Stefan Zermatten
ba7ccfdfa0 Added support for character profile pictures 2015-07-23 15:04:43 +02:00
Stefan Zermatten
92d3b086fa net worth calculations now take into account your containers' values 2015-07-23 09:14:55 +02:00
Stefan Zermatten
e180595dcd Merge branch 'release-0.6.4' 2015-07-06 13:37:02 +02:00
Stefan Zermatten
ed708bdde0 bumped version 2015-07-06 13:36:50 +02:00
Stefan Zermatten
d7852d640f Fixed Math using min and max incorrectly in skills 2015-07-03 13:21:26 +02:00
Stefan Zermatten
a2fdee88b6 Ordered Character lists 2015-06-29 14:00:55 +02:00
Stefan Zermatten
af070b1578 Attacks inherit spell names correctly 2015-06-29 13:55:27 +02:00
Stefan Zermatten
83a8eeef0f Fixed editing of multiple attacks 2015-06-29 13:55:15 +02:00
Stefan Zermatten
34f8e7402b Hit dice constitution now has a + sign when positive 2015-06-29 10:21:49 +02:00
Stefan Zermatten
1b7e2cd850 Merge branch 'hotfix-rounding' into develop 2015-06-29 10:04:45 +02:00
Stefan Zermatten
463b7f0fc9 Merge branch 'hotfix-rounding' 2015-06-29 09:45:38 +02:00
Stefan Zermatten
266495abc8 Bumped version 2015-06-29 09:44:57 +02:00
Stefan Zermatten
453d4365d3 Prevent memoized values being used in dependency loops 2015-06-29 09:41:01 +02:00
Stefan Zermatten
e0ce6275bf Floor character attribute values 2015-06-29 09:40:37 +02:00
Stefan Zermatten
16b16ce6c6 Merge branch 'hotfix-minmax' into develop 2015-06-26 10:49:10 +02:00
Stefan Zermatten
da8b91594e Removed reference to character helper 2015-06-25 14:22:07 +02:00
Stefan Zermatten
fc26f5a73e Merge branch 'hotfix-experience-inputs' into develop 2015-06-25 14:20:54 +02:00
Stefan Zermatten
d2cc2833a9 Merge branch 'release-0.6.0' into develop 2015-06-25 13:48:32 +02:00
58 changed files with 484 additions and 182 deletions

1
rpg-docs/.gitignore vendored
View File

@@ -1,5 +1,6 @@
.meteor/local .meteor/local
.meteor/meteorite .meteor/meteorite
settings.json
public/components public/components
nohup.out nohup.out
dump dump

View File

@@ -27,3 +27,5 @@ fourseven:scss@2.1.1
wolves:bourbon wolves:bourbon
meteorhacks:subs-manager meteorhacks:subs-manager
meteorhacks:kadira meteorhacks:kadira
chuangbo:marked
reywood:iron-router-ga

View File

@@ -14,6 +14,7 @@ blaze-tools@1.0.3
boilerplate-generator@1.0.3 boilerplate-generator@1.0.3
callback-hook@1.0.3 callback-hook@1.0.3
check@1.0.5 check@1.0.5
chuangbo:marked@0.3.5
coffeescript@1.0.6 coffeescript@1.0.6
dburles:collection-helpers@1.0.3 dburles:collection-helpers@1.0.3
dburles:mongo-collection-instances@0.3.3 dburles:mongo-collection-instances@0.3.3
@@ -70,6 +71,7 @@ reactive-dict@1.1.0
reactive-var@1.0.5 reactive-var@1.0.5
reload@1.1.3 reload@1.1.3
retry@1.0.3 retry@1.0.3
reywood:iron-router-ga@0.6.0
routepolicy@1.0.5 routepolicy@1.0.5
service-configuration@1.0.4 service-configuration@1.0.4
session@1.1.0 session@1.1.0

View File

@@ -7,6 +7,7 @@ Schemas.Character = new SimpleSchema({
alignment: {type: String, defaultValue: "", trim: false, optional: true}, alignment: {type: String, defaultValue: "", trim: false, optional: true},
gender: {type: String, defaultValue: "", trim: false, optional: true}, gender: {type: String, defaultValue: "", trim: false, optional: true},
race: {type: String, defaultValue: "", trim: false, optional: true}, race: {type: String, defaultValue: "", trim: false, optional: true},
picture: {type: String, defaultValue: "", trim: true, optional: true},
description: {type: String, defaultValue: "", trim: false, optional: true}, description: {type: String, defaultValue: "", trim: false, optional: true},
personality: {type: String, defaultValue: "", trim: false, optional: true}, personality: {type: String, defaultValue: "", trim: false, optional: true},
ideals: {type: String, defaultValue: "", trim: false, optional: true}, ideals: {type: String, defaultValue: "", trim: false, optional: true},
@@ -32,6 +33,7 @@ Schemas.Character = new SimpleSchema({
age: {type: Schemas.Attribute}, age: {type: Schemas.Attribute},
ageRate: {type: Schemas.Attribute}, ageRate: {type: Schemas.Attribute},
armor: {type: Schemas.Attribute}, armor: {type: Schemas.Attribute},
carryMultiplier: {type: Schemas.Attribute},
//resources //resources
level1SpellSlots: {type: Schemas.Attribute}, level1SpellSlots: {type: Schemas.Attribute},
@@ -186,7 +188,7 @@ Schemas.Character = new SimpleSchema({
Characters.attachSchema(Schemas.Character); Characters.attachSchema(Schemas.Character);
var attributeBase = function(charId, statName){ var attributeBase = preventLoop(function(charId, statName){
check(statName, String); check(statName, String);
//if it's a damage multiplier, we treat it specially //if it's a damage multiplier, we treat it specially
if (_.contains(DAMAGE_MULTIPLIERS, statName)){ if (_.contains(DAMAGE_MULTIPLIERS, statName)){
@@ -253,8 +255,8 @@ var attributeBase = function(charId, statName){
if (result < min) result = min; if (result < min) result = min;
if (result > max) result = max; if (result > max) result = max;
return result; return Math.floor(result);
}; });
if (Meteor.isClient) { if (Meteor.isClient) {
Template.registerHelper("characterCalculate", function(func, charId, input) { Template.registerHelper("characterCalculate", function(func, charId, input) {
@@ -324,9 +326,9 @@ Characters.calculate = {
value += attribute.adjustment; value += attribute.adjustment;
return value; return value;
}), }),
attributeBase: memoize(preventLoop(function(charId, attributeName){ attributeBase: memoize(function(charId, attributeName){
return attributeBase(charId, attributeName); return attributeBase(charId, attributeName);
})), }),
skillMod: memoize(preventLoop(function(charId, skillName){ skillMod: memoize(preventLoop(function(charId, skillName){
var skill = Characters.calculate.getField(charId, skillName); var skill = Characters.calculate.getField(charId, skillName);
//get the final value of the ability score //get the final value of the ability score
@@ -345,8 +347,8 @@ Characters.calculate = {
var value; var value;
var add = 0; var add = 0;
var mul = 1; var mul = 1;
var min = Math.NEGATIVE_INFINITY; var min = Number.NEGATIVE_INFINITY;
var max = Math.POSITIVE_INFINITY; var max = Number.POSITIVE_INFINITY;
Effects.find({ Effects.find({
charId: charId, charId: charId,
@@ -369,7 +371,7 @@ Characters.calculate = {
if (result < min) result = min; if (result < min) result = min;
if (result > max) result = max; if (result > max) result = max;
return result; return Math.floor(result);
})), })),
proficiency: memoize(function(charId, skillName){ proficiency: memoize(function(charId, skillName){
//return largest value in proficiency array //return largest value in proficiency array
@@ -390,7 +392,7 @@ Characters.calculate = {
}); });
var advantage = Characters.calculate.advantage(charId, skillName); var advantage = Characters.calculate.advantage(charId, skillName);
value += 5 * advantage; value += 5 * advantage;
return value; return Math.floor(value);
}), }),
advantage: memoize(function(charId, skillName){ advantage: memoize(function(charId, skillName){
var advantage = Effects.find( var advantage = Effects.find(

View File

@@ -107,6 +107,18 @@ if (Meteor.isServer) Characters.after.insert(function(userId, char) {
group: "Inate", group: "Inate",
}, },
}); });
Effects.insert({
charId: char._id,
name: "Natural Carrying Capacity",
stat: "carryMultiplier",
operation: "base",
value: "1",
parent: {
id: char._id,
collection: "Characters",
group: "Inate",
},
});
}); });
Effects.attachBehaviour("softRemovable"); Effects.attachBehaviour("softRemovable");

View File

@@ -30,7 +30,7 @@ Schemas.Proficiency = new SimpleSchema({
Proficiencies.attachSchema(Schemas.Proficiency); Proficiencies.attachSchema(Schemas.Proficiency);
Proficiencies.attachBehaviour("softRemovable"); Proficiencies.attachBehaviour("softRemovable");
makeChild(Proficiencies); makeChild(Proficiencies, ["enabled"]);
Proficiencies.allow(CHARACTER_SUBSCHEMA_ALLOW); Proficiencies.allow(CHARACTER_SUBSCHEMA_ALLOW);
Proficiencies.deny(CHARACTER_SUBSCHEMA_DENY); Proficiencies.deny(CHARACTER_SUBSCHEMA_DENY);

View File

@@ -62,6 +62,7 @@ Spells.attachSchema(Schemas.Spell);
Spells.attachBehaviour("softRemovable"); Spells.attachBehaviour("softRemovable");
makeChild(Spells); //children of spell lists makeChild(Spells); //children of spell lists
makeParent(Spells, ["name", "enabled"]); //parents of attacks
Spells.allow(CHARACTER_SUBSCHEMA_ALLOW); Spells.allow(CHARACTER_SUBSCHEMA_ALLOW);
Spells.deny(CHARACTER_SUBSCHEMA_DENY); Spells.deny(CHARACTER_SUBSCHEMA_DENY);

View File

@@ -3,9 +3,9 @@ TemporaryHitPoints = new Mongo.Collection("temporaryHitPoints");
Schemas.TemporaryHitPoints = new SimpleSchema({ Schemas.TemporaryHitPoints = new SimpleSchema({
charId: {type: String, regEx: SimpleSchema.RegEx.Id}, charId: {type: String, regEx: SimpleSchema.RegEx.Id},
name: {type: String, optional: true}, name: {type: String, optional: true},
maximum: {type: Number, defaultValue: 0}, maximum: {type: Number, defaultValue: 0, min: 0, max: 500},
used: {type: Number, defaultValue: 0}, used: {type: Number, defaultValue: 0, min: 0, max: 500},
deleteOnZero:{type: Boolean, defaultValue: true}, deleteOnZero:{type: Boolean, defaultValue: false},
dateAdded: { dateAdded: {
type: Date, type: Date,
autoValue: function() { autoValue: function() {

View File

@@ -1,6 +1,7 @@
Router.configure({ Router.configure({
loadingTemplate: "loading", loadingTemplate: "loading",
layoutTemplate: "layout", layoutTemplate: "layout",
trackPageView: true,
}); });
Router.plugin("ensureSignedIn", { Router.plugin("ensureSignedIn", {
@@ -27,7 +28,7 @@ Router.map(function() {
}, },
data: { data: {
characters: function(){ characters: function(){
return Characters.find({}, {fields: {_id: 1}}); return Characters.find({}, {fields: {_id: 1}, sort: {name: 1}});
} }
}, },
onAfterAction: function() { onAfterAction: function() {
@@ -56,6 +57,12 @@ Router.map(function() {
document.title = name; document.title = name;
} }
}, },
//analytics
trackPageView: false,
onRun: function() {
window.ga && window.ga("send", "pageview", "/character");
this.next();
},
}); });
this.route("loading", { this.route("loading", {

View File

@@ -77,10 +77,10 @@ this.GlobalUI = (function() {
var throttleBack = _.throttle(function() { var throttleBack = _.throttle(function() {
history.back(); history.back();
}, 800, {trailing: false}); }, 100, {trailing: false});
GlobalUI.closeDetail = function() { GlobalUI.closeDetail = function() {
if (!!(window.history && window.history.pushState)) { if (window.history && history.pushState && history.state.detail === "opened") {
throttleBack(); throttleBack();
} else { } else {
Session.set("global.ui.detailShow", false); Session.set("global.ui.detailShow", false);

View File

@@ -1,6 +1,10 @@
Template.registerHelper("canEditCharacter", function(charId) { Template.registerHelper("canEditCharacter", function(charId) {
return canEditCharacter(charId);
});
canEditCharacter = function(charId) {
var char = Characters.findOne(charId) var char = Characters.findOne(charId)
var userId = Meteor.userId(); var userId = Meteor.userId();
return char.owner === userId || return char.owner === userId ||
_.contains(char.writers, userId); _.contains(char.writers, userId);
}); };

View File

@@ -3,17 +3,24 @@
$thickColumnWidth: 304px; $thickColumnWidth: 304px;
$thinColumnWidth: 240px; $thinColumnWidth: 240px;
//Column layouts of cards //Column layout
.column-container { .column-container {
@include column-fill(balance); @include column-fill(balance);
@include column-gap(8px); @include column-gap(0px);
@include column-width($thickColumnWidth); @include column-width($thickColumnWidth);
padding: 8px; padding: 4px;
&.thin-columns { &.thin-columns {
@include column-count(4); @include column-count(4);
@include column-width($thinColumnWidth); @include column-width($thinColumnWidth);
} }
& > div {
padding: 4px;
//stop divs breaking over multiple columns
-webkit-column-break-inside: avoid;
page-break-inside: avoid;
break-inside: avoid;
}
} }
//Cards //Cards
@@ -21,20 +28,6 @@ $thinColumnWidth: 240px;
background: white; background: white;
border-radius: 2px; border-radius: 2px;
.column-container & {
margin-bottom: 8px;
width: 100%;
//hack to stop flickering
-webkit-backface-visibility: hidden;
-webkit-transform: translateX(0);
//stop breaking over column divide
-webkit-column-break-inside: avoid;
page-break-inside: avoid;
break-inside: avoid;
//Fixes extra margin at top of columns
display: inline-block;
}
.top { .top {
cursor: pointer; cursor: pointer;
padding: 16px; padding: 16px;

View File

@@ -29,6 +29,11 @@ core-header-panel[drawer] {
box-shadow: 2px 0px 5px 0px rgba(0,0,0,0.2); box-shadow: 2px 0px 5px 0px rgba(0,0,0,0.2);
} }
//Paragraphs
p {
margin-bottom: 8px;
}
//Horizontal rule //Horizontal rule
hr { hr {
background-color: #444; background-color: #444;
@@ -37,7 +42,7 @@ hr {
color: #444; color: #444;
height: 1px; height: 1px;
line-height: 0; line-height: 0;
margin: 16px -16px; margin: 16px 0;
text-align: center; text-align: center;
} }

View File

@@ -1,8 +1,5 @@
td { td {
padding: 8px; padding: 8px;
&:nth-child(1) {
min-width: 100px;
}
} }
.strengthTable{ .strengthTable{

View File

@@ -3,26 +3,26 @@
<div layout vertical flex> <div layout vertical flex>
<div layout horizontal> <div layout horizontal>
<!--attackBonus--> <!--attackBonus-->
<paper-input id="attackBonusInput" <paper-input class="attackBonusInput"
label="Attack Bonus" label="Attack Bonus"
floatinglabel floatinglabel
value={{attackBonus}} value={{attackBonus}}
flex></paper-input> flex></paper-input>
<!--details--> <!--details-->
<paper-input id="detailInput" <paper-input class="detailInput"
label="Details" label="Details"
floatinglabel floatinglabel
value={{details}}></paper-input> value={{details}}></paper-input>
</div> </div>
<div layout horizontal> <div layout horizontal>
<!--damageBonus--> <!--damageBonus-->
<paper-input id="damageInput" <paper-input class="damageInput"
label="Damage" label="Damage"
floatinglabel floatinglabel
value={{damage}} value={{damage}}
flex></paper-input> flex></paper-input>
<!--DamageType--> <!--DamageType-->
<paper-dropdown-menu id="damageTypeDropdown" label="Damage Type"> <paper-dropdown-menu class="damageTypeDropdown" label="Damage Type">
<paper-dropdown layered class="dropdown"> <paper-dropdown layered class="dropdown">
<core-menu class="menu" selected={{damageType}}> <core-menu class="menu" selected={{damageType}}>
{{#each damageTypes}} {{#each damageTypes}}
@@ -34,6 +34,6 @@
</div> </div>
</div> </div>
<!--Delete Button--> <!--Delete Button-->
<paper-icon-button id="deleteAttack" role="button" tabindex="0" icon="delete" aria-label="Delete"></paper-icon-button> <paper-icon-button class="deleteAttack" role="button" tabindex="0" icon="delete" aria-label="Delete"></paper-icon-button>
</div> </div>
</template> </template>

View File

@@ -15,23 +15,23 @@ var damageTypes = [
]; ];
Template.attackEdit.events({ Template.attackEdit.events({
"tap #deleteAttack": function(event, instance) { "tap .deleteAttack": function(event, instance) {
Attacks.softRemoveNode(this._id); Attacks.softRemoveNode(this._id);
GlobalUI.deletedToast(this._id, "Attacks", "Attack"); GlobalUI.deletedToast(this._id, "Attacks", "Attack");
}, },
"change #attackBonusInput": function(event) { "change .attackBonusInput": function(event) {
var value = event.currentTarget.value; var value = event.currentTarget.value;
Attacks.update(this._id, {$set: {attackBonus: value}}); Attacks.update(this._id, {$set: {attackBonus: value}});
}, },
"change #damageInput": function(event) { "change .damageInput": function(event) {
var value = event.currentTarget.value; var value = event.currentTarget.value;
Attacks.update(this._id, {$set: {damage: value}}); Attacks.update(this._id, {$set: {damage: value}});
}, },
"change #detailInput": function(event) { "change .detailInput": function(event) {
var value = event.currentTarget.value; var value = event.currentTarget.value;
Attacks.update(this._id, {$set: {details: value}}); Attacks.update(this._id, {$set: {details: value}});
}, },
"core-select #damageTypeDropdown": function(event) { "core-select .damageTypeDropdown": function(event) {
var detail = event.originalEvent.detail; var detail = event.originalEvent.detail;
if (!detail.isSelected) return; if (!detail.isSelected) return;
var value = detail.item.getAttribute("name"); var value = detail.item.getAttribute("name");

View File

@@ -44,7 +44,8 @@
label="Value" label="Value"
floatinglabel floatinglabel
value={{effectValue}} value={{effectValue}}
flex> flex
style="flex-basis: 100px;">
</paper-input> </paper-input>
</template> </template>

View File

@@ -42,6 +42,7 @@ var stats = [
{stat: "rageDamage", name: "Rage Damage", group: "Stats"}, {stat: "rageDamage", name: "Rage Damage", group: "Stats"},
{stat: "expertiseDice", name: "Expertise Dice", group: "Stats"}, {stat: "expertiseDice", name: "Expertise Dice", group: "Stats"},
{stat: "superiorityDice", name: "Superiority Dice", group: "Stats"}, {stat: "superiorityDice", name: "Superiority Dice", group: "Stats"},
{stat: "carryMultiplier", name: "Carry Capacity Multiplier", group: "Stats"},
{stat: "level1SpellSlots", name: "level 1", group: "Spell Slots"}, {stat: "level1SpellSlots", name: "level 1", group: "Spell Slots"},
{stat: "level2SpellSlots", name: "level 2", group: "Spell Slots"}, {stat: "level2SpellSlots", name: "level 2", group: "Spell Slots"},
{stat: "level3SpellSlots", name: "level 3", group: "Spell Slots"}, {stat: "level3SpellSlots", name: "level 3", group: "Spell Slots"},

View File

@@ -42,6 +42,7 @@ var stats = {
"rageDamage":{"name":"Rage Damage"}, "rageDamage":{"name":"Rage Damage"},
"expertiseDice":{"name":"Expertise Dice"}, "expertiseDice":{"name":"Expertise Dice"},
"superiorityDice":{"name":"Superiority Dice"}, "superiorityDice":{"name":"Superiority Dice"},
"carryMultiplier": {"name": "Carry Capacity Multiplier"},
"level1SpellSlots":{"name":"level 1 Spell Slots"}, "level1SpellSlots":{"name":"level 1 Spell Slots"},
"level2SpellSlots":{"name":"level 2 Spell Slots"}, "level2SpellSlots":{"name":"level 2 Spell Slots"},
"level3SpellSlots":{"name":"level 3 Spell Slots"}, "level3SpellSlots":{"name":"level 3 Spell Slots"},

View File

@@ -32,7 +32,7 @@
{{/if}} {{/if}}
{{#if description}} {{#if description}}
<div class="pre-wrap">{{evaluateString charId description}}</div> <div>{{#markdown}}{{evaluateString charId description}}{{/markdown}}</div>
{{/if}} {{/if}}
{{> effectsViewList charId=charId parentId=_id}} {{> effectsViewList charId=charId parentId=_id}}

View File

@@ -12,8 +12,9 @@
{{>resource name="sorceryPoints" title="Sorcery Points" color="teal" char=this}} {{>resource name="sorceryPoints" title="Sorcery Points" color="teal" char=this}}
<!--superiorityDice--> <!--superiorityDice-->
{{>resource name="superiorityDice" title="Superiority Dice" color="teal" char=this}} {{>resource name="superiorityDice" title="Superiority Dice" color="teal" char=this}}
<!--Attacks--> <!--Attacks-->
<div>
<paper-shadow class="card"> <paper-shadow class="card">
<div class="top white"> <div class="top white">
Attacks Attacks
@@ -48,8 +49,10 @@
{{/each}} {{/each}}
</div> </div>
</paper-shadow> </paper-shadow>
</div>
<!--Proficiencies--> <!--Proficiencies-->
<div>
<paper-shadow class="card"> <paper-shadow class="card">
<div class="white top"> <div class="white top">
Proficiencies Proficiencies
@@ -75,13 +78,15 @@
{{/each}} {{/each}}
</div> </div>
</paper-shadow> </paper-shadow>
</div>
<!--features--> <!--features-->
{{#each features}} {{#each features}}
<div>
<paper-shadow class="card featureCard" <paper-shadow class="card featureCard"
hero-id="main" {{detailHero}}> hero-id="main" {{detailHero}}>
<div class="top {{colorClass}} subhead" <div class="top {{colorClass}} subhead"
layout horizontal layout horizontal
hero-id="toolbar" {{detailHero}}> hero-id="toolbar" {{detailHero}}>
<div flex hero-id="title" {{detailHero}}> <div flex hero-id="title" {{detailHero}}>
{{name}} {{name}}
@@ -94,41 +99,44 @@
{{#if canEnable}} {{#if canEnable}}
<core-tooltip label="Feature enabled" <core-tooltip label="Feature enabled"
position="left"> position="left">
<paper-checkbox class="enabledCheckbox" <paper-checkbox class="enabledCheckbox"
checked={{enabled}}> checked={{enabled}}
disabled={{#unless canEditCharacter charId}}true{{/unless}}>
</paper-checkbox> </paper-checkbox>
</core-tooltip> </core-tooltip>
{{/if}} {{/if}}
</div> </div>
{{#if description}} {{#if description}}
<div flex class="bottom text" <div flex class="bottom">
>{{evaluateString charId description}}</div> {{#markdown}}{{evaluateString charId shortDescription}}{{/markdown}}
</div>
{{/if}} {{/if}}
{{#if hasUses}} {{#if hasUses}}
<div layout horizontal center end-justified> <div layout horizontal center end-justified>
<paper-button class="useFeature" <paper-button class="useFeature"
disabled={{noUsesLeft}}> disabled={{noUsesLeft}}>
Use Use
</paper-button> </paper-button>
<paper-button class="resetFeature" <paper-button class="resetFeature"
disabled={{usesFull}}> disabled={{usesFull}}>
Reset Reset
</paper-button> </paper-button>
</div> </div>
{{/if}} {{/if}}
</paper-shadow> </paper-shadow>
</div>
{{/each}} {{/each}}
</div> </div>
<div class="fab-buffer"></div> <div class="fab-buffer"></div>
</div> </div>
{{#if canEditCharacter _id}} {{#if canEditCharacter _id}}
<paper-fab id="addFeature" <paper-fab id="addFeature"
class="floatyButton" class="floatyButton"
icon="add" icon="add"
title="Add" title="Add"
role="button" role="button"
tabindex="0" tabindex="0"
aria-label="Add" aria-label="Add"
hero-id="main"></paper-fab> hero-id="main"></paper-fab>
{{/if}} {{/if}}
</div> </div>
@@ -136,15 +144,16 @@
<template name="resource"> <template name="resource">
{{#if characterCalculate "attributeBase" char._id name}} {{#if characterCalculate "attributeBase" char._id name}}
<paper-shadow class="card" <div>
<paper-shadow class="card"
hero-id="main" {{detailHero name char._id}} hero-id="main" {{detailHero name char._id}}
layout horizontal> layout horizontal>
<div class="left {{getColor}} display1 white-text" <div class="left {{getColor}} display1 white-text"
hero-id="toolbar" {{detailHero name char._id}} hero-id="toolbar" {{detailHero name char._id}}
layout horizontal center> layout horizontal center>
<div style="margin-right: 8px;"> <div style="margin-right: 8px;">
<paper-icon-button class="resourceUp" <paper-icon-button class="resourceUp"
icon="arrow-drop-up" icon="arrow-drop-up"
disabled={{cantIncrement}}> disabled={{cantIncrement}}>
</paper-icon-button> </paper-icon-button>
<paper-icon-button class="resourceDown" <paper-icon-button class="resourceDown"
@@ -155,10 +164,11 @@
<div>{{characterCalculate "attributeValue" char._id name}}</div> <div>{{characterCalculate "attributeValue" char._id name}}</div>
<!--<div>/{{char.attributeBase name}}</div>--> <!--<div>/{{char.attributeBase name}}</div>-->
</div> </div>
<div class="right clickable" <div class="right clickable"
flex layout horizontal center> flex layout horizontal center>
{{title}} {{title}}
</div> </div>
</paper-shadow> </paper-shadow>
</div>
{{/if}} {{/if}}
</template> </template>

View File

@@ -3,14 +3,19 @@ Template.features.helpers({
var features = Features.find({charId: this._id}, {sort: {color: 1, name: 1}}); var features = Features.find({charId: this._id}, {sort: {color: 1, name: 1}});
return features; return features;
}, },
shortDescription: function() {
if (_.isString(this.description)){
return this.description.split(/^( *[-*_]){3,} *(?:\n+|$)/m)[0];
}
},
hasUses: function(){ hasUses: function(){
return this.usesValue() > 0; return this.usesValue() > 0;
}, },
noUsesLeft: function(){ noUsesLeft: function(){
return this.usesLeft() <= 0; return this.usesLeft() <= 0 || !canEditCharacter(this.charId);
}, },
usesFull: function(){ usesFull: function(){
return this.usesLeft() >= this.usesValue(); return this.usesLeft() >= this.usesValue() || !canEditCharacter(this.charId);
}, },
colorClass: function(){ colorClass: function(){
return getColorClass(this.color); return getColorClass(this.color);
@@ -99,15 +104,16 @@ Template.resource.helpers({
var value = Characters.calculate.attributeValue(this.char._id, this.name); var value = Characters.calculate.attributeValue(this.char._id, this.name);
var base = Characters.calculate.attributeBase(this.char._id, this.name); var base = Characters.calculate.attributeBase(this.char._id, this.name);
var baseBigger = value < base; var baseBigger = value < base;
return !baseBigger; return !baseBigger || !canEditCharacter(this.char._id);
}, },
cantDecrement: function(){ cantDecrement: function(){
var value = Characters.calculate.attributeValue(this.char._id, this.name); var value = Characters.calculate.attributeValue(this.char._id, this.name);
var valuePositive = value > 0; var valuePositive = value > 0;
return !valuePositive; return !valuePositive || !canEditCharacter(this.char._id);
}, },
getColor: function(){ getColor: function(){
if (this.char.attributeValue(this.name) > 0){ var value = Characters.calculate.attributeValue(this.char._id, this.name);
if (value > 0){
return this.color; return this.color;
} else { } else {
return "grey"; return "grey";

View File

@@ -14,7 +14,9 @@ var getFractionCarried = function(char) {
}); });
//get strength //get strength
var strength = Characters.calculate.attributeValue(char._id, "strength"); var strength = Characters.calculate.attributeValue(char._id, "strength");
var capacity = strength * 15; var carryMultiplier = Characters.calculate
.attributeValue(char._id, "carryMultiplier");
var capacity = strength * 15 * carryMultiplier;
return weight / capacity; return weight / capacity;
}; };

View File

@@ -41,6 +41,6 @@
</div> </div>
{{#if description}} {{#if description}}
<hr class="vertMargin"> <hr class="vertMargin">
<div class="pre-wrap">{{evaluateString charId description}}</div> <div>{{#markdown}}{{evaluateString charId description}}{{/markdown}}</div>
{{/if}} {{/if}}
</template> </template>

View File

@@ -3,6 +3,7 @@
<div id="inventory" class="scroll-y" fit> <div id="inventory" class="scroll-y" fit>
<div class="column-container"> <div class="column-container">
<!--Net Worth--> <!--Net Worth-->
<div>
<paper-shadow class="card"> <paper-shadow class="card">
<div class="white top" layout horizontal center> <div class="white top" layout horizontal center>
<div class="subhead" flex> <div class="subhead" flex>
@@ -13,7 +14,9 @@
</div> </div>
</div> </div>
</paper-shadow> </paper-shadow>
</div>
<!--Weight Carried--> <!--Weight Carried-->
<div>
<paper-shadow class="card" <paper-shadow class="card"
hero-id="main" {{detailHero "weightCarried" _id}}> hero-id="main" {{detailHero "weightCarried" _id}}>
<div class="top green white-text weightCarried" <div class="top green white-text weightCarried"
@@ -35,8 +38,7 @@
<div class="item-slot"> <div class="item-slot">
<div class="item buff" <div class="item buff"
hero-id="main" {{detailHero}} hero-id="main" {{detailHero}}
layout horizontal center layout horizontal center>
draggable="true">
<div flex> <div flex>
<core-icon icon="work" <core-icon icon="work"
style="margin-right: 16px"> style="margin-right: 16px">
@@ -49,7 +51,9 @@
</div> </div>
{{/if}} {{/if}}
</paper-shadow> </paper-shadow>
</div>
<!--Equipment--> <!--Equipment-->
<div>
<paper-shadow class="card equipmentContainer"> <paper-shadow class="card equipmentContainer">
<div class="white top" layout horizontal center> <div class="white top" layout horizontal center>
<div class="subhead" flex> <div class="subhead" flex>
@@ -77,7 +81,9 @@
{{/each}} {{/each}}
</div> </div>
</paper-shadow> </paper-shadow>
</div>
<!--Carried Items--> <!--Carried Items-->
<div>
<paper-shadow class="card carriedContainer"> <paper-shadow class="card carriedContainer">
<div class="white top" layout horizontal center> <div class="white top" layout horizontal center>
<div class="subhead" flex> <div class="subhead" flex>
@@ -96,8 +102,10 @@
{{/each}} {{/each}}
</div> </div>
</paper-shadow> </paper-shadow>
</div>
{{#each containers}} {{#each containers}}
<paper-shadow class="card itemContainer" <div>
<paper-shadow class="card itemContainer"
hero-id="main" {{detailHero}}> hero-id="main" {{detailHero}}>
<div class="top {{colorClass}}" <div class="top {{colorClass}}"
hero-id="toolbar" {{detailHero}} hero-id="toolbar" {{detailHero}}
@@ -114,6 +122,7 @@
</div> </div>
<core-tooltip label="Container carried" position="left"> <core-tooltip label="Container carried" position="left">
<paper-checkbox class="carriedCheckbox" <paper-checkbox class="carriedCheckbox"
disabled={{#unless canEditCharacter charId}}true{{/unless}}
checked={{isCarried}}> checked={{isCarried}}>
</paper-checkbox> </paper-checkbox>
</core-tooltip> </core-tooltip>
@@ -124,6 +133,7 @@
{{/each}} {{/each}}
</div> </div>
</paper-shadow> </paper-shadow>
</div>
{{/each}} {{/each}}
</div> </div>
<div class="fab-buffer"></div> <div class="fab-buffer"></div>
@@ -152,11 +162,11 @@
<div class="item {{hidden}} inventoryItem" <div class="item {{hidden}} inventoryItem"
hero-id="main" {{detailHero}} hero-id="main" {{detailHero}}
layout horizontal center layout horizontal center
draggable="true"> draggable={{canEditCharacter charId}}>
<div flex class="itemName"> <div flex class="itemName">
{{#if ne1 quantity}}{{quantity}}&nbsp;{{/if}}{{pluralName}} {{#if ne1 quantity}}{{quantity}}&nbsp;{{/if}}{{pluralName}}
</div> </div>
{{#if settings.showIncrement}} {{#if settings.showIncrement}}{{#if canEditCharacter charId}}
<div class="incrementButtons"> <div class="incrementButtons">
<paper-icon-button class="addItemQuantity" <paper-icon-button class="addItemQuantity"
icon="add" icon="add"
@@ -166,7 +176,7 @@
icon="remove" icon="remove"
style="margin-right: -8px"></paper-icon-button> style="margin-right: -8px"></paper-icon-button>
</div> </div>
{{/if}} {{/if}}{{/if}}
</div> </div>
</div> </div>
</template> </template>

View File

@@ -44,6 +44,12 @@ Template.inventory.helpers({
).forEach(function(item){ ).forEach(function(item){
worth += item.totalValue(); worth += item.totalValue();
}); });
Containers.find(
{charId: this._id},
{fields: {value : 1}}
).forEach(function(container) {
if (container.value) worth += container.value;
});
return worth; return worth;
}, },
weightCarried: function(){ weightCarried: function(){

View File

@@ -18,8 +18,8 @@
{{#if requiresAttunement}}<div class="vertMargin">Requires Attunement</div>{{/if}} {{#if requiresAttunement}}<div class="vertMargin">Requires Attunement</div>{{/if}}
</div> </div>
{{#if description}} {{#if description}}
<hr class="vertMargin"> <hr style="margin: 16px 0 16px 0;">
<div class="pre-wrap">{{evaluateString charId description}}</div> <div>{{#markdown}}{{evaluateString charId description}}{{/markdown}}</div>
{{/if}} {{/if}}
{{> effectsViewList charId=charId parentId=_id}} {{> effectsViewList charId=charId parentId=_id}}
{{> attacksViewList charId=charId parentId=_id}} {{> attacksViewList charId=charId parentId=_id}}

View File

@@ -6,7 +6,7 @@
</div> </div>
{{#if description}} {{#if description}}
<hr class="vertMargin"> <hr class="vertMargin">
<div class="pre-wrap">{{description}}</div> <div>{{#markdown}}{{description}}{{/markdown}}</div>
{{/if}} {{/if}}
{{else}} {{else}}
{{> experienceEdit}} {{> experienceEdit}}

View File

@@ -3,14 +3,15 @@
<div id="journal" class="scroll-y" fit> <div id="journal" class="scroll-y" fit>
<div class="column-container"> <div class="column-container">
<!--Experience Table--> <!--Experience Table-->
<paper-shadow class="card experiencesCard" <div><paper-shadow class="card experiencesCard"
hero-id="main" {{detailHero}}> hero-id="main" {{detailHero}}>
<div class="top white subhead" <div class="top white subhead"
hero-id="toolbar" {{detailHero}} hero-id="toolbar" {{detailHero}}
layout horizontal center> layout horizontal center>
<div flex>Experience</div> <div flex>Experience</div>
<div >{{characterCalculate "experience" _id}} XP</div> <div >{{characterCalculate "experience" _id}} XP</div>
<paper-icon-button class="black54" id="addXP" icon="add"></paper-icon-button> <paper-icon-button class="black54" id="addXP" icon="add"
disabled={{#unless canEditCharacter _id}}true{{/unless}}></paper-icon-button>
</div> </div>
<div class="bottom list"> <div class="bottom list">
{{#each experiences}} {{#each experiences}}
@@ -36,9 +37,9 @@
</paper-button> </paper-button>
</div> </div>
{{/if}} {{/if}}
</paper-shadow> </paper-shadow></div>
<!--Class Table--> <!--Class Table-->
<paper-shadow class="card" <div><paper-shadow class="card"
hero-id="main" {{detailHero}}> hero-id="main" {{detailHero}}>
<div class="white top" <div class="white top"
hero-id="toolbar" {{detailHero}} hero-id="toolbar" {{detailHero}}
@@ -55,7 +56,8 @@
</div> </div>
<paper-icon-button class="black54" <paper-icon-button class="black54"
id="addClassButton" id="addClassButton"
icon="add"> icon="add"
disabled={{#unless canEditCharacter _id}}true{{/unless}}>
</paper-icon-button> </paper-icon-button>
</div> </div>
<div class="bottom list"> <div class="bottom list">
@@ -76,29 +78,31 @@
</div> </div>
{{/each}} {{/each}}
</div> </div>
</paper-shadow> </paper-shadow></div>
<!--Notes--> <!--Notes-->
{{#each notes}} {{#each notes}}
<div>
<paper-shadow class="card" hero-id="main" {{detailHero}}> <paper-shadow class="card" hero-id="main" {{detailHero}}>
<div class="top {{colorClass}} noteTop subhead" <div class="top {{colorClass}} noteTop subhead"
hero-id="toolbar" {{detailHero}} hero-id="toolbar" {{detailHero}}
layout horizontal center> layout horizontal center>
{{name}} {{name}}
</div> </div>
<div class="bottom text">{{description}}</div> <div class="bottom">{{#markdown}}{{description}}{{/markdown}}</div>
</paper-shadow> </paper-shadow>
</div>
{{/each}} {{/each}}
</div> </div>
<div class="fab-buffer"></div> <div class="fab-buffer"></div>
</div> </div>
</div> </div>
{{#if canEditCharacter _id}} {{#if canEditCharacter _id}}
<paper-fab id="addNote" <paper-fab id="addNote"
class="floatyButton" class="floatyButton"
icon="add" icon="add"
title="Add" title="Add"
role="button" role="button"
tabindex="0" tabindex="0"
hero-id="main"></paper-fab> hero-id="main"></paper-fab>
{{/if}} {{/if}}
</template> </template>

View File

@@ -1,7 +1,7 @@
<template name="noteDialog"> <template name="noteDialog">
{{#with note}} {{#with note}}
{{#baseDialog title=name class=colorClass startEditing=../startEditing}} {{#baseDialog title=name class=colorClass startEditing=../startEditing}}
<div class="pre-wrap">{{description}}</div> <div>{{#markdown}}{{description}}{{/markdown}}</div>
{{else}} {{else}}
{{> noteDialogEdit}} {{> noteDialogEdit}}
{{/baseDialog}} {{/baseDialog}}

View File

@@ -1,6 +1,6 @@
<template name="backgroundDialog"> <template name="backgroundDialog">
{{#baseDialog title=title class=colorClass hideColor="true" hideDelete="true" startEditing=startEditing}} {{#baseDialog title=title class=colorClass hideColor="true" hideDelete="true"}}
<div class="pre-wrap">{{evaluateString charId value}}</div> <div>{{#markdown}}{{evaluateString charId value}}{{/markdown}}</div>
{{> proficiencyViewList charId=charId parentId=charId parentGroup="background"}} {{> proficiencyViewList charId=charId parentId=charId parentGroup="background"}}
{{else}} {{else}}
{{> textDialogEdit}} {{> textDialogEdit}}

View File

@@ -1,18 +1,36 @@
<template name="personaDetailsDialog"> <template name="personaDetailsDialog">
{{#baseDialog title=name class="deep-purple white-text" hideColor="true" hideDelete="true" startEditing=startEditing}} {{#baseDialog title=name class="deep-purple white-text" hideColor="true" hideDelete="true" startEditing=startEditing}}
{{alignment}} {{gender}} {{race}} {{#with char}}
<div>{{alignment}} {{gender}} {{race}}</div>
<core-image style="width: 350px; height: 350px; margin-top: 8px;"
sizing="cover"
hero-id="image" hero
src={{picture}}></core-image>
{{/with}}
{{else}} {{else}}
{{> personaDetailsEdit}} {{#with char}}
{{> personaDetailsEdit}}
{{/with}}
{{/baseDialog}} {{/baseDialog}}
</template> </template>
<template name="personaDetailsEdit"> <template name="personaDetailsEdit">
<!--Name--> <div layout horizontal center-justified>
<paper-input id="nameInput" label="Name" floatinglabel value={{name}}></paper-input><br> <div flex style="max-width: 350px;" layout vertical>
<!--Alignment--> <!--Name-->
<paper-input id="alignmentInput" label="Alignment" floatinglabel value={{alignment}}></paper-input><br> <paper-input id="nameInput" label="Name" floatinglabel value={{name}}></paper-input>
<!--Gender--> <!--Alignment-->
<paper-input id="genderInput" label="Gender" floatinglabel value={{gender}}></paper-input><br> <paper-input id="alignmentInput" label="Alignment" floatinglabel value={{alignment}}></paper-input>
<!--Race--> <!--Gender-->
<paper-input id="raceInput" label="Race" floatinglabel value={{race}}></paper-input><br> <paper-input id="genderInput" label="Gender" floatinglabel value={{gender}}></paper-input>
<!--Race-->
<paper-input id="raceInput" label="Race" floatinglabel value={{race}}></paper-input>
<!--Picture-->
<paper-input id="pictureInput" label="Picture URL" floatinglabel value={{picture}}></paper-input>
<core-image style="height:350px; width: 100%; margin-top: 8px;"
sizing="cover"
hero-id="image" hero
src={{picture}}></core-image>
</div>
</div>
</template> </template>

View File

@@ -2,21 +2,34 @@ Template.personaDetailsEdit.onRendered(function(){
updatePolymerInputs(this); updatePolymerInputs(this);
}); });
Template.personaDetailsDialog.helpers({
char: function() {
return Characters.findOne(
this._id,
{fields: {name: 1, alignment: 1, gender: 1, race: 1, picture: 1}}
);
}
});
Template.personaDetailsEdit.events({ Template.personaDetailsEdit.events({
"change #nameInput": function(event){ "change #nameInput": function(event){
var input = event.currentTarget.value; var input = event.currentTarget.value;
Characters.update(this.charId, {$set: {name: input}}); Characters.update(this._id, {$set: {name: input}});
}, },
"change #alignmentInput": function(event){ "change #alignmentInput": function(event){
var input = event.currentTarget.value; var input = event.currentTarget.value;
Characters.update(this.charId, {$set: {alignment: input}}); Characters.update(this._id, {$set: {alignment: input}});
}, },
"change #genderInput": function(event){ "change #genderInput": function(event){
var input = event.currentTarget.value; var input = event.currentTarget.value;
Characters.update(this.charId, {$set: {gender: input}}); Characters.update(this._id, {$set: {gender: input}});
}, },
"change #raceInput": function(event){ "change #raceInput": function(event){
var input = event.currentTarget.value; var input = event.currentTarget.value;
Characters.update(this.charId, {$set: {race: input}}); Characters.update(this._id, {$set: {race: input}});
},
"change #pictureInput": function(event){
var input = event.currentTarget.value;
Characters.update(this._id, {$set: {picture: input}});
}, },
}); });

View File

@@ -3,14 +3,45 @@
<div id="persona" class="scroll-y" fit> <div id="persona" class="scroll-y" fit>
<div class="column-container"> <div class="column-container">
{{#with characterDetails}} {{#with characterDetails}}
{{#containerCardHelper this}}{{alignment}} {{gender}} {{race}}{{/containerCardHelper}} <div>
<paper-shadow class="card"
hero-id="main" {{detailHero "details" _id}}>
{{#unless picture}}
<div class="top subhead characterField {{colorClass}}"
hero-id="toolbar" {{detailHero "details" _id}}>
<div class="subhead" flex
hero-id="title" {{detailHero "details" _id}}>
{{name}}
</div>
</div>
{{else}}
<core-image class="characterField clickable"
style="height:350px; width: 100%;
background-color: #e8e8e8;"
sizing="cover"
hero-id="image" {{detailHero "details" _id}}
src={{picture}}></core-image>
{{/unless}}
<div class="bottom">
{{#if picture}}
<div class="title" hero-id="title" {{detailHero "details" _id}}>
{{name}}
</div>
{{/if}}
<div class="subhead">
{{alignment}} {{gender}} {{race}}
</div>
</div>
</paper-shadow>
</div>
{{/with}} {{/with}}
{{> containerCard characterField "description" "Description"}} <div>{{> containerCard characterField "description" "Description"}}</div>
{{> containerCard characterField "personality" "Personality Traits"}} <div>{{> containerCard characterField "personality" "Personality Traits"}}</div>
{{> containerCard characterField "ideals" "Ideals"}} <div>{{> containerCard characterField "ideals" "Ideals"}}</div>
{{> containerCard characterField "bonds" "Bonds"}} <div>{{> containerCard characterField "bonds" "Bonds"}}</div>
{{> containerCard characterField "flaws" "Flaws"}} <div>{{> containerCard characterField "flaws" "Flaws"}}</div>
{{> containerCard characterField "backstory" "Background"}} <div>{{> containerCard characterField "backstory" "Background"}}</div>
<div>
<paper-shadow class="card"> <paper-shadow class="card">
<div class="white top subhead"> <div class="white top subhead">
Languages Languages
@@ -21,6 +52,7 @@
{{/each}} {{/each}}
</div> </div>
</paper-shadow> </paper-shadow>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -40,6 +72,6 @@
{{title}} {{title}}
</div> </div>
</div> </div>
<div class="bottom text">{{> UI.contentBlock}}</div> <div class="bottom">{{#markdown}}{{> UI.contentBlock}}{{/markdown}}</div>
</paper-shadow> </paper-shadow>
</template> </template>

View File

@@ -11,12 +11,12 @@ Template.persona.helpers({
characterDetails: function(){ characterDetails: function(){
var char = Characters.findOne( var char = Characters.findOne(
this._id, this._id,
{fields: {name: 1, gender: 1, alignment: 1, race:1}} {fields: {name: 1, gender: 1, alignment: 1, race:1, picture: 1}}
); );
char.field = "details"; char.field = "details";
char.title = char.name; char.title = char.name;
char.color = "d"; char.color = "d";
char.topClass = "characterField"; char.startEditing = true;
return char; return char;
}, },
characterField: function(field, title){ characterField: function(field, title){
@@ -40,7 +40,7 @@ Template.persona.helpers({
Template.persona.events({ Template.persona.events({
"tap .characterField": function(event){ "tap .characterField": function(event){
if (this.field === "details"){ if (this.field == "details"){
this.charId = Template.parentData()._id; this.charId = Template.parentData()._id;
GlobalUI.setDetail({ GlobalUI.setDetail({
template: "personaDetailsDialog", template: "personaDetailsDialog",
@@ -58,6 +58,7 @@ Template.persona.events({
field: this.field, field: this.field,
title: this.title, title: this.title,
color: this.color, color: this.color,
startEditing: true,
}, },
heroId: this._id + this.field, heroId: this._id + this.field,
}); });

View File

@@ -1,6 +1,6 @@
<template name="textDialog"> <template name="textDialog">
{{#baseDialog title=title class=colorClass hideColor="true" hideDelete="true" startEditing=startEditing}} {{#baseDialog title=title class=colorClass hideColor="true" hideDelete="true" startEditing=startEditing}}
<div class="pre-wrap">{{evaluateString charId value}}</div> <div>{{#markdown}}{{evaluateString charId value}}{{/markdown}}</div>
{{else}} {{else}}
{{> textDialogEdit}} {{> textDialogEdit}}
{{/baseDialog}} {{/baseDialog}}

View File

@@ -34,7 +34,7 @@
</div> </div>
{{/if}} {{/if}}
</div> </div>
<div class="pre-wrap">{{evaluateString charId description}}</div> <div>{{#markdown}}{{evaluateString charId description}}{{/markdown}}</div>
{{> attacksViewList charId=charId parentId=_id}} {{> attacksViewList charId=charId parentId=_id}}
</template> </template>

View File

@@ -20,7 +20,7 @@
{{/if}} {{/if}}
</div> </div>
<hr class="vertMargin"> <hr class="vertMargin">
<div class="pre-wrap">{{evaluateString charId description}}</div> <div>{{#markdown}}{{evaluateString charId description}}{{/markdown}}</div>
</div> </div>
{{else}} {{else}}
<!--Name--> <!--Name-->

View File

@@ -1,9 +1,10 @@
<template name="spells"> <template name="spells">
<div fit> <div fit>
<div id="spells" class="scroll-y" fit> <div id="spells" class="scroll-y" fit>
<div style="padding: 4px;" <div style="padding: 4px;"
layout horizontal start wrap> layout horizontal start wrap>
{{#if hasSlots}} {{#if hasSlots}}
<div>
<paper-shadow class="card" <paper-shadow class="card"
style="margin: 4px;" style="margin: 4px;"
hero-id="main" {{detailHero}}> hero-id="main" {{detailHero}}>
@@ -33,8 +34,10 @@
{{/if}}{{/each}} {{/if}}{{/each}}
</div> </div>
</paper-shadow> </paper-shadow>
</div>
{{/if}} {{/if}}
{{#each spellLists}} {{#each spellLists}}
<div>
<paper-shadow class="card spellList" flex <paper-shadow class="card spellList" flex
hero-id="main" {{detailHero}} hero-id="main" {{detailHero}}
style="margin: 4px;"> style="margin: 4px;">
@@ -72,6 +75,7 @@
<core-tooltip label="Change prepared spells" <core-tooltip label="Change prepared spells"
position="left"> position="left">
<paper-icon-button class="prepSpells" <paper-icon-button class="prepSpells"
disabled={{#unless canEditCharacter charId}}true{{/unless}}
icon="book"> icon="book">
</paper-icon-button> </paper-icon-button>
</core-tooltip> </core-tooltip>
@@ -91,7 +95,7 @@
<div class="tall spell item" <div class="tall spell item"
hero-id="main" {{detailHero}} hero-id="main" {{detailHero}}
layout horizontal center> layout horizontal center>
<core-icon icon="social:whatshot" <core-icon icon="social:whatshot"
style="color: {{hexColor color}}; style="color: {{hexColor color}};
margin-right: 16px;" margin-right: 16px;"
></core-icon> ></core-icon>
@@ -122,6 +126,7 @@
{{/each}} {{/each}}
</div> </div>
</paper-shadow> </paper-shadow>
</div>
{{/each}} {{/each}}
</div> </div>
<div class="fab-buffer"></div> <div class="fab-buffer"></div>
@@ -143,4 +148,4 @@
</core-tooltip> </core-tooltip>
{{/fabMenu}} {{/fabMenu}}
{{/if}} {{/if}}
</template> </template>

View File

@@ -112,7 +112,7 @@ Template.spells.helpers({
for (i = 0; i < currentSlots; i++){ for (i = 0; i < currentSlots; i++){
bubbles.push({ bubbles.push({
icon: "radio-button-on", icon: "radio-button-on",
disabled: i !== currentSlots - 1, //last full slot not disabled disabled: i !== currentSlots - 1 || !canEditCharacter(char._id), //last full slot not disabled
attribute: "level" + this.level + "SpellSlots", attribute: "level" + this.level + "SpellSlots",
charId: char._id, charId: char._id,
}); });
@@ -120,7 +120,7 @@ Template.spells.helpers({
for (i = 0; i < slotsUsed; i++){ for (i = 0; i < slotsUsed; i++){
bubbles.push({ bubbles.push({
icon: "radio-button-off", icon: "radio-button-off",
disabled: i !== 0, //first empty slot not disabled disabled: i !== 0 || !canEditCharacter(char._id), //first empty slot not disabled
attribute: "level" + this.level + "SpellSlots", attribute: "level" + this.level + "SpellSlots",
charId: char._id, charId: char._id,
}); });

View File

@@ -1,5 +1,6 @@
<template name="abilityMiniCard"> <template name="abilityMiniCard">
<paper-shadow class="card abilityMiniCard clickable" <div>
<paper-shadow class="card abilityMiniCard clickable"
hero-id="main" {{detailHero ability ../_id}} hero-id="main" {{detailHero ability ../_id}}
layout horizontal> layout horizontal>
<div class="left white-text {{color}}" <div class="left white-text {{color}}"
@@ -11,4 +12,5 @@
{{title}} {{title}}
</div> </div>
</paper-shadow> </paper-shadow>
</div>
</template> </template>

View File

@@ -1,9 +1,11 @@
Template.addTHPDialog.events({ Template.addTHPDialog.events({
"tap #addButton": function(event, instance){ "tap #addButton": function(event, instance){
var max = +instance.find("#quantityInput").value;
if (!max || max < 0) max = 0;
TemporaryHitPoints.insert({ TemporaryHitPoints.insert({
charId: this.charId, charId: this.charId,
name: instance.find("#nameInput").value, name: instance.find("#nameInput").value,
maximum: +instance.find("#quantityInput").value, maximum: max,
deleteOnZero: !!instance.find("#deleteWhenZeroCheckbox").checked, deleteOnZero: !!instance.find("#deleteWhenZeroCheckbox").checked,
}); });
} }

View File

@@ -2,27 +2,27 @@
<table class="carryCapacityTable strengthTable"> <table class="carryCapacityTable strengthTable">
<tr> <tr>
<td>Encumbered</td> <td>Encumbered</td>
<td>&gt;{{evaluate charId "strength * 5"}}lbs</td> <td>&gt;{{evaluate charId "strength * 5 * carryMultiplier"}}lbs</td>
<td class="caption">Variant rule, encumbered characters move 10 feet slower</td> <td class="caption">Variant rule, encumbered characters move 10 feet slower</td>
</tr> </tr>
<tr> <tr>
<td>Heavily encumbered</td> <td>Heavily encumbered</td>
<td>&gt;{{evaluate charId "strength * 10"}}lbs</td> <td>&gt;{{evaluate charId "strength * 10 * carryMultiplier"}}lbs</td>
<td class="caption"> <td class="caption">
Variant rule, heavily encumbered characters move 20 feet slower and have disadvantage on ability checks, attack rolls, and saving thows that use Strength, Dexterity, or Constitution Variant rule, heavily encumbered characters move 20 feet slower and have disadvantage on ability checks, attack rolls, and saving thows that use Strength, Dexterity, or Constitution
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Over Encumbered</td> <td>Over Encumbered</td>
<td>&gt;{{evaluate charId "strength * 15"}}lbs</td> <td>&gt;{{evaluate charId "strength * 15 * carryMultiplier"}}lbs</td>
<td class="caption"> <td class="caption">
Characters that can only just lift, push or drag their current load can only move at 5 feet. Characters that can only just lift, push or drag their current load can only move at 5 feet.
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Push, drag or lift maximum</td> <td>Push, drag or lift maximum</td>
<td>{{evaluate charId "strength * 30"}}lbs</td> <td>{{evaluate charId "strength * 30 * carryMultiplier"}}lbs</td>
<td class="caption"></td> <td class="caption"></td>
</tr> </tr>
</table> </table>
</template> </template>

View File

@@ -1,12 +1,16 @@
<template name="healthCard"> <template name="healthCard">
<paper-shadow class="card container healthCard" <paper-shadow class="card container healthCard"
hero-id="main" {{detailHero "hitPoints" _id}} hero-id="main" {{detailHero "hitPoints" _id}}
layout horizontal wrap> layout horizontal wrap>
<div class="green white-text subhead left" <div class="green white-text subhead left"
hero-id="toolbar" {{detailHero "hitPoints" _id}} hero-id="toolbar" {{detailHero "hitPoints" _id}}
layout vertical center center-justified> layout vertical center center-justified>
<div class="hitPointTitle clickable">Hit Points</div> <div class="hitPointTitle clickable">Hit Points</div>
<paper-icon-button class="white54" id="addTempHP" icon="add"></paper-icon-button> <paper-icon-button class="white54"
id="addTempHP"
icon="add"
disabled={{#unless canEditCharacter _id}}true{{/unless}}>
</paper-icon-button>
</div> </div>
<div class="right" flex layout vertical center-justified style="min-width: 180px;"> <div class="right" flex layout vertical center-justified style="min-width: 180px;">
<div layout horizontal> <div layout horizontal>
@@ -14,6 +18,7 @@
value={{characterCalculate "attributeValue" _id "hitPoints"}} value={{characterCalculate "attributeValue" _id "hitPoints"}}
max={{characterCalculate "attributeBase" _id "hitPoints"}} max={{characterCalculate "attributeBase" _id "hitPoints"}}
editable pin editable pin
disabled={{#unless canEditCharacter _id}}true{{/unless}}
role="slider"> role="slider">
</paper-diff-slider> </paper-diff-slider>
</div> </div>
@@ -28,14 +33,14 @@
role="slider" role="slider"
flex flex
></paper-diff-slider> ></paper-diff-slider>
{{#unless left}}{{#unless deleteOnZero}} {{#unless left}}
<paper-icon-button class="deleteTHP" icon="delete"></paper-icon-button> <paper-icon-button class="deleteTHP" icon="delete"></paper-icon-button>
{{/unless}}{{/unless}} {{/unless}}
</div> </div>
</div> </div>
{{/each}} {{/each}}
<div class="caption"> <div class="caption">
{{#if multipliers.immunities.length}} {{#if multipliers.immunities.length}}
<div> <div>
Immune: {{#each multipliers.immunities}} {{name}} {{/each}} Immune: {{#each multipliers.immunities}} {{name}} {{/each}}
</div> </div>

View File

@@ -1,14 +1,15 @@
<template name="hitDice"> <template name="hitDice">
{{#if characterCalculate "attributeBase" ../_id name}} {{#if characterCalculate "attributeBase" ../_id name}}
<paper-shadow class="card hit-dice" hero-id="main" <div>
{{detailHero name ../_id}} <paper-shadow class="card hit-dice" hero-id="main"
{{detailHero name ../_id}}
layout horizontal> layout horizontal>
<div class="left green display1 white-text" <div class="left green display1 white-text"
hero-id="toolbar" {{detailHero name ../_id}} hero-id="toolbar" {{detailHero name ../_id}}
layout horizontal> layout horizontal>
<div> <div>
<paper-icon-button class="resourceUp" <paper-icon-button class="resourceUp"
icon="arrow-drop-up" icon="arrow-drop-up"
disabled={{cantIncrement}}> disabled={{cantIncrement}}>
</paper-icon-button> </paper-icon-button>
<paper-icon-button class="resourceDown" <paper-icon-button class="resourceDown"
@@ -21,7 +22,7 @@
{{characterCalculate "attributeValue" ../_id name}} {{characterCalculate "attributeValue" ../_id name}}
</div> </div>
<div class="title white-text"> <div class="title white-text">
d{{diceNum}} {{characterCalculate "abilityMod" ../_id "constitution"}} d{{diceNum}} {{conMod}}
</div> </div>
</div> </div>
</div> </div>
@@ -29,5 +30,6 @@
Hit Dice Hit Dice
</div> </div>
</paper-shadow> </paper-shadow>
</div>
{{/if}} {{/if}}
</template> </template>

View File

@@ -2,11 +2,16 @@ Template.hitDice.helpers({
cantIncrement: function(){ cantIncrement: function(){
var value = Characters.calculate.attributeValue(this.char._id, this.name); var value = Characters.calculate.attributeValue(this.char._id, this.name);
var base = Characters.calculate.attributeBase(this.char._id, this.name); var base = Characters.calculate.attributeBase(this.char._id, this.name);
return value >= base; return value >= base || !canEditCharacter(this.char._id);
}, },
cantDecrement: function(){ cantDecrement: function(){
var value = Characters.calculate.attributeValue(this.char._id, this.name); var value = Characters.calculate.attributeValue(this.char._id, this.name);
return value <= 0; return value <= 0 || !canEditCharacter(this.char._id);
},
conMod: function(){
return signedString(
Characters.calculate.abilityMod(this.char._id, "constitution")
);
}, },
}); });

View File

@@ -27,6 +27,7 @@
{{>hitDice name="d10HitDice" diceNum="10" char=this}} {{>hitDice name="d10HitDice" diceNum="10" char=this}}
{{>hitDice name="d12HitDice" diceNum="12" char=this}} {{>hitDice name="d12HitDice" diceNum="12" char=this}}
<!--Saving Throws--> <!--Saving Throws-->
<div>
<paper-shadow class="card"> <paper-shadow class="card">
<div class="top white subhead"> <div class="top white subhead">
Saving Throws Saving Throws
@@ -40,7 +41,9 @@
{{> skillRow name="Charisma" skill="charismaSave"}} {{> skillRow name="Charisma" skill="charismaSave"}}
</div> </div>
</paper-shadow> </paper-shadow>
</div>
<!--Skills--> <!--Skills-->
<div>
<paper-shadow class="card"> <paper-shadow class="card">
<div class="top white subhead"> <div class="top white subhead">
Skills Skills
@@ -66,11 +69,13 @@
{{> skillRow name="Survival" skill="survival"}} {{> skillRow name="Survival" skill="survival"}}
</div> </div>
</paper-shadow> </paper-shadow>
</div>
</div> </div>
</div> </div>
</template> </template>
<template name="statCard"> <template name="statCard">
<div>
<paper-shadow class="card statCard clickable" hero-id="main" {{detailHero stat ../_id}} layout horizontal> <paper-shadow class="card statCard clickable" hero-id="main" {{detailHero stat ../_id}} layout horizontal>
<div class="left display1 white-text {{color}}" <div class="left display1 white-text {{color}}"
hero-id="toolbar" {{detailHero stat ../_id}}> hero-id="toolbar" {{detailHero stat ../_id}}>
@@ -84,4 +89,5 @@
{{name}} {{name}}
</div> </div>
</paper-shadow> </paper-shadow>
</div>
</template> </template>

View File

@@ -13,7 +13,10 @@ Template.characterSideList.helpers({
{owner: userId}, {owner: userId},
] ]
}, },
{fields: {name: 1}} {
fields: {name: 1},
sort: {name: 1},
}
); );
} }
}); });

View File

@@ -45,6 +45,15 @@
</div> </div>
<div class="bottom text">Lawful Good Human</div> <div class="bottom text">Lawful Good Human</div>
</paper-shadow> </paper-shadow>
<paper-shadow class="card characterCard ssWizard clickable"
z="2">
<div class="top subhead deep-purple white-text">
<div class="subhead" flex>
Starter Set Wizard
</div>
</div>
<div class="bottom text">Chaotic Good High Elf</div>
</paper-shadow>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -8,6 +8,9 @@ Template.intro.events({
"tap .ssArcher": function() { "tap .ssArcher": function() {
Router.go("/character/yBWwt5XQTTHZiRQxq"); Router.go("/character/yBWwt5XQTTHZiRQxq");
}, },
"tap .ssWizard": function() {
Router.go("/character/KxHKskm22fS2Xogah");
},
"tap .guideButton": function() { "tap .guideButton": function() {
Router.go("/guide"); Router.go("/guide");
}, },

View File

@@ -4,6 +4,9 @@
</core-toolbar> </core-toolbar>
<div fit layout vertical center center-justified> <div fit layout vertical center center-justified>
<paper-spinner class="bigSpinner" active></paper-spinner> <paper-spinner class="bigSpinner" active></paper-spinner>
<div class="subhead">{{randomHint}}</div> <div class="subhead"
style="margin-left: 16px;
margin-right: 16px;
text-align: center;">{{randomHint}}</div>
</div> </div>
</template> </template>

View File

@@ -1,10 +1,14 @@
<template name="notFound"> <template name="notFound">
<div layout vertical center center-justified fit> <core-toolbar class="app-grey white-text">
<h2>The data for the page you requested could not be found.</h2> <core-icon-button icon="menu" core-drawer-toggle></core-icon-button>
</core-toolbar>
<div layout vertical center center-justified fit
style="padding: 16px; text-align: center;">
<h2 style="margin-bottom: 12px;">The data for the page you requested could not be found.</h2>
{{#if currentUser}} {{#if currentUser}}
<h2>It might not exist, or you might not have permission to view it.</h2> <h3>It might not exist, or you might not have permission to view it.</h3>
{{else}} {{else}}
<h2>Perhaps you need to sign in first:</h2> <h3>Perhaps you need to sign in first:</h3>
{{atForm}} {{atForm}}
{{/if}} {{/if}}
</div> </div>

View File

@@ -9,20 +9,11 @@ Template.baseDialog.onRendered(function(){
Template.baseDialog.helpers({ Template.baseDialog.helpers({
editing: function(){ editing: function(){
return Template.instance().editing.get(); return Template.instance().editing.get() && canEditCharacter(Template.parentData().charId);
}, },
showEdit: function() { showEdit: function() {
if (this.hideEdit) return false; if (this.hideEdit) return false;
var charId = Template.parentData().charId; return canEditCharacter(Template.parentData().charId);
var userId = Meteor.userId();
if (!userId) return false;
if (charId){
var char = Characters.findOne(charId);
if (char)
return char.owner === userId ||
_.contains(char.writers, userId);
}
return true;
}, },
}); });

View File

@@ -1,8 +1,13 @@
Meteor.methods({ Meteor.methods({
"getUserId": function(username){ "getUserId": function(username){
if (!username) return; if (!username) return;
regex = new RegExp("^" + username + "$", "i")
var user = Meteor.users.findOne( var user = Meteor.users.findOne(
{$or: [{username: username}, {"emails.address": username}]} {$or: [
{username: username},
{"emails.address": regex},
{"services.google.email": regex},
]}
); );
return user && user._id; return user && user._id;
} }

View File

@@ -15,6 +15,7 @@ function CacheObject(func, address, args, cache, context){
var self = this; var self = this;
self.currentValue = null; self.currentValue = null;
self.dep = new Tracker.Dependency(); self.dep = new Tracker.Dependency();
self.numRun = 0;
//spawn a new autorun that keeps the value up-to-date //spawn a new autorun that keeps the value up-to-date
Tracker.nonreactive(function() { Tracker.nonreactive(function() {
@@ -26,8 +27,22 @@ function CacheObject(func, address, args, cache, context){
delete cache[address]; delete cache[address];
return; return;
} }
//if we haven't run this before this flush, reset the counter after the flush
if(self.numRun === 0){
Tracker.afterFlush(function(){
self.numRun = 0;
});
}
self.numRun++;
//call the expensive function //call the expensive function
//even if we don't use its value, we need to track its dependencies
var newValue = func.apply(context, args); var newValue = func.apply(context, args);
//prevent dependency loops, the memoized function shouldn't re-run
//more than once per flush
if (self.numRun > 1){
newValue = NaN;
if(_.isNaN(self.currentValue)) return;
}
//if the value changed, store the new value //if the value changed, store the new value
if (self.currentValue !== newValue){ if (self.currentValue !== newValue){
self.currentValue = newValue; self.currentValue = newValue;

View File

@@ -101,6 +101,8 @@ trackEncumbranceConditions = function(charId, templateInstance) {
{fields: {"settings": 1}} {fields: {"settings": 1}}
); );
var strength = Characters.calculate.attributeValue(charId, "strength"); var strength = Characters.calculate.attributeValue(charId, "strength");
var carryMultiplier = Characters.calculate
.attributeValue(charId, "carryMultiplier");
var give = function(condition) { var give = function(condition) {
Meteor.call("giveCondition", charId, condition); Meteor.call("giveCondition", charId, condition);
}; };
@@ -108,11 +110,11 @@ trackEncumbranceConditions = function(charId, templateInstance) {
Meteor.call("removeCondition", charId, condition); Meteor.call("removeCondition", charId, condition);
}; };
//variant encumbrance rules //variant encumbrance rules
if (weight > strength * 10 && if (weight > strength * 10 * carryMultiplier &&
character.settings.useVariantEncumbrance) { character.settings.useVariantEncumbrance) {
give("encumbered2"); give("encumbered2");
remove("encumbered"); remove("encumbered");
} else if (weight > strength * 5 && } else if (weight > strength * 5 * carryMultiplier &&
character.settings.useVariantEncumbrance){ character.settings.useVariantEncumbrance){
give("encumbered"); give("encumbered");
remove("encumbered2"); remove("encumbered2");
@@ -121,11 +123,11 @@ trackEncumbranceConditions = function(charId, templateInstance) {
remove("encumbered2"); remove("encumbered2");
} }
//normal encumbrance rules //normal encumbrance rules
if (weight > strength * 30 && if (weight > strength * 30 * carryMultiplier &&
character.settings.useStandardEncumbrance){ character.settings.useStandardEncumbrance){
give("encumbered4"); give("encumbered4");
remove("encumbered3"); remove("encumbered3");
} else if (weight > strength * 15 && } else if (weight > strength * 15 * carryMultiplier &&
character.settings.useStandardEncumbrance) { character.settings.useStandardEncumbrance) {
give("encumbered3"); give("encumbered3");
remove("encumbered4"); remove("encumbered4");

View File

@@ -201,3 +201,70 @@ ChangeLogs.insert({
], ],
}); });
ChangeLogs.insert({
version: "0.6.3",
changes: [
"Fixed a regression that stopped skills and attributes from rounding down correctly",
"Made dependency loops return NaN immediately, rather than looping indefinitely until a page refresh. Adding an effect that adds \"strength\" to Strength, won't cause Strength to constantly increase or freeze the browser, Strength just becomes NaN",
],
});
ChangeLogs.insert({
version: "0.6.4",
changes: [
"Hit dice now has a \"+\" between the dice and the constitution modifier",
"Items with multiple attacks should have the damage type editable on all attacks now",
"Spell attacks should now correctly inherit changes to their spell's name",
"Character lists should now be ordered alphabetically",
"Skills should have correct min and max effects applied again",
],
});
ChangeLogs.insert({
version: "0.6.5",
changes: [
"Net worth now takes container values into account",
"Added support for character pictures",
"Disabled edit buttons for read-only viewers",
],
});
ChangeLogs.insert({
version: "0.6.6",
changes: [
"Text fields now accept github-flavor markdown formatting",
],
});
ChangeLogs.insert({
version: "0.6.7",
changes: [
"Fixed effect values not being visible on small screens",
"Added basic analytics",
],
});
ChangeLogs.insert({
version: "0.6.8",
changes: [
"Fixed share dialog not finding user names",
"Fixed temporary hitpoint sliders allowing negative values",
"Fixed proficiencies not being disabled with their features",
],
});
ChangeLogs.insert({
version: "0.7.0",
changes: [
"Added carry capacity multiplier as a stat with a default value of 1",
"Improved loading times by vulcanizing polymer imports",
],
});
ChangeLogs.insert({
version: "0.7.1",
changes: [
"Fixed carry capacity effects not displaying correctly when not editing",
"Changed how columns are presented to fix a display issue introduced in Chrome 44",
],
});

View File

@@ -108,3 +108,45 @@ Migrations.add({
); );
}, },
}); });
Migrations.add({
version: 4,
name: "Adds an effect to give characters a base carry capacity",
up: function() {
//update characters
Characters.find({}).forEach(function(char){
Characters.update(char._id, {
$set: {
carryMultiplier: {
adjustment: 0,
reset: "longRest",
}
}
});
var effect = Effects.findOne({
charId: char._id, name: "Natural Carrying Capacity"
});
if (effect) return;
Effects.insert({
charId: char._id,
name: "Natural Carrying Capacity",
stat: "carryMultiplier",
operation: "base",
value: "1",
parent: {
id: char._id,
collection: "Characters",
group: "Inate",
},
});
effect = Effects.findOne({
charId: char._id, name: "Natural Carrying Capacity"
});
if (!effect) throw "Carry capacity effect should be set by now."
});
},
down: function(){
return;
},
});