adds wound threshold and actor based action to takeDamage by a certain amount to a specific zone (or non which is only allowed when play with zones is active)

pull/58/head
macniel 2025-10-13 23:40:07 +02:00
parent 719e571b21
commit 416830a56e
5 changed files with 108 additions and 15 deletions

View File

@ -20,6 +20,7 @@ import {SpecialAbilityDataModel} from "./module/data/specialAbility.mjs";
import {SpecialAbilitySheet} from "./module/sheets/specialAbilitySheet.mjs"; import {SpecialAbilitySheet} from "./module/sheets/specialAbilitySheet.mjs";
import {ActiveEffectSheet} from "./module/sheets/ActiveEffectSheet.mjs"; import {ActiveEffectSheet} from "./module/sheets/ActiveEffectSheet.mjs";
import {ActiveEffectDataModel} from "./module/data/activeeffect.mjs"; import {ActiveEffectDataModel} from "./module/data/activeeffect.mjs";
import {Trefferzone, Wunde, Zonenruestung, Zonenwunde} from "./module/data/Trefferzone.js";
async function preloadHandlebarsTemplates() { async function preloadHandlebarsTemplates() {
return loadTemplates([ return loadTemplates([
@ -42,7 +43,11 @@ async function preloadHandlebarsTemplates() {
Hooks.once("init", () => { Hooks.once("init", () => {
game.DSA41 = { game.DSA41 = {
rollItemMacro rollItemMacro,
Zonenruestung,
Zonenwunde,
Trefferzone,
Wunde
} }
// Configure custom Document implementations. // Configure custom Document implementations.

View File

@ -0,0 +1,30 @@
export const Trefferzone = {
ARM_LINKS: "armlinks",
ARM_RECHTS: "armrechts",
BEIN_LINKS: "beinlinks",
BEIN_RECHTS: "beinrechts",
BAUCH: "bauch",
KOPF: "kopf",
BRUST: "brust"
}
export const Zonenruestung = {
...Trefferzone,
WAFFE_LINKS: "links",
WAFFE_RECHTS: "rechts",
FERNKAMPF: "fernkampf",
MUNITION: "munition",
RUECKEN: "ruecken",
}
export const Zonenwunde = {
ARM_LINKS: "Wunde linker Arm",
ARM_RECHTS: "Wunde rechter Arm",
BEIN_LINKS: "Wunde rechtes Bein",
BEIN_RECHTS: "Wunde rechtes Bein",
BAUCH: "Bauchwunde",
KOPF: "Kopfwunde",
BRUST: "Brustwunde",
}
export const Wunde = "Wunde"

View File

@ -59,6 +59,7 @@ export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel {
aktuell: new NumberField({required: true, integer: true, initial: 0}), aktuell: new NumberField({required: true, integer: true, initial: 0}),
mod: new NumberField({required: true, integer: true}), mod: new NumberField({required: true, integer: true}),
}), }),
ws: new NumberField({required: true, integer: true, initial: 0}),
attribute: new SchemaField({ attribute: new SchemaField({
mu: new SchemaField({ mu: new SchemaField({
start: new NumberField({required: true, integer: true}), start: new NumberField({required: true, integer: true}),
@ -138,7 +139,7 @@ export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel {
beinlinks: 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}), beinrechts: new NumberField({required: true, integer: true, initial: 0}),
bauch: 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}), brust: new NumberField({required: true, integer: true, initial: 0}),
kopf: new NumberField({required: true, integer: true, initial: 0}), kopf: new NumberField({required: true, integer: true, initial: 0}),
}), }),
heldenausruestung: new ArrayField( heldenausruestung: new ArrayField(
@ -180,9 +181,6 @@ export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel {
} }
async _onCreate(data, options, userId) { async _onCreate(data, options, userId) {
console.log(data, 'onCreate');
} }
static getSlots() { static getSlots() {

View File

@ -1,5 +1,6 @@
import {importCharacter} from "../xml-import/xml-import.mjs"; import {importCharacter} from "../xml-import/xml-import.mjs";
import {LiturgyData} from "../data/miracle/liturgydata.mjs"; import {LiturgyData} from "../data/miracle/liturgydata.mjs";
import {Zonenruestung, Zonenwunde} from "../data/Trefferzone.js";
export class Character extends Actor { export class Character extends Actor {
@ -95,7 +96,7 @@ export class Character extends Actor {
if (game.settings.get("DSA_4-1", "optional_ruestungzonen")) { if (game.settings.get("DSA_4-1", "optional_ruestungzonen")) {
systemData.rs = { systemData.rs = {
torso: 0, brust: 0,
bauch: 0, bauch: 0,
armlinks: 0, armlinks: 0,
armrechts: 0, armrechts: 0,
@ -113,7 +114,7 @@ export class Character extends Actor {
systemData.wunden.max = ko / 2; systemData.wunden.max = ko / 2;
if (game.settings.get("DSA_4-1", "optional_trefferzonen")) { if (game.settings.get("DSA_4-1", "optional_trefferzonen")) {
systemData.wunden.kopf = 0; systemData.wunden.kopf = 0;
systemData.wunden.torso = 0; systemData.wunden.brust = 0;
systemData.wunden.bauch = 0; systemData.wunden.bauch = 0;
systemData.wunden.armlinks = 0; systemData.wunden.armlinks = 0;
systemData.wunden.armrechts = 0; systemData.wunden.armrechts = 0;
@ -121,6 +122,7 @@ export class Character extends Actor {
systemData.wunden.beinrechts = 0; systemData.wunden.beinrechts = 0;
} }
systemData.ws = ko / 2;
// map current set to RS and BE // map current set to RS and BE
@ -129,7 +131,7 @@ export class Character extends Actor {
if (ausruestung.brust) { if (ausruestung.brust) {
systemData.be += systemData.parent.items.get(ausruestung.brust).system.armorHandicap ?? 0 systemData.be += systemData.parent.items.get(ausruestung.brust).system.armorHandicap ?? 0
if (game.settings.get("DSA_4-1", "optional_ruestungzonen")) { if (game.settings.get("DSA_4-1", "optional_ruestungzonen")) {
systemData.rs.torso = systemData.parent.items.get(ausruestung.brust).system.armorValue ?? 0 systemData.rs.brust = systemData.parent.items.get(ausruestung.brust).system.armorValue ?? 0
} else { } else {
systemData.rs += systemData.parent.items.get(ausruestung.brust).system.armorValue ?? 0 systemData.rs += systemData.parent.items.get(ausruestung.brust).system.armorValue ?? 0
} }
@ -242,4 +244,62 @@ export class Character extends Actor {
return data; return data;
} }
/**
*
* @param amount
* @param zone either null or one of
* @returns {Promise<void>}
*/
async takeDamage(amount = null, zone = null) {
this.prepareDerivedData()
const playWithZoneArmor = game.settings.get("DSA_4-1", "optional_ruestungzonen")
const playWithWoundZones = game.settings.get("DSA_4-1", "optional_trefferzonen")
const previousLeP = this.system.lep.aktuell;
if (amount == null) {
// TODO show Dialog for entering damage amount (TP)
}
let armorReduction = 0
let setEquipped = this.system.setEquipped
let woundThreshold = this.system.ws
if (playWithZoneArmor) {
const armorId = this.system.heldenausruestung[setEquipped][Zonenruestung[zone]]
const zoneArmor = await this.items.find(p => p._id === armorId)
if (!zoneArmor) {
return console.error(`zone "${zone}" is not a valid value`)
}
armorReduction = zoneArmor.system.armorValue ?? 0
} else {
armorReduction = this.system.rs
}
let damage = amount - armorReduction
let wounds = damage / woundThreshold
let wound = null
if (playWithWoundZones) {
wound = await game.packs.get("DSA_4-1.Wounds").index.find(p => p.name === Zonenwunde[zone])
if (!wound) {
return console.error(`Wunden Dokument zu "${zone}" konnten nicht gefunden werden`)
}
} else {
wound = await game.packs.get("DSA_4-1.Wounds").index.find(p => p.name === Wunde)
if (!wound) {
return console.error(`Wunden Dokument zu "${Wunde}" konnten nicht gefunden werden`)
}
}
// TODO this doesnt work yet, wound documents wont get expanded
for (let i = 0; i < wounds; i++) {
await this.createEmbeddedDocuments('Item', [wound])
}
await this.update({system: {lep: {aktuell: previousLeP - damage}}})
}
} }

View File

@ -310,14 +310,14 @@
<label>Lebensenergie:</label> <label>Lebensenergie:</label>
<input type="number" name="system.lep.aktuell" value="{{actor.system.lep.aktuell}}"/> <input type="number" name="system.lep.aktuell" value="{{actor.system.lep.aktuell}}"/>
<span class="inline">von</span> <span class="inline">von</span>
<input type="number" name="system.lep.max" value="{{actor.system.lep.max}}"/> <input type="number" disabled value="{{actor.system.lep.max}}"/>
</div> </div>
{{#if ausdauer}} {{#if ausdauer}}
<div class="ausdauer"> <div class="ausdauer">
<label>Ausdauerpunkte:</label> <label>Ausdauerpunkte:</label>
<input type="number" name="system.aup.aktuell" value="{{actor.system.aup.aktuell}}"/> <input type="number" name="system.aup.aktuell" value="{{actor.system.aup.aktuell}}"/>
<span class="inline">von</span> <span class="inline">von</span>
<input type="number" name="system.aup.max" value="{{actor.system.aup.max}}"/> <input type="number" disabled value="{{actor.system.aup.max}}"/>
</div> </div>
{{/if}} {{/if}}
{{#if (not zonenruestung)}} {{#if (not zonenruestung)}}
@ -371,7 +371,7 @@
</svg> </svg>
{{#if trefferzonen}} {{#if trefferzonen}}
<span class="wound kopf">{{derived.wunden.kopf}}</span> <span class="wound kopf">{{derived.wunden.kopf}}</span>
<span class="wound torso">{{derived.wunden.torso}}</span> <span class="wound brust">{{derived.wunden.brust}}</span>
<span class="wound armlinks">{{derived.wunden.armlinks}}</span> <span class="wound armlinks">{{derived.wunden.armlinks}}</span>
<span class="wound armrechts">{{derived.wunden.armrechts}}</span> <span class="wound armrechts">{{derived.wunden.armrechts}}</span>
<span class="wound bauch">{{derived.wunden.bauch}}</span> <span class="wound bauch">{{derived.wunden.bauch}}</span>
@ -380,7 +380,7 @@
{{/if}} {{/if}}
{{#if zonenruestung}} {{#if zonenruestung}}
<span class="armor kopf">{{derived.rs.kopf}}</span> <span class="armor kopf">{{derived.rs.kopf}}</span>
<span class="armor torso">{{derived.rs.torso}}</span> <span class="armor brust">{{derived.rs.brust}}</span>
<span class="armor armlinks">{{derived.rs.armlinks}}</span> <span class="armor armlinks">{{derived.rs.armlinks}}</span>
<span class="armor armrechts">{{derived.rs.armrechts}}</span> <span class="armor armrechts">{{derived.rs.armrechts}}</span>
<span class="armor bauch">{{derived.rs.bauch}}</span> <span class="armor bauch">{{derived.rs.bauch}}</span>
@ -544,11 +544,11 @@
<label>AsP:</label> <label>AsP:</label>
<input type="number" name="system.asp.aktuell" value="{{system.asp.aktuell}}"/> <input type="number" name="system.asp.aktuell" value="{{system.asp.aktuell}}"/>
<span class="inline">von</span> <span class="inline">von</span>
{{derived.asp.max}} <input type="number" disabled value="{{derived.asp.max}}"/>
</div> </div>
<div class="mr"> <div class="mr">
<label>MR: </label> <label>MR: </label>
{{derived.mr.aktuell}} <input type="number" disabled value="{{derived.mr.aktuell}}"/>
</div> </div>
</div> </div>
@ -594,7 +594,7 @@
<label>KaP:</label> <label>KaP:</label>
<input type="number" name="system.kap.aktuell" value="{{system.kap.aktuell}}"/> <input type="number" name="system.kap.aktuell" value="{{system.kap.aktuell}}"/>
<span class="inline">von</span> <span class="inline">von</span>
{{derived.kap.max}} <input type="number" disabled value="{{derived.kap.max}}"/>
</div> </div>
</div> </div>