diff --git a/dragonbane.css b/dragonbane.css index 8860d22..79c9e3f 100644 --- a/dragonbane.css +++ b/dragonbane.css @@ -1620,3 +1620,9 @@ box-shadow: 0 0 2px #FFF inset; word-break: break-all; } +.system-dragonbane .checkbox-container { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; +} diff --git a/dragonbane.js b/dragonbane.js index 9336a93..a2e5b4e 100644 --- a/dragonbane.js +++ b/dragonbane.js @@ -256,6 +256,15 @@ function registerSettings() { default: true, type: Boolean }); + // If true, support intensive training with a teacher + game.settings.register("dragonbane", "automaticSkillIntensiveTraining", { + name: "DoD.SETTINGS.automaticSkillIntensiveTraining", + hint: "DoD.SETTINGS.automaticSkillIntensiveTrainingHint", + scope: "world", + config: true, + default: false, + type: Boolean + }); } Hooks.once("init", function () { diff --git a/lang/en.json b/lang/en.json index d050018..4b0d2ef 100644 --- a/lang/en.json +++ b/lang/en.json @@ -248,7 +248,9 @@ "hide": "Hide", "hideTooltip": "Hides skill from the list of Skills on the character's main tab", "markAdvancement": "Mark skill for advancement", + "markTaught": "Immediately roll to advance skill due to intense training with a teacher.", "rollAdvancement": "Roll to advance skill at end of session.\rRight-click to remove mark without rolling.", + "rollTaught": "Has already performed intense training with a teacher.", "type": "Type", "typeTooltip": "The skill's Type" }, @@ -539,7 +541,9 @@ "allowDealDamageOnSelected": "Damage selected token", "allowDealDamageOnSelectedHint": "If checked, the GM may deal damage (and heal) the selected token if no token has been targeted.", "automaticSkillAdvancementMark": "Automate skill checkmark", - "automaticSkillAdvancementMarkHint": "Automatically set improvement checkmark on Dragon and Demon rolls." + "automaticSkillAdvancementMarkHint": "Automatically set improvement checkmark on Dragon and Demon rolls.", + "automaticSkillIntensiveTraining": "Handle intensive training with a teacher.", + "automaticSkillIntensiveTrainingHint": "Handle intensive training with a teacher (will add a second checkbox to be clicked after intensive training, if that advancement is successful it will be blocked until an advancement check has been filled.)" }, "WARNING": { "kinAbility": "Could not find Kin Ability: {ability}", diff --git a/lang/sv.json b/lang/sv.json index 199dca8..a49fdbd 100644 --- a/lang/sv.json +++ b/lang/sv.json @@ -250,7 +250,9 @@ "hide": "Dölj", "hideTooltip": "Dölj från listan med Färdigheter på karaktärens översiktsflik", "markAdvancement": "Sätt förbättringskryss", + "markTaught": "Slå omedelbart förbättringsslag pga intensiv träning med lärare.", "rollAdvancement": "Slå förbättringsslag i slutet av spelpasset.\rHögerklicka för att ta bort markeringen utan att slå förbättringsslag.", + "rollTaught": "Har redan utfört intensiv träning med en lärare", "type": "Typ", "typeTooltip": "Färdighetens typ" }, @@ -543,7 +545,9 @@ "allowDealDamageOnSelected": "Skada på vald spelfigur", "allowDealDamageOnSelectedHint": "Spelledaren (GM) kan tillfoga skada (och hela skada) på vald spelfigur om ingen spelfigur satts som mål.", "automaticSkillAdvancementMark": "Automatiskt förbättringskryss", - "automaticSkillAdvancementMarkHint": "Sätt automatiskt förbättringskryss vid Drakslag eller Demonslag." + "automaticSkillAdvancementMarkHint": "Sätt automatiskt förbättringskryss vid Drakslag eller Demonslag.", + "automaticSkillIntensiveTraining": "Hantera intensiv träning med en lärare.", + "automaticSkillIntensiveTrainingHint": "Hantera intensiv träning med en lärare (lägger till en knapp för intensiv träning, om det lyckas blockeras knappen tills förbättringskryss är ifyllt.)" }, "WARNING": { "kinAbility": "Kan ej hitta Släktesförmåga: {ability}", diff --git a/modules/character-sheet.js b/modules/character-sheet.js index e34e71f..30ddcc6 100644 --- a/modules/character-sheet.js +++ b/modules/character-sheet.js @@ -1,5 +1,5 @@ import * as DoDChat from "./chat.js"; -import { DoD } from "./config.js"; +import {DoD} from "./config.js"; import DoDAttributeTest from "./tests/attribute-test.js"; import DoDSkillTest from "./tests/skill-test.js"; import DoDSpellTest from "./tests/spell-test.js"; @@ -89,7 +89,8 @@ export default class DoDCharacterSheet extends ActorSheet { editable: this.isEditable, actor: baseData.actor, system: baseData.data.system, - config: CONFIG.DoD + config: CONFIG.DoD, + automaticSkillIntensiveTraining: game.settings.get("dragonbane", "automaticSkillIntensiveTraining") ?? false }; async function enrich(html) { @@ -359,6 +360,7 @@ export default class DoDCharacterSheet extends ActorSheet { html.find(".use-ability").on("click contextmenu", this._onUseAbility.bind(this)); html.find("[data-action='roll-advancement']").on("click contextmenu", this._onAdvancementRoll.bind(this)) html.find(".mark-advancement").on("click", this._onMarkAdvancement.bind(this)) + html.find(".mark-taught").on("click", this._onMarkTaught.bind(this)) html.find(".hit-points-max-label").change(this._onEditHp.bind(this)); html.find(".hit-points-current-label").change(this._onEditCurrentHp.bind(this)); @@ -1160,14 +1162,56 @@ export default class DoDCharacterSheet extends ActorSheet { case 0: // Cancel return; case 1: // Mark - await skillItem.update({ "system.advance": true }); + await skillItem.update({ "system.advance": true, "system.taught": false }); return; case 2: // Train await skillItem.update({ "system.value": baseChance * 2 }); return; } } else { - await skillItem.update({ "system.advance": true }); + await skillItem.update({ "system.advance": true, "system.taught": false }); + } + } + + async _onMarkTaught(event) { + event.preventDefault(); + const itemId = event.currentTarget.closest("tr").dataset.itemId; + const skillItem = this.actor.items.get(itemId); + + // left click to roll, right-click to clear + if (event.type === "click") { + + if (skillItem.system.taught) { + return; + } + + // Make roll + const roll = await new Roll("D20").roll(game.release.generation < 12 ? { async: true } : {}); + const advance = Math.min(DoD.skillMaximum, roll.result) > skillItem.system.value; + const flavorText = advance ? + game.i18n.format("DoD.skill.advancementSuccess", { + skill: skillItem.name, + old: skillItem.system.value, + new: skillItem.system.value + 1 + }) : + game.i18n.format("DoD.skill.advancementFail", { skill: skillItem.name }); + + const msg = await roll.toMessage({ + user: game.user.id, + speaker: ChatMessage.getSpeaker({ actor: this.actor }), + flavor: flavorText + }); + + if (advance) { + if (game.dice3d) { + game.dice3d.waitFor3DAnimationByMessageID(msg.id).then( + () => skillItem.update({ "system.value": skillItem.system.value + 1, "system.taught": true })); + } else { + await skillItem.update({ "system.value": skillItem.system.value + 1, "system.taught": true }); + } + } + } else { + await skillItem.update({ "system.taught": false }) } } @@ -1202,9 +1246,8 @@ export default class DoDCharacterSheet extends ActorSheet { } } // always clear advancement - await skillItem.update({ "system.advance": false }) + await skillItem.update({ "system.advance": false, "system.taught": false }) } - async _onConditionClick(event) { if (event.target.className === "condition-input") { return; // event is handled by input element diff --git a/modules/data/items/skillData.js b/modules/data/items/skillData.js index 9201998..41b9526 100644 --- a/modules/data/items/skillData.js +++ b/modules/data/items/skillData.js @@ -8,6 +8,7 @@ export default class DoDSkillData extends DoDItemBaseData { attribute: new fields.StringField({ required: true, initial: "" }), value: new fields.NumberField({ required: true, initial: 0 }), advance: new fields.NumberField({ required: true, initial: 0 }), + taught: new fields.NumberField({ required: true, initial: 0 }), hideTrained: new fields.BooleanField({ required: true, initial: false }), }); }; diff --git a/templates/partials/character-sheet-skills.hbs b/templates/partials/character-sheet-skills.hbs index 24b5bf1..9fd5372 100644 --- a/templates/partials/character-sheet-skills.hbs +++ b/templates/partials/character-sheet-skills.hbs @@ -5,6 +5,9 @@ + {{#if @root.automaticSkillIntensiveTraining}} + + {{/if}} @@ -21,15 +24,26 @@ + {{/if}} {{/if}} -
{{localize "DoD.ui.character-sheet.skillValue"}} {{#if skill.canImproveSkill}} {{#if skill.system.advance}} - + {{else}} {{/if}} + {{#if @root.automaticSkillIntensiveTraining}} + + {{#if skill.system.taught}} + + {{else}} + + {{/if}} + + @@ -57,6 +71,9 @@ + {{#if @root.automaticSkillIntensiveTraining}} + + {{/if}} @@ -73,12 +90,23 @@ + {{/if}} {{/if}}
{{localize "DoD.ui.character-sheet.skillValue"}} {{#if skill.canImproveSkill}} {{#if skill.system.advance}} - + {{else}} {{/if}} + {{#if @root.automaticSkillIntensiveTraining}} + + {{#if skill.system.taught}} + + {{else}} + + {{/if}} + @@ -107,6 +135,9 @@ + {{#if @root.automaticSkillIntensiveTraining}} + + {{/if}} @@ -126,10 +157,21 @@ {{else}} - + {{/if}} {{/if}} - + + {{#if @root.automaticSkillIntensiveTraining}} + + {{/if}}
{{localize "DoD.ui.character-sheet.skillValue"}} + {{#if skill.system.taught}} + + {{else}} +