From 98cf6fa6de1d2bb61f0a9b9c4a4d2df385120b70 Mon Sep 17 00:00:00 2001
From: WBHarry <89362246+WBHarry@users.noreply.github.com>
Date: Fri, 16 Jan 2026 13:13:26 +0100
Subject: [PATCH] [Feature] Character Creation Confirmations (#1533)
* Added confirmation on ignoring character setup. Added reset option to character sheet.
* Removed the system setting for playerCanEdit. It's always available now.
---
lang/en.json | 11 ++--
.../applications/sheets/actors/character.mjs | 51 ++++++++++++++++---
module/data/settings/Automation.mjs | 5 --
.../settings/automation-settings/general.hbs | 1 -
templates/sheets/actors/character/header.hbs | 6 +--
5 files changed, 52 insertions(+), 22 deletions(-)
diff --git a/lang/en.json b/lang/en.json
index 8e64ab7d..870e1b2b 100755
--- a/lang/en.json
+++ b/lang/en.json
@@ -237,10 +237,13 @@
"confirmText": "Would you like to level up your companion {name} by {levelChange} levels at this time? (You can do it manually later)"
},
"viewLevelups": "View Levelups",
+ "resetCharacter": "Reset Character",
"viewParty": "View Party",
"InvalidOldCharacterImportTitle": "Old Character Import",
"InvalidOldCharacterImportText": "Character data exported prior to system version 1.1 will not generate a complete character. Do you wish to continue?",
- "cancelBeastform": "Cancel Beastform"
+ "cancelBeastform": "Cancel Beastform",
+ "resetCharacterConfirmationTitle": "Reset Character",
+ "resetCharacterConfirmationContent": "You are reseting all character data except name and portrait. Are you sure?"
},
"Companion": {
"FIELDS": {
@@ -314,6 +317,8 @@
"selectPrimaryWeapon": "Select Primary Weapon",
"selectSecondaryWeapon": "Select Secondary Weapon",
"selectSubclass": "Select Subclass",
+ "setupSkipTitle": "Skipping Character Setup",
+ "setupSkipContent": "You are skipping the Character Setup by adding this manually. The character setup is the blinking arrows in the top-right. Are you sure you want to continue?",
"startingItems": "Starting Items",
"story": "Story",
"storyExplanation": "Select which background and connection prompts you want to copy into your character's background.",
@@ -2450,10 +2455,6 @@
"label": "Show Resource Change Scrolltexts",
"hint": "When a character is damaged, uses armor etc, a scrolling text will briefly appear by the token to signify this."
},
- "playerCanEditSheet": {
- "label": "Players Can Manually Edit Character Settings",
- "hint": "Players are allowed to access the manual Character Settings and change their statistics beyond the rules."
- },
"roll": {
"roll": {
"label": "Roll",
diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs
index e11fee05..d691c129 100644
--- a/module/applications/sheets/actors/character.mjs
+++ b/module/applications/sheets/actors/character.mjs
@@ -27,6 +27,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
makeDeathMove: CharacterSheet.#makeDeathMove,
levelManagement: CharacterSheet.#levelManagement,
viewLevelups: CharacterSheet.#viewLevelups,
+ resetCharacter: CharacterSheet.#resetCharacter,
toggleEquipItem: CharacterSheet.#toggleEquipItem,
toggleResourceDice: CharacterSheet.#toggleResourceDice,
handleResourceDice: CharacterSheet.#handleResourceDice,
@@ -42,6 +43,11 @@ export default class CharacterSheet extends DHBaseActorSheet {
icon: 'fa-solid fa-angles-up',
label: 'DAGGERHEART.ACTORS.Character.viewLevelups',
action: 'viewLevelups'
+ },
+ {
+ icon: 'fa-solid fa-arrow-rotate-left',
+ label: 'DAGGERHEART.ACTORS.Character.resetCharacter',
+ action: 'resetCharacter'
}
]
},
@@ -220,13 +226,6 @@ export default class CharacterSheet extends DHBaseActorSheet {
async _preparePartContext(partId, context, options) {
context = await super._preparePartContext(partId, context, options);
switch (partId) {
- case 'header':
- const { playerCanEditSheet, levelupAuto } = game.settings.get(
- CONFIG.DH.id,
- CONFIG.DH.SETTINGS.gameSettings.Automation
- );
- context.showSettings = game.user.isGM || !levelupAuto || (levelupAuto && playerCanEditSheet);
- break;
case 'loadout':
await this._prepareLoadoutContext(context, options);
break;
@@ -666,6 +665,32 @@ export default class CharacterSheet extends DHBaseActorSheet {
new LevelupViewMode(this.document).render({ force: true });
}
+ /**
+ * Resets the character data and removes all embedded documents.
+ */
+ static async #resetCharacter() {
+ const confirmed = await foundry.applications.api.DialogV2.confirm({
+ window: {
+ title: game.i18n.localize('DAGGERHEART.ACTORS.Character.resetCharacterConfirmationTitle')
+ },
+ content: game.i18n.localize('DAGGERHEART.ACTORS.Character.resetCharacterConfirmationContent')
+ });
+
+ if (!confirmed) return;
+
+ await this.document.update({
+ '==system': {}
+ });
+ await this.document.deleteEmbeddedDocuments(
+ 'Item',
+ this.document.items.map(x => x.id)
+ );
+ await this.document.deleteEmbeddedDocuments(
+ 'ActiveEffect',
+ this.document.effects.map(x => x.id)
+ );
+ }
+
/**
* Opens the Death Move interface for the character.
* @type {ApplicationClickAction}
@@ -956,6 +981,18 @@ export default class CharacterSheet extends DHBaseActorSheet {
}
async _onDropItem(event, item) {
+ const setupCriticalItemTypes = ['class', 'subclass', 'ancestry', 'community'];
+ if (this.document.system.needsCharacterSetup && setupCriticalItemTypes.includes(item.type)) {
+ const confirmed = await foundry.applications.api.DialogV2.confirm({
+ window: {
+ title: game.i18n.localize('DAGGERHEART.APPLICATIONS.CharacterCreation.setupSkipTitle')
+ },
+ content: game.i18n.localize('DAGGERHEART.APPLICATIONS.CharacterCreation.setupSkipContent')
+ });
+
+ if (!confirmed) return;
+ }
+
if (this.document.uuid === item.parent?.uuid) {
return super._onDropItem(event, item);
}
diff --git a/module/data/settings/Automation.mjs b/module/data/settings/Automation.mjs
index 3376b153..bff0bae9 100644
--- a/module/data/settings/Automation.mjs
+++ b/module/data/settings/Automation.mjs
@@ -55,11 +55,6 @@ export default class DhAutomation extends foundry.abstract.DataModel {
initial: true,
label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.resourceScrollTexts.label'
}),
- playerCanEditSheet: new fields.BooleanField({
- required: true,
- initial: false,
- label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.playerCanEditSheet.label'
- }),
defeated: new fields.SchemaField({
enabled: new fields.BooleanField({
required: true,
diff --git a/templates/settings/automation-settings/general.hbs b/templates/settings/automation-settings/general.hbs
index d49ef9b8..bd91b2b1 100644
--- a/templates/settings/automation-settings/general.hbs
+++ b/templates/settings/automation-settings/general.hbs
@@ -18,7 +18,6 @@
{{formGroup settingFields.schema.fields.hordeDamage value=settingFields._source.hordeDamage localize=true}}
{{formGroup settingFields.schema.fields.effects.fields.rangeDependent value=settingFields._source.effects.rangeDependent localize=true}}
{{formGroup settingFields.schema.fields.levelupAuto value=settingFields._source.levelupAuto localize=true}}
- {{formGroup settingFields.schema.fields.playerCanEditSheet value=settingFields._source.playerCanEditSheet localize=true}}
{{formGroup settingFields.schema.fields.damageReductionRulesDefault value=settingFields._source.damageReductionRulesDefault localize=true}}
{{formGroup settingFields.schema.fields.resourceScrollTexts value=settingFields._source.resourceScrollTexts localize=true}}
diff --git a/templates/sheets/actors/character/header.hbs b/templates/sheets/actors/character/header.hbs
index 1459e10b..87319dbb 100644
--- a/templates/sheets/actors/character/header.hbs
+++ b/templates/sheets/actors/character/header.hbs
@@ -123,9 +123,7 @@
{{/each}}
- {{#> 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' showSettings=showSettings }}
- {{#if ../showSettings}}
-
- {{/if}}
+ {{#> 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }}
+
{{/'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs'}}
\ No newline at end of file