diff --git a/src/lang/en.json b/src/lang/en.json index d5c011e..e40564a 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -29,6 +29,9 @@ "OSE.TreasureTableHint": "Drop a rollable table here to roll the monster treasure", "OSE.Size": "Size", "OSE.Morale": "Morale", + "OSE.MoraleCheck": "Morale Check", + "OSE.Reaction": "Reaction", + "OSE.ReactionCheck": "Reaction Check", "OSE.Retainer": "Retainer", "OSE.Appearing": "NA", "OSE.Attack": "Attack", @@ -162,6 +165,7 @@ "OSE.items.roundAttacks": "Attacks Spent this Round", "OSE.items.roundAttacksMax": "Maximum Attacks per Round", "OSE.items.resetAttacks": "Reset all Attacks per Round", + "OSE.items.hasShield": "Has a Shield bonus", "OSE.armor.type": "Armor Type", "OSE.armor.unarmored": "Unarmored", @@ -211,5 +215,11 @@ "OSE.colors.purple": "Purple", "OSE.colors.blue": "Blue", "OSE.colors.orange": "Orange", - "OSE.colors.white": "White" + "OSE.colors.white": "White", + + "OSE.reaction.Hostile": "{name} is Hostile", + "OSE.reaction.Unfriendly": "{name} is Unfriendly", + "OSE.reaction.Neutral": "{name} is Neutral", + "OSE.reaction.Indifferent": "{name} is Indifferent", + "OSE.reaction.Friendly": "{name} is Friendly" } \ No newline at end of file diff --git a/src/module/actor/character-sheet.js b/src/module/actor/character-sheet.js index 62300c8..7baa01d 100644 --- a/src/module/actor/character-sheet.js +++ b/src/module/actor/character-sheet.js @@ -98,6 +98,7 @@ export class OseActorSheetCharacter extends OseActorSheet { }); data.data.aac.value = baseAac + data.data.scores.dex.mod + shield; data.data.ac.value = baseAc - data.data.scores.dex.mod - shield; + data.data.shield = shield; return data; } diff --git a/src/module/actor/entity.js b/src/module/actor/entity.js index 0f40fc5..ea7968d 100644 --- a/src/module/actor/entity.js +++ b/src/module/actor/entity.js @@ -118,6 +118,40 @@ export class OseActor extends Actor { }); } + rollReaction(options = {}) { + const label = game.i18n.localize(`OSE.Reaction`); + const rollParts = ["2d6"]; + + const data = { + ...this.data, + ...{ + rollData: { + type: "Table", + table: { + 2: game.i18n.format("OSE.reaction.Hostile", {name: this.data.name}), + 3: game.i18n.format("OSE.reaction.Unfriendly", {name: this.data.name}), + 6: game.i18n.format("OSE.reaction.Neutral", {name: this.data.name}), + 9: game.i18n.format("OSE.reaction.Indifferent", {name: this.data.name}), + 12: game.i18n.format("OSE.reaction.Friendly", {name: this.data.name}) + } + }, + }, + }; + + let skip = options.event && options.event.ctrlKey; + + // Roll and return + return OseDice.Roll({ + event: options.event, + parts: rollParts, + data: data, + skipDialog: skip, + 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"]; diff --git a/src/module/actor/monster-sheet.js b/src/module/actor/monster-sheet.js index 5220fe8..3e30843 100644 --- a/src/module/actor/monster-sheet.js +++ b/src/module/actor/monster-sheet.js @@ -174,6 +174,11 @@ export class OseActorSheetMonster extends OseActorSheet { actorObject.rollMorale({ event: event }); }); + html.find(".reaction-check a").click((ev) => { + let actorObject = this.actor; + actorObject.rollReaction({ event: event }); + }); + html .find(".counter input") .click((ev) => ev.target.select()) diff --git a/src/module/config.js b/src/module/config.js index 991d1a1..48ec082 100644 --- a/src/module/config.js +++ b/src/module/config.js @@ -35,5 +35,5 @@ export const OSE = { blue: "OSE.colors.blue", orange: "OSE.colors.orange", white: "OSE.colors.white" - } + }, }; diff --git a/src/module/dice.js b/src/module/dice.js index 3567d39..48ec28c 100644 --- a/src/module/dice.js +++ b/src/module/dice.js @@ -28,6 +28,16 @@ export class OseDice { } else { result.isFailure = true; } + } else if (data.rollData.type == "Table") { + // Reaction + let table = data.rollData.table; + let output = ""; + for (let i = 0; i <= roll.total; i++) { + if (table[i]) { + output = table[i]; + } + } + result.details = output; } return result; } diff --git a/src/scss/character.scss b/src/scss/character.scss index 01376aa..934a2bc 100644 --- a/src/scss/character.scss +++ b/src/scss/character.scss @@ -29,12 +29,18 @@ &.armor-class { background: url('/systems/ose/assets/shield.png') no-repeat center; background-size: 70px; + .shield { + text-align: right; + padding: 0 14px; + font-size: 18px; + } } margin: 10px 0; height: 70px; position: relative; - input { + .health-value { font-size: 16px; + text-align: center; font-weight: bolder; text-shadow: 0 0 2px white, 0 1px 2px white, 1px 0 2px white, 1px 1px 2px white; } diff --git a/src/scss/monster.scss b/src/scss/monster.scss index 0ecb10a..cbe297f 100644 --- a/src/scss/monster.scss +++ b/src/scss/monster.scss @@ -3,7 +3,7 @@ min-width: 460px; .header-details { .summary { - .morale-check { + .morale-check,.reaction-check { line-height: 35px; flex: 0 0 20px; &:hover { diff --git a/src/templates/actors/partials/character-attributes-tab.html b/src/templates/actors/partials/character-attributes-tab.html index d036d82..2ce5c4d 100644 --- a/src/templates/actors/partials/character-attributes-tab.html +++ b/src/templates/actors/partials/character-attributes-tab.html @@ -103,25 +103,22 @@