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 @@