From 2d70119ee05996ef738df8be054eba7aefac998c Mon Sep 17 00:00:00 2001 From: Thaum Date: Tue, 6 Jan 2015 12:25:58 +0000 Subject: [PATCH] Implemented Features and Items granting effects, actions, attacks and spells --- README.md | 23 +-- rpg-docs/.bowerrc | 1 + rpg-docs/.gitignore | 3 + rpg-docs/.meteor/release | 2 +- rpg-docs/.meteor/versions | 145 +++++++++--------- rpg-docs/Model/Character/Characters.js | 128 ++++++---------- rpg-docs/Model/Character/Features.js | 42 +++++ rpg-docs/Model/Character/SubSchemas/Action.js | 29 ++++ .../Model/Character/SubSchemas/Adjustment.js | 25 +++ rpg-docs/Model/Character/SubSchemas/Attack.js | 31 ++++ rpg-docs/Model/Character/SubSchemas/Buff.js | 18 +++ .../SubSchemas/{Effect => }/Effect.js | 9 +- .../Model/Character/SubSchemas/Effect/Buff.js | 12 -- .../SubSchemas/Effect/Vulnerability.js | 0 .../Model/Character/SubSchemas/Expiration.js | 13 -- .../Model/Character/SubSchemas/Feature.js | 22 --- rpg-docs/Model/Character/SubSchemas/Spell.js | 6 +- rpg-docs/Model/Inventory/Items.js | 30 +++- rpg-docs/bower.json | 25 +++ rpg-docs/client/views/GeneralCSS/general.css | 3 +- .../client/views/GeneralCSS/typography.css | 2 +- .../views/character/Features/features.html | 8 - .../client/views/character/Stats/stats.css | 29 ++++ .../client/views/character/Stats/stats.html | 84 ++-------- .../client/views/character/Stats/stats.js | 9 ++ .../character/abilityCards/abilityCards.css | 4 +- .../character/abilityCards/abilityCards.html | 21 ++- .../views/character/characterSheet.html | 3 +- .../views/character/features/features.html | 32 ++++ .../{Features => features}/features.js | 0 .../containerTable/containerTable.html | 10 -- .../containerTable/containerTable.js | 5 - .../views/character/inventory/inventory.html | 20 ++- .../inventoryTables/inventoryTables.html | 5 - .../inventoryTables/inventoryTables.js | 5 - .../character/inventory/itemRow/itemRow.css | 3 - .../character/inventory/itemRow/itemRow.html | 6 - .../character/inventory/itemRow/itemRow.js | 15 -- .../client/views/character/skills/skills.html | 7 +- rpg-docs/lib/functions/buffsToCharacter.js | 42 ----- rpg-docs/lib/methods/actionUtils.js | 22 +++ rpg-docs/lib/methods/attackUtils.js | 22 +++ rpg-docs/lib/methods/effectUtils.js | 27 ++++ rpg-docs/lib/methods/featureUtils.js | 56 +++++++ rpg-docs/lib/methods/spellUtils.js | 22 +++ rpg-docs/lib/methods/updateEffect.js | 12 -- rpg-docs/nohup.out | 29 ---- rpg-docs/public/jpg/rusted-metal-armor.jpg | Bin 0 -> 59086 bytes 48 files changed, 625 insertions(+), 442 deletions(-) create mode 100644 rpg-docs/.bowerrc create mode 100644 rpg-docs/.gitignore create mode 100644 rpg-docs/Model/Character/Features.js create mode 100644 rpg-docs/Model/Character/SubSchemas/Action.js create mode 100644 rpg-docs/Model/Character/SubSchemas/Adjustment.js create mode 100644 rpg-docs/Model/Character/SubSchemas/Attack.js create mode 100644 rpg-docs/Model/Character/SubSchemas/Buff.js rename rpg-docs/Model/Character/SubSchemas/{Effect => }/Effect.js (68%) delete mode 100644 rpg-docs/Model/Character/SubSchemas/Effect/Buff.js delete mode 100644 rpg-docs/Model/Character/SubSchemas/Effect/Vulnerability.js delete mode 100644 rpg-docs/Model/Character/SubSchemas/Expiration.js delete mode 100644 rpg-docs/Model/Character/SubSchemas/Feature.js create mode 100644 rpg-docs/bower.json delete mode 100644 rpg-docs/client/views/character/Features/features.html create mode 100644 rpg-docs/client/views/character/features/features.html rename rpg-docs/client/views/character/{Features => features}/features.js (100%) delete mode 100644 rpg-docs/client/views/character/inventory/containerTable/containerTable.html delete mode 100644 rpg-docs/client/views/character/inventory/containerTable/containerTable.js delete mode 100644 rpg-docs/client/views/character/inventory/inventoryTables/inventoryTables.html delete mode 100644 rpg-docs/client/views/character/inventory/inventoryTables/inventoryTables.js delete mode 100644 rpg-docs/client/views/character/inventory/itemRow/itemRow.css delete mode 100644 rpg-docs/client/views/character/inventory/itemRow/itemRow.html delete mode 100644 rpg-docs/client/views/character/inventory/itemRow/itemRow.js delete mode 100644 rpg-docs/lib/functions/buffsToCharacter.js create mode 100644 rpg-docs/lib/methods/actionUtils.js create mode 100644 rpg-docs/lib/methods/attackUtils.js create mode 100644 rpg-docs/lib/methods/effectUtils.js create mode 100644 rpg-docs/lib/methods/featureUtils.js create mode 100644 rpg-docs/lib/methods/spellUtils.js delete mode 100644 rpg-docs/lib/methods/updateEffect.js delete mode 100644 rpg-docs/nohup.out create mode 100644 rpg-docs/public/jpg/rusted-metal-armor.jpg diff --git a/README.md b/README.md index 4a9302cb..8a410eeb 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,11 @@ TODO ==== -Strip the core interaction out of swipe-pages to create an element that just listens to swipe events - -wishlist: - -* swipes are emitted as an event if possible -* swiping should translate the element -* it should bounce back to its resting position when released +* Get Polymer installed using bower. +* Install Vulcanize package listed below +* Copy the differential polymer demo to get polymer implemented nicely +* Update Meteor +* Install and use LESS Packages used ============= @@ -48,8 +46,13 @@ Packages used * aldeed:autoform * Automatically generates bootstrap forms for collection2 Schemas. * [github](https://github.com/aldeed/meteor-autoform) +* differential:vulcanize + * Bakes all the polymer imports into one file + * [github](https://github.com/Differential/meteor-vulcanize) ************ - -To Speed up builds when you know you wont need online package checking use -METEOR_OFFLINE_CATALOG=1 \ No newline at end of file + +Resources +========= + +[differential's polymer demo](https://github.com/Differential/polymer-demo) diff --git a/rpg-docs/.bowerrc b/rpg-docs/.bowerrc new file mode 100644 index 00000000..1ad2d4f1 --- /dev/null +++ b/rpg-docs/.bowerrc @@ -0,0 +1 @@ +{"directory":"public/components/"} \ No newline at end of file diff --git a/rpg-docs/.gitignore b/rpg-docs/.gitignore new file mode 100644 index 00000000..3ba35773 --- /dev/null +++ b/rpg-docs/.gitignore @@ -0,0 +1,3 @@ +.meteor/local +.meteor/meteorite +public/components \ No newline at end of file diff --git a/rpg-docs/.meteor/release b/rpg-docs/.meteor/release index f1b62559..fdc65835 100644 --- a/rpg-docs/.meteor/release +++ b/rpg-docs/.meteor/release @@ -1 +1 @@ -METEOR@1.0.1 +METEOR@1.0.2.1 diff --git a/rpg-docs/.meteor/versions b/rpg-docs/.meteor/versions index 7d59a45b..3e9dd96c 100644 --- a/rpg-docs/.meteor/versions +++ b/rpg-docs/.meteor/versions @@ -1,77 +1,74 @@ -accounts-base@1.1.2 -accounts-password@1.0.4 -accounts-ui-unstyled@1.1.4 -accounts-ui@1.1.3 -aldeed:autoform@4.1.0 -aldeed:collection2@2.2.0 +accounts-base@1.1.3 +accounts-password@1.0.5 +accounts-ui@1.1.4 +accounts-ui-unstyled@1.1.5 +aldeed:autoform@4.2.2 +aldeed:collection2@2.3.0 aldeed:simple-schema@1.1.0 -application-configuration@1.0.3 -autoupdate@1.1.3 -base64@1.0.1 -binary-heap@1.0.1 -blaze-tools@1.0.1 -blaze@2.0.3 -boilerplate-generator@1.0.1 -callback-hook@1.0.1 -check@1.0.2 -ctl-helper@1.0.4 -ctl@1.0.2 +application-configuration@1.0.4 +autoupdate@1.1.4 +base64@1.0.2 +binary-heap@1.0.2 +blaze@2.0.4 +blaze-tools@1.0.2 +boilerplate-generator@1.0.2 +callback-hook@1.0.2 +check@1.0.3 cw4gn3r:jquery-event-drag@2.2.0 -dburles:collection-helpers@1.0.1 -ddp@1.0.12 -deps@1.0.5 -ejson@1.0.4 -email@1.0.4 -fastclick@1.0.1 -follower-livedata@1.0.2 -geojson-utils@1.0.1 -html-tools@1.0.2 -htmljs@1.0.2 -http@1.0.8 -id-map@1.0.1 -insecure@1.0.1 -iron:controller@1.0.3 -iron:core@1.0.3 -iron:dynamic-template@1.0.3 -iron:layout@1.0.3 -iron:location@1.0.3 -iron:middleware-stack@1.0.3 -iron:router@1.0.3 -iron:url@1.0.3 -jquery@1.0.1 -json@1.0.1 -launch-screen@1.0.0 -less@1.0.11 -livedata@1.0.11 -localstorage@1.0.1 -logging@1.0.5 -meteor-platform@1.2.0 -meteor@1.1.3 -minifiers@1.1.2 -minimongo@1.0.5 -mobile-status-bar@1.0.1 -mongo-livedata@1.0.6 -mongo@1.0.9 -mrt:moment@2.6.0 +dburles:collection-helpers@1.0.2 +ddp@1.0.13 +deps@1.0.6 +ejson@1.0.5 +email@1.0.5 +fastclick@1.0.2 +follower-livedata@1.0.3 +geojson-utils@1.0.2 +html-tools@1.0.3 +htmljs@1.0.3 +http@1.0.9 +id-map@1.0.2 +insecure@1.0.2 +iron:controller@1.0.6 +iron:core@1.0.6 +iron:dynamic-template@1.0.6 +iron:layout@1.0.6 +iron:location@1.0.6 +iron:middleware-stack@1.0.6 +iron:router@1.0.6 +iron:url@1.0.6 +jquery@1.0.2 +json@1.0.2 +launch-screen@1.0.1 +less@1.0.12 +livedata@1.0.12 +localstorage@1.0.2 +logging@1.0.6 +meteor@1.1.4 +meteor-platform@1.2.1 +minifiers@1.1.3 +minimongo@1.0.6 +mobile-status-bar@1.0.2 +momentjs:moment@2.8.4 +mongo@1.0.11 npm-bcrypt@0.7.7 -observe-sequence@1.0.3 -ordered-dict@1.0.1 -random@1.0.1 -reactive-dict@1.0.4 -reactive-var@1.0.3 -reload@1.1.1 -retry@1.0.1 -routepolicy@1.0.2 -service-configuration@1.0.2 -session@1.0.4 -sha@1.0.1 -spacebars-compiler@1.0.3 -spacebars@1.0.3 -srp@1.0.1 -templating@1.0.9 -tracker@1.0.3 -ui@1.0.4 -underscore@1.0.1 -url@1.0.2 -webapp-hashing@1.0.1 -webapp@1.1.4 +observe-sequence@1.0.4 +ordered-dict@1.0.2 +random@1.0.2 +reactive-dict@1.0.5 +reactive-var@1.0.4 +reload@1.1.2 +retry@1.0.2 +routepolicy@1.0.3 +service-configuration@1.0.3 +session@1.0.5 +sha@1.0.2 +spacebars@1.0.4 +spacebars-compiler@1.0.4 +srp@1.0.2 +templating@1.0.10 +tracker@1.0.4 +ui@1.0.5 +underscore@1.0.2 +url@1.0.3 +webapp@1.1.5 +webapp-hashing@1.0.2 diff --git a/rpg-docs/Model/Character/Characters.js b/rpg-docs/Model/Character/Characters.js index cc9c085e..e0cd5b2c 100644 --- a/rpg-docs/Model/Character/Characters.js +++ b/rpg-docs/Model/Character/Characters.js @@ -37,7 +37,7 @@ Schemas.Character = new SimpleSchema({ "proficiencyBonus.effects": { type: [Schemas.Effect], defaultValue: [ - {name: "Proficiency bonus by level", calculation: "floor(level / 4.1) + 2", operation: "add", type: "inate"} + {name: "Proficiency bonus by level", calculation: "floor(level / 4 + 1.75)", operation: "add", type: "inate"} ] }, speed: {type: Schemas.Attribute}, @@ -68,6 +68,8 @@ Schemas.Character = new SimpleSchema({ superiorityDice: {type: Schemas.Attribute}, expertiseDice: {type: Schemas.Attribute}, + //specific features + rageDamage: {type: Schemas.Attribute}, //hit dice d6HitDice: {type: Schemas.Attribute}, @@ -174,52 +176,24 @@ Schemas.Character = new SimpleSchema({ strengthAttack: {type: Schemas.Skill}, "strengthAttack.ability": {type: String,defaultValue: "strength"}, - "strengthAttack.effects": { - type: [Schemas.Effect], - defaultValue: [{name: "Attack Proficiency", value: 1, operation: "proficiency", type: "inate"}] - }, dexterityAttack: {type: Schemas.Skill}, "dexterityAttack.ability": { type: String, defaultValue: "dexterity" }, - "dexterityAttack.proficiency": { - type: [Schemas.Effect], - defaultValue: [{name: "Attack Proficiency", value: 1, operation: "proficiency", type: "inate"}] - }, constitutionAttack: {type: Schemas.Skill}, "constitutionAttack.ability":{ type: String, defaultValue: "constitution" }, - "constitutionAttack.proficiency": { - type: [Schemas.Effect], - defaultValue: [{name: "Attack Proficiency", value: 1, operation: "proficiency", type: "inate"}] - }, intelligenceAttack: {type: Schemas.Skill}, "intelligenceAttack.ability":{ type: String, defaultValue: "intelligence" }, - "intelligenceAttack.proficiency": { - type: [Schemas.Effect], - defaultValue: [{name: "Attack Proficiency", value: 1, operation: "proficiency", type: "inate"}] - }, wisdomAttack: {type: Schemas.Skill}, "wisdomAttack.ability": { type: String, defaultValue: "wisdom" }, - "wisdomAttack.proficiency": { - type: [Schemas.Effect], - defaultValue: [{name: "Attack Proficiency", value: 1, operation: "proficiency", type: "inate"}] - }, charismaAttack: {type: Schemas.Skill}, "charismaAttack.ability": { type: String, defaultValue: "charisma" }, - "charismaAttack.proficiency": { - type: [Schemas.Effect], - defaultValue: [{name: "Attack Proficiency", value: 1, operation: "proficiency", type: "inate"}] - }, rangedAttack: {type: Schemas.Skill}, "rangedAttack.ability": { type: String, defaultValue: "dexterity" }, - "rangedAttack.proficiency": { - type: [Schemas.Effect], - defaultValue: [{name: "Attack Proficiency", value: 1, operation: "proficiency", type: "inate"}] - }, dexterityArmor: {type: Schemas.Skill}, "dexterityArmor.ability": { type: String, defaultValue: "dexterity" }, @@ -239,19 +213,22 @@ Schemas.Character = new SimpleSchema({ }, //mechanics - features: { type: [Schemas.Feature], defaultValue: []}, + features: { type: [String], defaultValue: [], regEx: SimpleSchema.RegEx.Id,}, + customFeatures: { type: [Schemas.Feature], defaultValue: []}, + actions: { type: [Schemas.Action], defaultValue: []}, deathSave: { type: Schemas.DeathSave }, time: { type: Number, min: 0, decimal: true, defaultValue: 0}, initiativeOrder:{ type: Number, min: 0, max: 1, decimal: true, defaultValue: 0}, - expirations: { type: [Schemas.Expiration], defaultValue: []}, - spells: { type: [Schemas.Spell], defaultValue: []} + buffs: { type: [Schemas.Buff], defaultValue: []} //TODO add permission stuff for owner, readers and writers + //TODO add per-character settings }); Characters.attachSchema(Schemas.Character); //reactively remove expired effects -//this can be optimised a lot once clients can do projections +//TODO broken with the move from expirations -> buffs +//TODO fix by finding every buff whose expiry is >= current time, pull those buffs Characters.find({},{fields: {time: 1, expirations: 1, features: 1}}).observe({ changed: function(character){ var currentTime = character.time; @@ -276,25 +253,38 @@ Characters.find({},{fields: {time: 1, expirations: 1, features: 1}}).observe({ }); var attributeBase = function(charId, attribute){ + var effects = _.groupBy(attribute.effects, "operation"); var value = 0; - _.each(attribute.effects, function(effect){ - switch(effect.operation) { - case "add": - value += evaluateEffect(charId, effect); - break; - case "mul": - value *= evaluateEffect(charId, effect); - break; - case "min": - var min = evaluateEffect(charId, effect); - value = value > min? value : min; - break; - case "max": - var max = evaluateEffect(charId, effect); - value = value < max? value : max; - break; + + //start with the highest base value + _.each(effects.base, function(effect){ + var efv = evaluateEffect(charId, effect) + if (effect.value > value){ + value = effect.value; } }); + + //add all the add values + _.each(effects.add, function(effect){ + value += evaluateEffect(charId, effect); + }); + + //multiply all the mul values + _.each(effects.mul, function(effect){ + value *= evaluateEffect(charId, effect); + }); + + //ensure value is >= all mins + _.each(effects.min, function(effect){ + var min = evaluateEffect(charId, effect); + value = value > min? value : min; + }); + + //ensure value is <= all maxes + _.each(effects.max, function(effect){ + var max = evaluateEffect(charId, effect); + value = value < max? value : max; + }); return value; } @@ -309,7 +299,7 @@ Characters.helpers({ fieldSelector[fieldName] = 1; var char = Characters.findOne(this._id, {fields: fieldSelector}); var field = char[fieldName]; - if(!field){ + if(field === undefined){ throw new Meteor.Error("getField failed", "getField could not find field " + fieldName + " in character "+ char._id); } @@ -333,35 +323,15 @@ Characters.helpers({ return this.getField(fieldName); }, - attributeValue: (function(){ - //store a private array of attributes we've visited without returning - //if we try to visit the same attribute twice before resolving its value - //we are in a dependency loop and need to GTFO - var visitedAttributes = []; - return function(attributeName){ - check(attributeName, String); - //we're still evaluating this attribute, must be in a loop - if(_.contains(visitedAttributes, attributeName)) { - console.log("dependency loop detected"); - return NaN; - } - //push this attribute to the list of visited attributes - //we can't visit it again unless it returns first - visitedAttributes.push(attributeName); - - try{ - var charId = this._id; - var attribute = this.getField(attributeName); - //base value - var value = attributeBase(charId, attribute); - value += attribute.adjustment; - }finally{ - //this attribute returns or fails, pull it from the array, we may visit it again safely - visitedAttributes = _.without(visitedAttributes, attributeName); - } - return value; - } - })(), + attributeValue: function(attributeName){ + var charId = this._id; + var attribute = this.getField(attributeName); + //base value + var value = this.attributeBase(attributeName); + //plus adjustment + value += attribute.adjustment; + return value; + }, attributeBase: (function(){ //store a private array of attributes we've visited without returning diff --git a/rpg-docs/Model/Character/Features.js b/rpg-docs/Model/Character/Features.js new file mode 100644 index 00000000..b7f545a3 --- /dev/null +++ b/rpg-docs/Model/Character/Features.js @@ -0,0 +1,42 @@ +//Features are features that can be selected but not edited +//they are the things that come in the player's handbook and +//facilitate the quick building of characters +//They are the primary means of collecting cease and desist letters :( +// +//Should only be edited by admins +// +//TODO add a Meteor Method that lets users add a feature to their character +//and pushes the effects and actions accordingly +// +//TODO add a Method that updates every character with a given feature if that feature should change + +Features = new Meteor.Collection("features"); + +Schemas.Feature = new SimpleSchema({ + _id: { + type: String, + regEx: SimpleSchema.RegEx.Id, + autoValue: function(){ + if(!this.isSet) return Random.id(); + } + }, + name: {type: String}, + description:{type: String, optional: true}, + source: {type: String, optional: true}, + effects: {type: [Schemas.Effect], defaultValue: []}, + actions: {type: [Schemas.Action], defaultValue: []}, + attacks: {type: [Schemas.Attack], defaultValue: []}, + spells: {type: [Schemas.Spell] , defaultValue: []}, +}); + +Features.attachSchema(Schemas.Feature); + +//observe standard features for changes and update characters using them +Features.find().observe({ + changed: function(newFeature, oldFeature){ + //TODO + }, + removed: function(oldFeature){ + //TODO + } +}); \ No newline at end of file diff --git a/rpg-docs/Model/Character/SubSchemas/Action.js b/rpg-docs/Model/Character/SubSchemas/Action.js new file mode 100644 index 00000000..a3796b12 --- /dev/null +++ b/rpg-docs/Model/Character/SubSchemas/Action.js @@ -0,0 +1,29 @@ +/* + * Actions are given to a character by items and features + */ +Schemas.Action = new SimpleSchema({ + _id: { + type: String, + regEx: SimpleSchema.RegEx.Id, + autoValue: function(){ + if(!this.isSet) return Random.id(); + } + }, + name: { + type: String + }, + description: { + type: String + }, + type: { + type: String, + allowedValues: ["action, bonus, reaction, free"], + defaultValue: "action" + }, + selfBuffs: { + type: [Schemas.Buff], defaultValue: [] + }, + selfAdjustments: { + type: [Schemas.Adjustment], defaultValue: [] + } +}); \ No newline at end of file diff --git a/rpg-docs/Model/Character/SubSchemas/Adjustment.js b/rpg-docs/Model/Character/SubSchemas/Adjustment.js new file mode 100644 index 00000000..0b4623fd --- /dev/null +++ b/rpg-docs/Model/Character/SubSchemas/Adjustment.js @@ -0,0 +1,25 @@ +/* + * Adjustments make instantaneous changes to the value of some attribute + * Damage, healing and resource cost/recovery are all adjustments + */ +Schemas.Adjustment = new SimpleSchema({ + name: { + type: String, + optional: true + }, + //which stat the adjustment is applied to + stat: { + type: String, + optional: true + }, + //the value added to the stat + value: { + type: Number, + decimal: true, + optional: true + }, + calculation: { + type: String, + optional: true + } +}); \ No newline at end of file diff --git a/rpg-docs/Model/Character/SubSchemas/Attack.js b/rpg-docs/Model/Character/SubSchemas/Attack.js new file mode 100644 index 00000000..0c04b263 --- /dev/null +++ b/rpg-docs/Model/Character/SubSchemas/Attack.js @@ -0,0 +1,31 @@ +/* + * Attacks are given to a character by items and features + */ +Schemas.Attack = new SimpleSchema({ + _id: { + type: String, + regEx: SimpleSchema.RegEx.Id, + autoValue: function(){ + if(!this.isSet) return Random.id(); + } + }, + name: { + type: String + }, + range: { + type: String, + optional: true + }, + attackBonus: { + type: String, + optional: true + }, + damage: { + type: String + }, + damageType: { + type: String, + allowedValues: ["acid", "bludgeoning", "cold", "fire", "force", "lightning", "necrotic", + "piercing", "poison", "psychic", "radiant", "slashing", "thunder"] + } +}); \ No newline at end of file diff --git a/rpg-docs/Model/Character/SubSchemas/Buff.js b/rpg-docs/Model/Character/SubSchemas/Buff.js new file mode 100644 index 00000000..f658da52 --- /dev/null +++ b/rpg-docs/Model/Character/SubSchemas/Buff.js @@ -0,0 +1,18 @@ +//buffs are temporary once applied and store things which expire and their expiry time +Schemas.Buff = new SimpleSchema({ + //buff id + _id: { + type: String, + regEx: SimpleSchema.RegEx.Id, + autoValue: function(){ + if(!this.isSet) return Random.id(); + }}, + + //things that expire + effects: { type: [Schemas.Effect], defaultValue: [] }, + actions: { type: [Schemas.Action], defaultValue: [] }, + + //expiry time + expiry: { type: Number, optional: true}, + duration: { type: Number } +}); diff --git a/rpg-docs/Model/Character/SubSchemas/Effect/Effect.js b/rpg-docs/Model/Character/SubSchemas/Effect.js similarity index 68% rename from rpg-docs/Model/Character/SubSchemas/Effect/Effect.js rename to rpg-docs/Model/Character/SubSchemas/Effect.js index 4a858dae..82b4474f 100644 --- a/rpg-docs/Model/Character/SubSchemas/Effect/Effect.js +++ b/rpg-docs/Model/Character/SubSchemas/Effect.js @@ -1,5 +1,5 @@ /* - * Effects are reason-value pairs attached to skills and abilities + * Effects are reason-value attached to skills and abilities * that modify their final value or presentation in some way */ Schemas.Effect = new SimpleSchema({ @@ -16,7 +16,7 @@ Schemas.Effect = new SimpleSchema({ operation: { type: String, defaultValue: "add", - allowedValues: ["proficiency","add","mul","min","max","advantage","disadvantage","passiveAdd","fail","conditional","passiveAdd"] + allowedValues: ["base", "proficiency","add","mul","min","max","advantage","disadvantage","passiveAdd","fail","conditional","passiveAdd"] }, value: { type: Number, @@ -32,5 +32,10 @@ Schemas.Effect = new SimpleSchema({ type: String, defaultValue: "editable", allowedValues: ["editable", "feat", "buff", "equipment", "inate"] + }, + //which stat the effect is applied to + stat: { + type: String, + optional: true } }); \ No newline at end of file diff --git a/rpg-docs/Model/Character/SubSchemas/Effect/Buff.js b/rpg-docs/Model/Character/SubSchemas/Effect/Buff.js deleted file mode 100644 index cbe993d0..00000000 --- a/rpg-docs/Model/Character/SubSchemas/Effect/Buff.js +++ /dev/null @@ -1,12 +0,0 @@ -/* - * A buff becomes an effect when applied on a creature. - * It is the effect plus the stat to which it should be applied - */ -Schemas.Buff = new SimpleSchema({ - stat: { - type: String - }, - effect: { - type: Schemas.Effect - } -}); \ No newline at end of file diff --git a/rpg-docs/Model/Character/SubSchemas/Effect/Vulnerability.js b/rpg-docs/Model/Character/SubSchemas/Effect/Vulnerability.js deleted file mode 100644 index e69de29b..00000000 diff --git a/rpg-docs/Model/Character/SubSchemas/Expiration.js b/rpg-docs/Model/Character/SubSchemas/Expiration.js deleted file mode 100644 index 349a44cb..00000000 --- a/rpg-docs/Model/Character/SubSchemas/Expiration.js +++ /dev/null @@ -1,13 +0,0 @@ -//schema to store all effects which expire and their expiry dates -Schemas.Expiration = new SimpleSchema({ - _id: { - type: String, - regEx: SimpleSchema.RegEx.Id, - autoValue: function(){ - if(!this.isSet) return Random.id(); - }}, - stat: { type: String }, - effectIds: { type: [String], regEx: SimpleSchema.RegEx.Id }, - featureIds:{ type: [String], regEx: SimpleSchema.RegEx.Id }, - expiry: { type: Number } -}); diff --git a/rpg-docs/Model/Character/SubSchemas/Feature.js b/rpg-docs/Model/Character/SubSchemas/Feature.js deleted file mode 100644 index d0ed7156..00000000 --- a/rpg-docs/Model/Character/SubSchemas/Feature.js +++ /dev/null @@ -1,22 +0,0 @@ -Schemas.Feature = new SimpleSchema({ - _id: { - type: String, - regEx: SimpleSchema.RegEx.Id, - autoValue: function(){ - if(!this.isSet) return Random.id(); - } - }, - name: {type: String}, - description:{type: String}, - source: {type: String}, - buffs: {type: [Schemas.Buff], defaultValue: []}, - enabled: {type: Boolean, defaultValue: false}, - duration: {type: Number, optional: true}, - uses: {type: Number, min: 0, optional: true}, - maxUses: {type: Number, min: 0, optional: true}, - reset: { - type: String, - optional: true, - allowedValues: ["longRest", "shortRest"] - } -}); diff --git a/rpg-docs/Model/Character/SubSchemas/Spell.js b/rpg-docs/Model/Character/SubSchemas/Spell.js index 927d3eb5..520ae054 100644 --- a/rpg-docs/Model/Character/SubSchemas/Spell.js +++ b/rpg-docs/Model/Character/SubSchemas/Spell.js @@ -13,8 +13,10 @@ Schemas.Spell = new SimpleSchema({ duration: {type: Number}, "components.verbal": {type: Boolean}, "components.somatic": {type: Boolean}, - "components.material": {type: String}, + "components.material": {type: String, optional: true}, "components.concentration": {type: Boolean}, - buffs: {type: [Schemas.Buff], optional: true}, + ritual: {type: Boolean}, + selfBuffs: {type: [Schemas.Buff], defaultValue: []}, level: {type: Number}, + class: {type: String} }); \ No newline at end of file diff --git a/rpg-docs/Model/Inventory/Items.js b/rpg-docs/Model/Inventory/Items.js index ea6bfa42..3b231f23 100644 --- a/rpg-docs/Model/Inventory/Items.js +++ b/rpg-docs/Model/Inventory/Items.js @@ -4,18 +4,42 @@ Schemas.Item = new SimpleSchema({ name: {type: String, defaultValue: "New Item"}, plural: {type: String, optional: true}, description:{type: String, defaultValue: ""}, - container: {type: String, regEx: SimpleSchema.RegEx.Id}, + container: {type: String}, //id of container it normally is stowed in + character: {type: String, regEx: SimpleSchema.RegEx.Id}, //id of owner quantity: {type: Number, min: 0, defaultValue: 1}, weight: {type: Number, min: 0, defaultValue: 0, decimal: true}, value: {type: Number, min: 0, defaultValue: 0, decimal: true}, tradeGood: {type: Boolean, defaultValue: false}, stackable: {type: Boolean, defaultValue: false}, - buffs: {type: [Schemas.Buff], defaultValue: []}, - equipmentSlot: {type: String, defaultValue: "", allowedValues: ["head", "body", "arms", "hands", "held", "feet"]}, + feature: {type: Schemas.Feature}, + equipmentSlot: { + type: String, + defaultValue: "none", + allowedValues: ["none", "head", "armor", "arms", "hands", "held", "feet"] + }, + equipped: {type: Boolean, defaultValue: false} }); Items.attachSchema(Schemas.Item); +//update the features of the items as needed +Items.find({}, {fields: {feature: 1, character: 1, equipped: 1}}).observe({ + added: function(newItem){ + if(newItem.feature && newItem.character) + addFeatureEffects(newItem.character, newItem.feature); + }, + changed: function(newItem, oldItem){ + if(oldItem.feature && oldItem.character) + removeFeatureEffects(oldItem.character, oldItem.feature); + if(newItem.feature && newItem.character) + addFeatureEffects(newItem.character, newItem.feature); + }, + removed: function(oldItem){ + if(oldItem.feature && oldItem.character) + removeFeatureEffects(oldItem.character, oldItem.feature); + } +}); + Items.helpers({ totalValue: function(){ return this.value * this.quantity; diff --git a/rpg-docs/bower.json b/rpg-docs/bower.json new file mode 100644 index 00000000..5b99a63a --- /dev/null +++ b/rpg-docs/bower.json @@ -0,0 +1,25 @@ +{ + "name": "RPG Docs", + "version": "0.0.0", + "homepage": "", + "authors": ["Stefan Zermatten"], + "license": "none", + "private": true, + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ], + "dependencies": { + "polymer": "Polymer/polymer#~0.5.2", + "core-elements": "Polymer/core-elements#~0.5.2", + "paper-elements": "Polymer/paper-elements#~0.5.2" + }, + "resolutions": { + "core-component-page": "^0.5.0", + "polymer": "^0.5.0", + "webcomponentsjs": "^0.5.0" + } +} \ No newline at end of file diff --git a/rpg-docs/client/views/GeneralCSS/general.css b/rpg-docs/client/views/GeneralCSS/general.css index d961f5eb..18d6b9e9 100644 --- a/rpg-docs/client/views/GeneralCSS/general.css +++ b/rpg-docs/client/views/GeneralCSS/general.css @@ -58,7 +58,6 @@ paper-button { } .card { - width: 148px; margin: 4px; padding: 16px; font-size: 14px; @@ -67,7 +66,7 @@ paper-button { } .card.double { - width: 304px; + width: 332px; } .card paper-button { diff --git a/rpg-docs/client/views/GeneralCSS/typography.css b/rpg-docs/client/views/GeneralCSS/typography.css index d7d9d08e..ba8cec3e 100644 --- a/rpg-docs/client/views/GeneralCSS/typography.css +++ b/rpg-docs/client/views/GeneralCSS/typography.css @@ -31,7 +31,7 @@ h1, .headline { letter-spacing: 0; } -.white-text h1, .white-text .headline{ +.white-text h1, .white-text .headline, .white-text.headline{ color: rgba(255,255,255,0.87); } diff --git a/rpg-docs/client/views/character/Features/features.html b/rpg-docs/client/views/character/Features/features.html deleted file mode 100644 index 853f5fbd..00000000 --- a/rpg-docs/client/views/character/Features/features.html +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/rpg-docs/client/views/character/Stats/stats.css b/rpg-docs/client/views/character/Stats/stats.css index e2d44935..d249b7d1 100644 --- a/rpg-docs/client/views/character/Stats/stats.css +++ b/rpg-docs/client/views/character/Stats/stats.css @@ -11,6 +11,7 @@ #stats .card { flex-grow: 1; + max-width: 480px; } #stats .abilityFlex{ @@ -25,6 +26,26 @@ flex-grow: 1; } +.attribute.card, .skill.card { + padding: 0; + display: flex; + flex-direction: column; + text-align: center; +} + +.card-top { + flex-grow: 1; + padding: 16px; + border-radius: 2px 2px 0 0; + display: flex; + align-items: center; + justify-content: center; +} + +.card .subhead { + padding: 16px; +} + .editEffect > * { vertical-align: bottom; } @@ -35,6 +56,14 @@ padding: 16px; } +#armorHeading { + background: url(/jpg/rusted-metal-armor.jpg) no-repeat; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; +} + #detailContainer { position: fixed; display: flex; diff --git a/rpg-docs/client/views/character/Stats/stats.html b/rpg-docs/client/views/character/Stats/stats.html index 63967878..b57633bb 100644 --- a/rpg-docs/client/views/character/Stats/stats.html +++ b/rpg-docs/client/views/character/Stats/stats.html @@ -4,73 +4,6 @@
{{> abilityCards}}
-
- -

{{attributeValue "armor"}}

-

Armor

-
- -

{{skillMod "initiative"}}

-

Initiative

-
- -

{{attributeValue "proficiencyBonus"}}

-

Proficiency Bonus

-
- -

{{attributeValue "speed"}}

-

Speed

-
- -

{{passiveSkill "perception"}}

-

Passive Perception

-
- -

- {{> hitDice hitDice="d6HitDice" d="6"}} -

-

- {{> hitDice hitDice="d8HitDice" d="8"}} -

-

- {{> hitDice hitDice="d10HitDice" d="10"}} -

-

- {{> hitDice hitDice="d12HitDice" d="12"}} -

-

Hit Dice

-
- {{# if canCast}} - -

{{> spellSlots}}

-

Spell Slots

-
- {{/if}} - {{# if attributeBase "rages"}} - -

{{attributeValue "rages"}}

-

rages

-
- {{/if}} - {{# if attributeBase "sorceryPoints"}} - -

{{attributeValue "sorceryPoints"}}

-

Sorcery Points

-
- {{/if}} - {{# if attributeBase "expertiseDice"}} - -

{{attributeValue "expertiseDice"}}

-

Expertise Dice

-
- {{/if}} - {{# if attributeBase "superiorityDice"}} - -

{{attributeValue "superiorityDice"}}

-

Superiority Dice

-
- {{/if}} -
@@ -80,12 +13,6 @@ - - + + @@ -90,7 +103,7 @@ {{> skillRow name="Animal Handling" skill="animalHandling"}} {{> skillRow name="Insight" skill="insight"}} {{> skillRow name="Medicine" skill="medicine"}} - {{> skillRow name="Perception" skill="perception"}} + {{> skillRow name="Perception" skill="perception" showPassive="true"}} {{> skillRow name="Survival" skill="survival"}} @@ -114,3 +127,9 @@ + + \ No newline at end of file diff --git a/rpg-docs/client/views/character/characterSheet.html b/rpg-docs/client/views/character/characterSheet.html index b5b28d97..3d3a82ff 100644 --- a/rpg-docs/client/views/character/characterSheet.html +++ b/rpg-docs/client/views/character/characterSheet.html @@ -3,7 +3,6 @@ Stats Features Inventory - Proficiency Bonus Spellbook Persona Journal @@ -11,7 +10,7 @@ {{> stats}} - features + {{> features}} inventory spellBook persona diff --git a/rpg-docs/client/views/character/features/features.html b/rpg-docs/client/views/character/features/features.html new file mode 100644 index 00000000..a0817e26 --- /dev/null +++ b/rpg-docs/client/views/character/features/features.html @@ -0,0 +1,32 @@ + \ No newline at end of file diff --git a/rpg-docs/client/views/character/Features/features.js b/rpg-docs/client/views/character/features/features.js similarity index 100% rename from rpg-docs/client/views/character/Features/features.js rename to rpg-docs/client/views/character/features/features.js diff --git a/rpg-docs/client/views/character/inventory/containerTable/containerTable.html b/rpg-docs/client/views/character/inventory/containerTable/containerTable.html deleted file mode 100644 index 2ae1ab0d..00000000 --- a/rpg-docs/client/views/character/inventory/containerTable/containerTable.html +++ /dev/null @@ -1,10 +0,0 @@ - \ No newline at end of file diff --git a/rpg-docs/client/views/character/inventory/containerTable/containerTable.js b/rpg-docs/client/views/character/inventory/containerTable/containerTable.js deleted file mode 100644 index 0edf1c42..00000000 --- a/rpg-docs/client/views/character/inventory/containerTable/containerTable.js +++ /dev/null @@ -1,5 +0,0 @@ -Template.containerTable.helpers({ - items: function(){ - return Items.find({container: this._id}); - } -}); \ No newline at end of file diff --git a/rpg-docs/client/views/character/inventory/inventory.html b/rpg-docs/client/views/character/inventory/inventory.html index 962aeca5..6b38212a 100644 --- a/rpg-docs/client/views/character/inventory/inventory.html +++ b/rpg-docs/client/views/character/inventory/inventory.html @@ -1,6 +1,20 @@ \ No newline at end of file diff --git a/rpg-docs/client/views/character/inventory/inventoryTables/inventoryTables.html b/rpg-docs/client/views/character/inventory/inventoryTables/inventoryTables.html deleted file mode 100644 index 0d0560da..00000000 --- a/rpg-docs/client/views/character/inventory/inventoryTables/inventoryTables.html +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/rpg-docs/client/views/character/inventory/inventoryTables/inventoryTables.js b/rpg-docs/client/views/character/inventory/inventoryTables/inventoryTables.js deleted file mode 100644 index 84f36e4c..00000000 --- a/rpg-docs/client/views/character/inventory/inventoryTables/inventoryTables.js +++ /dev/null @@ -1,5 +0,0 @@ -Template.inventoryTables.helpers({ - containers: function(){ - return Containers.find({owner: this._id}); - } -}); \ No newline at end of file diff --git a/rpg-docs/client/views/character/inventory/itemRow/itemRow.css b/rpg-docs/client/views/character/inventory/itemRow/itemRow.css deleted file mode 100644 index e9201f42..00000000 --- a/rpg-docs/client/views/character/inventory/itemRow/itemRow.css +++ /dev/null @@ -1,3 +0,0 @@ -tr.selected{ - background-color: #4182BC; -} \ No newline at end of file diff --git a/rpg-docs/client/views/character/inventory/itemRow/itemRow.html b/rpg-docs/client/views/character/inventory/itemRow/itemRow.html deleted file mode 100644 index 33f38a87..00000000 --- a/rpg-docs/client/views/character/inventory/itemRow/itemRow.html +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/rpg-docs/client/views/character/inventory/itemRow/itemRow.js b/rpg-docs/client/views/character/inventory/itemRow/itemRow.js deleted file mode 100644 index af8df0eb..00000000 --- a/rpg-docs/client/views/character/inventory/itemRow/itemRow.js +++ /dev/null @@ -1,15 +0,0 @@ -Template.itemRow.helpers({ - isSelected: function(){ - return Session.get('selectedItemRow')=== this._id; - } -}); - -Template.itemRow.events({ - "click": function(e){ - if(Session.get('selectedItemRow')=== this._id){ - Session.set('selectedItemRow', null); - } else{ - Session.set('selectedItemRow', this._id); - } - } -}); \ No newline at end of file diff --git a/rpg-docs/client/views/character/skills/skills.html b/rpg-docs/client/views/character/skills/skills.html index 1fa0f6f1..147653be 100644 --- a/rpg-docs/client/views/character/skills/skills.html +++ b/rpg-docs/client/views/character/skills/skills.html @@ -22,6 +22,11 @@ {{else}}
{{../skillMod skill}}
{{/if}} -
{{name}}
+
+ {{name}} + {{#if showPassive}} + ({{../passiveSkill skill}}) + {{/if}} +
\ No newline at end of file diff --git a/rpg-docs/lib/functions/buffsToCharacter.js b/rpg-docs/lib/functions/buffsToCharacter.js deleted file mode 100644 index 0d7ecd0c..00000000 --- a/rpg-docs/lib/functions/buffsToCharacter.js +++ /dev/null @@ -1,42 +0,0 @@ -//give a character a set of buffs that expire after [duration] -pushBuffs = function(id, buffArray, duration){ - _.each(buffArray, function(buff){ - var pushObject = {}; - if(duration > 0){ - //expiry time is now plus duration - var expiry = Characters.findOne(id, {fields: {time: 1}}).time + duration; - //ensure the effect has an id - buff.effect._id = buff.effect._id || Random.id(); - //build the expiration object - var expiration = { - stat: buff.stat, - effectId: buff.effect._id, - expiry: expiry - }; - //push expiration object to character - Characters.update(id, {$push: {expirations: expiration } }); - } - //push the effect to the character - pushObject[buff.stat] = buff.effect; - Characters.update(id, {$push: pushObject}); - }); -}; - -//pull all the buffs listed in the buffArray -pullBuffs = function(id, buffArray){ - _.each(buffArray, function(buff){ - pullEffect(id, buff.effect._id); - }); -}; - -//pull a single effect by stat and id -pullEffect = function(id, stat, effectId){ - var pullObject = {}; - pullObject[stat] = {_id: effectId}; - Characters.update(id, {$pull: pullObject }); -} - -//pull an expiry by id -pullExpiry = function(id, expiryId){ - Characters.update(id, {$pull: {expirations: {_id: expiryId} } }); -} \ No newline at end of file diff --git a/rpg-docs/lib/methods/actionUtils.js b/rpg-docs/lib/methods/actionUtils.js new file mode 100644 index 00000000..fa8002a3 --- /dev/null +++ b/rpg-docs/lib/methods/actionUtils.js @@ -0,0 +1,22 @@ +Meteor.methods({ + updateAction: function (charId, oldAction, newAction) { + var selector = {_id: charId, "actions._id": oldAction._id}; + var setter = {"actions.$": newAction}; + Characters.update( + selector, + { $set: setter } + ); + } +}); + +pullAction = function(id, action){ + var pullObject = {}; + pullObject["actions"] = {_id: action._id}; + Characters.update(id, {$pull: pullObject }); +}; + +pushAction = function(id, action){ + var pushObject = {}; + pushObject["actions"] = action; + Characters.update(id, {$push: pushObject}); +}; diff --git a/rpg-docs/lib/methods/attackUtils.js b/rpg-docs/lib/methods/attackUtils.js new file mode 100644 index 00000000..e9f7d1f0 --- /dev/null +++ b/rpg-docs/lib/methods/attackUtils.js @@ -0,0 +1,22 @@ +Meteor.methods({ + updateAttack: function (charId, oldAttack, newAttack) { + var selector = {_id: charId, "attacks._id": oldAttack._id}; + var setter = {"attacks.$": newAttack}; + Characters.update( + selector, + { $set: setter } + ); + } +}); + +pullAttack = function(id, attack){ + var pullObject = {}; + pullObject["attacks"] = {_id: attack._id}; + Characters.update(id, {$pull: pullObject }); +}; + +pushAttack = function(id, attack){ + var pushObject = {}; + pushObject["attacks"] = attack; + Characters.update(id, {$push: pushObject}); +}; diff --git a/rpg-docs/lib/methods/effectUtils.js b/rpg-docs/lib/methods/effectUtils.js new file mode 100644 index 00000000..408df881 --- /dev/null +++ b/rpg-docs/lib/methods/effectUtils.js @@ -0,0 +1,27 @@ +Meteor.methods({ + updateEffect: function (charId, attributeName, effectId, newEffect) { + var selector = {_id: charId}; + selector[attributeName + ".effects._id"] = effectId; + var setter = {}; + setter[attributeName + ".effects.$"] = newEffect + Characters.update( + selector, + { $set: setter } + ) + } +}); + +//pull a single effect by stat and id +pullEffect = function(id, effect){ + var pullObject = {}; + pullObject[effect.stat + ".effects"] = {_id: effect._id}; + Characters.update(id, {$pull: pullObject }); +} + +pushEffect = function(id, effect){ + var pushObject = {}; + pushObject[effect.stat + ".effects"] = effect; + Characters.update(id, {$push: pushObject}); +} + + diff --git a/rpg-docs/lib/methods/featureUtils.js b/rpg-docs/lib/methods/featureUtils.js new file mode 100644 index 00000000..7dd69c1a --- /dev/null +++ b/rpg-docs/lib/methods/featureUtils.js @@ -0,0 +1,56 @@ +Meteor.methods({ + addFeature: function(charId, newFeature){ + Characters.update( + charId, + { $push: {"customFeatures": newFeature} } + ); + addFeatureEffects(charId, newFeature); + }, + removeFeature: function(charId, oldFeature){ + Characters.update( + charId, + { $pull: { "customFeatures": {"_id": oldFeature._id} } } + ); + removeFeatureEffects(charId, oldFeature); + }, + updateFeature: function (charId, oldFeature, newFeature) { + var selector = {_id: charId, "customFeatures._id": oldFeature._id}; + var setter = {"customFeatures.$": newFeature}; + Characters.update( + selector, + { $set: setter } + ); + removeFeatureEffects(charId, oldFeature); + addFeatureEffects(charId, newFeature); + } +}); + +addFeatureEffects = function(charId, newFeature){ + _.each(newFeature.effects, function(effect){ + pushEffect(charId, effect); + }); + _.each(newFeature.actions, function(action){ + pushAction(charId, action); + }); + _.each(newFeature.attacks, function(attack){ + pushAttack(charId, attack); + }); + _.each(newFeature.spells, function(spell){ + pushSpell(charId, spell); + }); +} + +removeFeatureEffects = function(charId, oldFeature){ + _.each(oldFeature.effects, function(effect){ + pullEffect(charId, effect); + }); + _.each(oldFeature.actions, function(action){ + pullAction(charId, action); + }); + _.each(newFeature.attacks, function(attack){ + pushAttack(charId, attack); + }); + _.each(newFeature.spells, function(spell){ + pushSpell(charId, spell); + }); +}; \ No newline at end of file diff --git a/rpg-docs/lib/methods/spellUtils.js b/rpg-docs/lib/methods/spellUtils.js new file mode 100644 index 00000000..54d73f8d --- /dev/null +++ b/rpg-docs/lib/methods/spellUtils.js @@ -0,0 +1,22 @@ +Meteor.methods({ + updateSpell: function (charId, oldSpell, newSpell) { + var selector = {_id: charId, "spells._id": oldSpell._id}; + var setter = {"spells.$": newSpell}; + Characters.update( + selector, + { $set: setter } + ); + } +}); + +pullSpell = function(id, spell){ + var pullObject = {}; + pullObject["spells"] = {_id: spell._id}; + Characters.update(id, {$pull: pullObject }); +}; + +pushSpell = function(id, spell){ + var pushObject = {}; + pushObject["spells"] = spell; + Characters.update(id, {$push: pushObject}); +}; diff --git a/rpg-docs/lib/methods/updateEffect.js b/rpg-docs/lib/methods/updateEffect.js deleted file mode 100644 index be74a399..00000000 --- a/rpg-docs/lib/methods/updateEffect.js +++ /dev/null @@ -1,12 +0,0 @@ -Meteor.methods({ - updateEffect: function (charId, attributeName, effectId, newEffect) { - var selector = {_id: charId}; - selector[attributeName + ".effects._id"] = effectId; - var setter = {}; - setter[attributeName + ".effects.$"] = newEffect - Characters.update( - selector, - { $set: setter } - ) - } -}); \ No newline at end of file diff --git a/rpg-docs/nohup.out b/rpg-docs/nohup.out deleted file mode 100644 index 52bf12b0..00000000 --- a/rpg-docs/nohup.out +++ /dev/null @@ -1,29 +0,0 @@ -[[[[[ ~/workspace/rpg-docs ]]]]] - -=> Started proxy. -=> Started MongoDB. -I20141122-15:44:13.239(0)? ** You've set up some data subscriptions with Meteor.publish(), but -I20141122-15:44:13.351(0)? ** you still have autopublish turned on. Because autopublish is still -I20141122-15:44:13.352(0)? ** on, your Meteor.publish() calls won't have much effect. All data -I20141122-15:44:13.352(0)? ** will still be sent to all clients. -I20141122-15:44:13.352(0)? ** -I20141122-15:44:13.352(0)? ** Turn off autopublish by removing the autopublish package: -I20141122-15:44:13.353(0)? ** -I20141122-15:44:13.353(0)? ** $ meteor remove autopublish -I20141122-15:44:13.353(0)? ** -I20141122-15:44:13.353(0)? ** .. and make sure you have Meteor.publish() and Meteor.subscribe() calls -I20141122-15:44:13.353(0)? ** for each collection that you want clients to see. -I20141122-15:44:13.353(0)?  -=> Started your app. - -=> App running at: http://localhost:3000/ -Can't listen on port 3000. Perhaps another Meteor is running? - -Running two copies of Meteor in the same application directory -will not work. If something else is using port 3000, you can -specify an alternative port with --port . -Can't listen on port 3000. Perhaps another Meteor is running? - -Running two copies of Meteor in the same application directory -will not work. If something else is using port 3000, you can -specify an alternative port with --port . diff --git a/rpg-docs/public/jpg/rusted-metal-armor.jpg b/rpg-docs/public/jpg/rusted-metal-armor.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5e3e7e9e6304f04d50f0c8f230c289be8b687f5d GIT binary patch literal 59086 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 literal 0 HcmV?d00001