From bd86c1608e4ea8eb8d11e5e25277e1f78f0561b4 Mon Sep 17 00:00:00 2001 From: Thaum Date: Fri, 20 Feb 2015 10:09:53 +0000 Subject: [PATCH] Added XP, changed spellslot display --- rpg-docs/.meteor/packages | 1 + rpg-docs/.meteor/versions | 1 + rpg-docs/Model/Character/Characters.js | 13 +++- rpg-docs/Model/Character/Experience.js | 22 +++++++ rpg-docs/client/globalHelpers/mongol.js | 17 +++++ .../views/character/inventory/inventory.css | 2 + .../views/character/inventory/inventory.html | 10 +-- .../experienceDialog/experienceDialog.css | 3 + .../experienceDialog/experienceDialog.html | 32 ++++++++++ .../experienceDialog/experienceDialog.js | 49 ++++++++++++++ .../views/character/journal/journal.css | 7 ++ .../views/character/journal/journal.html | 23 ++++++- .../client/views/character/journal/journal.js | 64 +++++++++++++++---- .../client/views/character/spells/spells.css | 36 ++++++++++- .../client/views/character/spells/spells.html | 48 +++++++++----- .../client/views/character/spells/spells.js | 63 +++++++++++++++++- rpg-docs/lib/constants/colorOptions.js | 4 +- .../server/publications/singleCharacter.js | 5 +- 18 files changed, 355 insertions(+), 45 deletions(-) create mode 100644 rpg-docs/Model/Character/Experience.js create mode 100644 rpg-docs/client/globalHelpers/mongol.js create mode 100644 rpg-docs/client/views/character/journal/experienceDialog/experienceDialog.css create mode 100644 rpg-docs/client/views/character/journal/experienceDialog/experienceDialog.html create mode 100644 rpg-docs/client/views/character/journal/experienceDialog/experienceDialog.js diff --git a/rpg-docs/.meteor/packages b/rpg-docs/.meteor/packages index 9ace0240..a927b8e0 100644 --- a/rpg-docs/.meteor/packages +++ b/rpg-docs/.meteor/packages @@ -17,3 +17,4 @@ aldeed:collection2 differential:vulcanize aldeed:autoform conielo:autoform-polymer-paper +msavin:mongol diff --git a/rpg-docs/.meteor/versions b/rpg-docs/.meteor/versions index 0434d325..c3915dd4 100644 --- a/rpg-docs/.meteor/versions +++ b/rpg-docs/.meteor/versions @@ -52,6 +52,7 @@ minimongo@1.0.6 mobile-status-bar@1.0.2 momentjs:moment@2.8.4 mongo@1.0.11 +msavin:mongol@0.1.1 npm-bcrypt@0.7.7 observe-sequence@1.0.4 ordered-dict@1.0.2 diff --git a/rpg-docs/Model/Character/Characters.js b/rpg-docs/Model/Character/Characters.js index d5496430..f5f0cdf4 100644 --- a/rpg-docs/Model/Character/Characters.js +++ b/rpg-docs/Model/Character/Characters.js @@ -188,8 +188,9 @@ Schemas.Character = new SimpleSchema({ owner: { type: String, regEx: SimpleSchema.RegEx.Id }, readers: { type: [String], regEx: SimpleSchema.RegEx.Id }, writers: { type: [String], regEx: SimpleSchema.RegEx.Id }, - color: {type: String, allowedValues: _.pluck(colorOptions, "key"), defaultValue: "q"} + color: {type: String, allowedValues: _.pluck(colorOptions, "key"), defaultValue: "q"}, //TODO add per-character settings + "settings.experiencesInc": {type: Number, defaultValue: 20}, }); Characters.attachSchema(Schemas.Character); @@ -431,7 +432,7 @@ Characters.helpers({ }, level: function(){ - var xp = this.attributeValue("experience"); + var xp = this.experience(); var xpTable = [0, 300, 900, 2700, 6500, 14000, 23000, 34000, 48000, 64000, 85000, 100000, 120000, 140000, 165000, 195000, 225000, 265000, 305000, 355000]; @@ -442,5 +443,13 @@ Characters.helpers({ }; if(xp > 355000) return 20; return 0; + }, + + experience: function(){ + var xp = 0; + Experiences.find({charId: this._id}, {fields: {value: 1}}).forEach(function(e){ + xp += e.value; + }) + return xp; } }); diff --git a/rpg-docs/Model/Character/Experience.js b/rpg-docs/Model/Character/Experience.js new file mode 100644 index 00000000..f67b6399 --- /dev/null +++ b/rpg-docs/Model/Character/Experience.js @@ -0,0 +1,22 @@ +Experiences = new Meteor.Collection("experience"); + +Schemas.Experience = new SimpleSchema({ + charId: {type: String, regEx: SimpleSchema.RegEx.Id}, + name: {type: String, defaultValue: "New Experience"}, + description: {type: String, optional: true}, + value: {type: Number, defaultValue: 0}, + dateAdded: { + type: Date, + autoValue: function() { + if (this.isInsert) { + return new Date; + } else if (this.isUpsert) { + return {$setOnInsert: new Date}; + } else { + this.unset(); + } + } + }, +}); + +Experiences.attachSchema(Schemas.Experience); diff --git a/rpg-docs/client/globalHelpers/mongol.js b/rpg-docs/client/globalHelpers/mongol.js new file mode 100644 index 00000000..7aa522c7 --- /dev/null +++ b/rpg-docs/client/globalHelpers/mongol.js @@ -0,0 +1,17 @@ +Session.set("Mongol", { + 'collections': [ + "Characters", + "Containers", + "Items", + "Features", + "Effects", + "Spells", + "SpellLists", + "Notes", + "Experiences" + ], + 'display': true, + 'opacity_normal': ".7", + 'opacity_expand': ".9", + 'disable_warning': 'false', +}); \ No newline at end of file diff --git a/rpg-docs/client/views/character/inventory/inventory.css b/rpg-docs/client/views/character/inventory/inventory.css index f70293d3..3b48002d 100644 --- a/rpg-docs/client/views/character/inventory/inventory.css +++ b/rpg-docs/client/views/character/inventory/inventory.css @@ -5,6 +5,8 @@ -webkit-column-gap: 8px; -moz-column-gap: 8px; column-gap: 8px; + -moz-column-fill: balance; + column-fill: balance; padding: 8px; } diff --git a/rpg-docs/client/views/character/inventory/inventory.html b/rpg-docs/client/views/character/inventory/inventory.html index 62c9e256..0d248873 100644 --- a/rpg-docs/client/views/character/inventory/inventory.html +++ b/rpg-docs/client/views/character/inventory/inventory.html @@ -36,11 +36,11 @@
{{#each items ../_id _id}} -
- - {{#if ne1 quantity}}{{quantity}} {{/if}}{{pluralName}} - -
+
+ + {{#if ne1 quantity}}{{quantity}} {{/if}}{{pluralName}} + +
{{/each}}
diff --git a/rpg-docs/client/views/character/journal/experienceDialog/experienceDialog.css b/rpg-docs/client/views/character/journal/experienceDialog/experienceDialog.css new file mode 100644 index 00000000..2cc1e765 --- /dev/null +++ b/rpg-docs/client/views/character/journal/experienceDialog/experienceDialog.css @@ -0,0 +1,3 @@ +.noteDialog .colorDropdown { + top: 0; +} diff --git a/rpg-docs/client/views/character/journal/experienceDialog/experienceDialog.html b/rpg-docs/client/views/character/journal/experienceDialog/experienceDialog.html new file mode 100644 index 00000000..7f4ac9f9 --- /dev/null +++ b/rpg-docs/client/views/character/journal/experienceDialog/experienceDialog.html @@ -0,0 +1,32 @@ + \ No newline at end of file diff --git a/rpg-docs/client/views/character/journal/experienceDialog/experienceDialog.js b/rpg-docs/client/views/character/journal/experienceDialog/experienceDialog.js new file mode 100644 index 00000000..1d862535 --- /dev/null +++ b/rpg-docs/client/views/character/journal/experienceDialog/experienceDialog.js @@ -0,0 +1,49 @@ +Template.experienceDialog.rendered = function(){ + var self = this; + //update all autogrows after they've been filled + var pata = this.$("paper-autogrow-textarea"); + pata.each(function(index, el){ + el.update($(el).children().get(0)); + }) + //update all input fields as well + var input = this.$("paper-input"); + input.each(function(index, el){ + el.valueChanged(); + }) + //after the dialog is built, open it + if (!this.alreadyRendered){ + Session.set("global.ui.detailShow", true); + this.alreadyRendered = true; + } +} + +Template.experienceDialog.events({ + "tap #backButton": function(){ + GlobalUI.closeDetail(); + }, + "tap #deleteExperience": function(){ + Experiences.remove(this._id); + GlobalUI.closeDetail(); + }, + //TODO clean up String -> num here so they don't need casting by Schema.clean + //TODO validate input (integer, non-negative, etc) for these inputs and give validation errors + "change #experienceNameInput, input #experienceNameInput": function(event){ + var value = event.currentTarget.value + Experiences.update(this._id, {$set: {name: value}}); + }, + "change #valueInput": function(event){ + var value = event.currentTarget.value + Experiences.update(this._id, {$set: {value: value}}); + }, + "change #experienceDescriptionInput": function(event){ + var value = event.currentTarget.value + Experiences.update(this._id, {$set: {description: value}}); + } +}); + +Template.experienceDialog.helpers({ + experience: function(){ + Experiences.findOne(this.experienceId); + return Experiences.findOne(this.experienceId); + } +}); diff --git a/rpg-docs/client/views/character/journal/journal.css b/rpg-docs/client/views/character/journal/journal.css index e69de29b..f0423d04 100644 --- a/rpg-docs/client/views/character/journal/journal.css +++ b/rpg-docs/client/views/character/journal/journal.css @@ -0,0 +1,7 @@ +.experiences { + padding: 0 0 16px 0; +} + +.experience { + height: 48px; +} diff --git a/rpg-docs/client/views/character/journal/journal.html b/rpg-docs/client/views/character/journal/journal.html index ae5506a5..39c74f01 100644 --- a/rpg-docs/client/views/character/journal/journal.html +++ b/rpg-docs/client/views/character/journal/journal.html @@ -2,9 +2,30 @@
+ +
+
Experience
+
{{experience}}XP
+
+
+ {{#each experiences}} +
+ +
{{name}}
{{value}}
+
+
+ {{/each}} +
+ {{#if moreExperiencesOrCollapse}} +
+ Load More + Collapse +
+ {{/if}} +
{{#each notes}} -
+
{{name}}
diff --git a/rpg-docs/client/views/character/journal/journal.js b/rpg-docs/client/views/character/journal/journal.js index 87e1168b..f26bb61b 100644 --- a/rpg-docs/client/views/character/journal/journal.js +++ b/rpg-docs/client/views/character/journal/journal.js @@ -1,22 +1,47 @@ +Template.journal.created = function(){ + var self = this; + self.experiencesLimit = new ReactiveVar(self.data.settings && self.data.settings.experiencesInc || 10); +}; + Template.journal.helpers({ notes: function(){ return Notes.find({charId: this._id}, {sort: {color: 1, name: 1}}); + }, + experiences: function(){ + return Experiences.find({charId: this._id}, {sort: {dateAdded: -1}, limit: Template.instance().experiencesLimit.get()}); + }, + notMoreExperiences: function(){ + return Experiences.find({charId: this._id}).count() < Template.instance().experiencesLimit.get(); + }, + cantCollapse: function(){ + return Template.instance().experiencesLimit.get() <= (this.settings && this.settings.experiencesInc || 10); + }, + moreExperiencesOrCollapse: function(){ + return (!(Experiences.find({charId: this._id}).count() < Template.instance().experiencesLimit.get())) || + Template.instance().experiencesLimit.get() > (this.settings && this.settings.experiencesInc || 10); } }); Template.journal.events({ - "tap .containerTop": function(event){ + "tap .noteTop": function(event){ GlobalUI.setDetail({ template: "noteDialog", data: {noteId: this._id, charId: this.charId}, heroId: this._id }); }, + "tap .experience": function(event){ + GlobalUI.setDetail({ + template: "experienceDialog", + data: {experienceId: this._id, charId: this.charId}, + heroId: this._id + }); + }, "tap #addNote": function(event){ - var charId = this.charId; + var charId = this._id; Notes.insert({ name: "New Note", - charId: this._id + charId: charId }, function(error, id){ if(!error){ GlobalUI.setDetail({ @@ -28,21 +53,32 @@ Template.journal.events({ }); }, "tap #addXP": function(event){ - var charId = this.charId; - var listId = this.listId; - throw new Error("not implemented")/* - Spells.insert({ - name: "New Spell", - charId: this._id, - listId: SpellLists.findOne({charId: this._id})._id + var charId = this._id; + Experiences.insert({ + charId: charId }, function(error, id){ if(!error){ GlobalUI.setDetail({ - template: "spellDialog", - data: {spellId: id, charId: charId, listId: listId}, - heroId: id + template: "experienceDialog", + data: {experienceId: id, charId: charId}, + heroId: id }); } - });*/ + }) + }, + "tap #moreExperiences": function(event){ + var inst = Template.instance(); + inst.experiencesLimit.set(inst.experiencesLimit.get() + (this.settings && this.settings.experiencesInc || 10)); + }, + "tap #lessExperiences": function(event){ + var inst = Template.instance(); + inst.experiencesLimit.set(this.settings && this.settings.experiencesInc || 10); + //scroll to the top of the div + inst.$(".scroll-y").animate({ + scrollTop: inst.$(".scroll-y").scrollTop() + inst.$(".experiencesCard").position().top - 8 + }, 300); + //HACK giggle the columns :( to workaround chrome bug that stops .containers height from updating + var cs = inst.$(".containers").removeClass("containers"); + _.defer(function(){cs.addClass("containers")}); } }); diff --git a/rpg-docs/client/views/character/spells/spells.css b/rpg-docs/client/views/character/spells/spells.css index 39d2fc13..49176fd2 100644 --- a/rpg-docs/client/views/character/spells/spells.css +++ b/rpg-docs/client/views/character/spells/spells.css @@ -11,10 +11,44 @@ height: 32px; } +#spells .inventoryItem[disabled] { + color: #ccc !important; + color: rgba(0,0,0,0.26) !important; + pointer-events: initial !important; + cursor: pointer !important; +} + +#spells .inventoryItem[disabled] core-icon{ + color: #ccc !important; + color: rgba(0,0,0,0.26) !important; +} + #spells .inventoryItem paper-checkbox{ - pointer-events: initial; + pointer-events: initial !important; } #spells paper-checkbox /deep/ #ink { color: #009688; } + +#spells .inventoryItem.spellSlot { + height: 48px; +} + +.slotName { + margin-right: 16px; +} + +.slotBubble { + pointer-events: initial !important; +} + +.slotBubble { + color: #000; + color: rgba(0,0,0,0.54); +} + +.slotBubble[disabled] { + color: #cccccc; + color: rgba(0,0,0,0.26); +} diff --git a/rpg-docs/client/views/character/spells/spells.html b/rpg-docs/client/views/character/spells/spells.html index 770cb587..9fe65656 100644 --- a/rpg-docs/client/views/character/spells/spells.html +++ b/rpg-docs/client/views/character/spells/spells.html @@ -1,19 +1,28 @@