diff --git a/app/.meteor/packages b/app/.meteor/packages index f0b17b3f..83f528ce 100644 --- a/app/.meteor/packages +++ b/app/.meteor/packages @@ -51,3 +51,4 @@ static-html aldeed:collection2@3.0.0 aldeed:schema-index akryum:vue-component +autopublish diff --git a/app/.meteor/versions b/app/.meteor/versions index 42e8c6bb..2c3bdb2a 100644 --- a/app/.meteor/versions +++ b/app/.meteor/versions @@ -12,6 +12,7 @@ akryum:vue-router2@0.2.2 aldeed:collection2@3.0.0 aldeed:schema-index@3.0.0 allow-deny@1.1.0 +autopublish@1.0.7 autoupdate@1.4.1 babel-compiler@7.1.1 babel-runtime@1.2.7 diff --git a/app/imports/api/campaign/Party.js b/app/imports/api/campaign/Parties.js similarity index 100% rename from app/imports/api/campaign/Party.js rename to app/imports/api/campaign/Parties.js diff --git a/app/imports/api/creature/Creatures.js b/app/imports/api/creature/Creatures.js index b2ca6297..212dac2c 100644 --- a/app/imports/api/creature/Creatures.js +++ b/app/imports/api/creature/Creatures.js @@ -1,9 +1,9 @@ import { ValidatedMethod } from 'meteor/mdg:validated-method'; import SimpleSchema from 'simpl-schema'; -import Effects from "/imports/api/creature/Effects.js" +import Effects from "/imports/api/creature/properties/Effects.js" import deathSaveSchema from "/imports/api/creature/subSchemas/DeathSavesSchema.js" import ColorSchema from "/imports/api/creature/subSchemas/ColorSchema.js"; -import getDefaultCreatureDocs from "/imports/api/creature/CreatureDefaults.js"; +import getDefaultCreatureDocs from "/imports/api/creature/getDefaultCreatureDocs.js"; //set up the collection for creatures Creatures = new Mongo.Collection("creatures"); @@ -62,55 +62,6 @@ let creatureSchema = new SimpleSchema({ Creatures.attachSchema(creatureSchema); Creatures.attachSchema(ColorSchema); -Creatures.calculate = { - xpLevel: function(charId){ - var xp = Creatures.calculate.experience(charId); - for (var i = 0; i < 19; i++){ - if (xp < XP_TABLE[i]){ - return i; - } - } - if (xp > 355000) return 20; - return 0; - }, -}; - -const insertCharacter = new ValidatedMethod({ - - name: "Creatures.methods.insertCharacter", // DDP method name - - validate: new SimpleSchema({ - name: { - type: String, - optional: true, - }, - }).validator(), - - run({name}) { - if (!this.userId) { - throw new Meteor.Error("Creatures.methods.insert.denied", - "You need to be logged in to insert a creature"); - } - - // Create the creature document - let charId = Creatures.insert({name, owner: this.userId}); - this.unblock(); - //Add all the required attributes to it - if (Meteor.isServer){ - addDefaultStats(charId); - } - return charId; - }, - -}); - -const addDefaultStats = function(charId){ - const defaultDocs = getDefaultCreatureDocs(charId); - Attributes.rawCollection().insert(defaultDocs.attributes, {ordered: false}); - Skills.rawCollection().insert(defaultDocs.skills, {ordered: false}); - DamageMultipliers.rawCollection().insert(defaultDocs.damageMultipliers, {ordered: false}); -}; - //clean up all data related to that creature before removing it if (Meteor.isServer){ Creatures.after.remove(function(userId, creature) { @@ -145,91 +96,6 @@ if (Meteor.isServer){ doc.settings.newUserExperience = true; } }); - - //give characters default items - Creatures.after.insert(function(userId, char) { - if (Meteor.isServer){ - var containerId = Containers.insert({ - name: "Coin Pouch", - charId: char._id, - isCarried: true, - description: "A sturdy pouch for coins", - color: "d", - }); - Items.insert({ - name: "Gold piece", - plural: "Gold pieces", - charId: char._id, - quantity: 0, - weight: 0.02, - value: 1, - color: "n", - parent: { - id: containerId, - collection: "Containers", - }, - settings: { - showIncrement: true, - }, - }); - Items.insert({ - name: "Silver piece", - plural: "Silver pieces", - charId: char._id, - quantity: 0, - weight: 0.02, - value: 0.1, - color: "q", - parent: { - id: containerId, - collection: "Containers", - }, - settings: { - showIncrement: true, - }, - }); - Items.insert({ - name: "Copper piece", - plural: "Copper pieces", - charId: char._id, - quantity: 0, - weight: 0.02, - value: 0.01, - color: "s", - parent: { - id: containerId, - collection: "Containers", - }, - settings: { - showIncrement: true, - }, - }); - } - }); } -Creatures.allow({ - insert: function(userId, doc) { - // the user must be logged in, and the document must be owned by the user - return (userId && doc.owner === userId); - }, - update: function(userId, doc, fields, modifier) { - // can only change documents you have write access to - return doc.owner === userId || - _.contains(doc.writers, userId); - }, - remove: function(userId, doc) { - // can only remove your own documents - return doc.owner === userId; - }, - fetch: ["owner", "writers"], -}); - -Creatures.deny({ - update: function(userId, docs, fields, modifier) { - // can't change owners - return _.contains(fields, "owner"); - } -}); - export default Creatures; diff --git a/dataSources/rulesets/character5e.json b/app/imports/api/creature/DEFAULT_CHARACTER_STATS.js similarity index 99% rename from dataSources/rulesets/character5e.json rename to app/imports/api/creature/DEFAULT_CHARACTER_STATS.js index ca7ac964..4e30e0d8 100644 --- a/dataSources/rulesets/character5e.json +++ b/app/imports/api/creature/DEFAULT_CHARACTER_STATS.js @@ -1,4 +1,4 @@ -{ +export default { "attributes": [ {"name": "Strength", "variableName": "strength", "baseValue": 10, "type": "ability"}, {"name": "Dexterity", "variableName": "dexterity", "baseValue": 10, "type": "ability"}, diff --git a/app/imports/api/creature/CreatureDefaults.js b/app/imports/api/creature/getDefaultCreatureDocs.js similarity index 73% rename from app/imports/api/creature/CreatureDefaults.js rename to app/imports/api/creature/getDefaultCreatureDocs.js index 4d88a87d..2828d938 100644 --- a/app/imports/api/creature/CreatureDefaults.js +++ b/app/imports/api/creature/getDefaultCreatureDocs.js @@ -1,18 +1,34 @@ +import DEFAULT_CHARACTER_STATS from '/imports/api/creature/DEFAULT_CHARACTER_STATS.js'; + getDefaultCreatureDocs = function(charId, creatureType = "pc"){ - let docs = {attributes: [], skills: [], damageMultipliers: [], effects: []}; + // Setup the docs object which will be returned + let docs = { + attributes: [], + skills: [], + damageMultipliers: [], + effects: [] + }; + + // Get the default character stats + let stats; if (creatureType === "pc"){ - const stats = DEFAULT_CHARACTER_STATS; + stats = DEFAULT_CHARACTER_STATS; } else { + stats = null; throw new Meteor.Error("Not implemented", "Default stats for non-player characters aren't implemented yet"); } + + // Setup the variables we'll need to share let order = 0; const baseParent = { collection: "Characters", id: charId, group: "default", }; - let name, variableName, parent, attribute, skill, ability, dm, type, baseValue; + let name, variableName, parent, attribute, skill, dm, type, baseValue; + + // Attributes for (type in stats.attributes){ for (let i in stats.attributes[type]){ attribute = stats.attributes[type][i]; @@ -32,6 +48,8 @@ getDefaultCreatureDocs = function(charId, creatureType = "pc"){ order++; } } + + // Skills order = 0; for (type in stats.skills){ for (let i in stats.skills[type]){ @@ -49,26 +67,36 @@ getDefaultCreatureDocs = function(charId, creatureType = "pc"){ order++; } } + + // Damage Multipliers + order = 0; for (let i in stats.damageMultipliers){ dm = stats.damageMultipliers[i]; docs.damageMultipliers.push({ _id: Random.id, charId, + order, name: dm.name, variableName: dm.variableName, parent: _.clone(baseParent), }); + order++; } + + // Effects + order = 0; for (let i in stats.effects){ eff = stats.effects[i]; docs.effects.push({ _id: Random.id, charId, + order, name: eff.name, stat: eff.stat, operation: eff.operation, calculation:eff.calculation, }); + order++; } return docs; } diff --git a/app/imports/api/creature/insertCreature.js b/app/imports/api/creature/insertCreature.js new file mode 100644 index 00000000..0b1be7a1 --- /dev/null +++ b/app/imports/api/creature/insertCreature.js @@ -0,0 +1,39 @@ +import getDefaultCreatureDocs from '/imports/api/creature/getDefaultCreatureDocs.js'; + +const addDefaultStats = function(charId){ + const defaultDocs = getDefaultCreatureDocs(charId); + Attributes.rawCollection().insert(getDefa.attributes, {ordered: false}); + Skills.rawCollection().insert(getDefa.skills, {ordered: false}); + DamageMultipliers.rawCollection().insert(getDefa.damageMultipliers, {ordered: false}); +}; + +const insertCreature = new ValidatedMethod({ + + name: "Creatures.methods.insertCharacter", // DDP method name + + validate: new SimpleSchema({ + name: { + type: String, + optional: true, + }, + }).validator(), + + run({name}) { + if (!this.userId) { + throw new Meteor.Error("Creatures.methods.insert.denied", + "You need to be logged in to insert a creature"); + } + + // Create the creature document + let charId = Creatures.insert({name, owner: this.userId}); + this.unblock(); + //Add all the required attributes to it + if (Meteor.isServer){ + addDefaultStats(charId); + } + return charId; + }, + +}); + +export default insertCreature; diff --git a/app/imports/api/creature/Actions.js b/app/imports/api/creature/properties/Actions.js similarity index 100% rename from app/imports/api/creature/Actions.js rename to app/imports/api/creature/properties/Actions.js diff --git a/app/imports/api/creature/Attacks.js b/app/imports/api/creature/properties/Attacks.js similarity index 100% rename from app/imports/api/creature/Attacks.js rename to app/imports/api/creature/properties/Attacks.js diff --git a/app/imports/api/creature/Attributes.js b/app/imports/api/creature/properties/Attributes.js similarity index 100% rename from app/imports/api/creature/Attributes.js rename to app/imports/api/creature/properties/Attributes.js diff --git a/app/imports/api/creature/Buffs.js b/app/imports/api/creature/properties/Buffs.js similarity index 100% rename from app/imports/api/creature/Buffs.js rename to app/imports/api/creature/properties/Buffs.js diff --git a/app/imports/api/creature/Bundles.js b/app/imports/api/creature/properties/Bundles.js similarity index 100% rename from app/imports/api/creature/Bundles.js rename to app/imports/api/creature/properties/Bundles.js diff --git a/app/imports/api/creature/Classes.js b/app/imports/api/creature/properties/Classes.js similarity index 100% rename from app/imports/api/creature/Classes.js rename to app/imports/api/creature/properties/Classes.js diff --git a/app/imports/api/creature/Conditions.js b/app/imports/api/creature/properties/Conditions.js similarity index 100% rename from app/imports/api/creature/Conditions.js rename to app/imports/api/creature/properties/Conditions.js diff --git a/app/imports/api/creature/CustomBuffs.js b/app/imports/api/creature/properties/CustomBuffs.js similarity index 100% rename from app/imports/api/creature/CustomBuffs.js rename to app/imports/api/creature/properties/CustomBuffs.js diff --git a/app/imports/api/creature/DamageMultipliers.js b/app/imports/api/creature/properties/DamageMultipliers.js similarity index 100% rename from app/imports/api/creature/DamageMultipliers.js rename to app/imports/api/creature/properties/DamageMultipliers.js diff --git a/app/imports/api/creature/Effects.js b/app/imports/api/creature/properties/Effects.js similarity index 100% rename from app/imports/api/creature/Effects.js rename to app/imports/api/creature/properties/Effects.js diff --git a/app/imports/api/creature/Experiences.js b/app/imports/api/creature/properties/Experiences.js similarity index 100% rename from app/imports/api/creature/Experiences.js rename to app/imports/api/creature/properties/Experiences.js diff --git a/app/imports/api/creature/Features.js b/app/imports/api/creature/properties/Features.js similarity index 100% rename from app/imports/api/creature/Features.js rename to app/imports/api/creature/properties/Features.js diff --git a/app/imports/api/creature/Notes.js b/app/imports/api/creature/properties/Notes.js similarity index 100% rename from app/imports/api/creature/Notes.js rename to app/imports/api/creature/properties/Notes.js diff --git a/app/imports/api/creature/Proficiencies.js b/app/imports/api/creature/properties/Proficiencies.js similarity index 100% rename from app/imports/api/creature/Proficiencies.js rename to app/imports/api/creature/properties/Proficiencies.js diff --git a/app/imports/api/creature/Skills.js b/app/imports/api/creature/properties/Skills.js similarity index 100% rename from app/imports/api/creature/Skills.js rename to app/imports/api/creature/properties/Skills.js diff --git a/app/imports/api/creature/SpellLists.js b/app/imports/api/creature/properties/SpellLists.js similarity index 93% rename from app/imports/api/creature/SpellLists.js rename to app/imports/api/creature/properties/SpellLists.js index 8d843066..19e8076d 100644 --- a/app/imports/api/creature/SpellLists.js +++ b/app/imports/api/creature/properties/SpellLists.js @@ -1,5 +1,5 @@ import SimpleSchema from 'simpl-schema'; -import Attributes from "/imports/api/creature/Attributes.js"; +import Attributes from "/imports/api/creature/properties/Attributes.js"; import ColorSchema from "/imports/api/creature/subSchemas/ColorSchema.js"; import {makeParent} from "/imports/api/parenting.js"; diff --git a/app/imports/api/creature/Spells.js b/app/imports/api/creature/properties/Spells.js similarity index 100% rename from app/imports/api/creature/Spells.js rename to app/imports/api/creature/properties/Spells.js diff --git a/app/imports/server/publications/characterList.js b/app/imports/server/publications/characterList.js index a3af66e7..e65536f1 100644 --- a/app/imports/server/publications/characterList.js +++ b/app/imports/server/publications/characterList.js @@ -1,5 +1,5 @@ import Creatures from "/imports/api/creature/Creatures.js"; -import Parties from "/imports/api/campaign/Party.js"; +import Parties from '/imports/api/campaign/Parties.js'; Meteor.publish("characterList", function(){ var userId = this.userId; diff --git a/app/imports/server/publications/singleCharacter.js b/app/imports/server/publications/singleCharacter.js index b2a5ca93..50512f0b 100644 --- a/app/imports/server/publications/singleCharacter.js +++ b/app/imports/server/publications/singleCharacter.js @@ -1,20 +1,20 @@ import Characters from "/imports/api/creature/Creatures.js"; -import Actions from "/imports/api/creature/Actions.js"; -import Attacks from "/imports/api/creature/Attacks.js"; -import Attributes from "/imports/api/creature/Attributes.js"; -import Buffs from "/imports/api/creature/Buffs.js"; -import Classes from "/imports/api/creature/Classes.js"; -import Conditions from "/imports/api/creature/Conditions.js"; -import CustomBuffs from "/imports/api/creature/CustomBuffs.js"; -import DamageMultipliers from "/imports/api/creature/DamageMultipliers.js"; -import Effects from "/imports/api/creature/Effects.js"; -import Experiences from "/imports/api/creature/Experiences.js"; -import Features from "/imports/api/creature/Features.js"; -import Notes from "/imports/api/creature/Notes.js"; -import Skills from "/imports/api/creature/Skills.js"; -import Spells from "/imports/api/creature/Spells.js"; -import SpellLists from "/imports/api/creature/SpellLists.js"; -import Proficiencies from "/imports/api/creature/Proficiencies.js"; +import Actions from "/imports/api/creature/properties/Actions.js"; +import Attacks from "/imports/api/creature/properties/Attacks.js"; +import Attributes from "/imports/api/creature/properties/Attributes.js"; +import Buffs from "/imports/api/creature/properties/Buffs.js"; +import Classes from "/imports/api/creature/properties/Classes.js"; +import Conditions from "/imports/api/creature/properties/Conditions.js"; +import CustomBuffs from "/imports/api/creature/properties/CustomBuffs.js"; +import DamageMultipliers from "/imports/api/creature/properties/DamageMultipliers.js"; +import Effects from "/imports/api/creature/properties/Effects.js"; +import Experiences from "/imports/api/creature/properties/Experiences.js"; +import Features from "/imports/api/creature/properties/Features.js"; +import Notes from "/imports/api/creature/properties/Notes.js"; +import Skills from "/imports/api/creature/properties/Skills.js"; +import Spells from "/imports/api/creature/properties/Spells.js"; +import SpellLists from "/imports/api/creature/properties/SpellLists.js"; +import Proficiencies from "/imports/api/creature/properties/Proficiencies.js"; import Containers from "/imports/api/inventory/Containers.js"; import Items from "/imports/api/inventory/Items.js"; diff --git a/app/imports/ui/character/CharacterCreationDialog.vue b/app/imports/ui/character/CharacterCreationDialog.vue index 6eb14117..e3084e19 100644 --- a/app/imports/ui/character/CharacterCreationDialog.vue +++ b/app/imports/ui/character/CharacterCreationDialog.vue @@ -198,10 +198,10 @@ 14: 7, 15: 9, }; - if (costs[score]){ + if (costs[score] || costs[score] === 0){ return costs[score]; } else { - return null; + return NaN; } }; export default { diff --git a/app/imports/ui/components/Sidebar.vue b/app/imports/ui/components/Sidebar.vue index dacd7f29..f6a8a446 100644 --- a/app/imports/ui/components/Sidebar.vue +++ b/app/imports/ui/components/Sidebar.vue @@ -31,7 +31,7 @@ @@ -63,6 +63,9 @@