Compare commits
76 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
463b7f0fc9 | ||
|
|
266495abc8 | ||
|
|
453d4365d3 | ||
|
|
e0ce6275bf | ||
|
|
80c72a274e | ||
|
|
91f0f7954c | ||
|
|
c74abcb608 | ||
|
|
4f60766d5d | ||
|
|
e992aeebef | ||
|
|
4108346a98 | ||
|
|
946fadadc2 | ||
|
|
af57326194 | ||
|
|
98c69e9e17 | ||
|
|
395edd0563 | ||
|
|
43e87e7786 | ||
|
|
ad347504c6 | ||
|
|
4e6e99b695 | ||
|
|
104624a322 | ||
|
|
79d166e6af | ||
|
|
86c934e8ac | ||
|
|
a034cbf30e | ||
|
|
d5680ebf8a | ||
|
|
53f2fcc945 | ||
|
|
612e127be4 | ||
|
|
2b0d975cee | ||
|
|
248ab9bb6b | ||
|
|
314ce85410 | ||
|
|
9ff45dbcc2 | ||
|
|
6caf19bc99 | ||
|
|
c2b04d0977 | ||
|
|
9012c4a558 | ||
|
|
65a84937f2 | ||
|
|
eebb88b6b1 | ||
|
|
06ab7c5116 | ||
|
|
89f03c7601 | ||
|
|
9d2eb14c0c | ||
|
|
7b3cb54983 | ||
|
|
a09bad2fed | ||
|
|
afd897edfe | ||
|
|
efc79cb6e7 | ||
|
|
35efe39ea7 | ||
|
|
034067bd6e | ||
|
|
0d75cd5d15 | ||
|
|
4f1376a666 | ||
|
|
78b1d71b9d | ||
|
|
1323d8006c | ||
|
|
87d722adaf | ||
|
|
90e511eb00 | ||
|
|
5b8c25f5de | ||
|
|
2fbc54fee8 | ||
|
|
a064ae3fe8 | ||
|
|
ba9b518d7e | ||
|
|
2f729070b2 | ||
|
|
7aedb9451c | ||
|
|
c6886dd49e | ||
|
|
038ce490e4 | ||
|
|
52bef57637 | ||
|
|
29e9f8c8dc | ||
|
|
fea02811ff | ||
|
|
73cee52fff | ||
|
|
b58c006ed4 | ||
|
|
ef44f6c1a5 | ||
|
|
f455cea43f | ||
|
|
e4083bc744 | ||
|
|
baffafb62a | ||
|
|
4143929667 | ||
|
|
18286d1b9c | ||
|
|
9f51567162 | ||
|
|
66d8a3bfbf | ||
|
|
a9648c10cc | ||
|
|
679292373c | ||
|
|
ae416458b5 | ||
|
|
0ff4a887ea | ||
|
|
955794b5c0 | ||
|
|
b0ac1dcc29 | ||
|
|
83150bc527 |
@@ -25,3 +25,5 @@ splendido:accounts-meld
|
|||||||
email
|
email
|
||||||
fourseven:scss@2.1.1
|
fourseven:scss@2.1.1
|
||||||
wolves:bourbon
|
wolves:bourbon
|
||||||
|
meteorhacks:subs-manager
|
||||||
|
meteorhacks:kadira
|
||||||
|
|||||||
@@ -50,11 +50,15 @@ logging@1.0.7
|
|||||||
matb33:collection-hooks@0.7.13
|
matb33:collection-hooks@0.7.13
|
||||||
meteor@1.1.6
|
meteor@1.1.6
|
||||||
meteor-platform@1.2.2
|
meteor-platform@1.2.2
|
||||||
|
meteorhacks:kadira@2.21.0
|
||||||
|
meteorhacks:meteorx@1.3.1
|
||||||
|
meteorhacks:subs-manager@1.3.0
|
||||||
minifiers@1.1.5
|
minifiers@1.1.5
|
||||||
minimongo@1.0.8
|
minimongo@1.0.8
|
||||||
mobile-status-bar@1.0.3
|
mobile-status-bar@1.0.3
|
||||||
momentjs:moment@2.10.3
|
momentjs:moment@2.10.3
|
||||||
mongo@1.1.0
|
mongo@1.1.0
|
||||||
|
mongo-livedata@1.0.8
|
||||||
npm-bcrypt@0.7.8_2
|
npm-bcrypt@0.7.8_2
|
||||||
oauth@1.1.4
|
oauth@1.1.4
|
||||||
oauth2@1.1.3
|
oauth2@1.1.3
|
||||||
|
|||||||
@@ -24,18 +24,12 @@ Schemas.Attack = new SimpleSchema({
|
|||||||
optional: true,
|
optional: true,
|
||||||
trim: false,
|
trim: false,
|
||||||
},
|
},
|
||||||
damageBonus: {
|
damage: {
|
||||||
type: String,
|
type: String,
|
||||||
defaultValue: "strengthMod",
|
defaultValue: "1d8 + {strengthMod}",
|
||||||
optional: true,
|
optional: true,
|
||||||
trim: false,
|
trim: false,
|
||||||
},
|
},
|
||||||
damageDice: {
|
|
||||||
type: String,
|
|
||||||
optional: true,
|
|
||||||
defaultValue: "1d8",
|
|
||||||
allowedValues: DAMAGE_DICE,
|
|
||||||
},
|
|
||||||
damageType: {
|
damageType: {
|
||||||
type: String,
|
type: String,
|
||||||
allowedValues: [
|
allowedValues: [
|
||||||
|
|||||||
@@ -1,28 +1,51 @@
|
|||||||
Buffs = new Mongo.Collection("buffs");
|
Buffs = new Mongo.Collection("buffs");
|
||||||
|
|
||||||
//buffs are temporary once applied and store things which expire and their expiry time
|
|
||||||
Schemas.Buff = new SimpleSchema({
|
Schemas.Buff = new SimpleSchema({
|
||||||
//buff id
|
|
||||||
_id: {
|
|
||||||
type: String,
|
|
||||||
regEx: SimpleSchema.RegEx.Id,
|
|
||||||
autoValue: function(){
|
|
||||||
if (!this.isSet) return Random.id();
|
|
||||||
},
|
|
||||||
},
|
|
||||||
charId: {
|
charId: {
|
||||||
type: String,
|
type: String,
|
||||||
regEx: SimpleSchema.RegEx.Id,
|
regEx: SimpleSchema.RegEx.Id,
|
||||||
},
|
},
|
||||||
//expiry time
|
name: {
|
||||||
expiry: {type: Number, optional: true},
|
type: String,
|
||||||
duration: {type: Number},
|
trim: false,
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: String,
|
||||||
|
optional: true,
|
||||||
|
trim: false,
|
||||||
|
},
|
||||||
|
enabled: {
|
||||||
|
type: Boolean,
|
||||||
|
defaultValue: true,
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
allowedValues: [
|
||||||
|
"inate",
|
||||||
|
"custom",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
"lifeTime.total": {
|
||||||
|
type: Number,
|
||||||
|
defaultValue: 0, //0 is infinite
|
||||||
|
min: 0,
|
||||||
|
},
|
||||||
|
"lifeTime.spent": {
|
||||||
|
type: Number,
|
||||||
|
defaultValue: 0,
|
||||||
|
min: 0,
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
type: String,
|
||||||
|
allowedValues: _.pluck(colorOptions, "key"),
|
||||||
|
defaultValue: "q",
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Buffs.attachSchema(Schemas.Buff);
|
Buffs.attachSchema(Schemas.Buff);
|
||||||
|
|
||||||
Buffs.attachBehaviour("softRemovable");
|
Buffs.attachBehaviour("softRemovable");
|
||||||
makeParent(Buffs, "name"); //parents of effects and attacks
|
makeParent(Buffs, ["name", "enabled"]); //parents of effects
|
||||||
|
|
||||||
Buffs.allow(CHARACTER_SUBSCHEMA_ALLOW);
|
Buffs.allow(CHARACTER_SUBSCHEMA_ALLOW);
|
||||||
Buffs.deny(CHARACTER_SUBSCHEMA_DENY);
|
Buffs.deny(CHARACTER_SUBSCHEMA_DENY);
|
||||||
|
|||||||
@@ -3,16 +3,16 @@ Characters = new Mongo.Collection("characters");
|
|||||||
|
|
||||||
Schemas.Character = new SimpleSchema({
|
Schemas.Character = new SimpleSchema({
|
||||||
//strings
|
//strings
|
||||||
name: {type: String, defaultValue: "", trim: false},
|
name: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
alignment: {type: String, defaultValue: "", trim: false},
|
alignment: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
gender: {type: String, defaultValue: "", trim: false},
|
gender: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
race: {type: String, defaultValue: "", trim: false},
|
race: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
description: {type: String, defaultValue: "", trim: false},
|
description: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
personality: {type: String, defaultValue: "", trim: false},
|
personality: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
ideals: {type: String, defaultValue: "", trim: false},
|
ideals: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
bonds: {type: String, defaultValue: "", trim: false},
|
bonds: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
flaws: {type: String, defaultValue: "", trim: false},
|
flaws: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
backstory: {type: String, defaultValue: "", trim: false},
|
backstory: {type: String, defaultValue: "", trim: false, optional: true},
|
||||||
|
|
||||||
//attributes
|
//attributes
|
||||||
//ability scores
|
//ability scores
|
||||||
@@ -159,6 +159,7 @@ Schemas.Character = new SimpleSchema({
|
|||||||
deathSave: {type: Schemas.DeathSave},
|
deathSave: {type: Schemas.DeathSave},
|
||||||
|
|
||||||
//permissions
|
//permissions
|
||||||
|
party: {type: String, regEx: SimpleSchema.RegEx.Id, optional: true},
|
||||||
owner: {type: String, regEx: SimpleSchema.RegEx.Id},
|
owner: {type: String, regEx: SimpleSchema.RegEx.Id},
|
||||||
readers: {type: [String], regEx: SimpleSchema.RegEx.Id, defaultValue: []},
|
readers: {type: [String], regEx: SimpleSchema.RegEx.Id, defaultValue: []},
|
||||||
writers: {type: [String], regEx: SimpleSchema.RegEx.Id, defaultValue: []},
|
writers: {type: [String], regEx: SimpleSchema.RegEx.Id, defaultValue: []},
|
||||||
@@ -168,61 +169,122 @@ Schemas.Character = new SimpleSchema({
|
|||||||
defaultValue: "q",
|
defaultValue: "q",
|
||||||
},
|
},
|
||||||
//TODO add per-character settings
|
//TODO add per-character settings
|
||||||
"settings.experiencesInc": {type: Number, defaultValue: 20}, //how many experiences to load at a time in XP table
|
//how many experiences to load at a time in XP table
|
||||||
|
"settings.experiencesInc": {type: Number, defaultValue: 20},
|
||||||
|
//slowed down by carrying too much?
|
||||||
|
"settings.useVariantEncumbrance": {type: Boolean, defaultValue: false},
|
||||||
|
"settings.useStandardEncumbrance": {type: Boolean, defaultValue: true},
|
||||||
|
//hide spellcasting
|
||||||
|
"settings.hideSpellcasting": {type: Boolean, defaultValue: false},
|
||||||
|
//show to anyone with link
|
||||||
|
"settings.viewPermission": {
|
||||||
|
type: String,
|
||||||
|
defaultValue: "whitelist",
|
||||||
|
allowedValues: ["whitelist", "public"],
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
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);
|
||||||
var effects = Effects.find(
|
//if it's a damage multiplier, we treat it specially
|
||||||
{charId: charId, stat: statName, enabled: true}
|
if (_.contains(DAMAGE_MULTIPLIERS, statName)){
|
||||||
).fetch();
|
var invulnerabilityCount = Effects.find({
|
||||||
effects = _.groupBy(effects, "operation");
|
charId: charId,
|
||||||
var value = _.contains(DAMAGE_MULTIPLIERS, statName) ? 1 : 0;
|
stat: statName,
|
||||||
|
enabled: true,
|
||||||
|
operation: "mul",
|
||||||
|
value: 0,
|
||||||
|
}).count();
|
||||||
|
if (invulnerabilityCount) return 0;
|
||||||
|
var resistCount = Effects.find({
|
||||||
|
charId: charId,
|
||||||
|
stat: statName,
|
||||||
|
enabled: true,
|
||||||
|
operation: "mul",
|
||||||
|
value: 0.5,
|
||||||
|
}).count();
|
||||||
|
var vulnCount = Effects.find({
|
||||||
|
charId: charId,
|
||||||
|
stat: statName,
|
||||||
|
enabled: true,
|
||||||
|
operation: "mul",
|
||||||
|
value: 2,
|
||||||
|
}).count();
|
||||||
|
if (!resistCount && !vulnCount){
|
||||||
|
return 1;
|
||||||
|
} else if (resistCount && !vulnCount){
|
||||||
|
return 0.5;
|
||||||
|
} else if (!resistCount && vulnCount){
|
||||||
|
return 2;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var value;
|
||||||
|
var base = 0;
|
||||||
|
var add = 0;
|
||||||
|
var mul = 1;
|
||||||
|
var min = Number.NEGATIVE_INFINITY;
|
||||||
|
var max = Number.POSITIVE_INFINITY;
|
||||||
|
|
||||||
//start with the highest base value
|
Effects.find({
|
||||||
_.each(effects.base, function(effect){
|
charId: charId,
|
||||||
var efv = evaluateEffect(charId, effect);
|
stat: statName,
|
||||||
if (efv > value){
|
enabled: true,
|
||||||
value = efv;
|
operation: {$in: ["base", "add", "mul", "min", "max"]},
|
||||||
|
}).forEach(function(effect) {
|
||||||
|
value = evaluateEffect(charId, effect);
|
||||||
|
if (effect.operation === "base"){
|
||||||
|
if (value > base) base = value;
|
||||||
|
} else if (effect.operation === "add"){
|
||||||
|
add += value;
|
||||||
|
} else if (effect.operation === "mul"){
|
||||||
|
mul *= value;
|
||||||
|
} else if (effect.operation === "min"){
|
||||||
|
if (value > min) min = value;
|
||||||
|
} else if (effect.operation === "max"){
|
||||||
|
if (value < max) max = value;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
//add all the add values
|
var result = (base + add) * mul;
|
||||||
_.each(effects.add, function(effect){
|
if (result < min) result = min;
|
||||||
value += evaluateEffect(charId, effect);
|
if (result > max) result = max;
|
||||||
});
|
|
||||||
|
|
||||||
//multiply all the mul values
|
return Math.floor(result);
|
||||||
_.each(effects.mul, function(effect){
|
});
|
||||||
value *= evaluateEffect(charId, effect);
|
|
||||||
});
|
|
||||||
|
|
||||||
//ensure value is >= all mins
|
if (Meteor.isClient) {
|
||||||
_.each(effects.min, function(effect){
|
Template.registerHelper("characterCalculate", function(func, charId, input) {
|
||||||
var min = evaluateEffect(charId, effect);
|
try {
|
||||||
value = value > min ? value : min;
|
return Characters.calculate[func](charId, input);
|
||||||
|
} catch (e){
|
||||||
|
if (!Characters.calculate[func]){
|
||||||
|
throw new Error(func + "is not a function name");
|
||||||
|
} else {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
//ensure value is <= all maxes
|
//create a local memoize with a argument concatenating hash function
|
||||||
_.each(effects.max, function(effect){
|
var memoize = function(f) {
|
||||||
var max = evaluateEffect(charId, effect);
|
return Tracker.memoize(f, function() {
|
||||||
value = value < max ? value : max;
|
return _.reduce(arguments, function(memo, arg) {
|
||||||
|
return memo + arg;
|
||||||
|
}, "");
|
||||||
});
|
});
|
||||||
return value;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//functions and calculated values.
|
//memoize funcitons that have finds and slow loops
|
||||||
//These functions can only rely on this._id since no other
|
Characters.calculate = {
|
||||||
//field is likely to be attached to all returned characters
|
getField: function(charId, fieldName) {
|
||||||
Characters.helpers({
|
|
||||||
//returns the value stored in the field requested
|
|
||||||
//will set up dependencies on just that field
|
|
||||||
getField : function(fieldName){
|
|
||||||
var fieldSelector = {};
|
var fieldSelector = {};
|
||||||
fieldSelector[fieldName] = 1;
|
fieldSelector[fieldName] = 1;
|
||||||
var char = Characters.findOne(this._id, {fields: fieldSelector});
|
var char = Characters.findOne(charId, {fields: fieldSelector});
|
||||||
var field = char[fieldName];
|
var field = char[fieldName];
|
||||||
if (field === undefined){
|
if (field === undefined){
|
||||||
throw new Meteor.Error(
|
throw new Meteor.Error(
|
||||||
@@ -235,8 +297,7 @@ Characters.helpers({
|
|||||||
}
|
}
|
||||||
return field;
|
return field;
|
||||||
},
|
},
|
||||||
//returns the value of a field
|
fieldValue: function(charId, fieldName) {
|
||||||
fieldValue : function(fieldName){
|
|
||||||
if (!Schemas.Character.schema(fieldName)){
|
if (!Schemas.Character.schema(fieldName)){
|
||||||
throw new Meteor.Error(
|
throw new Meteor.Error(
|
||||||
"Field not found",
|
"Field not found",
|
||||||
@@ -246,102 +307,92 @@ Characters.helpers({
|
|||||||
//duck typing to get the right value function
|
//duck typing to get the right value function
|
||||||
//.ability implies skill
|
//.ability implies skill
|
||||||
if (Schemas.Character.schema(fieldName + ".ability")){
|
if (Schemas.Character.schema(fieldName + ".ability")){
|
||||||
return this.skillMod(fieldName);
|
return Characters.calculate.skillMod(charId, fieldName);
|
||||||
}
|
}
|
||||||
//adjustment implies attribute
|
//adjustment implies attribute
|
||||||
if (Schemas.Character.schema(fieldName + ".adjustment")){
|
if (Schemas.Character.schema(fieldName + ".adjustment")){
|
||||||
return this.attributeValue(fieldName);
|
return Characters.calculate.attributeValue(charId, fieldName);
|
||||||
}
|
}
|
||||||
//fall back to just returning the field itself
|
//fall back to just returning the field itself
|
||||||
return this.getField(fieldName);
|
return Characters.calculate.getField(charId, fieldName);
|
||||||
},
|
},
|
||||||
|
attributeValue: memoize(function(charId, attributeName){
|
||||||
attributeValue: function(attributeName){
|
var attribute = Characters.calculate.getField(charId, attributeName);
|
||||||
var charId = this._id;
|
|
||||||
var attribute = this.getField(attributeName);
|
|
||||||
//base value
|
//base value
|
||||||
var value = this.attributeBase(attributeName);
|
var value = Characters.calculate.attributeBase(charId, attributeName);
|
||||||
//plus adjustment
|
//plus adjustment
|
||||||
value += attribute.adjustment;
|
value += attribute.adjustment;
|
||||||
return value;
|
return value;
|
||||||
},
|
}),
|
||||||
|
attributeBase: memoize(function(charId, attributeName){
|
||||||
attributeBase: preventLoop(function(attributeName){
|
|
||||||
var charId = this._id;
|
|
||||||
//base value
|
|
||||||
return attributeBase(charId, attributeName);
|
return attributeBase(charId, attributeName);
|
||||||
}),
|
}),
|
||||||
|
skillMod: memoize(preventLoop(function(charId, skillName){
|
||||||
skillMod: preventLoop(function(skillName){
|
var skill = Characters.calculate.getField(charId, skillName);
|
||||||
var charId = this._id;
|
|
||||||
var skill = this.getField(skillName);
|
|
||||||
//get the final value of the ability score
|
//get the final value of the ability score
|
||||||
var ability = this.attributeValue(skill.ability);
|
var ability = Characters.calculate.attributeValue(charId, skill.ability);
|
||||||
|
|
||||||
//base modifier
|
//base modifier
|
||||||
var mod = +getMod(ability);
|
var mod = +getMod(ability);
|
||||||
|
|
||||||
//multiply proficiency bonus by largest value in proficiency array
|
//multiply proficiency bonus by largest value in proficiency array
|
||||||
var prof = this.proficiency(skillName);
|
var prof = Characters.calculate.proficiency(charId, skillName);
|
||||||
|
|
||||||
//add multiplied proficiency bonus to modifier
|
//add multiplied proficiency bonus to modifier
|
||||||
mod += prof * this.attributeValue("proficiencyBonus");
|
mod += prof * Characters.calculate.attributeValue(charId, "proficiencyBonus");
|
||||||
|
|
||||||
//apply all effects
|
//apply all effects
|
||||||
var rawEffects = Effects.find(
|
var value;
|
||||||
{charId: charId, stat: skillName, enabled: true}
|
var add = 0;
|
||||||
).fetch();
|
var mul = 1;
|
||||||
var effects = _.groupBy(rawEffects, "operation");
|
var min = Math.NEGATIVE_INFINITY;
|
||||||
_.forEach(effects.add, function(effect){
|
var max = Math.POSITIVE_INFINITY;
|
||||||
mod += evaluateEffect(charId, effect);
|
|
||||||
});
|
|
||||||
_.forEach(effects.mul, function(effect){
|
|
||||||
mod *= evaluateEffect(charId, effect);
|
|
||||||
});
|
|
||||||
_.forEach(effects.min, function(effect){
|
|
||||||
var min = evaluateEffect(charId, effect);
|
|
||||||
mod = mod > min ? mod : min;
|
|
||||||
});
|
|
||||||
_.forEach(effects.max, function(effect){
|
|
||||||
var max = evaluateEffect(charId, effect);
|
|
||||||
mod = mod < max ? mod : max;
|
|
||||||
});
|
|
||||||
return signedString(mod);
|
|
||||||
}),
|
|
||||||
|
|
||||||
proficiency: function(skillName){
|
Effects.find({
|
||||||
var charId = this._id;
|
charId: charId,
|
||||||
//return largest value in proficiency array
|
stat: skillName,
|
||||||
var prof = 0;
|
enabled: true,
|
||||||
Proficiencies.find(
|
operation: {$in: ["base", "add", "mul", "min", "max"]},
|
||||||
{charId: charId, name: skillName, enabled: true}
|
}).forEach(function(effect) {
|
||||||
).forEach(function(proficiency){
|
value = evaluateEffect(charId, effect);
|
||||||
var newProf = proficiency.value;
|
if (effect.operation === "add"){
|
||||||
if (newProf > prof){
|
add += value;
|
||||||
prof = newProf;
|
} else if (effect.operation === "mul"){
|
||||||
|
mul *= value;
|
||||||
|
} else if (effect.operation === "min"){
|
||||||
|
if (value > min) min = value;
|
||||||
|
} else if (effect.operation === "max"){
|
||||||
|
if (value < max) max = value;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return prof;
|
var result = (mod + add) * mul;
|
||||||
},
|
if (result < min) result = min;
|
||||||
|
if (result > max) result = max;
|
||||||
|
|
||||||
passiveSkill: function(skillName){
|
return Math.floor(result);
|
||||||
if (_.isString(skillName)){
|
})),
|
||||||
var skill = this.getField(skillName);
|
proficiency: memoize(function(charId, skillName){
|
||||||
}
|
//return largest value in proficiency array
|
||||||
var charId = this._id;
|
var prof = Proficiencies.findOne(
|
||||||
var mod = +this.skillMod(skillName);
|
{charId: charId, name: skillName, enabled: true},
|
||||||
|
{sort: {value: -1}}
|
||||||
|
);
|
||||||
|
return prof && prof.value || 0;
|
||||||
|
}),
|
||||||
|
passiveSkill: memoize(function(charId, skillName){
|
||||||
|
var skill = Characters.calculate.getField(charId, skillName);
|
||||||
|
var mod = +Characters.calculate.skillMod(charId, skillName);
|
||||||
var value = 10 + mod;
|
var value = 10 + mod;
|
||||||
Effects.find(
|
Effects.find(
|
||||||
{charId: charId, stat: skillName, enabled: true, operation: "passiveAdd"}
|
{charId: charId, stat: skillName, enabled: true, operation: "passiveAdd"}
|
||||||
).forEach(function(effect){
|
).forEach(function(effect){
|
||||||
value += evaluateEffect(charId, effect);
|
value += evaluateEffect(charId, effect);
|
||||||
});
|
});
|
||||||
return value;
|
var advantage = Characters.calculate.advantage(charId, skillName);
|
||||||
//TODO decide whether (dis)advantage gives (-)+5 to passive checks
|
value += 5 * advantage;
|
||||||
},
|
return Math.floor(value);
|
||||||
|
}),
|
||||||
advantage: function(skillName){
|
advantage: memoize(function(charId, skillName){
|
||||||
var charId = this._id;
|
|
||||||
var advantage = Effects.find(
|
var advantage = Effects.find(
|
||||||
{charId: charId, stat: skillName, enabled: true, operation: "advantage"}
|
{charId: charId, stat: skillName, enabled: true, operation: "advantage"}
|
||||||
).count();
|
).count();
|
||||||
@@ -351,19 +402,18 @@ Characters.helpers({
|
|||||||
if (advantage && !disadvantage) return 1;
|
if (advantage && !disadvantage) return 1;
|
||||||
if (disadvantage && !advantage) return -1;
|
if (disadvantage && !advantage) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
|
}),
|
||||||
|
abilityMod: function(charId, attribute){
|
||||||
|
return getMod(
|
||||||
|
Characters.calculate.attributeValue(charId, attribute)
|
||||||
|
);
|
||||||
},
|
},
|
||||||
|
passiveAbility: function(charId, attribute){
|
||||||
abilityMod: function(attribute){
|
var mod = +getMod(Characters.calculate.attributeValue(charId, attribute));
|
||||||
return signedString(getMod(this.attributeValue(attribute)));
|
|
||||||
},
|
|
||||||
|
|
||||||
passiveAbility: function(attribute){
|
|
||||||
var mod = +getMod(this.attributeValue(attribute));
|
|
||||||
return 10 + mod;
|
return 10 + mod;
|
||||||
},
|
},
|
||||||
|
xpLevel: function(charId){
|
||||||
xpLevel: function(){
|
var xp = Characters.calculate.experience(charId);
|
||||||
var xp = this.experience();
|
|
||||||
for (var i = 0; i < 19; i++){
|
for (var i = 0; i < 19; i++){
|
||||||
if (xp < XP_TABLE[i]){
|
if (xp < XP_TABLE[i]){
|
||||||
return i;
|
return i;
|
||||||
@@ -372,30 +422,103 @@ Characters.helpers({
|
|||||||
if (xp > 355000) return 20;
|
if (xp > 355000) return 20;
|
||||||
return 0;
|
return 0;
|
||||||
},
|
},
|
||||||
|
level: memoize(function(charId){
|
||||||
level: function(){
|
|
||||||
var level = 0;
|
var level = 0;
|
||||||
Classes.find({charId: this._id}).forEach(function(cls){
|
Classes.find({charId: charId}).forEach(function(cls){
|
||||||
level += cls.level;
|
level += cls.level;
|
||||||
});
|
});
|
||||||
return level;
|
return level;
|
||||||
},
|
}),
|
||||||
|
experience: memoize(function(charId){
|
||||||
experience: function(){
|
|
||||||
var xp = 0;
|
var xp = 0;
|
||||||
Experiences.find(
|
Experiences.find(
|
||||||
{charId: this._id},
|
{charId: charId},
|
||||||
{fields: {value: 1}}
|
{fields: {value: 1}}
|
||||||
).forEach(function(e){
|
).forEach(function(e){
|
||||||
xp += e.value;
|
xp += e.value;
|
||||||
});
|
});
|
||||||
return xp;
|
return xp;
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
|
||||||
|
var depreciated = function() {
|
||||||
|
//var err = new Error("this function has been depreciated");
|
||||||
|
var name = "";
|
||||||
|
if (Template.instance()){
|
||||||
|
name = Template.instance().view.name;
|
||||||
|
}
|
||||||
|
var logString = "this function has been depreciated \n";
|
||||||
|
if (name){
|
||||||
|
logString += "View: " + name + "\n\n";
|
||||||
|
}
|
||||||
|
//logString += err.stack + "\n\n---------------------\n\n";
|
||||||
|
console.log(logString);
|
||||||
|
};
|
||||||
|
|
||||||
|
//functions and calculated values.
|
||||||
|
//These functions can only rely on this._id since no other
|
||||||
|
//field is likely to be attached to all returned characters
|
||||||
|
Characters.helpers({
|
||||||
|
//returns the value stored in the field requested
|
||||||
|
//will set up dependencies on just that field
|
||||||
|
getField : function(fieldName){
|
||||||
|
depreciated();
|
||||||
|
return Characters.calculate.getField(this._id, fieldName);
|
||||||
|
},
|
||||||
|
//returns the value of a field
|
||||||
|
fieldValue : function(fieldName){
|
||||||
|
depreciated();
|
||||||
|
return Characters.calculate.fieldValue(this._id, fieldName);
|
||||||
|
},
|
||||||
|
attributeValue: function(attributeName){
|
||||||
|
depreciated();
|
||||||
|
return Characters.calculate.attributeValue(this._id, attributeName);
|
||||||
|
},
|
||||||
|
attributeBase: function(attributeName){
|
||||||
|
depreciated();
|
||||||
|
return Characters.calculate.attributeBase(this._id, attributeName);
|
||||||
|
},
|
||||||
|
skillMod: function(skillName){
|
||||||
|
depreciated();
|
||||||
|
return Characters.calculate.skillMod(this._id, skillName);
|
||||||
|
},
|
||||||
|
proficiency: function(skillName){
|
||||||
|
depreciated();
|
||||||
|
return Characters.calculate.proficiency(this._id, skillName);
|
||||||
|
},
|
||||||
|
passiveSkill: function(skillName){
|
||||||
|
depreciated();
|
||||||
|
return Characters.calculate.passiveSkill(this._id, skillName);
|
||||||
|
},
|
||||||
|
advantage: function(skillName){
|
||||||
|
depreciated();
|
||||||
|
return Characters.calculate.advantage(this._id, skillName);
|
||||||
|
},
|
||||||
|
abilityMod: function(attribute){
|
||||||
|
depreciated();
|
||||||
|
return Characters.calculate.abilityMod(this._id, attribute);
|
||||||
|
},
|
||||||
|
passiveAbility: function(attribute){
|
||||||
|
depreciated();
|
||||||
|
return Characters.calculate.passiveAbility(this._id, attribute);
|
||||||
|
},
|
||||||
|
xpLevel: function(){
|
||||||
|
depreciated();
|
||||||
|
return Characters.calculate.xpLevel(this._id);
|
||||||
|
},
|
||||||
|
level: function(){
|
||||||
|
depreciated();
|
||||||
|
return Characters.calculate.level(this._id);
|
||||||
|
},
|
||||||
|
experience: function(){
|
||||||
|
depreciated();
|
||||||
|
return Characters.calculate.experience(this._id);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
//clean up all data related to that character before removing it
|
//clean up all data related to that character before removing it
|
||||||
Characters.after.remove(function(userId, character) {
|
if (Meteor.isServer){
|
||||||
if (Meteor.isServer){
|
Characters.after.remove(function(userId, character) {
|
||||||
Actions .remove({charId: character._id});
|
Actions .remove({charId: character._id});
|
||||||
Attacks .remove({charId: character._id});
|
Attacks .remove({charId: character._id});
|
||||||
Buffs .remove({charId: character._id});
|
Buffs .remove({charId: character._id});
|
||||||
@@ -408,8 +531,8 @@ Characters.after.remove(function(userId, character) {
|
|||||||
SpellLists .remove({charId: character._id});
|
SpellLists .remove({charId: character._id});
|
||||||
Items .remove({charId: character._id});
|
Items .remove({charId: character._id});
|
||||||
Containers .remove({charId: character._id});
|
Containers .remove({charId: character._id});
|
||||||
}
|
});
|
||||||
});
|
}
|
||||||
|
|
||||||
Characters.allow({
|
Characters.allow({
|
||||||
insert: function(userId, doc) {
|
insert: function(userId, doc) {
|
||||||
|
|||||||
@@ -3,10 +3,6 @@
|
|||||||
* Damage, healing and resource cost/recovery are all adjustments
|
* Damage, healing and resource cost/recovery are all adjustments
|
||||||
*/
|
*/
|
||||||
Schemas.Adjustment = new SimpleSchema({
|
Schemas.Adjustment = new SimpleSchema({
|
||||||
name: {
|
|
||||||
type: String,
|
|
||||||
optional: true,
|
|
||||||
},
|
|
||||||
//which stat the adjustment is applied to
|
//which stat the adjustment is applied to
|
||||||
stat: {
|
stat: {
|
||||||
type: String,
|
type: String,
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ Schemas.Item = new SimpleSchema({
|
|||||||
value: {type: Number, min: 0, defaultValue: 0, decimal: true},
|
value: {type: Number, min: 0, defaultValue: 0, decimal: true},
|
||||||
enabled: {type: Boolean, defaultValue: false},
|
enabled: {type: Boolean, defaultValue: false},
|
||||||
requiresAttunement: {type: Boolean, defaultValue: false},
|
requiresAttunement: {type: Boolean, defaultValue: false},
|
||||||
|
"settings.showIncrement": {type: Boolean, defaultValue: false},
|
||||||
color: {
|
color: {
|
||||||
type: String,
|
type: String,
|
||||||
allowedValues: _.pluck(colorOptions, "key"),
|
allowedValues: _.pluck(colorOptions, "key"),
|
||||||
|
|||||||
@@ -45,7 +45,26 @@ Meteor.methods({
|
|||||||
metaData: Object,
|
metaData: Object,
|
||||||
});
|
});
|
||||||
report.owner = this.userId;
|
report.owner = this.userId;
|
||||||
Reports.insert(report);
|
var id = Reports.insert(report);
|
||||||
|
var user = Meteor.users.findOne(this.userId);
|
||||||
|
var sender = user &&
|
||||||
|
user.emails &&
|
||||||
|
user.emails[0] &&
|
||||||
|
user.emails[0].address ||
|
||||||
|
user.services &&
|
||||||
|
user.services.google &&
|
||||||
|
user.services.google.email ||
|
||||||
|
"reports@dicecloud.com";
|
||||||
|
var bodyText = "Report ID: " + id +
|
||||||
|
"\nSeverity: " + report.severity +
|
||||||
|
"\nType: " + report.type +
|
||||||
|
"\n\n" + report.description;
|
||||||
|
Email.send({
|
||||||
|
from: sender,
|
||||||
|
to: "stefan.zermatten@gmail.com",
|
||||||
|
subject: "DiceCloud feedback - " + report.title,
|
||||||
|
text: bodyText,
|
||||||
|
});
|
||||||
},
|
},
|
||||||
deleteReport: function(id) {
|
deleteReport: function(id) {
|
||||||
var user = Meteor.users.findOne(this.userId);
|
var user = Meteor.users.findOne(this.userId);
|
||||||
|
|||||||
@@ -4,17 +4,9 @@ Router.configure({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Router.plugin("ensureSignedIn", {
|
Router.plugin("ensureSignedIn", {
|
||||||
except: [
|
only: [
|
||||||
"home",
|
"profile",
|
||||||
"atSignIn",
|
"characterList",
|
||||||
"atSignUp",
|
|
||||||
"atForgotPassword",
|
|
||||||
"atResetPwd",
|
|
||||||
"atEnrollAccount",
|
|
||||||
"atVerifyEmail",
|
|
||||||
"atResendVerificationEmail",
|
|
||||||
"loginButtons",
|
|
||||||
"notFound",
|
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -31,7 +23,7 @@ Router.map(function() {
|
|||||||
this.route("characterList", {
|
this.route("characterList", {
|
||||||
path: "/characterList",
|
path: "/characterList",
|
||||||
waitOn: function(){
|
waitOn: function(){
|
||||||
return Meteor.subscribe("characterList", Meteor.userId());
|
return subsManager.subscribe("characterList", Meteor.userId());
|
||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
characters: function(){
|
characters: function(){
|
||||||
@@ -47,7 +39,7 @@ Router.map(function() {
|
|||||||
path: "/character/:_id",
|
path: "/character/:_id",
|
||||||
waitOn: function(){
|
waitOn: function(){
|
||||||
return [
|
return [
|
||||||
Meteor.subscribe("singleCharacter", this.params._id, Meteor.userId()),
|
subsManager.subscribe("singleCharacter", this.params._id, Meteor.userId()),
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
data: function() {
|
data: function() {
|
||||||
@@ -81,7 +73,7 @@ Router.map(function() {
|
|||||||
name: "changeLog",
|
name: "changeLog",
|
||||||
waitOn: function() {
|
waitOn: function() {
|
||||||
return [
|
return [
|
||||||
Meteor.subscribe("changeLog"),
|
subsManager.subscribe("changeLog"),
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
@@ -93,4 +85,11 @@ Router.map(function() {
|
|||||||
document.title = appName;
|
document.title = appName;
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.route("/guide", {
|
||||||
|
name: "guide",
|
||||||
|
onAfterAction: function() {
|
||||||
|
document.title = appName;
|
||||||
|
},
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -15,8 +15,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"polymer": "Polymer/polymer#~0.5.5",
|
"polymer": "Polymer/polymer#~0.5.5",
|
||||||
"core-elements": "Polymer/core-elements#~0.5.5",
|
"core-elements": "Polymer/core-elements#~0.5.5",
|
||||||
"paper-elements": "Polymer/paper-elements#~0.5.5",
|
"paper-elements": "Polymer/paper-elements#~0.5.5"
|
||||||
"paper-fab-menu": "cwdoh/paper-fab-menu"
|
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"core-component-page": "^0.5.0",
|
"core-component-page": "^0.5.0",
|
||||||
|
|||||||
@@ -20,6 +20,11 @@ openParentDialog = function(parent, charId, heroId) {
|
|||||||
template: "itemDialog",
|
template: "itemDialog",
|
||||||
data: {itemId: parent.id},
|
data: {itemId: parent.id},
|
||||||
};
|
};
|
||||||
|
} else if (parent.collection === "Spells") {
|
||||||
|
detail = {
|
||||||
|
template: "spellDialog",
|
||||||
|
data: {spellId: parent.id},
|
||||||
|
};
|
||||||
}
|
}
|
||||||
detail.heroId = heroId;
|
detail.heroId = heroId;
|
||||||
detail.charId = charId;
|
detail.charId = charId;
|
||||||
|
|||||||
@@ -1,25 +1,27 @@
|
|||||||
Template.registerHelper("valueString", function(value) {
|
Template.registerHelper("valueString", function(value) {
|
||||||
|
var intValue = Math.round(value * 100);
|
||||||
|
var cp = intValue % 10;
|
||||||
|
intValue -= cp;
|
||||||
|
cp = Math.round(cp);
|
||||||
|
sp = intValue % 100;
|
||||||
|
intValue -= sp;
|
||||||
|
sp = Math.round(sp / 10)
|
||||||
|
gp = Math.floor(value);
|
||||||
|
|
||||||
var resultArray = [];
|
var resultArray = [];
|
||||||
//sp
|
|
||||||
var gp = Math.floor(value);
|
|
||||||
if (gp > 0) {
|
if (gp > 0) {
|
||||||
resultArray.push(gp + "gp");
|
resultArray.push(gp + "gp");
|
||||||
}
|
}
|
||||||
//sp
|
|
||||||
var sp = Math.floor(10 * (value % 1));
|
|
||||||
if (sp > 0) {
|
if (sp > 0) {
|
||||||
resultArray.push(sp + "sp");
|
resultArray.push(sp + "sp");
|
||||||
}
|
}
|
||||||
//cp
|
|
||||||
var cp = 10 * ((value * 10) % 1);
|
|
||||||
cp = Math.round(cp * 1000) / 1000;
|
|
||||||
if (cp > 0) {
|
if (cp > 0) {
|
||||||
resultArray.push(cp + "cp");
|
resultArray.push(cp + "cp");
|
||||||
}
|
}
|
||||||
|
|
||||||
//build string with correct spacing
|
//build string with correct spacing
|
||||||
var result = "";
|
var result = "";
|
||||||
for (var i = 0; i < resultArray.length; i++) {
|
for (var i = 0, l = resultArray.length; i < l; i++) {
|
||||||
//add a space between values
|
//add a space between values
|
||||||
if (i !== 0) {
|
if (i !== 0) {
|
||||||
result += " ";
|
result += " ";
|
||||||
|
|||||||
96
rpg-docs/client/style/cards.scss
Normal file
96
rpg-docs/client/style/cards.scss
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
@import "bourbon/bourbon";
|
||||||
|
|
||||||
|
$thickColumnWidth: 304px;
|
||||||
|
$thinColumnWidth: 240px;
|
||||||
|
|
||||||
|
//Column layouts of cards
|
||||||
|
.column-container {
|
||||||
|
@include column-fill(balance);
|
||||||
|
@include column-gap(8px);
|
||||||
|
@include column-width($thickColumnWidth);
|
||||||
|
padding: 8px;
|
||||||
|
|
||||||
|
&.thin-columns {
|
||||||
|
@include column-count(4);
|
||||||
|
@include column-width($thinColumnWidth);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Cards
|
||||||
|
.card {
|
||||||
|
background: white;
|
||||||
|
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 {
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 16px;
|
||||||
|
border-radius: 2px 2px 0 0;
|
||||||
|
&.white {
|
||||||
|
cursor: auto;
|
||||||
|
padding: 16px;
|
||||||
|
border-bottom: rgba(0,0,0,0.12) solid 1px;
|
||||||
|
}
|
||||||
|
paper-checkbox::shadow #ink[checked] {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
paper-checkbox::shadow #ink {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
paper-checkbox::shadow #checkbox.checked {
|
||||||
|
background-color: #ffffff;
|
||||||
|
background-color: rgba(255,255,255,0.27);
|
||||||
|
border-color: #ffffff;
|
||||||
|
border-color: rgba(255,255,255,0.27);
|
||||||
|
}
|
||||||
|
paper-checkbox::shadow #checkbox {
|
||||||
|
border-color: #ffffff;
|
||||||
|
border-color: rgba(255,255,255,0.54);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.bottom {
|
||||||
|
padding: 16px;
|
||||||
|
border-radius: 0 0 2px 2px;
|
||||||
|
&.list {
|
||||||
|
padding: 0 0 16px 0;
|
||||||
|
.subhead {
|
||||||
|
color: rgba(0,0,0,0.54);
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
letter-spacing: 0.010em;
|
||||||
|
padding: 12px 16px 12px 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.text {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.left {
|
||||||
|
padding: 16px;
|
||||||
|
border-radius: 2px 0 0 2px;
|
||||||
|
text-align: center;
|
||||||
|
min-width: 72px;
|
||||||
|
}
|
||||||
|
.right {
|
||||||
|
padding: 16px;
|
||||||
|
border-radius: 0 2px 2px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* undo pointer cursor on detail box heading */
|
||||||
|
#globalDetail.card .top {
|
||||||
|
cursor: auto;
|
||||||
|
}
|
||||||
@@ -70,8 +70,8 @@
|
|||||||
background-color: #9E9E9E;
|
background-color: #9E9E9E;
|
||||||
}
|
}
|
||||||
|
|
||||||
.blue-grey {
|
.app-grey {
|
||||||
background-color: #607D8B;
|
background-color: #424242;
|
||||||
}
|
}
|
||||||
|
|
||||||
.white {
|
.white {
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
@import "bourbon/bourbon";
|
@import "bourbon/bourbon";
|
||||||
@import "colors";
|
@import "colors";
|
||||||
|
|
||||||
$thickColumnWidth: 304px;
|
|
||||||
$thinColumnWidth: 240px;
|
|
||||||
|
|
||||||
//apply a natural box layout model to all elements
|
//apply a natural box layout model to all elements
|
||||||
*, *:before, *:after {
|
*, *:before, *:after {
|
||||||
-moz-box-sizing: border-box;
|
-moz-box-sizing: border-box;
|
||||||
@@ -22,6 +19,16 @@ body {
|
|||||||
background-color: #E0E0E0;
|
background-color: #E0E0E0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//fix tabs and core-toolbar having box shadow
|
||||||
|
core-toolbar {
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
//give drawer panel a shadow always
|
||||||
|
core-header-panel[drawer] {
|
||||||
|
box-shadow: 2px 0px 5px 0px rgba(0,0,0,0.2);
|
||||||
|
}
|
||||||
|
|
||||||
//Horizontal rule
|
//Horizontal rule
|
||||||
hr {
|
hr {
|
||||||
background-color: #444;
|
background-color: #444;
|
||||||
@@ -41,93 +48,6 @@ hr {
|
|||||||
right: 24px;
|
right: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Column layouts of cards
|
|
||||||
.column-container {
|
|
||||||
@include column-fill(balance);
|
|
||||||
@include column-gap(8px);
|
|
||||||
@include column-width($thickColumnWidth);
|
|
||||||
padding: 8px;
|
|
||||||
|
|
||||||
&.thin-columns {
|
|
||||||
@include column-count(4);
|
|
||||||
@include column-width($thinColumnWidth);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Cards
|
|
||||||
.card {
|
|
||||||
background: white;
|
|
||||||
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 {
|
|
||||||
cursor: pointer;
|
|
||||||
padding: 16px;
|
|
||||||
border-radius: 2px 2px 0 0;
|
|
||||||
&.white {
|
|
||||||
cursor: auto;
|
|
||||||
padding: 16px;
|
|
||||||
border-bottom: rgba(0,0,0,0.12) solid 1px;
|
|
||||||
}
|
|
||||||
paper-checkbox::shadow #ink[checked] {
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
paper-checkbox::shadow #ink {
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
paper-checkbox::shadow #checkbox.checked {
|
|
||||||
background-color: #ffffff;
|
|
||||||
background-color: rgba(255,255,255,0.27);
|
|
||||||
border-color: #ffffff;
|
|
||||||
border-color: rgba(255,255,255,0.27);
|
|
||||||
}
|
|
||||||
paper-checkbox::shadow #checkbox {
|
|
||||||
border-color: #ffffff;
|
|
||||||
border-color: rgba(255,255,255,0.54);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.bottom {
|
|
||||||
padding: 16px;
|
|
||||||
border-radius: 0 0 2px 2px;
|
|
||||||
&.list {
|
|
||||||
padding: 0 0 16px 0;
|
|
||||||
.subhead {
|
|
||||||
color: rgba(0,0,0,0.54);
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 500;
|
|
||||||
letter-spacing: 0.010em;
|
|
||||||
padding: 12px 16px 12px 16px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.text {
|
|
||||||
white-space: pre-wrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.left {
|
|
||||||
padding: 16px;
|
|
||||||
border-radius: 2px 0 0 2px;
|
|
||||||
text-align: center;
|
|
||||||
min-width: 72px;
|
|
||||||
}
|
|
||||||
.right {
|
|
||||||
padding: 16px;
|
|
||||||
border-radius: 0 2px 2px 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Buttons
|
//Buttons
|
||||||
paper-button {
|
paper-button {
|
||||||
color: #000;
|
color: #000;
|
||||||
@@ -146,3 +66,19 @@ paper-button {
|
|||||||
.clickable, core-item, paper-tab {
|
.clickable, core-item, paper-tab {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.pre-wrap, .prewrap{
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.padded {
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fullwidth {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fab-buffer {
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
|||||||
24
rpg-docs/client/style/tables.scss
Normal file
24
rpg-docs/client/style/tables.scss
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
td {
|
||||||
|
padding: 8px;
|
||||||
|
&:nth-child(1) {
|
||||||
|
min-width: 100px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.strengthTable{
|
||||||
|
width: 100%;
|
||||||
|
td{
|
||||||
|
&:nth-child(2) {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
&:nth-child(3) {
|
||||||
|
width: 250px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.summaryTable {
|
||||||
|
&:nth-child(3){
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,21 +15,11 @@
|
|||||||
value={{details}}></paper-input>
|
value={{details}}></paper-input>
|
||||||
</div>
|
</div>
|
||||||
<div layout horizontal>
|
<div layout horizontal>
|
||||||
<!--DamageType-->
|
|
||||||
<paper-dropdown-menu id="damageDiceDropdown" label="Damage Dice">
|
|
||||||
<paper-dropdown layered class="dropdown">
|
|
||||||
<core-menu class="menu" selected={{damageDice}}>
|
|
||||||
{{#each DAMAGE_DICE}}
|
|
||||||
<paper-item name={{this}} class="containerMenuItem">{{this}}</paper-item>
|
|
||||||
{{/each}}
|
|
||||||
</core-menu>
|
|
||||||
</paper-dropdown>
|
|
||||||
</paper-dropdown-menu>
|
|
||||||
<!--damageBonus-->
|
<!--damageBonus-->
|
||||||
<paper-input id="damageInput"
|
<paper-input id="damageInput"
|
||||||
label="Damage Bonus"
|
label="Damage"
|
||||||
floatinglabel
|
floatinglabel
|
||||||
value={{damageBonus}}
|
value={{damage}}
|
||||||
flex></paper-input>
|
flex></paper-input>
|
||||||
<!--DamageType-->
|
<!--DamageType-->
|
||||||
<paper-dropdown-menu id="damageTypeDropdown" label="Damage Type">
|
<paper-dropdown-menu id="damageTypeDropdown" label="Damage Type">
|
||||||
|
|||||||
@@ -1,6 +1,18 @@
|
|||||||
var damageTypes = ["bludgeoning", "piercing", "slashing",
|
var damageTypes = [
|
||||||
"acid", "cold", "fire", "force", "lightning", "necrotic",
|
"bludgeoning",
|
||||||
"poison", "psychic", "radiant", "thunder"];
|
"piercing",
|
||||||
|
"slashing",
|
||||||
|
"acid",
|
||||||
|
"cold",
|
||||||
|
"fire",
|
||||||
|
"force",
|
||||||
|
"lightning",
|
||||||
|
"necrotic",
|
||||||
|
"poison",
|
||||||
|
"psychic",
|
||||||
|
"radiant",
|
||||||
|
"thunder",
|
||||||
|
];
|
||||||
|
|
||||||
Template.attackEdit.events({
|
Template.attackEdit.events({
|
||||||
"tap #deleteAttack": function(event, instance) {
|
"tap #deleteAttack": function(event, instance) {
|
||||||
@@ -13,7 +25,7 @@ Template.attackEdit.events({
|
|||||||
},
|
},
|
||||||
"change #damageInput": function(event) {
|
"change #damageInput": function(event) {
|
||||||
var value = event.currentTarget.value;
|
var value = event.currentTarget.value;
|
||||||
Attacks.update(this._id, {$set: {damageBonus: 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;
|
||||||
@@ -26,13 +38,6 @@ Template.attackEdit.events({
|
|||||||
if (value == this.damageType) return;
|
if (value == this.damageType) return;
|
||||||
Attacks.update(this._id, {$set: {damageType: value}});
|
Attacks.update(this._id, {$set: {damageType: value}});
|
||||||
},
|
},
|
||||||
"core-select #damageDiceDropdown": function(event) {
|
|
||||||
var detail = event.originalEvent.detail;
|
|
||||||
if (!detail.isSelected) return;
|
|
||||||
var value = detail.item.getAttribute("name");
|
|
||||||
if (value == this.damageDice) return;
|
|
||||||
Attacks.update(this._id, {$set: {damageDice: value}});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.attackEdit.helpers({
|
Template.attackEdit.helpers({
|
||||||
@@ -41,5 +46,5 @@ Template.attackEdit.helpers({
|
|||||||
},
|
},
|
||||||
DAMAGE_DICE: function() {
|
DAMAGE_DICE: function() {
|
||||||
return DAMAGE_DICE;
|
return DAMAGE_DICE;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
<template name="attackView">
|
<template name="attackView">
|
||||||
<div class="attackView" layout horizontal>
|
<div class="attackView" layout horizontal>
|
||||||
<div class="headline rightPadded" layout horizontal center>
|
<div class="headline" style="margin-right: 16px;" layout horizontal center>
|
||||||
{{evaluateSigned charId attackBonus}}
|
{{evaluateSigned charId attackBonus}}
|
||||||
</div>
|
</div>
|
||||||
<div layout vertical>
|
<div layout vertical>
|
||||||
<div>
|
<div>
|
||||||
{{damageDice}} {{{evaluateSignedSpaced charId damageBonus}}} {{damageType}}
|
{{evaluateString charId damage}} {{damageType}}
|
||||||
</div>
|
</div>
|
||||||
{{#if details}}
|
{{#if details}}
|
||||||
<div class="caption">
|
<div class="caption">
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<template name="buffDialog">
|
||||||
|
{{#with buff}}
|
||||||
|
{{#baseDialog title=name class=colorClass hideEdit=true}}
|
||||||
|
{{> buffDetails}}
|
||||||
|
{{/baseDialog}}
|
||||||
|
{{/with}}
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template name="buffDetails">
|
||||||
|
{{#if description}}
|
||||||
|
<div class="pre-wrap">{{evaluateString charId description}}</div>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{> effectsViewList charId=charId parentId=_id}}
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
Template.buffDialog.helpers({
|
||||||
|
buff: function(){
|
||||||
|
return Buffs.findOne(this.buffId);
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -1,3 +1,27 @@
|
|||||||
<template name="characterSettings">
|
<template name="characterSettings">
|
||||||
|
{{#with character}}
|
||||||
|
<div style="height: 100px;">
|
||||||
|
<table style="width: 100%;">
|
||||||
|
<tr>
|
||||||
|
<td>Hide Spells tab</td>
|
||||||
|
<td>
|
||||||
|
<paper-toggle-button id="hideSpellcasting"
|
||||||
|
checked={{settings.hideSpellcasting}}
|
||||||
|
touch-action="pan-y">
|
||||||
|
</paper-toggle-button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Use variant encumbrance</td>
|
||||||
|
<td>
|
||||||
|
<paper-toggle-button id="variantEncumbrance"
|
||||||
|
checked={{settings.useVariantEncumbrance}}
|
||||||
|
touch-action="pan-y">
|
||||||
|
</paper-toggle-button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{{/with}}
|
||||||
|
<paper-button id="doneButton" affirmative> Done </paper-button>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,3 +1,26 @@
|
|||||||
Template.characterSettings.events({
|
Template.characterSettings.helpers({
|
||||||
|
character: function() {
|
||||||
|
return Characters.findOne(this._id, {fields: {settings: 1}});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.characterSettings.events({
|
||||||
|
"change #variantEncumbrance": function(event, instance){
|
||||||
|
var value = instance.find("#variantEncumbrance").checked;
|
||||||
|
if (this.settings.useVariantEncumbrance !== value){
|
||||||
|
Characters.update(
|
||||||
|
this._id,
|
||||||
|
{$set: {"settings.useVariantEncumbrance": value}}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"change #hideSpellcasting": function(event, instance){
|
||||||
|
var value = instance.find("#hideSpellcasting").checked;
|
||||||
|
if (this.settings.hideSpellcasting !== value){
|
||||||
|
Characters.update(
|
||||||
|
this._id,
|
||||||
|
{$set: {"settings.hideSpellcasting": value}}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,17 @@
|
|||||||
<template name="shareDialog">
|
<template name="shareDialog">
|
||||||
<div style="width: 360px;">
|
<div style="width: 360px;">
|
||||||
|
<div layout horizontal center>
|
||||||
|
<div>Who can view this character: </div>
|
||||||
|
<paper-dropdown-menu class="visibilityDropdown"
|
||||||
|
label="Visibility">
|
||||||
|
<paper-dropdown layered class="dropdown">
|
||||||
|
<core-menu class="menu visibilityMenu" selected={{viewPermission}}>
|
||||||
|
<paper-item name="whitelist">Only people I share with</paper-item>
|
||||||
|
<paper-item name="public">Anyone with link</paper-item>
|
||||||
|
</core-menu>
|
||||||
|
</paper-dropdown>
|
||||||
|
</paper-dropdown-menu>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{{#if readers.count}}
|
{{#if readers.count}}
|
||||||
<div style="font-weight: 500;">
|
<div style="font-weight: 500;">
|
||||||
@@ -7,7 +19,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{{#each readers}}
|
{{#each readers}}
|
||||||
<div layout horizontal center>
|
<div layout horizontal center>
|
||||||
<div flex>{{username}}</div>
|
<div flex>{{getUserName}}</div>
|
||||||
<paper-icon-button class="deleteShare" icon="delete"></paper-icon-button>
|
<paper-icon-button class="deleteShare" icon="delete"></paper-icon-button>
|
||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
|||||||
@@ -3,6 +3,10 @@ Template.shareDialog.onCreated(function(){
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.shareDialog.helpers({
|
Template.shareDialog.helpers({
|
||||||
|
viewPermission: function() {
|
||||||
|
var char = Characters.findOne(this._id, {fields: {settings: 1}});
|
||||||
|
return char.settings.viewPermission || "whitelist";
|
||||||
|
},
|
||||||
readers: function(){
|
readers: function(){
|
||||||
var char = Characters.findOne(this._id, {fields: {readers: 1}});
|
var char = Characters.findOne(this._id, {fields: {readers: 1}});
|
||||||
return Meteor.users.find({_id: {$in: char.readers}});
|
return Meteor.users.find({_id: {$in: char.readers}});
|
||||||
@@ -19,9 +23,20 @@ Template.shareDialog.helpers({
|
|||||||
return "User not found";
|
return "User not found";
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
getUserName: function() {
|
||||||
|
return this.username || "user: " + this._id;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.shareDialog.events({
|
Template.shareDialog.events({
|
||||||
|
"core-select .visibilityDropdown": function(event){
|
||||||
|
var detail = event.originalEvent.detail;
|
||||||
|
if (!detail.isSelected) return;
|
||||||
|
var value = detail.item.getAttribute("name");
|
||||||
|
var char = Characters.findOne(this._id, {fields: {settings: 1}});
|
||||||
|
if (value == char.settings.viewPermission) return;
|
||||||
|
Characters.update(this._id, {$set: {"settings.viewPermission": value}});
|
||||||
|
},
|
||||||
"input #userNameOrEmailInput":
|
"input #userNameOrEmailInput":
|
||||||
function(event, instance){
|
function(event, instance){
|
||||||
var userName = instance.find("#userNameOrEmailInput").value;
|
var userName = instance.find("#userNameOrEmailInput").value;
|
||||||
|
|||||||
@@ -19,6 +19,9 @@
|
|||||||
<paper-item id="shareCharacter">
|
<paper-item id="shareCharacter">
|
||||||
<core-icon icon="social:share"></core-icon>Share
|
<core-icon icon="social:share"></core-icon>Share
|
||||||
</paper-item>
|
</paper-item>
|
||||||
|
<paper-item id="characterSettings">
|
||||||
|
<core-icon icon="settings"></core-icon>Settings
|
||||||
|
</paper-item>
|
||||||
</core-menu>
|
</core-menu>
|
||||||
</paper-dropdown>
|
</paper-dropdown>
|
||||||
</paper-menu-button>
|
</paper-menu-button>
|
||||||
@@ -28,7 +31,9 @@
|
|||||||
<paper-tab name="stats">Stats</paper-tab>
|
<paper-tab name="stats">Stats</paper-tab>
|
||||||
<paper-tab name="features">Features</paper-tab>
|
<paper-tab name="features">Features</paper-tab>
|
||||||
<paper-tab name="inventory">Inventory</paper-tab>
|
<paper-tab name="inventory">Inventory</paper-tab>
|
||||||
|
{{#unless hideSpellcasting}}
|
||||||
<paper-tab name="spells">Spells</paper-tab>
|
<paper-tab name="spells">Spells</paper-tab>
|
||||||
|
{{/unless}}
|
||||||
<paper-tab name="persona">Persona</paper-tab>
|
<paper-tab name="persona">Persona</paper-tab>
|
||||||
<paper-tab name="journal">Journal</paper-tab>
|
<paper-tab name="journal">Journal</paper-tab>
|
||||||
</paper-tabs>
|
</paper-tabs>
|
||||||
@@ -39,7 +44,9 @@
|
|||||||
<section flex name="stats">{{> stats}}</section>
|
<section flex name="stats">{{> stats}}</section>
|
||||||
<section flex name="features">{{> features}}</section>
|
<section flex name="features">{{> features}}</section>
|
||||||
<section flex name="inventory">{{> inventory}}</section>
|
<section flex name="inventory">{{> inventory}}</section>
|
||||||
|
{{#unless hideSpellcasting}}
|
||||||
<section flex name="spells">{{> spells}}</section>
|
<section flex name="spells">{{> spells}}</section>
|
||||||
|
{{/unless}}
|
||||||
<section flex name="persona">{{> persona}}</section>
|
<section flex name="persona">{{> persona}}</section>
|
||||||
<section flex name="journal">{{> journal}}</section>
|
<section flex name="journal">{{> journal}}</section>
|
||||||
</core-animated-pages>
|
</core-animated-pages>
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
Template.characterSheet.created = function(){
|
Template.characterSheet.onCreated(function() {
|
||||||
|
//default to the first tab
|
||||||
Session.setDefault(this.data._id + ".selectedTab", "stats");
|
Session.setDefault(this.data._id + ".selectedTab", "stats");
|
||||||
};
|
//watch this character and make sure their encumbrance is updated
|
||||||
|
trackEncumbranceConditions(this.data._id, this);
|
||||||
|
});
|
||||||
|
|
||||||
var setTab = function(charId, tab){
|
var setTab = function(charId, tab){
|
||||||
return Session.set(charId + ".selectedTab", tab);
|
return Session.set(charId + ".selectedTab", tab);
|
||||||
@@ -14,6 +17,10 @@ Template.characterSheet.helpers({
|
|||||||
selectedTab: function(){
|
selectedTab: function(){
|
||||||
return getTab(this._id);
|
return getTab(this._id);
|
||||||
},
|
},
|
||||||
|
hideSpellcasting: function() {
|
||||||
|
var char = Characters.findOne(this._id);
|
||||||
|
return char && char.settings.hideSpellcasting;
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.characterSheet.events({
|
Template.characterSheet.events({
|
||||||
@@ -40,4 +47,11 @@ Template.characterSheet.events({
|
|||||||
template: "shareDialog",
|
template: "shareDialog",
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
"tap #characterSettings": function(event, instance){
|
||||||
|
GlobalUI.showDialog({
|
||||||
|
heading: this.name + " Settings",
|
||||||
|
data: this,
|
||||||
|
template: "characterSettings",
|
||||||
|
});
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,21 +1,13 @@
|
|||||||
body /deep/ #statGroupDropDown {
|
html /deep/ .operationDropDown {
|
||||||
width: 120px;
|
width: 152px;
|
||||||
}
|
}
|
||||||
|
|
||||||
body /deep/ #statDropDown {
|
html /deep/ .statDropDown {
|
||||||
width: 120px;
|
width: 152px;
|
||||||
}
|
}
|
||||||
|
|
||||||
body /deep/ #operationDropDown {
|
html /deep/ .damageMultiplierDropDown {
|
||||||
width: 100px;
|
width: 152px;
|
||||||
}
|
|
||||||
|
|
||||||
body /deep/ #damageMultiplierDropDown {
|
|
||||||
width: 120px;
|
|
||||||
}
|
|
||||||
|
|
||||||
body /deep/ #proficiencyDropDown {
|
|
||||||
width: 120px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
html /deep/ .effectEdit paper-input {
|
html /deep/ .effectEdit paper-input {
|
||||||
@@ -24,6 +16,7 @@ html /deep/ .effectEdit paper-input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
html /deep/ .effectEdit {
|
html /deep/ .effectEdit {
|
||||||
|
height: 64px;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: flex-end;
|
align-items: flex-end;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,23 @@
|
|||||||
<template name="effectEdit">
|
<template name="effectEdit">
|
||||||
<div class="effectEdit" layout horizontal center>
|
<div class="effectEdit" layout horizontal center>
|
||||||
<paper-dropdown-menu class="statGroupDropDown" label="Stat Group" flex>
|
<paper-dropdown-menu class="statDropDown"
|
||||||
<paper-dropdown layered class="dropdown">
|
label="Stat">
|
||||||
<core-menu class="menu statGroupMenu" selected={{selectedStatGroup}}>
|
<paper-dropdown layered
|
||||||
{{#each statGroups}}
|
class="dropdown">
|
||||||
<paper-item class="statGroupSelect" name={{this}}>{{this}}</paper-item>
|
<core-menu class="menu statMenu" selected={{stat}}>
|
||||||
{{/each}}
|
{{#each statGroups}}
|
||||||
</core-menu>
|
<div style="font-weight: bold;
|
||||||
</paper-dropdown>
|
margin-top: 16px;">{{this}}</div>
|
||||||
</paper-dropdown-menu>
|
{{#each stats}}
|
||||||
{{#if stats}}
|
<paper-item name={{stat}}>{{name}}</paper-item>
|
||||||
<paper-dropdown-menu class="statDropDown" label="Stat" flex>
|
{{/each}}
|
||||||
<paper-dropdown layered class="dropdown">
|
|
||||||
<core-menu class="menu statMenu" selected={{stat}} on-tap="onStatMenuTap">
|
|
||||||
{{#each stats}}
|
|
||||||
<paper-item name={{stat}}>{{name}}</paper-item>
|
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</core-menu>
|
</core-menu>
|
||||||
</paper-dropdown>
|
</paper-dropdown>
|
||||||
</paper-dropdown-menu>
|
</paper-dropdown-menu>
|
||||||
{{/if}}
|
|
||||||
{{#if operations}}
|
{{#if operations}}
|
||||||
<paper-dropdown-menu class="operationDropDown" label="Operation" flex>
|
<paper-dropdown-menu class="operationDropDown"
|
||||||
|
label="Operation">
|
||||||
<paper-dropdown layered class="dropdown">
|
<paper-dropdown layered class="dropdown">
|
||||||
<core-menu class="menu operationMenu" selected={{operation}}>
|
<core-menu class="menu operationMenu" selected={{operation}}>
|
||||||
{{#each operations}}
|
{{#each operations}}
|
||||||
@@ -31,24 +27,39 @@
|
|||||||
</paper-dropdown>
|
</paper-dropdown>
|
||||||
</paper-dropdown-menu>
|
</paper-dropdown-menu>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{> Template.dynamic template=effectValueTemplate}}
|
{{#if effectValueTemplate}}
|
||||||
<paper-icon-button class="deleteEffect" role="button" tabindex="0" icon="delete" aria-label="Delete"></paper-icon-button>
|
{{> Template.dynamic template=effectValueTemplate}}
|
||||||
|
{{else}}
|
||||||
|
<div flex></div>
|
||||||
|
{{/if}}
|
||||||
|
<paper-icon-button class="deleteEffect"
|
||||||
|
icon="delete">
|
||||||
|
</paper-icon-button>
|
||||||
<br>
|
<br>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="regularEffectValue">
|
<template name="regularEffectValue">
|
||||||
<paper-input class="effectValueInput" label="Value" floatinglabel value={{effectValue}} flex></paper-input>
|
<paper-input class="effectValueInput"
|
||||||
|
label="Value"
|
||||||
|
floatinglabel
|
||||||
|
value={{effectValue}}
|
||||||
|
flex>
|
||||||
|
</paper-input>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="multiplierEffectValue">
|
<template name="multiplierEffectValue">
|
||||||
<paper-dropdown-menu class="damageMultiplierDropDown" label="Damage Multiplier" flex>
|
<paper-dropdown-menu class="damageMultiplierDropDown"
|
||||||
<paper-dropdown layered class="dropdown">
|
label="Damage Multiplier">
|
||||||
<core-menu class="menu multiplierMenu" selected={{value}}>
|
<paper-dropdown layered
|
||||||
|
class="dropdown">
|
||||||
|
<core-menu class="menu multiplierMenu"
|
||||||
|
selected={{value}}>
|
||||||
<paper-item name="0.5">Resistance</paper-item>
|
<paper-item name="0.5">Resistance</paper-item>
|
||||||
<paper-item name="2">Vulnerability</paper-item>
|
<paper-item name="2">Vulnerability</paper-item>
|
||||||
<paper-item name="0">Immunity</paper-item>
|
<paper-item name="0">Immunity</paper-item>
|
||||||
</core-menu>
|
</core-menu>
|
||||||
</paper-dropdown>
|
</paper-dropdown>
|
||||||
</paper-dropdown-menu>
|
</paper-dropdown-menu>
|
||||||
|
<div flex></div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -93,24 +93,17 @@ var skillOperations = [
|
|||||||
{name: "Conditional Benefit", operation: "conditional"}
|
{name: "Conditional Benefit", operation: "conditional"}
|
||||||
];
|
];
|
||||||
|
|
||||||
Template.effectEdit.created = function(){
|
|
||||||
var statGroup = statsDict[this.data.stat] && statsDict[this.data.stat].group;
|
|
||||||
this.selectedStatGroup = new ReactiveVar(statGroup);
|
|
||||||
};
|
|
||||||
|
|
||||||
Template.effectEdit.helpers({
|
Template.effectEdit.helpers({
|
||||||
selectedStatGroup: function(){
|
|
||||||
return Template.instance().selectedStatGroup.get();
|
|
||||||
},
|
|
||||||
statGroups: function(){
|
statGroups: function(){
|
||||||
return statGroupNames;
|
return statGroupNames;
|
||||||
},
|
},
|
||||||
stats: function(){
|
stats: function(){
|
||||||
var group = Template.instance().selectedStatGroup.get();
|
var group = this;
|
||||||
return statGroups[group];
|
return statGroups[group];
|
||||||
},
|
},
|
||||||
operations: function(){
|
operations: function(){
|
||||||
var group = Template.instance().selectedStatGroup.get();
|
var stat = statsDict[this.stat];
|
||||||
|
var group = stat && stat.group;
|
||||||
if (group === "Weakness/Resistance") return null;
|
if (group === "Weakness/Resistance") return null;
|
||||||
if (group === "Saving Throws" || group === "Skills"){
|
if (group === "Saving Throws" || group === "Skills"){
|
||||||
return skillOperations;
|
return skillOperations;
|
||||||
@@ -120,7 +113,8 @@ Template.effectEdit.helpers({
|
|||||||
},
|
},
|
||||||
effectValueTemplate: function(){
|
effectValueTemplate: function(){
|
||||||
//resistance/vulnerability template
|
//resistance/vulnerability template
|
||||||
var group = Template.instance().selectedStatGroup.get();
|
var stat = statsDict[this.stat];
|
||||||
|
var group = stat && stat.group;
|
||||||
if (group === "Weakness/Resistance") return "multiplierEffectValue";
|
if (group === "Weakness/Resistance") return "multiplierEffectValue";
|
||||||
|
|
||||||
var op = this.operation;
|
var op = this.operation;
|
||||||
@@ -144,25 +138,6 @@ Template.effectEdit.events({
|
|||||||
Effects.softRemoveNode(this._id);
|
Effects.softRemoveNode(this._id);
|
||||||
GlobalUI.deletedToast(this._id, "Effects", "Effect");
|
GlobalUI.deletedToast(this._id, "Effects", "Effect");
|
||||||
},
|
},
|
||||||
"core-select .statGroupDropDown": function(event, instance){
|
|
||||||
var detail = event.originalEvent.detail;
|
|
||||||
if (!detail.isSelected) return;
|
|
||||||
var groupName = detail.item.getAttribute("name");
|
|
||||||
var oldName = Template.instance().selectedStatGroup.get();
|
|
||||||
if (oldName != groupName){
|
|
||||||
instance.selectedStatGroup.set(groupName);
|
|
||||||
if (groupName === "Weakness/Resistance"){
|
|
||||||
Effects.update(this._id, {$set: {
|
|
||||||
value: 0.5,
|
|
||||||
calculation: "",
|
|
||||||
operation: "mul"}, $unset: {stat: ""}});
|
|
||||||
} else {
|
|
||||||
Effects.update(this._id,
|
|
||||||
{$set: {operation: "add"},
|
|
||||||
$unset: {stat: "", value: "", calculation: ""}});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"core-select .statDropDown": function(event){
|
"core-select .statDropDown": function(event){
|
||||||
var detail = event.originalEvent.detail;
|
var detail = event.originalEvent.detail;
|
||||||
if (!detail.isSelected) return;
|
if (!detail.isSelected) return;
|
||||||
|
|||||||
@@ -57,40 +57,40 @@ var stats = {
|
|||||||
"d12HitDice":{"name":"d12 Hit Dice"},
|
"d12HitDice":{"name":"d12 Hit Dice"},
|
||||||
"acidMultiplier":{"name":"Acid damage", "group": "Weakness/Resistance"},
|
"acidMultiplier":{"name":"Acid damage", "group": "Weakness/Resistance"},
|
||||||
"bludgeoningMultiplier":{
|
"bludgeoningMultiplier":{
|
||||||
"name":"Bludgeoning damage", "group": "Weakness/Resistance"
|
"name":"Bludgeoning damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"coldMultiplier":{
|
"coldMultiplier":{
|
||||||
"name":"Cold damage", "group": "Weakness/Resistance"
|
"name":"Cold damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"fireMultiplier":{
|
"fireMultiplier":{
|
||||||
"name":"Fire damage", "group": "Weakness/Resistance"
|
"name":"Fire damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"forceMultiplier":{
|
"forceMultiplier":{
|
||||||
"name":"Force damage", "group": "Weakness/Resistance"
|
"name":"Force damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"lightningMultiplier":{
|
"lightningMultiplier":{
|
||||||
"name":"Lightning damage", "group": "Weakness/Resistance"
|
"name":"Lightning damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"necroticMultiplier":{
|
"necroticMultiplier":{
|
||||||
"name":"Necrotic damage", "group": "Weakness/Resistance"
|
"name":"Necrotic damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"piercingMultiplier":{
|
"piercingMultiplier":{
|
||||||
"name":"Piercing damage", "group": "Weakness/Resistance"
|
"name":"Piercing damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"poisonMultiplier":{
|
"poisonMultiplier":{
|
||||||
"name":"Poison damage", "group": "Weakness/Resistance"
|
"name":"Poison damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"psychicMultiplier":{
|
"psychicMultiplier":{
|
||||||
"name":"Psychic damage", "group": "Weakness/Resistance"
|
"name":"Psychic damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"radiantMultiplier":{
|
"radiantMultiplier":{
|
||||||
"name":"Radiant damage", "group": "Weakness/Resistance"
|
"name":"Radiant damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"slashingMultiplier":{
|
"slashingMultiplier":{
|
||||||
"name":"Slashing damage", "group": "Weakness/Resistance"
|
"name":"Slashing damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
"thunderMultiplier":{
|
"thunderMultiplier":{
|
||||||
"name":"Thunder damage", "group": "Weakness/Resistance"
|
"name":"Thunder damage", "group": "Weakness/Resistance",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -110,8 +110,8 @@ var operations = {
|
|||||||
Template.effectView.helpers({
|
Template.effectView.helpers({
|
||||||
sourceName: function(){
|
sourceName: function(){
|
||||||
var id = this.parent.id;
|
var id = this.parent.id;
|
||||||
if(!id) return;
|
if (!id) return;
|
||||||
switch(this.parent.collection){
|
switch (this.parent.collection){
|
||||||
case "Features":
|
case "Features":
|
||||||
return "Feature - " + Features.findOne(id, {fields: {name: 1}}).name;
|
return "Feature - " + Features.findOne(id, {fields: {name: 1}}).name;
|
||||||
case "Classes":
|
case "Classes":
|
||||||
@@ -130,33 +130,39 @@ Template.effectView.helpers({
|
|||||||
return stats[this.stat] && stats[this.stat].name || "No Stat";
|
return stats[this.stat] && stats[this.stat].name || "No Stat";
|
||||||
},
|
},
|
||||||
operationName: function(){
|
operationName: function(){
|
||||||
if(this.operation === "proficiency" ||
|
if (this.operation === "proficiency" ||
|
||||||
this.operation === "conditional") return null;
|
this.operation === "conditional") return null;
|
||||||
if(stats[this.stat].group === "Weakness/Resistance") return null;
|
if (stats[this.stat] && stats[this.stat].group === "Weakness/Resistance")
|
||||||
if(this.operation === "add" && evaluateEffect(this.charId, this) < 0) return null;
|
return null;
|
||||||
return operations[this.operation] && operations[this.operation].name || "No Operation";
|
if (this.operation === "add" && evaluateEffect(this.charId, this) < 0)
|
||||||
|
return null;
|
||||||
|
return operations[this.operation] &&
|
||||||
|
operations[this.operation].name || "No Operation";
|
||||||
},
|
},
|
||||||
statValue: function(){
|
statValue: function(){
|
||||||
if(this.operation === "advantage" ||
|
if (this.operation === "advantage" ||
|
||||||
this.operation === "disadvantage" ||
|
this.operation === "disadvantage" ||
|
||||||
this.operation === "fail"){
|
this.operation === "fail"){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if(this.operation === "proficiency"){
|
if (this.operation === "proficiency"){
|
||||||
if(this.value == 0.5 || this.calculation == 0.5) return "Half Proficiency";
|
if (this.value == 0.5 || this.calculation == 0.5)
|
||||||
if(this.value == 1 || this.calculation == 1) return "Proficiency";
|
return "Half Proficiency";
|
||||||
if(this.value == 2 || this.calculation == 2) return "Double Proficiency";
|
if (this.value == 1 || this.calculation == 1)
|
||||||
|
return "Proficiency";
|
||||||
|
if (this.value == 2 || this.calculation == 2)
|
||||||
|
return "Double Proficiency";
|
||||||
}
|
}
|
||||||
if(this.operation === "conditional"){
|
if (this.operation === "conditional"){
|
||||||
return this.calculation || this.value;
|
return this.calculation || this.value;
|
||||||
}
|
}
|
||||||
if(stats[this.stat].group === "Weakness/Resistance"){
|
if (stats[this.stat] && stats[this.stat].group === "Weakness/Resistance"){
|
||||||
if(this.value === 0.5) return "Resistance";
|
if (this.value === 0.5) return "Resistance";
|
||||||
if(this.value === 2) return "Vulnerability";
|
if (this.value === 2) return "Vulnerability";
|
||||||
if(this.value === 0) return "Immunity";
|
if (this.value === 0) return "Immunity";
|
||||||
}
|
}
|
||||||
var value = evaluateEffect(this.charId, this);
|
var value = evaluateEffect(this.charId, this);
|
||||||
if(_.isNumber(value)) return value;
|
if (_.isNumber(value)) return value;
|
||||||
return this.calculation || this.value;
|
return this.calculation || this.value;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{#if description}}
|
{{#if description}}
|
||||||
<div class="prewrap">{{description}}</div>
|
<div class="pre-wrap">{{evaluateString charId description}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{> effectsViewList charId=charId parentId=_id}}
|
{{> effectsViewList charId=charId parentId=_id}}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
{{name}}
|
{{name}}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{{damageDice}} {{{evaluateSignedSpaced ../_id damageBonus}}} {{damageType}}
|
{{evaluateString ../_id damage}} {{damageType}}
|
||||||
</div>
|
</div>
|
||||||
{{#if details}}
|
{{#if details}}
|
||||||
<div class="caption">
|
<div class="caption">
|
||||||
@@ -102,7 +102,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{{#if description}}
|
{{#if description}}
|
||||||
<div flex class="bottom text"
|
<div flex class="bottom text"
|
||||||
>{{description}}</div>
|
>{{evaluateString charId description}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if hasUses}}
|
{{#if hasUses}}
|
||||||
<div layout horizontal center end-justified>
|
<div layout horizontal center end-justified>
|
||||||
@@ -135,7 +135,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="resource">
|
<template name="resource">
|
||||||
{{#if char.attributeBase name}}
|
{{#if characterCalculate "attributeBase" char._id name}}
|
||||||
<paper-shadow class="card"
|
<paper-shadow class="card"
|
||||||
hero-id="main" {{detailHero name char._id}}
|
hero-id="main" {{detailHero name char._id}}
|
||||||
layout horizontal>
|
layout horizontal>
|
||||||
@@ -152,7 +152,7 @@
|
|||||||
disabled={{cantDecrement}}>
|
disabled={{cantDecrement}}>
|
||||||
</paper-icon-button>
|
</paper-icon-button>
|
||||||
</div>
|
</div>
|
||||||
<div>{{char.attributeValue 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"
|
||||||
|
|||||||
@@ -96,12 +96,14 @@ Template.features.events({
|
|||||||
|
|
||||||
Template.resource.helpers({
|
Template.resource.helpers({
|
||||||
cantIncrement: function(){
|
cantIncrement: function(){
|
||||||
var baseBigger = this.char.attributeValue(this.name) <
|
var value = Characters.calculate.attributeValue(this.char._id, this.name);
|
||||||
this.char.attributeBase(this.name);
|
var base = Characters.calculate.attributeBase(this.char._id, this.name);
|
||||||
|
var baseBigger = value < base;
|
||||||
return !baseBigger;
|
return !baseBigger;
|
||||||
},
|
},
|
||||||
cantDecrement: function(){
|
cantDecrement: function(){
|
||||||
var valuePositive = this.char.attributeValue(this.name) > 0;
|
var value = Characters.calculate.attributeValue(this.char._id, this.name);
|
||||||
|
var valuePositive = value > 0;
|
||||||
return !valuePositive;
|
return !valuePositive;
|
||||||
},
|
},
|
||||||
getColor: function(){
|
getColor: function(){
|
||||||
@@ -115,14 +117,17 @@ Template.resource.helpers({
|
|||||||
|
|
||||||
Template.resource.events({
|
Template.resource.events({
|
||||||
"tap .resourceUp": function(event){
|
"tap .resourceUp": function(event){
|
||||||
if (this.char.attributeValue(this.name) < this.char.attributeBase(this.name)){
|
var value = Characters.calculate.attributeValue(this.char._id, this.name);
|
||||||
|
var base = Characters.calculate.attributeBase(this.char._id, this.name);
|
||||||
|
if (value < base){
|
||||||
var modifier = {$inc: {}};
|
var modifier = {$inc: {}};
|
||||||
modifier.$inc[this.name + ".adjustment"] = 1;
|
modifier.$inc[this.name + ".adjustment"] = 1;
|
||||||
Characters.update(this.char._id, modifier, {validate: false});
|
Characters.update(this.char._id, modifier, {validate: false});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tap .resourceDown": function(event){
|
"tap .resourceDown": function(event){
|
||||||
if (this.char.attributeValue(this.name) > 0){
|
var value = Characters.calculate.attributeValue(this.char._id, this.name);
|
||||||
|
if (value > 0){
|
||||||
var modifier = {$inc: {}};
|
var modifier = {$inc: {}};
|
||||||
modifier.$inc[this.name + ".adjustment"] = -1;
|
modifier.$inc[this.name + ".adjustment"] = -1;
|
||||||
Characters.update(this.char._id, modifier, {validate: false});
|
Characters.update(this.char._id, modifier, {validate: false});
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
<template name="carryCapacityBar">
|
||||||
|
<div class="carryCapacityBar">
|
||||||
|
<div class="carriedWeightBar"
|
||||||
|
style="width: {{carriedPercent}}%;
|
||||||
|
background-color: {{carriedColor}}">
|
||||||
|
</div>
|
||||||
|
<div class="tick"
|
||||||
|
style="width: 33.333%;">
|
||||||
|
</div>
|
||||||
|
<div class="tick"
|
||||||
|
style="width: 66.666%;">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{#if overCarriedPercent}}
|
||||||
|
<div class="carryCapacityBar">
|
||||||
|
<div class="carriedWeightBar"
|
||||||
|
style="width: {{overCarriedPercent}}%;
|
||||||
|
background-color: {{overCarriedColor}}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
var getFractionCarried = function(char) {
|
||||||
|
//find out the weight
|
||||||
|
var weight = 0;
|
||||||
|
Containers.find(
|
||||||
|
{charId: char._id, isCarried: true}
|
||||||
|
).forEach(function(container){
|
||||||
|
weight += container.totalWeight();
|
||||||
|
});
|
||||||
|
Items.find(
|
||||||
|
{charId: char._id, "parent.id": char._id},
|
||||||
|
{fields: {weight : 1, quantity: 1}}
|
||||||
|
).forEach(function(item){
|
||||||
|
weight += item.totalWeight();
|
||||||
|
});
|
||||||
|
//get strength
|
||||||
|
var strength = Characters.calculate.attributeValue(char._id, "strength");
|
||||||
|
var capacity = strength * 15;
|
||||||
|
return weight / capacity;
|
||||||
|
};
|
||||||
|
|
||||||
|
Template.carryCapacityBar.onCreated(function() {
|
||||||
|
var self = this;
|
||||||
|
self.carriedFraction = new ReactiveVar(0);
|
||||||
|
self.autorun(function() {
|
||||||
|
self.carriedFraction.set(getFractionCarried(self.data));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.carryCapacityBar.helpers({
|
||||||
|
carriedPercent: function() {
|
||||||
|
var percent = 100 * Template.instance().carriedFraction.get();
|
||||||
|
return percent > 100 ? 100 : percent;
|
||||||
|
},
|
||||||
|
overCarriedPercent: function() {
|
||||||
|
var percent = 100 * Template.instance().carriedFraction.get();
|
||||||
|
var overPercent = percent - 100;
|
||||||
|
if (overPercent < 0) return 0;
|
||||||
|
if (overPercent > 100) return 100;
|
||||||
|
return overPercent;
|
||||||
|
},
|
||||||
|
carriedColor: function() {
|
||||||
|
var frac = Template.instance().carriedFraction.get();
|
||||||
|
if (frac < 1 / 3){
|
||||||
|
return "#2196F3";
|
||||||
|
} else if (frac < 2 / 3){
|
||||||
|
return "#CDDC39";
|
||||||
|
} else if (frac < 1) {
|
||||||
|
return "#FFC107";
|
||||||
|
} else {
|
||||||
|
return "#F44336";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
overCarriedColor: function() {
|
||||||
|
var frac = Template.instance().carriedFraction.get();
|
||||||
|
if (frac < 1 / 3){
|
||||||
|
return "#2196F3";
|
||||||
|
} else if (frac < 2 / 3){
|
||||||
|
return "#CDDC39";
|
||||||
|
} else if (frac < 1) {
|
||||||
|
return "#FFC107";
|
||||||
|
} else {
|
||||||
|
return "#F44336";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
.carryCapacityBar {
|
||||||
|
background-color: #7DC580;
|
||||||
|
background-color: rgba(255,255,255,0.27);
|
||||||
|
position: relative;
|
||||||
|
height: 4px;
|
||||||
|
div{
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
.tick {
|
||||||
|
border-right: solid 2px #E5E5E5;
|
||||||
|
border-right-color: rgba(255,255,255,0.54);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<template name="carryDialog">
|
||||||
|
{{#baseDialog title="Weight Carried" class=color hideEdit=true}}
|
||||||
|
<div layout horizontal center-justified end>
|
||||||
|
<div class="display2">
|
||||||
|
{{round carriedWeight 1}}
|
||||||
|
</div>
|
||||||
|
<div class="display1">
|
||||||
|
lbs
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr class="vertMargin">
|
||||||
|
|
||||||
|
{{> carryCapacityTable}}
|
||||||
|
|
||||||
|
{{/baseDialog}}
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
Template.carryDialog.helpers({
|
||||||
|
carriedWeight: function() {
|
||||||
|
var weight = 0;
|
||||||
|
Containers.find(
|
||||||
|
{charId: this.charId, isCarried: true}
|
||||||
|
).forEach(function(container){
|
||||||
|
weight += container.totalWeight();
|
||||||
|
});
|
||||||
|
Items.find(
|
||||||
|
{charId: this.charId, "parent.id": this.charId},
|
||||||
|
{fields: {weight : 1, quantity: 1}}
|
||||||
|
).forEach(function(item){
|
||||||
|
weight += item.totalWeight();
|
||||||
|
});
|
||||||
|
return weight;
|
||||||
|
},
|
||||||
|
color: function() {
|
||||||
|
if (this.color) return this.color + " white-text";
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -34,13 +34,13 @@
|
|||||||
<template name="containerView">
|
<template name="containerView">
|
||||||
<div layout horizontal wrap center justified>
|
<div layout horizontal wrap center justified>
|
||||||
<table class="summaryTable fullwidth">
|
<table class="summaryTable fullwidth">
|
||||||
<tr><td>Container</td><td>{{weight}}lbs</td><td>{{longValueString value}}</td></tr>
|
<tr><td>Container</td><td>{{round weight}}lbs</td><td>{{longValueString value}}</td></tr>
|
||||||
<tr><td>Contents</td><td>{{contentsWeight}}lbs</td><td>{{longValueString contentsValue}}</td></tr>
|
<tr><td>Contents</td><td>{{round contentsWeight}}lbs</td><td>{{longValueString contentsValue}}</td></tr>
|
||||||
<tr class="body2"><td>Total</td><td>{{totalWeight}}lbs</td><td>{{longValueString totalValue}}</td></tr>
|
<tr class="body2"><td>Total</td><td>{{round totalWeight}}lbs</td><td>{{longValueString totalValue}}</td></tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
{{#if description}}
|
{{#if description}}
|
||||||
<hr class="vertMargin">
|
<hr class="vertMargin">
|
||||||
<div class="prewrap">{{description}}</div>
|
<div class="pre-wrap">{{evaluateString charId description}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -3,22 +3,51 @@
|
|||||||
<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-->
|
||||||
<paper-shadow class="card" layout horizontal>
|
<paper-shadow class="card">
|
||||||
<div class="indigo white-text subhead left">
|
<div class="white top" layout horizontal center>
|
||||||
Net Worth
|
<div class="subhead" flex>
|
||||||
</div>
|
Net Worth
|
||||||
<div class="right" flex>
|
</div>
|
||||||
{{valueString netWorth}}
|
<div>
|
||||||
|
{{valueString netWorth}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
<!--Weight Carried-->
|
<!--Weight Carried-->
|
||||||
<paper-shadow class="card" layout horizontal>
|
<paper-shadow class="card"
|
||||||
<div class="green white-text subhead left">
|
hero-id="main" {{detailHero "weightCarried" _id}}>
|
||||||
Weight Carried
|
<div class="top green white-text weightCarried"
|
||||||
|
hero-id="toolbar" {{detailHero "weightCarried" _id}}
|
||||||
|
layout horizontal center>
|
||||||
|
<div class="subhead" flex>
|
||||||
|
Weight Carried
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{{round weightCarried}}lbs
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="right" flex>
|
<div class="bottom green" style="padding: 0;">
|
||||||
{{round weightCarried}}lbs
|
{{> carryCapacityBar}}
|
||||||
</div>
|
</div>
|
||||||
|
{{#if encumberedBuffs.count}}
|
||||||
|
<div class="bottom list">
|
||||||
|
{{#each encumberedBuffs}}
|
||||||
|
<div class="item-slot">
|
||||||
|
<div class="item buff"
|
||||||
|
hero-id="main" {{detailHero}}
|
||||||
|
layout horizontal center
|
||||||
|
draggable="true">
|
||||||
|
<div flex>
|
||||||
|
<core-icon icon="work"
|
||||||
|
style="margin-right: 16px">
|
||||||
|
</core-icon>
|
||||||
|
{{name}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
</paper-shadow>
|
</paper-shadow>
|
||||||
<!--Equipment-->
|
<!--Equipment-->
|
||||||
<paper-shadow class="card equipmentContainer">
|
<paper-shadow class="card equipmentContainer">
|
||||||
@@ -51,7 +80,7 @@
|
|||||||
<!--Carried Items-->
|
<!--Carried Items-->
|
||||||
<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">
|
<div class="subhead" flex>
|
||||||
Carried
|
Carried
|
||||||
</div>
|
</div>
|
||||||
<div class="caption" style="margin-right: 8px">
|
<div class="caption" style="margin-right: 8px">
|
||||||
@@ -100,32 +129,44 @@
|
|||||||
<div class="fab-buffer"></div>
|
<div class="fab-buffer"></div>
|
||||||
</div>
|
</div>
|
||||||
{{#if canEditCharacter _id}}
|
{{#if canEditCharacter _id}}
|
||||||
<paper-fab-menu id="inventoryAddMenu"
|
{{#fabMenu}}
|
||||||
icon="add"
|
<core-tooltip label="New container" position="left">
|
||||||
closeIcon="close"
|
<paper-fab icon="work"
|
||||||
duration="0.3">
|
class="addContainer"
|
||||||
<paper-fab-menu-item id="addItem"
|
mini>
|
||||||
icon="note-add"
|
</paper-fab>
|
||||||
color="#d23f31"
|
</core-tooltip>
|
||||||
tooltip="Item">
|
<core-tooltip label="New item" position="left">
|
||||||
</paper-fab-menu-item>
|
<paper-fab icon="note-add"
|
||||||
<paper-fab-menu-item id="addContainer"
|
class="addItem"
|
||||||
icon="work"
|
mini>
|
||||||
color="#d23f31"
|
</paper-fab>
|
||||||
tooltip="Container">
|
</core-tooltip>
|
||||||
</paper-fab-menu-item>
|
{{/fabMenu}}
|
||||||
</paper-fab-menu>
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="inventoryItem">
|
<template name="inventoryItem">
|
||||||
<div class="item-slot">
|
<div class="item-slot">
|
||||||
<paper-item class="item inventoryItem {{hidden}}" noink
|
<div class="item {{hidden}} inventoryItem"
|
||||||
hero-id="main" {{detailHero}}
|
hero-id="main" {{detailHero}}
|
||||||
layout horizontal
|
layout horizontal center
|
||||||
draggable="true">
|
draggable="true">
|
||||||
{{#if ne1 quantity}}{{quantity}} {{/if}}{{pluralName}}
|
<div flex class="itemName">
|
||||||
</paper-item>
|
{{#if ne1 quantity}}{{quantity}} {{/if}}{{pluralName}}
|
||||||
|
</div>
|
||||||
|
{{#if settings.showIncrement}}
|
||||||
|
<div class="incrementButtons">
|
||||||
|
<paper-icon-button class="addItemQuantity"
|
||||||
|
icon="add"
|
||||||
|
style="margin-right: -8px"></paper-icon-button>
|
||||||
|
<paper-icon-button class="subItemQuantity"
|
||||||
|
disabled={{lt1 quantity}}
|
||||||
|
icon="remove"
|
||||||
|
style="margin-right: -8px"></paper-icon-button>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -61,6 +61,18 @@ Template.inventory.helpers({
|
|||||||
});
|
});
|
||||||
return weight;
|
return weight;
|
||||||
},
|
},
|
||||||
|
encumberedBuffs: function(){
|
||||||
|
return Buffs.find({
|
||||||
|
charId: this._id,
|
||||||
|
type: "inate",
|
||||||
|
name: {$in: [
|
||||||
|
"Encumbered",
|
||||||
|
"Heavily encumbered",
|
||||||
|
"Over encumbered",
|
||||||
|
"Can't move load",
|
||||||
|
]},
|
||||||
|
});
|
||||||
|
},
|
||||||
equipmentValue: function(){
|
equipmentValue: function(){
|
||||||
var value = 0;
|
var value = 0;
|
||||||
Items.find(
|
Items.find(
|
||||||
@@ -103,7 +115,7 @@ Template.inventory.helpers({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.inventory.events({
|
Template.inventory.events({
|
||||||
"tap #addItem": function(event){
|
"tap .addItem": function(event){
|
||||||
var charId = this._id;
|
var charId = this._id;
|
||||||
Items.insert({
|
Items.insert({
|
||||||
charId: charId,
|
charId: charId,
|
||||||
@@ -120,7 +132,7 @@ Template.inventory.events({
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap #addContainer": function(event){
|
"tap .addContainer": function(event){
|
||||||
var containerId = Containers.insert({
|
var containerId = Containers.insert({
|
||||||
name: "New Container",
|
name: "New Container",
|
||||||
isCarried: true,
|
isCarried: true,
|
||||||
@@ -136,6 +148,23 @@ Template.inventory.events({
|
|||||||
heroId: containerId,
|
heroId: containerId,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
"tap .weightCarried": function(event) {
|
||||||
|
var charId = this._id;
|
||||||
|
GlobalUI.setDetail({
|
||||||
|
template: "carryDialog",
|
||||||
|
data: {charId: charId, color: "green"},
|
||||||
|
heroId: charId + "weightCarried",
|
||||||
|
});
|
||||||
|
},
|
||||||
|
"tap .buff": function(event){
|
||||||
|
var buffId = this._id;
|
||||||
|
var charId = Template.parentData()._id;
|
||||||
|
GlobalUI.setDetail({
|
||||||
|
template: "buffDialog",
|
||||||
|
data: {buffId: buffId, charId: charId},
|
||||||
|
heroId: buffId,
|
||||||
|
});
|
||||||
|
},
|
||||||
"tap .inventoryItem": function(event){
|
"tap .inventoryItem": function(event){
|
||||||
var itemId = this._id;
|
var itemId = this._id;
|
||||||
var charId = Template.parentData()._id;
|
var charId = Template.parentData()._id;
|
||||||
@@ -145,6 +174,31 @@ Template.inventory.events({
|
|||||||
heroId: itemId,
|
heroId: itemId,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
"hold .inventoryItem": function(event, instance) {
|
||||||
|
var itemId = this._id;
|
||||||
|
var charId = Template.parentData()._id;
|
||||||
|
var containerId = this.parent.id;
|
||||||
|
GlobalUI.showDialog({
|
||||||
|
template: "moveItemDialog",
|
||||||
|
data: {
|
||||||
|
charId: charId,
|
||||||
|
itemId: itemId,
|
||||||
|
containerId: containerId,
|
||||||
|
},
|
||||||
|
heading: "Move " + this.pluralName(),
|
||||||
|
});
|
||||||
|
},
|
||||||
|
"tap .incrementButtons": function(event) {
|
||||||
|
event.stopPropagation();
|
||||||
|
},
|
||||||
|
"tap .addItemQuantity": function(event) {
|
||||||
|
var itemId = this._id;
|
||||||
|
Items.update(itemId, {$set: {quantity: this.quantity + 1}});
|
||||||
|
},
|
||||||
|
"tap .subItemQuantity": function(event) {
|
||||||
|
var itemId = this._id;
|
||||||
|
Items.update(itemId, {$set: {quantity: this.quantity - 1}});
|
||||||
|
},
|
||||||
"tap .itemContainer .top": function(event){
|
"tap .itemContainer .top": function(event){
|
||||||
GlobalUI.setDetail({
|
GlobalUI.setDetail({
|
||||||
template: "containerDialog",
|
template: "containerDialog",
|
||||||
@@ -167,6 +221,9 @@ Template.inventoryItem.helpers({
|
|||||||
ne1: function(num){
|
ne1: function(num){
|
||||||
return num !== 1;
|
return num !== 1;
|
||||||
},
|
},
|
||||||
|
lt1: function(num) {
|
||||||
|
return num < 1;
|
||||||
|
},
|
||||||
hidden: function(){
|
hidden: function(){
|
||||||
return Session.equals("inventory.dragItemId", this._id) ? "hidden" : null;
|
return Session.equals("inventory.dragItemId", this._id) ? "hidden" : null;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{{#if description}}
|
{{#if description}}
|
||||||
<hr class="vertMargin">
|
<hr class="vertMargin">
|
||||||
<div class="prewrap">{{description}}</div>
|
<div class="pre-wrap">{{evaluateString charId description}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{> effectsViewList charId=charId parentId=_id}}
|
{{> effectsViewList charId=charId parentId=_id}}
|
||||||
{{> attacksViewList charId=charId parentId=_id}}
|
{{> attacksViewList charId=charId parentId=_id}}
|
||||||
@@ -28,10 +28,25 @@
|
|||||||
<template name="itemEdit">
|
<template name="itemEdit">
|
||||||
<paper-input class="fullwidth" id="itemNameInput" label="Name" floatinglabel value={{name}}></paper-input>
|
<paper-input class="fullwidth" id="itemNameInput" label="Name" floatinglabel value={{name}}></paper-input>
|
||||||
<div layout horizontal wrap>
|
<div layout horizontal wrap>
|
||||||
<paper-input-decorator label="Quantity" floatinglabel>
|
<paper-input-decorator label="Quantity"
|
||||||
<input id="quantityInput" type="number" value={{quantity}}>
|
floatinglabel
|
||||||
|
style="width: 80px">
|
||||||
|
<input id="quantityInput"
|
||||||
|
type="number"
|
||||||
|
value={{quantity}}>
|
||||||
</paper-input-decorator>
|
</paper-input-decorator>
|
||||||
{{# if ne1 quantity}}<paper-input flex id="itemPluralInput" label="Plural Name" floatinglabel value={{plural}}></paper-input>{{/if}}
|
{{# if ne1 quantity}}
|
||||||
|
<paper-input flex id="itemPluralInput"
|
||||||
|
label="Plural Name"
|
||||||
|
floatinglabel
|
||||||
|
value={{plural}}></paper-input>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
<div center horizontal layout>
|
||||||
|
<div class="padded">Show increment buttons</div>
|
||||||
|
<paper-checkbox id="incrementCheckbox"
|
||||||
|
checked={{settings.showIncrement}}>
|
||||||
|
</paper-checkbox>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr class="vertMargin">
|
<hr class="vertMargin">
|
||||||
@@ -53,7 +68,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<div center horizontal layout>
|
<div center horizontal layout>
|
||||||
<div class="padded">Requires Attunement</div>
|
<div class="padded">Requires Attunement</div>
|
||||||
<paper-checkbox id="attunementCheckbox" checked={{requiresAttunement}}></paper-checkbox>
|
<paper-checkbox id="attunementCheckbox"
|
||||||
|
checked={{requiresAttunement}}>
|
||||||
|
</paper-checkbox>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ Template.itemEdit.onRendered(function(){
|
|||||||
Template.itemEdit.helpers({
|
Template.itemEdit.helpers({
|
||||||
ne1: function(num){
|
ne1: function(num){
|
||||||
return num != 1;
|
return num != 1;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.itemEdit.events({
|
Template.itemEdit.events({
|
||||||
@@ -87,6 +87,10 @@ Template.itemEdit.events({
|
|||||||
Meteor.call("unequipItem", this._id, this.charId);
|
Meteor.call("unequipItem", this._id, this.charId);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"change #incrementCheckbox": function(event){
|
||||||
|
var value = event.currentTarget.checked;
|
||||||
|
Items.update(this._id, {$set: {"settings.showIncrement": value}});
|
||||||
|
},
|
||||||
"change #attunementCheckbox": function(event){
|
"change #attunementCheckbox": function(event){
|
||||||
var value = event.currentTarget.checked;
|
var value = event.currentTarget.checked;
|
||||||
Items.update(this._id, {$set: {requiresAttunement: value}});
|
Items.update(this._id, {$set: {requiresAttunement: value}});
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
html /deep/ .moveItemDialog paper-tabs::shadow #selectionBar {
|
||||||
|
background-color: #D50000;
|
||||||
|
}
|
||||||
|
|
||||||
|
html /deep/ .moveItemDialog paper-tab::shadow #ink {
|
||||||
|
color: #D50000;
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
<template name="moveItemDialog">
|
||||||
|
<div class="moveItemDialog">
|
||||||
|
<paper-tabs selected="{{selectedTab}}">
|
||||||
|
<paper-tab name="containers"
|
||||||
|
class="clickable">
|
||||||
|
Containers
|
||||||
|
</paper-tab>
|
||||||
|
<paper-tab name="characters"
|
||||||
|
class="clickable">
|
||||||
|
Characters
|
||||||
|
</paper-tab>
|
||||||
|
</paper-tabs>
|
||||||
|
<core-animated-pages selected="{{selectedTab}}"
|
||||||
|
transitions="slide-from-right"
|
||||||
|
style="width: 250px;
|
||||||
|
height: 200px;
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;">
|
||||||
|
<section name="containers">
|
||||||
|
<core-menu id="containerMenu" style="margin: 0;">
|
||||||
|
{{#each containers}}
|
||||||
|
<paper-item name={{_id}}
|
||||||
|
layout horizontal center>
|
||||||
|
<core-icon icon="image:brightness-1"
|
||||||
|
style="color: {{hexColor color}};
|
||||||
|
margin-right: 16px;">
|
||||||
|
</core-icon>
|
||||||
|
<div>{{name}}</div>
|
||||||
|
</paper-item>
|
||||||
|
{{/each}}
|
||||||
|
</core-menu>
|
||||||
|
</section>
|
||||||
|
<section name="characters">
|
||||||
|
<core-menu id="characterMenu" style="margin: 0;">
|
||||||
|
{{#each characters}}
|
||||||
|
<paper-item name={{_id}}
|
||||||
|
layout horizontal center>
|
||||||
|
<div class="item small">
|
||||||
|
{{name}}
|
||||||
|
</div>
|
||||||
|
</paper-item>
|
||||||
|
{{/each}}
|
||||||
|
</core-menu>
|
||||||
|
</section>
|
||||||
|
</core-animated-pages>
|
||||||
|
</div>
|
||||||
|
<paper-button id="cancelButton" affirmative> Cancel </paper-button>
|
||||||
|
<paper-button id="moveButton" affirmative> Move </paper-button>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
Template.moveItemDialog.onCreated(function() {
|
||||||
|
Session.setDefault("moveItemDialogTab", "containers");
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.moveItemDialog.helpers({
|
||||||
|
selectedTab: function() {
|
||||||
|
return Session.get("moveItemDialogTab");
|
||||||
|
},
|
||||||
|
characters: function() {
|
||||||
|
var userId = Meteor.userId();
|
||||||
|
return Characters.find(
|
||||||
|
{
|
||||||
|
$or: [
|
||||||
|
{readers: userId},
|
||||||
|
{writers: userId},
|
||||||
|
{owner: userId},
|
||||||
|
],
|
||||||
|
_id: {$ne: this.charId},
|
||||||
|
},
|
||||||
|
{fields: {name: 1}}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
containers: function(){
|
||||||
|
return Containers.find(
|
||||||
|
{
|
||||||
|
charId: this.charId,
|
||||||
|
_id: {$ne: this.containerId},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fields: {color: 1, name: 1},
|
||||||
|
sort: {color: 1, name: 1},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.moveItemDialog.events({
|
||||||
|
"tap paper-tab": function(event) {
|
||||||
|
Session.set("moveItemDialogTab", event.currentTarget.getAttribute("name"));
|
||||||
|
},
|
||||||
|
"tap #moveButton": function(event, instance) {
|
||||||
|
var tab = Session.get("moveItemDialogTab");
|
||||||
|
if (tab === "containers"){
|
||||||
|
var containerId = instance.find("#containerMenu").selected;
|
||||||
|
if (!containerId) throw "no menu selection";
|
||||||
|
Meteor.call("moveItemToContainer", this.itemId, containerId);
|
||||||
|
} else if (tab === "characters"){
|
||||||
|
var characterId = instance.find("#characterMenu").selected;
|
||||||
|
if (!characterId) throw "no menu selection";
|
||||||
|
Meteor.call("moveItemToCharacter", this.itemId, characterId);
|
||||||
|
} else {
|
||||||
|
throw "Move item dialog tab is not set to containers or character," +
|
||||||
|
" it is set to " + tab;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -3,6 +3,9 @@ Template.classDialog.onRendered(function(){
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.classDialog.events({
|
Template.classDialog.events({
|
||||||
|
"color-change": function(event, instance){
|
||||||
|
Classes.update(instance.data.classId, {$set: {color: event.color}});
|
||||||
|
},
|
||||||
"tap #deleteButton": function(event, instance){
|
"tap #deleteButton": function(event, instance){
|
||||||
Classes.softRemoveNode(instance.data.classId);
|
Classes.softRemoveNode(instance.data.classId);
|
||||||
GlobalUI.deletedToast(instance.data.classId, "Classes", "Class");
|
GlobalUI.deletedToast(instance.data.classId, "Classes", "Class");
|
||||||
|
|||||||
@@ -1,28 +1,32 @@
|
|||||||
<template name="experienceDialog">
|
<template name="experienceDialog">
|
||||||
{{#with experience}}
|
{{#with experience}}
|
||||||
{{#baseDialog title=name class=colorClass hideColor="true" startEditing=../startEditing}}
|
{{#baseDialog title=name class=color hideColor="true" startEditing=../startEditing}}
|
||||||
<div horizontal layout center-justified class= "display2">
|
<div horizontal layout center-justified class= "display2">
|
||||||
{{value}}
|
{{value}}
|
||||||
</div>
|
</div>
|
||||||
{{#if description}}
|
{{#if description}}
|
||||||
<hr class="vertMargin">
|
<hr class="vertMargin">
|
||||||
<div class="prewrap">{{description}}</div>
|
<div class="pre-wrap">{{description}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{else}}
|
{{else}}
|
||||||
<div horizontal layout>
|
{{> experienceEdit}}
|
||||||
<!--Name-->
|
|
||||||
<paper-input id="experienceNameInput" label="Name" floatinglabel value={{name}} flex></paper-input>
|
|
||||||
<!--Value-->
|
|
||||||
<paper-input-decorator label="Value" floatinglabel>
|
|
||||||
<input id="valueInput" type="number" value={{value}}>
|
|
||||||
</paper-input-decorator>
|
|
||||||
</div>
|
|
||||||
<!--Description-->
|
|
||||||
<paper-input-decorator label="Description" floatinglabel layout vertical>
|
|
||||||
<paper-autogrow-textarea>
|
|
||||||
<textarea id="experienceDescriptionInput" placeholder value={{description}}></textarea>
|
|
||||||
</paper-autogrow-textarea>
|
|
||||||
</paper-input-decorator>
|
|
||||||
{{/baseDialog}}
|
{{/baseDialog}}
|
||||||
{{/with}}
|
{{/with}}
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<template name="experienceEdit">
|
||||||
|
<div horizontal layout>
|
||||||
|
<!--Name-->
|
||||||
|
<paper-input id="experienceNameInput" label="Name" floatinglabel value={{name}} flex></paper-input>
|
||||||
|
<!--Value-->
|
||||||
|
<paper-input-decorator label="Value" floatinglabel>
|
||||||
|
<input id="valueInput" type="number" value={{value}}>
|
||||||
|
</paper-input-decorator>
|
||||||
|
</div>
|
||||||
|
<!--Description-->
|
||||||
|
<paper-input-decorator label="Description" floatinglabel layout vertical>
|
||||||
|
<paper-autogrow-textarea>
|
||||||
|
<textarea id="experienceDescriptionInput" placeholder value={{description}}></textarea>
|
||||||
|
</paper-autogrow-textarea>
|
||||||
|
</paper-input-decorator>
|
||||||
|
</template>
|
||||||
|
|||||||
@@ -1,6 +1,15 @@
|
|||||||
|
Template.experienceEdit.onRendered(function(){
|
||||||
|
updatePolymerInputs(this);
|
||||||
|
});
|
||||||
|
|
||||||
Template.experienceDialog.helpers({
|
Template.experienceDialog.helpers({
|
||||||
feature: function(){
|
experience: function(){
|
||||||
return Features.findOne(this.featureId);
|
Experiences.findOne(this.experienceId);
|
||||||
|
return Experiences.findOne(this.experienceId);
|
||||||
|
},
|
||||||
|
color: function() {
|
||||||
|
var char = Characters.findOne(this.charId, {fields: {color: 1}});
|
||||||
|
if (char) return getColorClass(char.color);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -13,8 +22,10 @@ Template.experienceDialog.events({
|
|||||||
);
|
);
|
||||||
GlobalUI.closeDetail();
|
GlobalUI.closeDetail();
|
||||||
},
|
},
|
||||||
//TODO validate input (integer, non-negative, etc) for these inputs and give validation errors
|
});
|
||||||
"change #experienceNameInput, input #experienceNameInput": function(event){
|
|
||||||
|
Template.experienceEdit.events({
|
||||||
|
"change #experienceNameInput": function(event){
|
||||||
var value = event.currentTarget.value;
|
var value = event.currentTarget.value;
|
||||||
Experiences.update(this._id, {$set: {name: value}});
|
Experiences.update(this._id, {$set: {name: value}});
|
||||||
},
|
},
|
||||||
@@ -27,10 +38,3 @@ Template.experienceDialog.events({
|
|||||||
Experiences.update(this._id, {$set: {description: value}});
|
Experiences.update(this._id, {$set: {description: value}});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.experienceDialog.helpers({
|
|
||||||
experience: function(){
|
|
||||||
Experiences.findOne(this.experienceId);
|
|
||||||
return Experiences.findOne(this.experienceId);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
hero-id="toolbar" {{detailHero}}
|
hero-id="toolbar" {{detailHero}}
|
||||||
layout horizontal center>
|
layout horizontal center>
|
||||||
<div flex>Experience</div>
|
<div flex>Experience</div>
|
||||||
<div >{{experience}} 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"></paper-icon-button>
|
||||||
</div>
|
</div>
|
||||||
<div class="bottom list">
|
<div class="bottom list">
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
layout horizontal center>
|
layout horizontal center>
|
||||||
<div flex>
|
<div flex>
|
||||||
<div class="containerName subhead">
|
<div class="containerName subhead">
|
||||||
Level {{level}}
|
Level {{characterCalculate "level" _id}}
|
||||||
</div>
|
</div>
|
||||||
{{#if nextLevelXP}}
|
{{#if nextLevelXP}}
|
||||||
<div class="caption">
|
<div class="caption">
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ Template.journal.helpers({
|
|||||||
return Levels.find({charId: charId, classId: this._id}, {sort: {value: 1}});
|
return Levels.find({charId: charId, classId: this._id}, {sort: {value: 1}});
|
||||||
},
|
},
|
||||||
nextLevelXP: function(){
|
nextLevelXP: function(){
|
||||||
var currentLevel = this.level();
|
var currentLevel = Characters.calculate.level(this._id);
|
||||||
if (currentLevel < 20){
|
if (currentLevel < 20){
|
||||||
return XP_TABLE[currentLevel];
|
return XP_TABLE[currentLevel];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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="prewrap">{{description}}</div>
|
<div class="pre-wrap">{{description}}</div>
|
||||||
{{else}}
|
{{else}}
|
||||||
{{> noteDialogEdit}}
|
{{> noteDialogEdit}}
|
||||||
{{/baseDialog}}
|
{{/baseDialog}}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template name="raceDialog">
|
<template name="raceDialog">
|
||||||
{{#baseDialog title="Race" class=colorClass hideColor="true" hideDelete="true" startEditing=startEditing}}
|
{{#baseDialog title="Race" class=color hideColor="true" hideDelete="true" startEditing=startEditing}}
|
||||||
<div horizontal layout center-justified class= "display2">
|
<div horizontal layout center-justified class= "display2">
|
||||||
{{race}}
|
{{race}}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -13,5 +13,9 @@ Template.raceDialog.helpers({
|
|||||||
race: function(){
|
race: function(){
|
||||||
var char = Characters.findOne(this.charId, {fields: {race: 1}});
|
var char = Characters.findOne(this.charId, {fields: {race: 1}});
|
||||||
return char && char.race;
|
return char && char.race;
|
||||||
}
|
},
|
||||||
|
color: function() {
|
||||||
|
var char = Characters.findOne(this.charId, {fields: {color: 1}});
|
||||||
|
if (char) return getColorClass(char.color);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<template name="backgroundDialog">
|
||||||
|
{{#baseDialog title=title class=colorClass hideColor="true" hideDelete="true" startEditing=startEditing}}
|
||||||
|
<div class="pre-wrap">{{evaluateString charId value}}</div>
|
||||||
|
{{> proficiencyViewList charId=charId parentId=charId parentGroup="background"}}
|
||||||
|
{{else}}
|
||||||
|
{{> textDialogEdit}}
|
||||||
|
{{> proficiencyEditList parentId=charId parentCollection="Characters" charId=charId parentGroup="background"}}
|
||||||
|
{{/baseDialog}}
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
Template.backgroundDialog.helpers({
|
||||||
|
value: function(){
|
||||||
|
var fieldSelector = {fields: {}};
|
||||||
|
fieldSelector.fields[this.field] = 1;
|
||||||
|
var char = Characters.findOne(this.charId, fieldSelector);
|
||||||
|
return char[this.field];
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="containerCard">
|
<template name="containerCard">
|
||||||
{{#containerCardHelper this}}{{body}}{{/containerCardHelper}}
|
{{#containerCardHelper this}}{{evaluateString _id body}}{{/containerCardHelper}}
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="containerCardHelper">
|
<template name="containerCardHelper">
|
||||||
|
|||||||
@@ -40,11 +40,20 @@ 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;
|
||||||
|
GlobalUI.setDetail({
|
||||||
|
template: "personaDetailsDialog",
|
||||||
|
data: this,
|
||||||
|
heroId: this._id + this.field,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
var template = "textDialog";
|
||||||
|
if (this.field === "backstory") template = "backgroundDialog";
|
||||||
var charId = Template.parentData()._id;
|
var charId = Template.parentData()._id;
|
||||||
GlobalUI.setDetail({
|
GlobalUI.setDetail({
|
||||||
template: "textDialog",
|
template: template,
|
||||||
data: {
|
data: {
|
||||||
charId: charId,
|
charId: charId,
|
||||||
field: this.field,
|
field: this.field,
|
||||||
title: this.title,
|
title: this.title,
|
||||||
@@ -52,13 +61,6 @@ Template.persona.events({
|
|||||||
},
|
},
|
||||||
heroId: this._id + this.field,
|
heroId: this._id + this.field,
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
this.charId = Template.parentData()._id;
|
|
||||||
GlobalUI.setDetail({
|
|
||||||
template: "personaDetailsDialog",
|
|
||||||
data: this,
|
|
||||||
heroId: this._id + this.field,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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="prewrap">{{value}}</div>
|
<div class="pre-wrap">{{evaluateString charId value}}</div>
|
||||||
{{else}}
|
{{else}}
|
||||||
{{> textDialogEdit}}
|
{{> textDialogEdit}}
|
||||||
{{/baseDialog}}
|
{{/baseDialog}}
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
<template name="proficiencyView">
|
<template name="proficiencyView">
|
||||||
<div class="proficiencyView" layout horizontal center>
|
<div class="proficiencyView item small"
|
||||||
<core-icon icon="{{profIcon}}"></core-icon>
|
style="padding: 0;"
|
||||||
<div class="sideMargin">{{getName}}</div>
|
layout horizontal center>
|
||||||
|
<core-icon icon="{{profIcon}}" style="margin-right: 16px;"></core-icon>
|
||||||
|
<div>{{getName}}</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{{#if proficiencies.count}}
|
{{#if proficiencies.count}}
|
||||||
<hr class="vertMargin">
|
<hr class="vertMargin">
|
||||||
<div class="proficiencies">
|
<div class="proficiencies">
|
||||||
<h2 class="spaceAfter">Proficiencies</h2>
|
<h2 style="margin-bottom: 8px;">Proficiencies</h2>
|
||||||
{{#each proficiencies}}
|
{{#each proficiencies}}
|
||||||
{{> proficiencyView}}
|
{{> proficiencyView}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
|||||||
@@ -9,24 +9,33 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="spellDetails">
|
<template name="spellDetails">
|
||||||
<div class="caption">
|
<div class="body2">
|
||||||
Level {{level}} {{school}}, {{preparedString}}
|
Level {{level}} {{school}}, {{preparedString}}
|
||||||
</div>
|
</div>
|
||||||
<div class="vertMargin">
|
<div style="margin: 16px 0 16px 0;">
|
||||||
|
{{#if castingTime}}
|
||||||
<div>
|
<div>
|
||||||
<span class="body2">Casting Time: </span><span>{{castingTime}}</span>
|
<span class="body2">Casting Time: </span><span>{{castingTime}}</span>
|
||||||
</div>
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{#if range}}
|
||||||
<div>
|
<div>
|
||||||
<span class="body2">Range: </span><span>{{range}}</span>
|
<span class="body2">Range: </span><span>{{range}}</span>
|
||||||
</div>
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{#if getComponents}}
|
||||||
<div>
|
<div>
|
||||||
<span class="body2">Components: </span><span>{{getComponents}}</span>
|
<span class="body2">Components: </span><span>{{getComponents}}</span>
|
||||||
</div>
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{#if duration}}
|
||||||
<div>
|
<div>
|
||||||
<span class="body2">Duration: </span><span>{{duration}}</span>
|
<span class="body2">Duration: </span><span>{{duration}}</span>
|
||||||
</div>
|
</div>
|
||||||
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<div class="prewrap">{{description}}</div>
|
<div class="pre-wrap">{{evaluateString charId description}}</div>
|
||||||
|
{{> attacksViewList charId=charId parentId=_id}}
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template name="spellEdit">
|
<template name="spellEdit">
|
||||||
@@ -126,4 +135,5 @@
|
|||||||
<textarea id="descriptionInput" placeholder value={{description}}></textarea>
|
<textarea id="descriptionInput" placeholder value={{description}}></textarea>
|
||||||
</paper-autogrow-textarea>
|
</paper-autogrow-textarea>
|
||||||
</paper-input-decorator>
|
</paper-input-decorator>
|
||||||
|
{{> attackEditList parentId=_id parentCollection="Spells" charId=charId enabled=true name=name}}
|
||||||
</template>
|
</template>
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<hr class="vertMargin">
|
<hr class="vertMargin">
|
||||||
<div class="prewrap">{{description}}</div>
|
<div class="pre-wrap">{{evaluateString charId description}}</div>
|
||||||
</div>
|
</div>
|
||||||
{{else}}
|
{{else}}
|
||||||
<!--Name-->
|
<!--Name-->
|
||||||
|
|||||||
@@ -128,20 +128,19 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{#if canEditCharacter _id}}
|
{{#if canEditCharacter _id}}
|
||||||
<paper-fab-menu id="inventoryAddMenu"
|
{{#fabMenu}}
|
||||||
icon="add"
|
<core-tooltip label="New spell list" position="left">
|
||||||
closeIcon="close"
|
<paper-fab icon="work"
|
||||||
duration="0.3">
|
class="addSpellList"
|
||||||
<paper-fab-menu-item id="addSpell"
|
mini>
|
||||||
icon="note-add"
|
</paper-fab>
|
||||||
color="#d23f31"
|
</core-tooltip>
|
||||||
tooltip="Spell">
|
<core-tooltip label="New spell" position="left">
|
||||||
</paper-fab-menu-item>
|
<paper-fab icon="note-add"
|
||||||
<paper-fab-menu-item id="addSpellList"
|
class="addSpell"
|
||||||
icon="work"
|
mini>
|
||||||
color="#d23f31"
|
</paper-fab>
|
||||||
tooltip="Spell List">
|
</core-tooltip>
|
||||||
</paper-fab-menu-item>
|
{{/fabMenu}}
|
||||||
</paper-fab-menu>
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</template>
|
</template>
|
||||||
@@ -84,32 +84,28 @@ Template.spells.helpers({
|
|||||||
},
|
},
|
||||||
cantCast: function(level, char){
|
cantCast: function(level, char){
|
||||||
for (var i = level; i <= 9; i++){
|
for (var i = level; i <= 9; i++){
|
||||||
if (char.attributeValue("level" + i + "SpellSlots") > 0){
|
if (Characters.calculate.attributeValue(char._id, "level" + i + "SpellSlots") > 0){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
baseSlots: function(char){
|
|
||||||
return char.attributeBase("level" + this.level + "SpellSlots");
|
|
||||||
},
|
|
||||||
slots: function(char){
|
|
||||||
return char.attributeValue("level" + this.level + "SpellSlots");
|
|
||||||
},
|
|
||||||
showSlots: function(char){
|
showSlots: function(char){
|
||||||
return this.level && char.attributeBase("level" + this.level + "SpellSlots");
|
return this.level && Characters.calculate.attributeBase(
|
||||||
|
char._id, "level" + this.level + "SpellSlots"
|
||||||
|
);
|
||||||
},
|
},
|
||||||
hasSlots: function(){
|
hasSlots: function(){
|
||||||
for (var i = 1; i <= 9; i += 1){
|
for (var i = 1; i <= 9; i += 1){
|
||||||
if (this.attributeBase("level" + i + "SpellSlots")){
|
if (Characters.calculate.attributeBase(this._id, "level" + i + "SpellSlots")){
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
slotBubbles: function(char){
|
slotBubbles: function(char){
|
||||||
var baseSlots = char.attributeBase("level" + this.level + "SpellSlots");
|
var baseSlots = Characters.calculate.attributeBase(char._id, "level" + this.level + "SpellSlots");
|
||||||
var currentSlots = char.attributeValue("level" + this.level + "SpellSlots");
|
var currentSlots = Characters.calculate.attributeValue(char._id, "level" + this.level + "SpellSlots");
|
||||||
var slotsUsed = baseSlots - currentSlots;
|
var slotsUsed = baseSlots - currentSlots;
|
||||||
var bubbles = [];
|
var bubbles = [];
|
||||||
var i;
|
var i;
|
||||||
@@ -143,15 +139,15 @@ Template.spells.events({
|
|||||||
var char = Characters.findOne(this.charId);
|
var char = Characters.findOne(this.charId);
|
||||||
if (event.currentTarget.icon === "radio-button-off"){
|
if (event.currentTarget.icon === "radio-button-off"){
|
||||||
if (
|
if (
|
||||||
char.attributeValue(this.attribute) <
|
Characters.calculate.attributeValue(char._id, this.attribute) <
|
||||||
char.attributeBase(this.attribute)
|
Characters.calculate.attributeBase(char._id, this.attribute)
|
||||||
){
|
){
|
||||||
modifier = {$inc: {}};
|
modifier = {$inc: {}};
|
||||||
modifier.$inc[this.attribute + ".adjustment"] = 1;
|
modifier.$inc[this.attribute + ".adjustment"] = 1;
|
||||||
Characters.update(this.charId, modifier, {validate: false});
|
Characters.update(this.charId, modifier, {validate: false});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (char.attributeValue(this.attribute) > 0){
|
if (Characters.calculate.attributeValue(char._id, this.attribute) > 0){
|
||||||
modifier = {$inc: {}};
|
modifier = {$inc: {}};
|
||||||
modifier.$inc[this.attribute + ".adjustment"] = -1;
|
modifier.$inc[this.attribute + ".adjustment"] = -1;
|
||||||
Characters.update(this.charId, modifier, {validate: false});
|
Characters.update(this.charId, modifier, {validate: false});
|
||||||
@@ -184,7 +180,7 @@ Template.spells.events({
|
|||||||
heroId: this._id,
|
heroId: this._id,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap #addSpellList": function(event){
|
"tap .addSpellList": function(event){
|
||||||
var charId = this.charId;
|
var charId = this.charId;
|
||||||
SpellLists.insert({
|
SpellLists.insert({
|
||||||
name: "New SpellList",
|
name: "New SpellList",
|
||||||
@@ -201,7 +197,7 @@ Template.spells.events({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
"tap #addSpell": function(event){
|
"tap .addSpell": function(event){
|
||||||
var charId = this.charId;
|
var charId = this.charId;
|
||||||
var listId = SpellLists.findOne({charId: this._id})._id;
|
var listId = SpellLists.findOne({charId: this._id})._id;
|
||||||
Spells.insert({
|
Spells.insert({
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
layout horizontal>
|
layout horizontal>
|
||||||
<div class="left white-text {{color}}"
|
<div class="left white-text {{color}}"
|
||||||
hero-id="toolbar" {{detailHero ability ../_id}}>
|
hero-id="toolbar" {{detailHero ability ../_id}}>
|
||||||
<div class="display1">{{../attributeValue ability}}</div>
|
<div class="display1">{{characterCalculate "attributeValue" ../_id ability}}</div>
|
||||||
<div class="title">{{../abilityMod ability}}</div>
|
<div class="title">{{abilityMod}}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="right subhead" layout horizontal center>
|
<div class="right subhead" layout horizontal center>
|
||||||
{{title}}
|
{{title}}
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
Template.abilityMiniCard.helpers({
|
||||||
|
abilityMod: function() {
|
||||||
|
return signedString(
|
||||||
|
Characters.calculate.abilityMod(
|
||||||
|
Template.parentData()._id, this.ability
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
{{#each baseEffects}}
|
{{#each baseEffects}}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{sourceName}}</td>
|
<td>{{sourceName}}</td>
|
||||||
<td>{{signedString statValue}}</td>
|
<td>Base: {{statValue}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{#each addEffects}}
|
{{#each addEffects}}
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
{{#each mulEffects}}
|
{{#each mulEffects}}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{sourceName}}</td>
|
<td>{{sourceName}}</td>
|
||||||
<td>×{{statValue}}</td>
|
<td>× {{statValue}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{#each minEffects}}
|
{{#each minEffects}}
|
||||||
|
|||||||
@@ -106,10 +106,8 @@ Template.attributeDialogView.helpers({
|
|||||||
return a || b || c;
|
return a || b || c;
|
||||||
},
|
},
|
||||||
adjustment: function(){
|
adjustment: function(){
|
||||||
var char = Characters.findOne(this.charId);
|
var value = Characters.calculate.attributeValue(this.charId, this.statName);
|
||||||
if (!char) return;
|
var base = Characters.calculate.attributeBase(this.charId, this.statName);
|
||||||
var value = char.attributeValue(this.statName);
|
|
||||||
var base = char.attributeBase(this.statName);
|
|
||||||
return value - base;
|
return value - base;
|
||||||
},
|
},
|
||||||
baseEffects: function(){
|
baseEffects: function(){
|
||||||
@@ -138,14 +136,10 @@ Template.attributeDialogView.helpers({
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
attributeBase: function(){
|
attributeBase: function(){
|
||||||
var char = Characters.findOne(this.charId);
|
return Characters.calculate.attributeBase(this.charId, this.statName);
|
||||||
if (!char) throw "character is " + char;
|
|
||||||
return char.attributeBase(this.statName);
|
|
||||||
},
|
},
|
||||||
attributeValue: function() {
|
attributeValue: function() {
|
||||||
var char = Characters.findOne(this.charId);
|
return Characters.calculate.attributeValue(this.charId, this.statName);
|
||||||
if (!char) throw "character is " + char;
|
|
||||||
return char.attributeValue(this.statName);
|
|
||||||
},
|
},
|
||||||
sourceName: function(){
|
sourceName: function(){
|
||||||
if (this.parent.group === "racial"){
|
if (this.parent.group === "racial"){
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
<template name="strengthDialog">
|
||||||
|
{{#baseDialog title=name class=color hideEdit=true}}
|
||||||
|
{{> attributeDialogView}}
|
||||||
|
<hr class="vertMargin">
|
||||||
|
<div>
|
||||||
|
<div class="title padded">Carrying</div>
|
||||||
|
{{> carryCapacityTable}}
|
||||||
|
<div class="title padded">Jumping</div>
|
||||||
|
<table class="strengthTable">
|
||||||
|
<tr>
|
||||||
|
<td>Running long jump</td>
|
||||||
|
<td>{{evaluate charId "strength"}} feet</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Standing long jump</td>
|
||||||
|
<td>{{evaluate charId "floor(strength/2)"}} feet</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Running high jump</td>
|
||||||
|
<td>{{evaluate charId "3 + strengthMod"}} feet</td>
|
||||||
|
<td class="caption">
|
||||||
|
Can reach a ledge as high as
|
||||||
|
{{evaluate charId "3 + strengthMod"}} feet
|
||||||
|
+ 1.5× your height
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Standing high jump</td>
|
||||||
|
<td>{{evaluate charId "floor((3 + strengthMod)/2)"}} feet</td>
|
||||||
|
<td class="caption">
|
||||||
|
Can reach a ledge as high as
|
||||||
|
{{evaluate charId "floor((3 + strengthMod)/2)"}} feet
|
||||||
|
+ 1.5× your height
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{{/baseDialog}}
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
Template.strengthDialog.helpers({
|
||||||
|
color: function(){
|
||||||
|
if (this.color) return this.color + " white-text";
|
||||||
|
var char = Characters.findOne(this.charId, {fields: {color: 1}});
|
||||||
|
if (char) return getColorClass(char.color);
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
<template name="carryCapacityTable">
|
||||||
|
<table class="carryCapacityTable strengthTable">
|
||||||
|
<tr>
|
||||||
|
<td>Encumbered</td>
|
||||||
|
<td>>{{evaluate charId "strength * 5"}}lbs</td>
|
||||||
|
<td class="caption">Variant rule, encumbered characters move 10 feet slower</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Heavily encumbered</td>
|
||||||
|
<td>>{{evaluate charId "strength * 10"}}lbs</td>
|
||||||
|
<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
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Over Encumbered</td>
|
||||||
|
<td>>{{evaluate charId "strength * 15"}}lbs</td>
|
||||||
|
<td class="caption">
|
||||||
|
Characters that can only just lift, push or drag their current load can only move at 5 feet.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Push, drag or lift maximum</td>
|
||||||
|
<td>{{evaluate charId "strength * 30"}}lbs</td>
|
||||||
|
<td class="caption"></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</template>
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
.healthCard paper-slider{
|
.healthCard paper-diff-slider{
|
||||||
width: 100%;
|
width: 100%;
|
||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,24 +10,24 @@
|
|||||||
</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>
|
||||||
<paper-slider id="hitPointSlider"
|
<paper-diff-slider id="hitPointSlider"
|
||||||
value={{attributeValue "hitPoints"}}
|
value={{characterCalculate "attributeValue" _id "hitPoints"}}
|
||||||
max={{attributeBase "hitPoints"}}
|
max={{characterCalculate "attributeBase" _id "hitPoints"}}
|
||||||
editable pin
|
editable pin
|
||||||
role="slider"
|
role="slider">
|
||||||
></paper-slider>
|
</paper-diff-slider>
|
||||||
</div>
|
</div>
|
||||||
{{#each tempHitPoints}}
|
{{#each tempHitPoints}}
|
||||||
<div>
|
<div>
|
||||||
{{name}}
|
{{name}}
|
||||||
<div layout horizontal>
|
<div layout horizontal>
|
||||||
<paper-slider class="tempHitPointSlider"
|
<paper-diff-slider class="tempHitPointSlider"
|
||||||
value={{left}}
|
value={{left}}
|
||||||
max={{maximum}}
|
max={{maximum}}
|
||||||
editable pin
|
editable pin
|
||||||
role="slider"
|
role="slider"
|
||||||
flex
|
flex
|
||||||
></paper-slider>
|
></paper-diff-slider>
|
||||||
{{#unless left}}{{#unless deleteOnZero}}
|
{{#unless left}}{{#unless deleteOnZero}}
|
||||||
<paper-icon-button class="deleteTHP" icon="delete"></paper-icon-button>
|
<paper-icon-button class="deleteTHP" icon="delete"></paper-icon-button>
|
||||||
{{/unless}}{{/unless}}
|
{{/unless}}{{/unless}}
|
||||||
@@ -35,9 +35,21 @@
|
|||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
<div class="caption">
|
<div class="caption">
|
||||||
{{#if multipliers.immunities.length}} <div>Immune: {{#each multipliers.immunities}} {{name}} {{/each}}</div>{{/if}}
|
{{#if multipliers.immunities.length}}
|
||||||
{{#if multipliers.resistances.length}}<div>Resistance: {{#each multipliers.resistances}} {{name}} {{/each}}</div>{{/if}}
|
<div>
|
||||||
{{#if multipliers.weaknesses.length}} <div>Weakness: {{#each multipliers.weaknesses}} {{name}} {{/each}}</div>{{/if}}
|
Immune: {{#each multipliers.immunities}} {{name}} {{/each}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{#if multipliers.resistances.length}}
|
||||||
|
<div>
|
||||||
|
Resistance: {{#each multipliers.resistances}} {{name}} {{/each}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{#if multipliers.weaknesses.length}}
|
||||||
|
<div>
|
||||||
|
Weakness: {{#each multipliers.weaknesses}} {{name}} {{/each}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
{{#if showDeathSave}}
|
{{#if showDeathSave}}
|
||||||
{{#with deathSaveObject}}
|
{{#with deathSaveObject}}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ Template.healthCard.helpers({
|
|||||||
return TemporaryHitPoints.find({charId: this._id});
|
return TemporaryHitPoints.find({charId: this._id});
|
||||||
},
|
},
|
||||||
showDeathSave: function(){
|
showDeathSave: function(){
|
||||||
return this.attributeValue("hitPoints") <= 0;
|
return Characters.calculate.attributeValue(this._id, "hitPoints") <= 0;
|
||||||
},
|
},
|
||||||
deathSaveObject: function(){
|
deathSaveObject: function(){
|
||||||
var char = Characters.findOne(this._id, {fields: {deathSave: 1}});
|
var char = Characters.findOne(this._id, {fields: {deathSave: 1}});
|
||||||
@@ -27,21 +27,20 @@ Template.healthCard.helpers({
|
|||||||
return this.fail >= 3;
|
return this.fail >= 3;
|
||||||
},
|
},
|
||||||
multipliers: function(){
|
multipliers: function(){
|
||||||
var char = Characters.findOne(this._id, {fields: {_id: 1}});
|
|
||||||
var multipliers = [
|
var multipliers = [
|
||||||
{name: "Acid", value: char.attributeValue("acidMultiplier", 1)},
|
{name: "Acid", value: Characters.calculate.attributeValue(this._id, "acidMultiplier")},
|
||||||
{name: "Bludgeoning", value: char.attributeValue("bludgeoningMultiplier", 1)},
|
{name: "Bludgeoning", value: Characters.calculate.attributeValue(this._id, "bludgeoningMultiplier")},
|
||||||
{name: "Cold", value: char.attributeValue("coldMultiplier", 1)},
|
{name: "Cold", value: Characters.calculate.attributeValue(this._id, "coldMultiplier")},
|
||||||
{name: "Fire", value: char.attributeValue("fireMultiplier", 1)},
|
{name: "Fire", value: Characters.calculate.attributeValue(this._id, "fireMultiplier")},
|
||||||
{name: "Force", value: char.attributeValue("forceMultiplier", 1)},
|
{name: "Force", value: Characters.calculate.attributeValue(this._id, "forceMultiplier")},
|
||||||
{name: "Lightning", value: char.attributeValue("lightningMultiplier", 1)},
|
{name: "Lightning", value: Characters.calculate.attributeValue(this._id, "lightningMultiplier")},
|
||||||
{name: "Necrotic", value: char.attributeValue("necroticMultiplier", 1)},
|
{name: "Necrotic", value: Characters.calculate.attributeValue(this._id, "necroticMultiplier")},
|
||||||
{name: "Piercing", value: char.attributeValue("piercingMultiplier", 1)},
|
{name: "Piercing", value: Characters.calculate.attributeValue(this._id, "piercingMultiplier")},
|
||||||
{name: "Poison", value: char.attributeValue("poisonMultiplier", 1)},
|
{name: "Poison", value: Characters.calculate.attributeValue(this._id, "poisonMultiplier")},
|
||||||
{name: "Psychic", value: char.attributeValue("psychicMultiplier", 1)},
|
{name: "Psychic", value: Characters.calculate.attributeValue(this._id, "psychicMultiplier")},
|
||||||
{name: "Radiant", value: char.attributeValue("radiantMultiplier", 1)},
|
{name: "Radiant", value: Characters.calculate.attributeValue(this._id, "radiantMultiplier")},
|
||||||
{name: "Slashing", value: char.attributeValue("slashingMultiplier", 1)},
|
{name: "Slashing", value: Characters.calculate.attributeValue(this._id, "slashingMultiplier")},
|
||||||
{name: "Thunder", value: char.attributeValue("thunderMultiplier", 1)},
|
{name: "Thunder", value: Characters.calculate.attributeValue(this._id, "thunderMultiplier")},
|
||||||
];
|
];
|
||||||
multipliers = _.groupBy(multipliers, "value");
|
multipliers = _.groupBy(multipliers, "value");
|
||||||
return {
|
return {
|
||||||
@@ -55,7 +54,8 @@ Template.healthCard.helpers({
|
|||||||
Template.healthCard.events({
|
Template.healthCard.events({
|
||||||
"change #hitPointSlider": function(event){
|
"change #hitPointSlider": function(event){
|
||||||
var value = event.currentTarget.value;
|
var value = event.currentTarget.value;
|
||||||
var adjustment = value - this.attributeBase("hitPoints");
|
var base = Characters.calculate.attributeBase(this._id, "hitPoints")
|
||||||
|
var adjustment = value - base;
|
||||||
Characters.update(this._id, {$set: {"hitPoints.adjustment": adjustment}});
|
Characters.update(this._id, {$set: {"hitPoints.adjustment": adjustment}});
|
||||||
//reset the death saves if we are gaining HP
|
//reset the death saves if we are gaining HP
|
||||||
if (value > 0)
|
if (value > 0)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template name="hitDice">
|
<template name="hitDice">
|
||||||
{{#if ../attributeBase name}}
|
{{#if characterCalculate "attributeBase" ../_id name}}
|
||||||
<paper-shadow class="card hit-dice" hero-id="main"
|
<paper-shadow class="card hit-dice" hero-id="main"
|
||||||
{{detailHero name ../_id}}
|
{{detailHero name ../_id}}
|
||||||
layout horizontal>
|
layout horizontal>
|
||||||
@@ -18,10 +18,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="resourceValue" layout vertical center>
|
<div class="resourceValue" layout vertical center>
|
||||||
<div>
|
<div>
|
||||||
{{../attributeValue name}}
|
{{characterCalculate "attributeValue" ../_id name}}
|
||||||
</div>
|
</div>
|
||||||
<div class="title white-text">
|
<div class="title white-text">
|
||||||
d{{diceNum}} {{../abilityMod "constitution"}}
|
d{{diceNum}} {{characterCalculate "abilityMod" ../_id "constitution"}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,25 +1,28 @@
|
|||||||
Template.hitDice.helpers({
|
Template.hitDice.helpers({
|
||||||
cantIncrement: function(){
|
cantIncrement: function(){
|
||||||
var valueSmallerThanBase = this.char.attributeValue(this.name) <
|
var value = Characters.calculate.attributeValue(this.char._id, this.name);
|
||||||
this.char.attributeBase(this.name);
|
var base = Characters.calculate.attributeBase(this.char._id, this.name);
|
||||||
return !valueSmallerThanBase;
|
return value >= base;
|
||||||
},
|
},
|
||||||
cantDecrement: function(){
|
cantDecrement: function(){
|
||||||
var valuePositive = this.char.attributeValue(this.name) > 0;
|
var value = Characters.calculate.attributeValue(this.char._id, this.name);
|
||||||
return !valuePositive;
|
return value <= 0;
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.hitDice.events({
|
Template.hitDice.events({
|
||||||
"tap .resourceUp": function(event){
|
"tap .resourceUp": function(event){
|
||||||
if (this.char.attributeValue(this.name) < this.char.attributeBase(this.name)){
|
var value = Characters.calculate.attributeValue(this.char._id, this.name);
|
||||||
|
var base = Characters.calculate.attributeBase(this.char._id, this.name);
|
||||||
|
if (value < base){
|
||||||
var modifier = {$inc: {}};
|
var modifier = {$inc: {}};
|
||||||
modifier.$inc[this.name + ".adjustment"] = 1;
|
modifier.$inc[this.name + ".adjustment"] = 1;
|
||||||
Characters.update(this.char._id, modifier, {validate: false});
|
Characters.update(this.char._id, modifier, {validate: false});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tap .resourceDown": function(event){
|
"tap .resourceDown": function(event){
|
||||||
if (this.char.attributeValue(this.name) > 0){
|
var value = Characters.calculate.attributeValue(this.char._id, this.name);
|
||||||
|
if (value > 0){
|
||||||
var modifier = {$inc: {}};
|
var modifier = {$inc: {}};
|
||||||
modifier.$inc[this.name + ".adjustment"] = -1;
|
modifier.$inc[this.name + ".adjustment"] = -1;
|
||||||
Characters.update(this.char._id, modifier, {validate: false});
|
Characters.update(this.char._id, modifier, {validate: false});
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<!-- needs name, char, and skillName -->
|
<!-- needs name, charId, and skillName -->
|
||||||
<template name="skillDialog">
|
<template name="skillDialog">
|
||||||
{{#baseDialog title=name class=color hideEdit=true}}
|
{{#baseDialog title=name class=color hideEdit=true}}
|
||||||
{{> skillDialogView}}
|
{{> skillDialogView}}
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
<template name="skillDialogView">
|
<template name="skillDialogView">
|
||||||
<div layout vertical center>
|
<div layout vertical center>
|
||||||
<div class="display2">
|
<div class="display2">
|
||||||
{{char.skillMod skillName}}
|
{{characterCalculate "skillMod" charId skillName}}
|
||||||
</div>
|
</div>
|
||||||
<div class="subhead">
|
<div class="subhead">
|
||||||
<core-icon icon="{{profIcon}}" class="black54"></core-icon>
|
<core-icon icon="{{profIcon}}" class="black54"></core-icon>
|
||||||
@@ -25,9 +25,9 @@
|
|||||||
<table class="summaryTable">
|
<table class="summaryTable">
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{abilityName}}</td>
|
<td>{{abilityName}}</td>
|
||||||
<td>{{char.abilityMod ability}}</td>
|
<td>{{characterCalculate "abilityMod" charId ability}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{#if char.proficiency skillName}}
|
{{#if characterCalculate "proficiency" charId skillName}}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{proficiencyValue}}</td>
|
<td>{{proficiencyValue}}</td>
|
||||||
<td>{{signedString profBonus}}</td>
|
<td>{{signedString profBonus}}</td>
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
{{/each}}
|
{{/each}}
|
||||||
<tr class="body2">
|
<tr class="body2">
|
||||||
<td>Total</td>
|
<td>Total</td>
|
||||||
<td>{{char.skillMod skillName}}</td>
|
<td>{{characterCalculate "skillMod" charId skillName}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|||||||
@@ -106,9 +106,7 @@ Template.skillDialogView.helpers({
|
|||||||
return a || b || c;
|
return a || b || c;
|
||||||
},
|
},
|
||||||
profIcon: function(){
|
profIcon: function(){
|
||||||
var char = Characters.findOne(this.charId);
|
var prof = Characters.calculate.proficiency(this.charId, this.skillName);
|
||||||
if (!char) return;
|
|
||||||
var prof = char.proficiency(this.skillName);
|
|
||||||
if (prof > 0 && prof < 1) return "image:brightness-2";
|
if (prof > 0 && prof < 1) return "image:brightness-2";
|
||||||
if (prof === 1) return "image:brightness-1";
|
if (prof === 1) return "image:brightness-1";
|
||||||
if (prof > 1) return "av:album";
|
if (prof > 1) return "av:album";
|
||||||
@@ -123,13 +121,13 @@ Template.skillDialogView.helpers({
|
|||||||
profBonus: function(){
|
profBonus: function(){
|
||||||
var char = Characters.findOne(this.charId);
|
var char = Characters.findOne(this.charId);
|
||||||
if (!char) return;
|
if (!char) return;
|
||||||
return char.proficiency(this.skillName) *
|
var prof = Characters.calculate.proficiency(this.charId, this.skillName);
|
||||||
char.attributeValue("proficiencyBonus");
|
var proficiencyBonus =
|
||||||
|
Characters.calculate.attributeValue(this.charId, "proficiencyBonus");
|
||||||
|
return prof * proficiencyBonus;
|
||||||
},
|
},
|
||||||
proficiencyValue: function(){
|
proficiencyValue: function(){
|
||||||
var char = Characters.findOne(this.charId);
|
var prof = Characters.calculate.proficiency(this.charId, this.skillName);
|
||||||
if (!char) return;
|
|
||||||
var prof = char.proficiency(this.skillName);
|
|
||||||
if (prof == 0.5) return "Half Proficiency";
|
if (prof == 0.5) return "Half Proficiency";
|
||||||
if (prof == 1) return "Proficient";
|
if (prof == 1) return "Proficient";
|
||||||
if (prof == 2) return "Double Proficiency";
|
if (prof == 2) return "Double Proficiency";
|
||||||
@@ -199,20 +197,21 @@ Template.skillDialogView.helpers({
|
|||||||
return skill.ability;
|
return skill.ability;
|
||||||
},
|
},
|
||||||
abilityName: function(){
|
abilityName: function(){
|
||||||
var opts = {fields: {}};
|
var skill = Characters.calculate.getField(this.charId, this.skillName);
|
||||||
opts.fields[this.skillName] = 1;
|
|
||||||
var char = Characters.findOne(this.charId, opts);
|
|
||||||
if (!char) return;
|
|
||||||
var skill = char[this.skillName];
|
|
||||||
if (!skill) return;
|
if (!skill) return;
|
||||||
var ability = skill.ability;
|
var ability = skill.ability;
|
||||||
return abilities[ability] && abilities[ability].name;
|
return abilities[ability] && abilities[ability].name;
|
||||||
},
|
},
|
||||||
char: function(){
|
|
||||||
return Characters.findOne(this.charId, {fields:{_id: 1}});
|
|
||||||
},
|
|
||||||
sourceName: function(){
|
sourceName: function(){
|
||||||
if (this.parent.collection === "Characters") return "inate";
|
if (this.parent.collection === "Characters"){
|
||||||
|
if (this.parent.group === "racial"){
|
||||||
|
return Characters.calculate.getField(this.charId, "race") || "Race";
|
||||||
|
}
|
||||||
|
if (this.parent.group === "background"){
|
||||||
|
return "Background";
|
||||||
|
}
|
||||||
|
return "Innate";
|
||||||
|
}
|
||||||
return this.getParent().name;
|
return this.getParent().name;
|
||||||
},
|
},
|
||||||
operationName: function(){
|
operationName: function(){
|
||||||
|
|||||||
@@ -8,7 +8,9 @@
|
|||||||
{{#if failSkill}}
|
{{#if failSkill}}
|
||||||
<div class="fail skill-mod">fail</div>
|
<div class="fail skill-mod">fail</div>
|
||||||
{{else}}
|
{{else}}
|
||||||
<div class="{{advantage}} skill-mod">{{../skillMod skill}}</div>
|
<div class="{{advantage}} skill-mod">
|
||||||
|
{{skillMod}}
|
||||||
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<div flex>
|
<div flex>
|
||||||
{{name}}
|
{{name}}
|
||||||
@@ -16,7 +18,7 @@
|
|||||||
*
|
*
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if showPassive}}
|
{{#if showPassive}}
|
||||||
({{../passiveSkill skill}})
|
({{characterCalculate "passiveSkill" ../_id skill}})
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,13 +1,21 @@
|
|||||||
Template.skillRow.helpers({
|
Template.skillRow.helpers({
|
||||||
|
skillMod: function() {
|
||||||
|
return signedString(
|
||||||
|
Characters.calculate.skillMod(
|
||||||
|
Template.parentData()._id, this.skill
|
||||||
|
)
|
||||||
|
);
|
||||||
|
},
|
||||||
profIcon: function(){
|
profIcon: function(){
|
||||||
var prof = Template.parentData(1).proficiency(this.skill);
|
var charId = Template.parentData()._id;
|
||||||
|
var prof = Characters.calculate.proficiency(charId, this.skill);
|
||||||
if (prof > 0 && prof < 1) return "image:brightness-2";
|
if (prof > 0 && prof < 1) return "image:brightness-2";
|
||||||
if (prof === 1) return "image:brightness-1";
|
if (prof === 1) return "image:brightness-1";
|
||||||
if (prof > 1) return "av:album";
|
if (prof > 1) return "av:album";
|
||||||
return "radio-button-off";
|
return "radio-button-off";
|
||||||
},
|
},
|
||||||
failSkill: function(){
|
failSkill: function(){
|
||||||
var charId = Template.parentData(1)._id;
|
var charId = Template.parentData()._id;
|
||||||
return Effects.find({
|
return Effects.find({
|
||||||
charId: charId,
|
charId: charId,
|
||||||
stat: this.skill,
|
stat: this.skill,
|
||||||
@@ -16,12 +24,13 @@ Template.skillRow.helpers({
|
|||||||
}).count();
|
}).count();
|
||||||
},
|
},
|
||||||
advantage: function(){
|
advantage: function(){
|
||||||
var advantage = Template.parentData(1).advantage(this.skill);
|
var charId = Template.parentData()._id;
|
||||||
|
var advantage = Characters.calculate.advantage(charId, this.skill);
|
||||||
if (advantage > 0) return "advantage";
|
if (advantage > 0) return "advantage";
|
||||||
if (advantage < 0) return "disadvantage";
|
if (advantage < 0) return "disadvantage";
|
||||||
},
|
},
|
||||||
conditionalCount: function(){
|
conditionalCount: function(){
|
||||||
var charId = Template.parentData(1)._id;
|
var charId = Template.parentData()._id;
|
||||||
return Effects.find({
|
return Effects.find({
|
||||||
charId: charId,
|
charId: charId,
|
||||||
stat: this.skill,
|
stat: this.skill,
|
||||||
|
|||||||
@@ -75,9 +75,9 @@
|
|||||||
<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}}>
|
||||||
{{#if isSkill}}
|
{{#if isSkill}}
|
||||||
{{../skillMod stat}}
|
{{prefix}}{{skillMod}}
|
||||||
{{else}}
|
{{else}}
|
||||||
{{prefix}}{{../attributeValue stat}}
|
{{prefix}}{{characterCalculate "attributeValue" ../_id stat}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<div class="right subhead" flex horizontal layout center>
|
<div class="right subhead" flex horizontal layout center>
|
||||||
|
|||||||
@@ -27,8 +27,10 @@ Template.stats.events({
|
|||||||
},
|
},
|
||||||
"tap .abilityMiniCard": function(event, instance){
|
"tap .abilityMiniCard": function(event, instance){
|
||||||
var charId = Template.parentData()._id;
|
var charId = Template.parentData()._id;
|
||||||
|
var template = "attributeDialog";
|
||||||
|
if (this.ability === "strength") template = "strengthDialog";
|
||||||
GlobalUI.setDetail({
|
GlobalUI.setDetail({
|
||||||
template: "attributeDialog",
|
template: template,
|
||||||
data: {
|
data: {
|
||||||
name: this.title,
|
name: this.title,
|
||||||
statName: this.ability,
|
statName: this.ability,
|
||||||
@@ -65,6 +67,12 @@ Template.stats.events({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.stats.helpers({
|
Template.statCard.helpers({
|
||||||
|
skillMod: function() {
|
||||||
|
return signedString(
|
||||||
|
Characters.calculate.skillMod(
|
||||||
|
Template.parentData()._id, this.stat
|
||||||
|
)
|
||||||
|
);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template name="characterList">
|
<template name="characterList">
|
||||||
<core-toolbar class="blue-grey white-text">
|
<core-toolbar class="app-grey white-text">
|
||||||
<core-icon-button icon="menu" core-drawer-toggle></core-icon-button>
|
<core-icon-button icon="menu" core-drawer-toggle></core-icon-button>
|
||||||
<div flex>
|
<div flex>
|
||||||
Characters
|
Characters
|
||||||
|
|||||||
@@ -25,6 +25,13 @@
|
|||||||
</paper-autogrow-textarea>
|
</paper-autogrow-textarea>
|
||||||
</paper-input-decorator>
|
</paper-input-decorator>
|
||||||
</div>
|
</div>
|
||||||
<paper-button id="cancelButton" affirmative>Cancel</paper-button>
|
<paper-button id="cancelButton"
|
||||||
<paper-button id="sendButton" affirmative>Send </paper-button>
|
affirmative>
|
||||||
|
Cancel
|
||||||
|
</paper-button>
|
||||||
|
<paper-button id="sendButton"
|
||||||
|
affirmative
|
||||||
|
disabled={{invalid}}>
|
||||||
|
Send
|
||||||
|
</paper-button>
|
||||||
</template>
|
</template>
|
||||||
@@ -1,4 +1,23 @@
|
|||||||
|
Template.feedback.onCreated(function() {
|
||||||
|
this.title = new ReactiveVar("");
|
||||||
|
this.description = new ReactiveVar("");
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.feedback.helpers({
|
||||||
|
invalid: function() {
|
||||||
|
var inst = Template.instance();
|
||||||
|
return !inst.title.get() ||
|
||||||
|
!inst.description.get();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
Template.feedback.events({
|
Template.feedback.events({
|
||||||
|
"input #feedbackTitle": function(event, instance) {
|
||||||
|
instance.title.set(instance.find("#feedbackTitle").value);
|
||||||
|
},
|
||||||
|
"input #feedbackDescription": function(event, instance) {
|
||||||
|
instance.description.set(instance.find("#feedbackDescription").value);
|
||||||
|
},
|
||||||
"tap #sendButton": function(event, instance) {
|
"tap #sendButton": function(event, instance) {
|
||||||
var report = {};
|
var report = {};
|
||||||
report.title = instance.find("#feedbackTitle").value;
|
report.title = instance.find("#feedbackTitle").value;
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
<template name="guide">
|
<template name="guide">
|
||||||
|
<core-toolbar class="app-grey white-text">
|
||||||
|
<core-icon-button icon="menu" core-drawer-toggle></core-icon-button>
|
||||||
|
<div flex>Guide</div>
|
||||||
|
</core-toolbar>
|
||||||
<div layout vertical center>
|
<div layout vertical center>
|
||||||
<paper-shadow class="wallOfText card" style="padding: 32px; max-width: 800px;">
|
<paper-shadow class="wallOfText card" style="padding: 32px; max-width: 800px;">
|
||||||
<h1>Dicecloud Beta</h1>
|
|
||||||
<p>Welcome to the Dicecloud beta. Please don't share the link with people you don't actively play with, since the beta is intended to be small, and your experience will probably get laggy if it gets more traffic than I'm expecting.</p>
|
|
||||||
<p>The beta is going to start with just the character sheet. You can play D&D without minis and maps, without a pre-written adventure, you can play without a lot of things, but the character sheet is necessary. So I'm starting here and working my way outwards.</p>
|
|
||||||
<p>I will eventually have public bug tracking and feature requests going, but for now I'm going to track comments, feedback and suggestions on <a href="http://reddit.com/r/dicecloud">this subreddit</a>. If you've never used reddit before, all you need is a username and password to sign up. So it should be pretty accessible.</p>
|
|
||||||
<h2>Character Sheet Philosophy</h2>
|
<h2>Character Sheet Philosophy</h2>
|
||||||
<p>Setting up your character on Dicecloud is going to take you a little longer than just filling it in on a paper character sheet would have. The goal of using an online sheet is to make actually playing the game more streamlined, and ultimately more fun. So putting a little extra effort into setting up your character now will pay off over and over again once you're playing.</p>
|
<p>Setting up your character on Dicecloud is going to take you a little longer than just filling it in on a paper character sheet would have. The goal of using an online sheet is to make actually playing the game more streamlined, and ultimately more fun. So putting a little extra effort into setting up your character now will pay off over and over again once you're playing.</p>
|
||||||
<p>The idea is to track where each number comes from, and allow you to easily make changes on the fly.</p>
|
<p>The idea is to track where each number comes from, and allow you to easily make changes on the fly.</p>
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
<template name="home">
|
<template name="home">
|
||||||
<core-toolbar class="blue-grey white-text">
|
<core-toolbar class="app-grey white-text">
|
||||||
<core-icon-button icon="menu" core-drawer-toggle></core-icon-button>
|
<core-icon-button icon="menu" core-drawer-toggle></core-icon-button>
|
||||||
<div flex>
|
<div flex>
|
||||||
DiceCloud
|
Home
|
||||||
</div>
|
</div>
|
||||||
</core-toolbar>
|
</core-toolbar>
|
||||||
<div class="scroll-y" style="padding: 16px" fit>
|
{{> intro}}
|
||||||
{{> guide}}
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
@@ -1,25 +1,15 @@
|
|||||||
Template.home.helpers({
|
Template.home.helpers({
|
||||||
characterDetails: function(){
|
selectedTab: function(){
|
||||||
var char = Characters.findOne(
|
return Session.get("homePage.selectedTab");
|
||||||
this._id,
|
},
|
||||||
{fields: {name: 1, gender: 1, alignment: 1, race:1}}
|
|
||||||
);
|
|
||||||
char.title = char.name;
|
|
||||||
char.field = "base";
|
|
||||||
char.color = "d";
|
|
||||||
char.class = "characterCard";
|
|
||||||
return char;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Template.home.events({
|
Template.home.events({
|
||||||
"tap .characterCard": function(event, instance){
|
"core-animated-pages-transition-end .tabPages": function(event) {
|
||||||
Router.go("characterSheet", {_id: this._id});
|
event.stopPropagation();
|
||||||
},
|
},
|
||||||
"tap #addCharacter": function(event, template) {
|
"tap .homeTabs paper-tab": function(event, instance){
|
||||||
Characters.insert({owner: Meteor.userId()});
|
Session.set("homePage.selectedTab",
|
||||||
},
|
event.currentTarget.getAttribute("name"));
|
||||||
"tap #deleteChar": function(event, template){
|
|
||||||
Characters.remove(this._id);
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
89
rpg-docs/client/views/home/intro/intro.html
Normal file
89
rpg-docs/client/views/home/intro/intro.html
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<template name="intro">
|
||||||
|
<div class="intro">
|
||||||
|
<div class="section white-text" style="background: #282828">
|
||||||
|
<div class="display2">
|
||||||
|
Dice Cloud
|
||||||
|
</div>
|
||||||
|
<img style="width:130px; height:130px; background-color: #282828;"
|
||||||
|
src="/crown-dice-logo-cropped-transparent.png">
|
||||||
|
<div class="display1">
|
||||||
|
Unofficial Online Realtime D&D 5e App
|
||||||
|
</div>
|
||||||
|
<h2>
|
||||||
|
Spend less time shuffling paper and more time playing the game
|
||||||
|
</h2>
|
||||||
|
{{#unless currentUser}}
|
||||||
|
<div layout horizontal around-justified wrap>
|
||||||
|
<paper-button class="red white-text signInButton"
|
||||||
|
style="margin: 16px;"
|
||||||
|
raised>
|
||||||
|
Sign In
|
||||||
|
</paper-button>
|
||||||
|
<paper-button class="red white-text signUpButton"
|
||||||
|
style="margin: 16px;"
|
||||||
|
raised>
|
||||||
|
Sign Up
|
||||||
|
</paper-button>
|
||||||
|
</div>
|
||||||
|
{{else}}
|
||||||
|
<div style="padding-bottom: 0;"></div>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
<div class="section" style="background-color: #e9e9e9;">
|
||||||
|
<div>
|
||||||
|
<div class="display1">Character Sheet Open Beta</div>
|
||||||
|
<h2 style="margin-bottom: 16px;">
|
||||||
|
Check out the example characters
|
||||||
|
</h2>
|
||||||
|
<div layout horizontal around-justified wrap>
|
||||||
|
<paper-shadow class="card characterCard ssArcher clickable"
|
||||||
|
z="2">
|
||||||
|
<div class="top subhead green white-text">
|
||||||
|
<div class="subhead" flex>
|
||||||
|
Starter Set Archer
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bottom text">Lawful Good Human</div>
|
||||||
|
</paper-shadow>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="section white-text" style="background: #282828">
|
||||||
|
<div class="columns" layout horizontal around-justified wrap>
|
||||||
|
<div>
|
||||||
|
<h1>Check out the guide</h1>
|
||||||
|
<p>
|
||||||
|
Learn how your class gives you features, those features have effects,
|
||||||
|
and those effects determine your stats.
|
||||||
|
<paper-button class="guideButton">View Guide</paper-button>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h1>
|
||||||
|
Discuss
|
||||||
|
</h1>
|
||||||
|
<p>
|
||||||
|
On the official subreddit
|
||||||
|
<paper-button class="redditButton">
|
||||||
|
<a href="http://www.reddit.com/r/dicecloud/">
|
||||||
|
/r/dicecloud
|
||||||
|
</a>
|
||||||
|
</paper-button>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h1>
|
||||||
|
Get involved
|
||||||
|
</h1>
|
||||||
|
<p>Shape upcoming features and track bugs on the Dice Cloud Trello board
|
||||||
|
<paper-button class="trelloButton">
|
||||||
|
<a href="https://trello.com/b/94M0SCnq/dicecloud-roadmap">
|
||||||
|
Trello Roadmap
|
||||||
|
</a>
|
||||||
|
</paper-button>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
14
rpg-docs/client/views/home/intro/intro.js
Normal file
14
rpg-docs/client/views/home/intro/intro.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
Template.intro.events({
|
||||||
|
"tap .signInButton": function() {
|
||||||
|
Router.go("/sign-in");
|
||||||
|
},
|
||||||
|
"tap .signUpButton": function() {
|
||||||
|
Router.go("/sign-up");
|
||||||
|
},
|
||||||
|
"tap .ssArcher": function() {
|
||||||
|
Router.go("/character/yBWwt5XQTTHZiRQxq");
|
||||||
|
},
|
||||||
|
"tap .guideButton": function() {
|
||||||
|
Router.go("/guide");
|
||||||
|
},
|
||||||
|
});
|
||||||
33
rpg-docs/client/views/home/intro/intro.scss
Normal file
33
rpg-docs/client/views/home/intro/intro.scss
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
.intro {
|
||||||
|
.section {
|
||||||
|
width: 100%;
|
||||||
|
min-height: 200px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
padding-top: 24px;
|
||||||
|
padding-bottom: 24px;
|
||||||
|
& > div, & > h2 {
|
||||||
|
padding: 32px;
|
||||||
|
.display1 {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.columns > div{
|
||||||
|
max-width: 300px;
|
||||||
|
padding: 16px;
|
||||||
|
text-align: center;
|
||||||
|
paper-button {
|
||||||
|
color: #FF5252;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
paper-button {
|
||||||
|
min-width: 200px;
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,7 @@
|
|||||||
<link rel="import" href="/components/core-icons/editor-icons.html">
|
<link rel="import" href="/components/core-icons/editor-icons.html">
|
||||||
<link rel="import" href="/components/core-icons/image-icons.html">
|
<link rel="import" href="/components/core-icons/image-icons.html">
|
||||||
<link rel="import" href="/components/core-icons/social-icons.html">
|
<link rel="import" href="/components/core-icons/social-icons.html">
|
||||||
|
<link rel="import" href="/components/core-image/core-image.html">
|
||||||
<link rel="import" href="/components/core-item/core-item.html">
|
<link rel="import" href="/components/core-item/core-item.html">
|
||||||
<link rel="import" href="/components/core-menu/core-menu.html">
|
<link rel="import" href="/components/core-menu/core-menu.html">
|
||||||
<link rel="import" href="/components/core-scaffold/core-scaffold.html">
|
<link rel="import" href="/components/core-scaffold/core-scaffold.html">
|
||||||
@@ -32,11 +33,12 @@
|
|||||||
<link rel="import" href="/components/paper-radio-group/paper-radio-group.html">
|
<link rel="import" href="/components/paper-radio-group/paper-radio-group.html">
|
||||||
<link rel="import" href="/components/paper-shadow/paper-shadow.html">
|
<link rel="import" href="/components/paper-shadow/paper-shadow.html">
|
||||||
<link rel="import" href="/components/paper-spinner/paper-spinner.html">
|
<link rel="import" href="/components/paper-spinner/paper-spinner.html">
|
||||||
|
<link rel="import" href="/components/paper-slider/paper-slider.html">
|
||||||
<link rel="import" href="/components/paper-tabs/paper-tabs.html">
|
<link rel="import" href="/components/paper-tabs/paper-tabs.html">
|
||||||
<link rel="import" href="/components/paper-toast/paper-toast.html">
|
<link rel="import" href="/components/paper-toast/paper-toast.html">
|
||||||
<link rel="import" href="/components/paper-toggle-button/paper-toggle-button.html">
|
<link rel="import" href="/components/paper-toggle-button/paper-toggle-button.html">
|
||||||
|
|
||||||
<!--custom components-->
|
<!--custom components-->
|
||||||
<link rel="import" href="/custom_components/paper-dropdown-menu/paper-dropdown-menu.html">
|
<link rel="import" href="/custom_components/paper-dropdown-menu/paper-dropdown-menu.html">
|
||||||
<link rel="import" href="/custom_components/paper-slider-diff/paper-slider.html">
|
<link rel="import" href="/custom_components/paper-diff-slider/paper-diff-slider.html">
|
||||||
<link rel="import" href="/custom_components/swipe-detect/swipe-detect.html">
|
<link rel="import" href="/custom_components/swipe-detect/swipe-detect.html">
|
||||||
|
|||||||
@@ -3,7 +3,8 @@
|
|||||||
<core-header-panel drawer navigation flex mode="seamed" class="white">
|
<core-header-panel drawer navigation flex mode="seamed" class="white">
|
||||||
<div id="accountSummary">
|
<div id="accountSummary">
|
||||||
{{#if currentUser}}
|
{{#if currentUser}}
|
||||||
<div id="profileLink" style="text-decoration: underline; cursor: pointer;">
|
<div id="profileLink"
|
||||||
|
style="text-decoration: underline; cursor: pointer; font-size: 16px;">
|
||||||
{{profileLink}}
|
{{profileLink}}
|
||||||
</div>
|
</div>
|
||||||
{{else}}
|
{{else}}
|
||||||
@@ -13,6 +14,7 @@
|
|||||||
<div id="navPanel">
|
<div id="navPanel">
|
||||||
<core-item id="homeNav" icon="home" label="Home"></core-item>
|
<core-item id="homeNav" icon="home" label="Home"></core-item>
|
||||||
{{> characterSideList}}
|
{{> characterSideList}}
|
||||||
|
<core-item id="guide" icon="social:school" label="Guide"></core-item>
|
||||||
<core-item id="feedback" icon="bug-report" label="Send Feedback"></core-item>
|
<core-item id="feedback" icon="bug-report" label="Send Feedback"></core-item>
|
||||||
<core-item id="changeLog" icon="list" label="Change Log"></core-item>
|
<core-item id="changeLog" icon="list" label="Change Log"></core-item>
|
||||||
</div>
|
</div>
|
||||||
@@ -23,7 +25,7 @@
|
|||||||
transitions="hero-transition cross-fade"
|
transitions="hero-transition cross-fade"
|
||||||
selected={{globalDetailSelected}}>
|
selected={{globalDetailSelected}}>
|
||||||
<section id="mainContentSection" class={{notSelected}}>
|
<section id="mainContentSection" class={{notSelected}}>
|
||||||
<core-header-panel fit mode="seamed">
|
<core-header-panel fit mode="standard">
|
||||||
{{> yield}}
|
{{> yield}}
|
||||||
</core-header-panel>
|
</core-header-panel>
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -41,4 +41,8 @@ Template.layout.events({
|
|||||||
Router.go("changeLog");
|
Router.go("changeLog");
|
||||||
instance.find("core-drawer-panel").closeDrawer();
|
instance.find("core-drawer-panel").closeDrawer();
|
||||||
},
|
},
|
||||||
|
"tap #guide": function(event, instance) {
|
||||||
|
Router.go("guide");
|
||||||
|
instance.find("core-drawer-panel").closeDrawer();
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
.bigSpinner {
|
.bigSpinner {
|
||||||
width: 100px;
|
width: 100px;
|
||||||
height: 100px;
|
height: 100px;
|
||||||
|
margin-bottom: 16px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template name="loading">
|
<template name="loading">
|
||||||
<core-toolbar class="blue-grey white-text">
|
<core-toolbar class="app-grey white-text">
|
||||||
<core-icon-button icon="menu" core-drawer-toggle></core-icon-button>
|
<core-icon-button icon="menu" core-drawer-toggle></core-icon-button>
|
||||||
</core-toolbar>
|
</core-toolbar>
|
||||||
<div fit layout vertical center center-justified>
|
<div fit layout vertical center center-justified>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template name="changeLog">
|
<template name="changeLog">
|
||||||
<core-toolbar class="blue-grey white-text">
|
<core-toolbar class="app-grey white-text">
|
||||||
<core-icon-button icon="menu" core-drawer-toggle></core-icon-button>
|
<core-icon-button icon="menu" core-drawer-toggle></core-icon-button>
|
||||||
<div flex>
|
<div flex>
|
||||||
Change Log
|
Change Log
|
||||||
|
|||||||
@@ -13,22 +13,22 @@
|
|||||||
role="button"
|
role="button"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
icon="delete"
|
icon="delete"
|
||||||
aria-label="Delete Feature"
|
aria-label="Delete Feature">
|
||||||
noink></paper-icon-button>
|
</paper-icon-button>
|
||||||
{{/unless}}
|
{{/unless}}
|
||||||
{{#unless hideColor}}
|
{{#unless hideColor}}
|
||||||
{{> colorDropdown}}
|
{{> colorDropdown}}
|
||||||
{{/unless}}
|
{{/unless}}
|
||||||
<paper-icon-button id="doneEditingButton"
|
<paper-icon-button id="doneEditingButton"
|
||||||
icon="done"
|
icon="done"
|
||||||
aria-label="Delete Feature"
|
aria-label="Delete Feature">
|
||||||
noink></paper-icon-button>
|
</paper-icon-button>
|
||||||
{{else}}
|
{{else}}
|
||||||
{{#if showEdit}}
|
{{#if showEdit}}
|
||||||
<paper-icon-button id="editButton"
|
<paper-icon-button id="editButton"
|
||||||
icon="create"
|
icon="create"
|
||||||
aria-label="Delete Feature"
|
aria-label="Delete Feature">
|
||||||
noink></paper-icon-button>
|
</paper-icon-button>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user