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)
parent
719e571b21
commit
416830a56e
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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}}})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue