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 = `