From 87ca3febd354abc0e30f28ec6ba857a6f602b86f Mon Sep 17 00:00:00 2001 From: sladecraven Date: Fri, 12 Mar 2021 17:12:14 +0100 Subject: [PATCH] #4 : Weakness management, including bonus/malus field for scores and reminder in the flip dialog --- img/icons/weakness_generic1.svg | 1 + ...{forest-camp.svg => weakness_generic2.svg} | 0 lang/en.json | 1 + module/actor-sheet.js | 2 + module/actor.js | 38 ++++++++++++------- packs/weaknesses.db | 4 ++ system.json | 13 ++++++- template.json | 27 ++++++++----- templates/actor-sheet.html | 34 ++++++++++++++--- templates/dialog-flip.html | 7 ++++ templates/item-weakness-sheet.html | 35 +++++++++++++++++ 11 files changed, 132 insertions(+), 30 deletions(-) create mode 100644 img/icons/weakness_generic1.svg rename img/icons/{forest-camp.svg => weakness_generic2.svg} (100%) create mode 100644 packs/weaknesses.db create mode 100644 templates/item-weakness-sheet.html diff --git a/img/icons/weakness_generic1.svg b/img/icons/weakness_generic1.svg new file mode 100644 index 0000000..601f08e --- /dev/null +++ b/img/icons/weakness_generic1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/icons/forest-camp.svg b/img/icons/weakness_generic2.svg similarity index 100% rename from img/icons/forest-camp.svg rename to img/icons/weakness_generic2.svg diff --git a/lang/en.json b/lang/en.json index 969232c..2cf8490 100644 --- a/lang/en.json +++ b/lang/en.json @@ -13,6 +13,7 @@ "SCORES.Currentwounds": "Current Wounds", "SCORES.Shock": "Shock", "SCORES.Wounds": "Wounds", + "SCORES.Totalwounds": "Max. Wounds", "SCORES.Encumbrance": "Encumbrance", "STATS.physical": "physical", diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 826c689..ff1819e 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -25,6 +25,8 @@ export class SoSActorSheet extends ActorSheet { getData() { let data = super.getData(); + this.actor.checkDeck(); + data.data.edgecard = this.actor.getEdgesCard(); data.data.deckSize = this.actor.getDeckSize(); diff --git a/module/actor.js b/module/actor.js index 1623188..35e98d5 100644 --- a/module/actor.js +++ b/module/actor.js @@ -53,17 +53,22 @@ export class SoSActor extends Actor { async prepareData() { super.prepareData(); - if ( !this.cardDeck ) { - if ( this.hasPlayerOwner) { - this.cardDeck = new SoSCardDeck(); - this.cardDeck.initCardDeck( this, this.data.data.internals.deck ); - } else { - this.cardDeck = game.system.sos.gmDeck; - } - } + this.checkDeck(); this.controlScores(); } + /* -------------------------------------------- */ + checkDeck() { + if ( !this.cardDeck && this.hasPlayerOwner ) { + this.cardDeck = new SoSCardDeck(); + this.cardDeck.initCardDeck( this, this.data.data.internals.deck ); + } + if ( !this.hasPlayerOwner ) { + this.cardDeck = game.system.sos.gmDeck.GMdeck; + console.log("DECK : ", this.cardDeck); + } + } + /* -------------------------------------------- */ getDeckSize() { return this.cardDeck.getDeckSize(); @@ -120,8 +125,8 @@ export class SoSActor extends Actor { } /* -------------------------------------------- */ computeDefense() { - return { value: Math.ceil((this.data.data.stats.speed.value + this.data.data.stats.perception.value + this.data.data.stats.dexterity.value) / 2), - critical: this.data.data.stats.speed.value + this.data.data.stats.perception.value + this.data.data.stats.dexterity.value + return { value: Math.ceil((this.data.data.stats.speed.value + this.data.data.stats.perception.value + this.data.data.stats.dexterity.value) / 2) + this.data.data.scores.defense.bonusmalus, + critical: this.data.data.stats.speed.value + this.data.data.stats.perception.value + this.data.data.stats.dexterity.value + this.data.data.scores.defense.bonusmalus } } /* -------------------------------------------- */ @@ -132,23 +137,27 @@ export class SoSActor extends Actor { getEncumbrance( ) { return this.data.data.scores.encumbrance.value; } + computeEncumbrance( ) { + return this.data.data.stats.strength.value + this.data.data.scores.encumbrance.bonusmalus; + } + /* -------------------------------------------- */ computeEdge( ) { - return Math.ceil( (this.data.data.stats.intelligence.value + this.data.data.stats.charisma.value) / 2) + this.data.data.scores.edge.bonus; + return Math.ceil( (this.data.data.stats.intelligence.value + this.data.data.stats.charisma.value) / 2) + this.data.data.scores.edge.bonusmalus; } /* -------------------------------------------- */ getShock( ) { return this.data.data.scores.shock.value; } computeShock() { - return Math.ceil( this.data.data.stats.endurance.value + this.data.data.stats.determination.value + this.data.data.scores.dr.value); + return Math.ceil( this.data.data.stats.endurance.value + this.data.data.stats.determination.value + this.data.data.scores.dr.value) + this.data.data.scores.shock.bonusmalus; } /* -------------------------------------------- */ getWound( ) { return this.data.data.scores.wound.value; } computeWound() { - return Math.ceil( (this.data.data.stats.strength.value + this.data.data.stats.endurance.value) / 2); + return Math.ceil( (this.data.data.stats.strength.value + this.data.data.stats.endurance.value) / 2) + this.data.data.scores.wounds.bonusmalus; } /* -------------------------------------------- */ @@ -183,7 +192,7 @@ export class SoSActor extends Actor { } // Encumbrance if ( this.getEncumbrance() != this.data.data.stats.strength.value ) { - await this.update( {'data.scores.encumbrance.value': this.data.data.stats.strength.value }); + await this.update( {'data.scores.encumbrance.value': this.computeEncumbrance() }); } // Shock if ( this.getShock() != this.computeShock() ) { @@ -235,6 +244,7 @@ export class SoSActor extends Actor { modifierList: SoSUtility.fillRange(-10, +10), tnList: SoSUtility.fillRange(6, 20), consequencesList: duplicate( this.getApplicableConsequences() ), + weaknessList: this.data.items.filter( item => item.type == 'weakness' ), wounds: duplicate( this.data.data.wounds), malusConsequence: 0, bonusConsequence: 0, diff --git a/packs/weaknesses.db b/packs/weaknesses.db new file mode 100644 index 0000000..d74a9e5 --- /dev/null +++ b/packs/weaknesses.db @@ -0,0 +1,4 @@ +{"name":"Complication (Wanted)","permission":{"default":0,"pJLHbu8WlBVyfXG4":3},"type":"weakness","data":{"subtitle":"","category":"complication","description":""},"flags":{},"img":"systems/foundryvtt-shadows-over-sol/img/icons/weakness_generic1.svg","effects":[],"_id":"FxCIbJm3T44kC0sG"} +{"name":"Impairment (Limp)","permission":{"default":0,"pJLHbu8WlBVyfXG4":3},"type":"weakness","data":{"subtitle":"","category":"impairment","description":""},"flags":{},"img":"systems/foundryvtt-shadows-over-sol/img/icons/weakness_generic1.svg","effects":[],"_id":"HxPweZ03At9tw6GH"} +{"name":"Shortcoming (Low Pain Treshold)","permission":{"default":0,"pJLHbu8WlBVyfXG4":3},"type":"weakness","data":{"subtitle":"","category":"shortcoming","description":""},"flags":{},"img":"systems/foundryvtt-shadows-over-sol/img/icons/weakness_generic1.svg","effects":[],"_id":"UEHEoNKHUe2hJryO"} +{"name":"Disability (Blind)","permission":{"default":0,"pJLHbu8WlBVyfXG4":3},"type":"weakness","data":{"subtitle":"","category":"disability","description":""},"flags":{},"img":"systems/foundryvtt-shadows-over-sol/img/icons/weakness_generic1.svg","effects":[],"_id":"VDYXsT8AZ6krv93p"} diff --git a/system.json b/system.json index 141d826..72f3527 100644 --- a/system.json +++ b/system.json @@ -2,11 +2,11 @@ "name": "foundryvtt-shadows-over-sol", "title": "Shadows over Sol", "description": "Shadows over Sol for FoundryVTT", - "version": "0.1.6", + "version": "0.1.11", "manifestPlusVersion": "1.0.0", "minimumCoreVersion": "0.7.5", "compatibleCoreVersion": "0.7.9", - "templateVersion": 18, + "templateVersion": 22, "author": "LeRatierBretonnien", "esmodules": [ "module/sos-main.js" ], "styles": ["styles/simple.css"], @@ -49,6 +49,15 @@ "path": "./packs/injuries.db", "entity": "Item", "tags" : [ "injury" ] + }, + { + "name": "weaknesses", + "label": "Weaknesses", + "system": "foundryvtt-shadows-over-sol", + "module": "foundryvtt-shadows-over-sol", + "path": "./packs/weaknesses.db", + "entity": "Item", + "tags" : [ "weakness" ] }, { "name": "languages", diff --git a/template.json b/template.json index 81f75b3..1d46f73 100644 --- a/template.json +++ b/template.json @@ -81,40 +81,48 @@ "edge": { "label": "SCORES.Edge", "value": 0, - "bonus": 0 + "bonusmalus": 0 }, "wealth": { "label": "SCORES.Wealth", - "value": 0 + "value": 0, + "bonusmalus": 0 }, "lifestyle": { "label": "SCORES.Lifestyle", - "value": 0 + "value": 0, + "bonusmalus": 0 }, "defense": { "label": "SCORES.Defense", "value": 0, - "critical": 0 + "critical": 0, + "bonusmalus": 0 }, "dr": { "label": "SCORES.DR", - "value": 0 + "value": 0, + "bonusmalus": 0 }, "shock": { "label": "SCORES.Shock", - "value": 0 + "value": 0, + "bonusmalus": 0 }, "currentwounds": { "label": "SCORES.Currentwounds", - "value": 0 + "value": 0, + "bonusmalus": 0 }, "wound": { "label": "SCORES.Wounds", - "value": 0 + "value": 0, + "bonusmalus": 0 }, "encumbrance": { "label": "SCORES.Encumbrance", - "value": 0 + "value": 0, + "bonusmalus": 0 } } }, @@ -165,6 +173,7 @@ }, "weakness": { "subtitle": "", + "category": "", "description": "" }, "geneline": { diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index a583569..6708958 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -31,7 +31,13 @@ src="systems/foundryvtt-shadows-over-sol/img/icons/{{#if data.editStatSkill}}unlocked.svg{{else}}locked.svg{{/if}}" alt="lock/unlock" >{{#if data.editStatSkill}}Lock{{else}}Unlock{{/if}} +
+ Weaknesses + +
diff --git a/templates/dialog-flip.html b/templates/dialog-flip.html index 2141a11..f430505 100644 --- a/templates/dialog-flip.html +++ b/templates/dialog-flip.html @@ -51,6 +51,13 @@

Consequences Bonus : 0

+
+
+ {{#each weaknessList as |weakness key|}} + {{localize weakness.name}} - {{weakness.data.category}} + {{/each}} +
+
{{#if (gt wounds.light 0)}} diff --git a/templates/item-weakness-sheet.html b/templates/item-weakness-sheet.html new file mode 100644 index 0000000..f555679 --- /dev/null +++ b/templates/item-weakness-sheet.html @@ -0,0 +1,35 @@ +
+
+ +
+

+
+
+ + {{!-- Sheet Body --}} +
+ +
+
+ +
+ +
+
+
+ +
+ {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
+
+
+ +
+