diff --git a/src/main.mjs b/src/main.mjs index 6355cf2a..13cc781c 100644 --- a/src/main.mjs +++ b/src/main.mjs @@ -127,6 +127,54 @@ Hooks.once("init", () => { label: 'DSA41.ActiveEffectLabels.ActiveFfect' }) + game.settings.register('DSA_4-1', 'optional_trefferzonen', { + name: "Optional: Trefferzonen", + hint: "Ersetzt das Wundensystem aus dem BRW durch das Trefferzonensystem aus WdH", + scope: "world", + config: true, + type: Boolean, + default: false, + onChange: value => { + }, + requiresReload: true + }) + + game.settings.register('DSA_4-1', 'optional_ruestungzonen', { + name: "Optional: Zonenrüstung", + hint: "Ersetzt das Rüstungssystem aus dem BRW durch das Zonenrüstungssystem aus WdH", + scope: "world", + config: true, + type: Boolean, + default: false, + onChange: value => { + }, + requiresReload: true + }) + + game.settings.register('DSA_4-1', 'optional_ausdauer', { + name: "Optional: Ausdauerregeln", + hint: "Aktiviert Regeln für das Spiel mit Ausdauer", + scope: "world", + config: true, + type: Boolean, + default: false, + onChange: value => { + }, + requiresReload: true + }) + + game.settings.register('DSA_4-1', 'optional_distanzklassen', { + name: "Optional: Distanzklassen", + hint: "Aktiviert Regeln für das Spiel mit Distanzklassen", + scope: "world", + config: true, + type: Boolean, + default: false, + onChange: value => { + }, + requiresReload: true + }) + return preloadHandlebarsTemplates(); }) diff --git a/src/module/data/character.mjs b/src/module/data/character.mjs index 761659ef..cc600ffb 100644 --- a/src/module/data/character.mjs +++ b/src/module/data/character.mjs @@ -126,9 +126,16 @@ export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel { notiz: new StringField(), })), wunden: new SchemaField({ - aktuell: new NumberField({required: true, integer: true}), - max: new NumberField({required: true, integer: true}), - mod: new NumberField({required: true, integer: true}), + aktuell: new NumberField({required: true, integer: true}), // only with DSA_4-1.optional_trefferzonen = false + max: new NumberField({required: true, integer: true}), // only with DSA_4-1.optional_trefferzonen = false + mod: new NumberField({required: true, integer: true}), // only with DSA_4-1.optional_trefferzonen = false + armlinks: new NumberField({required: true, integer: true, initial: 0}), + armrechts: new NumberField({required: true, integer: true, initial: 0}), + beinlinks: new NumberField({required: true, integer: true, initial: 0}), + beinrechts: new NumberField({required: true, integer: true, initial: 0}), + bauch: new NumberField({required: true, integer: true, initial: 0}), + torso: new NumberField({required: true, integer: true, initial: 0}), + kopf: new NumberField({required: true, integer: true, initial: 0}), }), heldenausruestung: new ArrayField( new SchemaField({ diff --git a/src/module/documents/character.mjs b/src/module/documents/character.mjs index 7ce64505..630b9d49 100644 --- a/src/module/documents/character.mjs +++ b/src/module/documents/character.mjs @@ -51,43 +51,103 @@ export class Character extends Actor { systemData.ini.aktuell = Math.round((mu + mu + _in + ge) / 5) + systemData.ini.mod; systemData.mr.aktuell = Math.round((mu + kl + ko) / 5) + systemData.mr.mod; - systemData.rs = 0; + + if (game.settings.get("DSA_4-1", "optional_ruestungzonen")) { + systemData.rs = { + torso: 0, + bauch: 0, + armlinks: 0, + armrechts: 0, + beinlinks: 0, + beinrechts: 0, + kopf: 0, + }; // only with DSA_4-1.optional_trefferzonen = true + } else { + systemData.rs = 0; // only with DSA_4-1.optional_trefferzonen = false + } systemData.be = 0; + // half KO is the maximum a character can sustain wounds before collapsing systemData.wunden.max = ko / 2; + if (game.settings.get("DSA_4-1", "optional_trefferzonen")) { + systemData.wunden.kopf = 0; + systemData.wunden.torso = 0; + systemData.wunden.bauch = 0; + systemData.wunden.armlinks = 0; + systemData.wunden.armrechts = 0; + systemData.wunden.beinlinks = 0; + systemData.wunden.beinrechts = 0; + } + // map current set to RS and BE const ausruestung = systemData.heldenausruestung[systemData.setEquipped]; if (ausruestung) { if (ausruestung.brust) { - systemData.rs += systemData.parent.items.get(ausruestung.brust).system.armorValue ?? 0 systemData.be += systemData.parent.items.get(ausruestung.brust).system.armorHandicap ?? 0 + if (game.settings.get("DSA_4-1", "optional_ruestungzonen")) { + systemData.rs.torso = systemData.parent.items.get(ausruestung.brust).system.armorValue ?? 0 + } else { + systemData.rs += systemData.parent.items.get(ausruestung.brust).system.armorValue ?? 0 + } } if (ausruestung.bauch) { - systemData.rs += systemData.parent.items.get(ausruestung.bauch).system.armorValue ?? 0 systemData.be += systemData.parent.items.get(ausruestung.bauch).system.armorHandicap ?? 0 + if (game.settings.get("DSA_4-1", "optional_ruestungzonen")) { + systemData.rs.bauch = systemData.parent.items.get(ausruestung.bauch).system.armorValue ?? 0 + } else { + systemData.rs += systemData.parent.items.get(ausruestung.bauch).system.armorValue ?? 0 + } } if (ausruestung.ruecken) { - systemData.rs += systemData.parent.items.get(ausruestung.ruecken).system.armorValue ?? 0 systemData.be += systemData.parent.items.get(ausruestung.ruecken).system.armorHandicap ?? 0 + if (game.settings.get("DSA_4-1", "optional_ruestungzonen")) { + // ruecken is not a valid trefferzone + } else { + systemData.rs += systemData.parent.items.get(ausruestung.ruecken).system.armorValue ?? 0 + } } if (ausruestung.armlinks) { - systemData.rs += systemData.parent.items.get(ausruestung.armlinks).system.armorValue ?? 0 systemData.be += systemData.parent.items.get(ausruestung.armlinks).system.armorHandicap ?? 0 + if (game.settings.get("DSA_4-1", "optional_ruestungzonen")) { + systemData.rs.armlinks = systemData.parent.items.get(ausruestung.armlinks).system.armorValue ?? 0 + } else { + systemData.rs += systemData.parent.items.get(ausruestung.armlinks).system.armorValue ?? 0 + } } if (ausruestung.armrechts) { - systemData.rs += systemData.parent.items.get(ausruestung.armrechts).system.armorValue ?? 0 systemData.be += systemData.parent.items.get(ausruestung.armrechts).system.armorHandicap ?? 0 + if (game.settings.get("DSA_4-1", "optional_ruestungzonen")) { + systemData.rs.armrechts = systemData.parent.items.get(ausruestung.armrechts).system.armorValue ?? 0 + } else { + systemData.rs += systemData.parent.items.get(ausruestung.armrechts).system.armorValue ?? 0 + } } if (ausruestung.beinlinks) { - systemData.rs += systemData.parent.items.get(ausruestung.beinlinks).system.armorValue ?? 0 systemData.be += systemData.parent.items.get(ausruestung.beinlinks).system.armorHandicap ?? 0 + if (game.settings.get("DSA_4-1", "optional_ruestungzonen")) { + systemData.rs.beinlinks = systemData.parent.items.get(ausruestung.beinlinks).system.armorValue ?? 0 + } else { + systemData.rs += systemData.parent.items.get(ausruestung.beinlinks).system.armorValue ?? 0 + } } if (ausruestung.beinrechts) { - systemData.rs += systemData.parent.items.get(ausruestung.beinrechts).system.armorValue ?? 0 systemData.be += systemData.parent.items.get(ausruestung.beinrechts).system.armorHandicap ?? 0 + if (game.settings.get("DSA_4-1", "optional_ruestungzonen")) { + systemData.rs.beinrechts = systemData.parent.items.get(ausruestung.beinrechts).system.armorValue ?? 0 + } else { + systemData.rs += systemData.parent.items.get(ausruestung.beinrechts).system.armorValue ?? 0 + } + } + if (ausruestung.kopf) { + systemData.be += systemData.parent.items.get(ausruestung.kopf).system.armorHandicap ?? 0 + if (game.settings.get("DSA_4-1", "optional_ruestungzonen")) { + systemData.rs.kopf = systemData.parent.items.get(ausruestung.kopf).system.armorValue ?? 0 + } else { + systemData.rs += systemData.parent.items.get(ausruestung.kopf).system.armorValue ?? 0 + } } } diff --git a/src/module/sheets/characterSheet.mjs b/src/module/sheets/characterSheet.mjs index 9e34fab0..d4dc0849 100644 --- a/src/module/sheets/characterSheet.mjs +++ b/src/module/sheets/characterSheet.mjs @@ -132,6 +132,11 @@ export class CharacterSheet extends ActorSheet { context.woundsFilled[i] = i <= context.wounds } + context.zonenruestung = game.settings.get("DSA_4-1", "optional_ruestungzonen") + context.trefferzonen = game.settings.get("DSA_4-1", "optional_trefferzonen") + context.ausdauer = game.settings.get("DSA_4-1", "optional_ausdauer") + + this.#addSkillsToContext(context) this.#addAdvantagesToContext(context) this.#addSpecialAbilitiesToContext(context) diff --git a/src/module/sheets/groupSheet.mjs b/src/module/sheets/groupSheet.mjs index 6536d933..ac411279 100644 --- a/src/module/sheets/groupSheet.mjs +++ b/src/module/sheets/groupSheet.mjs @@ -30,10 +30,10 @@ export class GroupSheet extends ActorSheet { // update group const settings = {...group.system.settings} character.items.filter((i) => i.type === "Advantage").forEach((advantage) => { - settings[this.#stringToKeyFieldName(advantage.name)] = false + settings[sheet.#stringToKeyFieldName(advantage.name)] = false }) character.items.filter((i) => i.type === "Skill").forEach((skill) => { - settings[this.#stringToKeyFieldName(skill.name)] = false + settings[sheet.#stringToKeyFieldName(skill.name)] = false }), await group.update({ system: { diff --git a/src/style/_character-sheet.scss b/src/style/_character-sheet.scss index df56d535..c427d165 100644 --- a/src/style/_character-sheet.scss +++ b/src/style/_character-sheet.scss @@ -240,10 +240,9 @@ } .backpack.active { - padding: 8px; display: grid; grid-template-columns: 1fr 320px; - grid-template-rows: 64px 1fr; + grid-template-rows: 74px 1fr; gap: 10px; height: 100%; grid-template-areas: @@ -284,8 +283,18 @@ } - .tab.combat { + .tab.combat.active { + display: grid; + + grid-template-columns: 1fr 320px; + grid-template-rows: 32px 32px 1fr; + grid-template-areas: "res res" "wounds wounds" "actions actions"; + gap: 10px; + + .tab-resources { + grid-area: res; + } .wounds { position: relative; @@ -293,6 +302,7 @@ display: flex; margin-bottom: 8px; padding-left: 130px; + grid-area: wounds; label { position: absolute; @@ -317,7 +327,7 @@ text-align: center; vertical-align: middle; line-height: 24px; - color: gold; + color: white; text-shadow: 2px 2px 0 rgba(0, 0, 0, 0.3); background-color: rgba(255, 0, 0, 0.8); background-blend-mode: multiply; @@ -342,6 +352,123 @@ } + .actions { + grid-area: actions; + } + + &.zones { + grid-template-areas: "res res" "wounds wounds" "actions paperdoll"; + + .paperdoll { + grid-area: paperdoll; + + div { + position: relative; + + .wound { + position: absolute; + width: 32px; + height: 32px; + border-radius: 16px; + border: 1px solid black; + background-color: rgba(0, 0, 0, 0.5); + box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3); + line-height: 32px; + vertical-align: middle; + text-align: center; + color: red; + + + &.armlinks { + top: 146px; + left: 210px; + } + + &.armrechts { + top: 146px; + left: 60px; + } + + &.beinlinks { + top: 346px; + left: 210px; + } + + &.beinrechts { + top: 346px; + left: 60px; + } + + &.bauch { + top: 166px; + left: 136px; + } + + &.kopf { + top: 6px; + left: 136px + } + + &.torso { + top: 86px; + left: 110px; + } + + } + + .armor { + position: absolute; + width: 32px; + height: 32px; + border-radius: 0 0 16px 16px; + line-height: 32px; + vertical-align: middle; + text-align: center; + border: 1px solid silver; + background-color: rgba(0, 0, 0, 0.5); + box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3); + color: silver; + + &.armlinks { + top: 180px; + left: 210px; + } + + &.armrechts { + top: 180px; + left: 60px; + } + + &.beinlinks { + top: 380px; + left: 210px; + } + + &.beinrechts { + top: 380px; + left: 60px; + } + + &.bauch { + top: 200px; + left: 136px; + } + + &.kopf { + top: 40px; + left: 136px + } + + &.torso { + top: 120px; + left: 110px; + } + } + } + + } + + } } @@ -490,23 +617,23 @@ & > div { - height: 48px; + height: 32px; position: relative; label { width: 80px; - line-height: 48px; + line-height: 32px; vertical-align: middle; } input { display: inline-block; width: 40px; - height: 48px; + height: 32px; } span.inline { - line-height: 48px; + line-height: 32px; vertical-align: middle; width: 40px; text-align: center; diff --git a/src/templates/actor/actor-character-sheet.hbs b/src/templates/actor/actor-character-sheet.hbs index ec4b8e00..b4ea0db1 100644 --- a/src/templates/actor/actor-character-sheet.hbs +++ b/src/templates/actor/actor-character-sheet.hbs @@ -22,9 +22,11 @@ + {{#if ausdauer}} + {{/if}} {{#if this.hasLiturgies}} -
+
@@ -268,16 +271,20 @@ von
+ {{#if ausdauer}}
von
-
+ {{/if}} + {{#if (not zonenruestung)}} +
{{derived.rs}}
+ {{/if}}
{{derived.be}} @@ -285,6 +292,7 @@
+ {{#if (not trefferzonen)}}
{{#each this.woundsFilled}} @@ -296,13 +304,52 @@ {{/if}} {{/each}}
+ {{/if}} +
+

Aktionen im Kampf

{{#each this.actions}} {{> "systems/DSA_4-1/templates/ui/partial-action-button.hbs" this}} {{/each}}
+ {{#if (or trefferzonen zonenruestung)}} +
+

{{#if (and trefferzonen zonenruestung)}}Trefferzonen{{/if}}{{#if + (and trefferzonen (not zonenruestung))}}Wunden{{/if}}{{#if + (and (not trefferzonen) zonenruestung)}}Rüstung{{/if}}

+
+ + + + {{#if trefferzonen}} + {{derived.wunden.kopf}} + {{derived.wunden.torso}} + {{derived.wunden.armlinks}} + {{derived.wunden.armrechts}} + {{derived.wunden.bauch}} + {{derived.wunden.beinlinks}} + {{derived.wunden.beinrechts}} + {{/if}} + {{#if zonenruestung}} + {{derived.rs.kopf}} + {{derived.rs.torso}} + {{derived.rs.armlinks}} + {{derived.rs.armrechts}} + {{derived.rs.bauch}} + {{derived.rs.beinlinks}} + {{derived.rs.beinrechts}} + {{/if}} +
+
+ {{/if}} +