From 70309c960e0dcee4a7744b3d2091a6c9a393e07b Mon Sep 17 00:00:00 2001 From: U~man Date: Sun, 5 Jul 2020 14:43:27 +0200 Subject: [PATCH] ENH: Fix formula formatting, Morale check --- src/module/actor/character-sheet.js | 5 ++ src/module/actor/entity.js | 55 ++++++++++++++++++- src/module/actor/monster-sheet.js | 5 ++ src/module/dice.js | 13 ++++- src/module/item/entity.js | 36 +++++++----- src/scss/monster.scss | 11 ++++ src/template.json | 20 +++++-- .../partials/character-attributes-tab.html | 4 +- .../actors/partials/monster-header.html | 9 ++- src/templates/chat/item-card.html | 2 +- 10 files changed, 130 insertions(+), 30 deletions(-) diff --git a/src/module/actor/character-sheet.js b/src/module/actor/character-sheet.js index d755b6f..4d04279 100644 --- a/src/module/actor/character-sheet.js +++ b/src/module/actor/character-sheet.js @@ -146,6 +146,11 @@ export class OseActorSheetCharacter extends OseActorSheet { actorObject.rollCheck(score, { event: event }); }); + html.find(".hit-dice .attribute-name a").click((ev) => { + let actorObject = this.actor; + actorObject.rollHitDice({ event: event }); + }); + html.find(".exploration .attribute-name a").click((ev) => { let actorObject = this.actor; let element = event.currentTarget; diff --git a/src/module/actor/entity.js b/src/module/actor/entity.js index 707b38d..3f63528 100644 --- a/src/module/actor/entity.js +++ b/src/module/actor/entity.js @@ -37,8 +37,8 @@ export class OseActor extends Actor { ...this.data, ...{ rollData: { - type: "Save", - stat: save, + type: "Above", + target: this.data.data.saves[save].value, }, }, }; @@ -54,6 +54,32 @@ export class OseActor extends Actor { }); } + rollMorale(options = {}) { + const label = game.i18n.localize(`OSE.Morale`); + const rollParts = ["2d6"]; + + const data = { + ...this.data, + ...{ + rollData: { + type: "Below", + target: this.data.data.details.morale, + }, + }, + }; + + // Roll and return + return OseDice.Roll({ + event: options.event, + parts: rollParts, + data: data, + skipDialog: true, + speaker: ChatMessage.getSpeaker({ actor: this }), + flavor: `${label} ${game.i18n.localize("OSE.Roll")}`, + title: `${label} ${game.i18n.localize("OSE.Roll")}`, + }); + } + rollCheck(score, options = {}) { const label = game.i18n.localize(`OSE.scores.${score}.long`); const rollParts = ["1d20"]; @@ -79,6 +105,31 @@ export class OseActor extends Actor { }); } + rollHitDice(options = {}) { + const label = game.i18n.localize(`OSE.HitDice`); + const rollParts = [this.data.data.hp.hd]; + + const data = { + ...this.data, + ...{ + rollData: { + type: "Hit Dice" + }, + }, + }; + + // Roll and return + return OseDice.Roll({ + event: options.event, + parts: rollParts, + data: data, + skipDialog: true, + speaker: ChatMessage.getSpeaker({ actor: this }), + flavor: `${label} ${game.i18n.localize("OSE.Roll")}`, + title: `${label} ${game.i18n.localize("OSE.Roll")}`, + }); + } + rollExploration(expl, options = {}) { const label = game.i18n.localize(`OSE.exploration.${expl}.long`); const rollParts = ["1d6"]; diff --git a/src/module/actor/monster-sheet.js b/src/module/actor/monster-sheet.js index 54ee4ec..2a2eed8 100644 --- a/src/module/actor/monster-sheet.js +++ b/src/module/actor/monster-sheet.js @@ -135,6 +135,11 @@ export class OseActorSheetMonster extends OseActorSheet { return this.actor.createOwnedItem(itemData, {}); }); + html.find(".morale-check a").click((ev) => { + let actorObject = this.actor; + actorObject.rollMorale({ event: event }); + }); + // Handle default listeners last so system listeners are triggered first super.activateListeners(html); } diff --git a/src/module/dice.js b/src/module/dice.js index 4444fa5..57d8b68 100644 --- a/src/module/dice.js +++ b/src/module/dice.js @@ -34,16 +34,23 @@ export class OseDice { -3, 9 )} (${thac})`; - // ADD DAMAGE ROLL } - } else if (data.rollData.type == "Save") { + } else if (data.rollData.type == "Above") { // SAVING THROWS - let sv = data.data.saves[data.rollData.stat].value; + let sv = data.rollData.target; if (roll.total >= sv) { details = `
Success! (${sv})
`; } else { details = `
Failure (${sv})
`; } + } else if (data.rollData.type == "Below") { + // Morale + let m = data.rollData.target; + if (roll.total <= m) { + details = `
Success! (${m})
`; + } else { + details = `
Failure (${m})
`; + } } else if (data.rollData.type == "Check") { // SCORE CHECKS let sc = data.data.scores[data.rollData.stat].value; diff --git a/src/module/item/entity.js b/src/module/item/entity.js index 4b9d796..ae125ff 100644 --- a/src/module/item/entity.js +++ b/src/module/item/entity.js @@ -1,3 +1,5 @@ +import { OseDice } from "../dice.js"; + /** * Override and extend the basic :class:`Item` implementation */ @@ -48,7 +50,6 @@ export class OseItem extends Item { } rollWeapon() { - console.log("WEAPON"); if (this.data.data.missile) { this.actor.rollAttack({type: 'missile', label: this.name, dmg: this.data.data.damage}); } else if (this.data.data.melee) { @@ -60,25 +61,32 @@ export class OseItem extends Item { } async rollFormula(options={}) { - console.log("FORMULA"); if ( !this.data.data.roll ) { throw new Error("This Item does not have a formula to roll!"); } - // Define Roll Data - const rollData = { - item: this.data.data - }; - const title = `${this.name} - Roll`; + const label = `${this.name}`; + const rollParts = [this.data.data.roll]; - // Invoke the roll and submit it to chat - const roll = new Roll(rollData.item.roll, rollData).roll(); - roll.toMessage({ - speaker: ChatMessage.getSpeaker({actor: this.actor}), - flavor: this.data.data.chatFlavor || title, - rollMode: game.settings.get("core", "rollMode") + const data = { + ...this.data, + ...{ + rollData: { + type: "Formula" + }, + }, + }; + + // Roll and return + return OseDice.Roll({ + event: options.event, + parts: rollParts, + data: data, + skipDialog: true, + speaker: ChatMessage.getSpeaker({ actor: this }), + flavor: `${label} ${game.i18n.localize("OSE.Roll")}`, + title: `${label} ${game.i18n.localize("OSE.Roll")}`, }); - return roll; } /** diff --git a/src/scss/monster.scss b/src/scss/monster.scss index 75f0482..de947aa 100644 --- a/src/scss/monster.scss +++ b/src/scss/monster.scss @@ -1,6 +1,17 @@ .ose.actor.monster { min-height: 565px; min-width: 460px; + .header-details { + .summary { + .morale-check { + line-height: 35px; + flex: 0 0 20px; + &:hover { + color: $colorDark; + } + } + } + } .sheet-body { .editor { height: 300px; diff --git a/src/template.json b/src/template.json index f36c6ed..82e1716 100644 --- a/src/template.json +++ b/src/template.json @@ -29,11 +29,21 @@ } }, "saves": { - "death": 10, - "wand": 10, - "paralysis": 10, - "breath": 10, - "spell": 10 + "death": { + "value": 10 + }, + "wand": { + "value": 10 + }, + "paralysis": { + "value": 10 + }, + "breath": { + "value": 10 + }, + "spell": { + "value": 10 + } }, "movement": { "base": 120 diff --git a/src/templates/actors/partials/character-attributes-tab.html b/src/templates/actors/partials/character-attributes-tab.html index 20b345a..933bbbc 100644 --- a/src/templates/actors/partials/character-attributes-tab.html +++ b/src/templates/actors/partials/character-attributes-tab.html @@ -126,9 +126,9 @@
diff --git a/src/templates/chat/item-card.html b/src/templates/chat/item-card.html index 1a93f7b..6d753ea 100644 --- a/src/templates/chat/item-card.html +++ b/src/templates/chat/item-card.html @@ -29,7 +29,7 @@ {{/if}} {{#if data.roll}} - + {{/if}}