initial draft of combat

pull/50/head
macniel 2025-10-04 16:58:26 +02:00
parent adff5b951f
commit 801de801ba
6 changed files with 85 additions and 34 deletions

View File

@ -11,6 +11,8 @@ import {GroupDataModel} from "./module/data/group.mjs";
import {GroupSheet} from "./module/sheets/groupSheet.mjs"; import {GroupSheet} from "./module/sheets/groupSheet.mjs";
import {EquipmentDataModel} from "./module/data/equipment.mjs"; import {EquipmentDataModel} from "./module/data/equipment.mjs";
import {AusruestungSheet} from "./module/sheets/equipmentSheet.mjs"; import {AusruestungSheet} from "./module/sheets/equipmentSheet.mjs";
import { CreatureDataModel } from "./module/data/creature.mjs";
import { CreatureSheet } from "./module/sheets/creatureSheet.mjs";
async function preloadHandlebarsTemplates() { async function preloadHandlebarsTemplates() {
return loadTemplates([ return loadTemplates([
@ -38,7 +40,8 @@ Hooks.once("init", () => {
// Configure System Data Models. // Configure System Data Models.
CONFIG.Actor.dataModels = { CONFIG.Actor.dataModels = {
character: PlayerCharacterDataModel, character: PlayerCharacterDataModel,
group: GroupDataModel group: GroupDataModel,
creature: CreatureDataModel,
}; };
CONFIG.Item.dataModels = { CONFIG.Item.dataModels = {
@ -49,7 +52,7 @@ Hooks.once("init", () => {
} }
CONFIG.Combat.initiative = { CONFIG.Combat.initiative = {
formula: `(@attribute.ini.wuerfel)d6 + @attribute.ini.aktuell`, formula: `(@ini.wuerfel)d6 + @ini.aktuell`,
decimals: 0 decimals: 0
} }
@ -60,6 +63,11 @@ Hooks.once("init", () => {
makeDefault: true, makeDefault: true,
label: 'DSA41.CharacterLabels.Item' label: 'DSA41.CharacterLabels.Item'
}) })
Actors.registerSheet('dsa41.creature', CreatureSheet, {
types: ["creature"],
makeDefault: true,
label : 'DSA41.CreatureLabel.Item'
})
Actors.registerSheet('dsa41.group', GroupSheet, { Actors.registerSheet('dsa41.group', GroupSheet, {
types: ["group"], types: ["group"],
makeDefault: true, makeDefault: true,

View File

@ -26,6 +26,27 @@ export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel {
titel: new StringField(), titel: new StringField(),
stand: new StringField(), stand: new StringField(),
}), }),
ini: new SchemaField({
aktuell: new NumberField({ required: true, integer: true, initial: 0 }),
mod: new NumberField({ required: true, integer: true, initial: 0 }),
wuerfel: new NumberField({ required: true, integer: true, initial: 1}),
}),
lep: new SchemaField({
aktuell: new NumberField({ required: true, integer: true, initial: 0 }),
mod: new NumberField({ required: true, integer: true }),
}),
mr: new SchemaField({
mod: new NumberField({ required: true, integer: true }),
}),
aup: new SchemaField({
mod: new NumberField({ required: true, integer: true }),
}),
asp: new SchemaField({
mod: new NumberField({ required: true, integer: true }),
}),
kap: new SchemaField({
mod: new NumberField({ required: true, integer: true }),
}),
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 }),
@ -67,21 +88,6 @@ export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel {
aktuell: new NumberField({ required: true, integer: true }), aktuell: new NumberField({ required: true, integer: true }),
mod: new NumberField({ required: true, integer: true }), mod: new NumberField({ required: true, integer: true }),
}), }),
mr: new SchemaField({
mod: new NumberField({ required: true, integer: true }),
}),
lep: new SchemaField({
mod: new NumberField({ required: true, integer: true }),
}),
aup: new SchemaField({
mod: new NumberField({ required: true, integer: true }),
}),
asp: new SchemaField({
mod: new NumberField({ required: true, integer: true }),
}),
kap: new SchemaField({
mod: new NumberField({ required: true, integer: true }),
}),
at: new SchemaField({ at: new SchemaField({
aktuell: new NumberField({ required: true, integer: true }), aktuell: new NumberField({ required: true, integer: true }),
mod: new NumberField({ required: true, integer: true }), mod: new NumberField({ required: true, integer: true }),
@ -94,11 +100,6 @@ export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel {
aktuell: new NumberField({ required: true, integer: true }), aktuell: new NumberField({ required: true, integer: true }),
mod: new NumberField({ required: true, integer: true }), mod: new NumberField({ required: true, integer: true }),
}), }),
ini: new SchemaField({
aktuell: new NumberField({ required: true, integer: true, initial: 0 }),
mod: new NumberField({ required: true, integer: true, initial: 0 }),
wuerfel: new NumberField({ required: true, integer: true, initial: 1}),
}),
so: new SchemaField({ so: new SchemaField({
start: new NumberField({ required: true, integer: true }), start: new NumberField({ required: true, integer: true }),
aktuell: new NumberField({ required: true, integer: true }), aktuell: new NumberField({ required: true, integer: true }),

View File

@ -11,6 +11,48 @@ export class Character extends Actor {
} }
input.click() input.click()
} }
/**
* @override
* Augment the actor source data with additional dynamic data. Typically,
* you'll want to handle most of your calculated/derived data in this step.
* Data calculated in this step should generally not exist in template.json
* (such as ability modifiers rather than ability scores) and should be
* available both inside and outside of character sheets (such as if an actor
* is queried and has a roll executed directly from it).
*/
prepareDerivedData() {
if (this.type === "character") {
const actorData = this;
const systemData = actorData.system;
const mu = systemData.attribute.mu.aktuell;
const kl = systemData.attribute.kl.aktuell;
const _in = systemData.attribute.in.aktuell;
const ch = systemData.attribute.ch.aktuell;
const ff = systemData.attribute.ff.aktuell;
const ge = systemData.attribute.ge.aktuell;
const ko = systemData.attribute.kk.aktuell;
const kk = systemData.attribute.kk.aktuell;
systemData.lep.max = (ko + ko + kk) / 2 + systemData.lep.mod;
systemData.aup.max = (mu + ko + ge) / 2 + systemData.aup.mod;
systemData.asp.aktuell = (mu + _in + ch) / 2 + systemData.asp.mod;
systemData.at = (mu + ge + kk) / 5;
systemData.pa = (_in + ge + kk) / 5;
systemData.fk = (_in + ff + kk) / 5;
systemData.ini.aktuell = (mu + mu + _in + ge) / 5 + systemData.ini.mod;
systemData.mr.aktuell = (mu + kl + ko) / 5 + systemData.mr.mod;
}
}
/** /**
* Augment the basic Item data model with additional dynamic data. * Augment the basic Item data model with additional dynamic data.
*/ */
@ -22,7 +64,7 @@ export class Character extends Actor {
getRollData() { getRollData() {
const data = super.getRollData(); const data = super.getRollData();
if (this.type !== 'character') return; if (this.type !== 'character' && this.type !== 'creature') return;
// Copy the ability scores to the top level, so that rolls can use // Copy the ability scores to the top level, so that rolls can use
// formulas like `@str.mod + 4`. // formulas like `@str.mod + 4`.

View File

@ -173,9 +173,9 @@ export class CharacterSheet extends ActorSheet {
#addCombatStatistics(context) { #addCombatStatistics(context) {
const actorData = context.data; const actorData = context.data;
context.inidice = actorData.system.attribute.ini.wuerfel; context.inidice = actorData.system.ini.wuerfel;
context.inivalue = actorData.system.attribute.ini.aktuell; context.inivalue = actorData.system.ini.aktuell;
context.inimod = actorData.system.attribute.ini.mod; context.inimod = actorData.system.ini.mod;
} }

View File

@ -206,19 +206,19 @@ function mapRawJson(actor, rawJson) {
json.attribute.ge = getAttributeJson(attributes, "Gewandtheit") json.attribute.ge = getAttributeJson(attributes, "Gewandtheit")
json.attribute.ko = getAttributeJson(attributes, "Konstitution") json.attribute.ko = getAttributeJson(attributes, "Konstitution")
json.attribute.kk = getAttributeJson(attributes, "Körperkraft") json.attribute.kk = getAttributeJson(attributes, "Körperkraft")
json.attribute.mr = { json.mr = {
mod: filterAttribute(attributes,"Magieresistenz").mod mod: filterAttribute(attributes,"Magieresistenz").mod
} }
json.attribute.lep = { json.lep = {
mod: filterAttribute(attributes,"Lebensenergie").mod mod: filterAttribute(attributes,"Lebensenergie").mod
} }
json.attribute.aup = { json.aup = {
mod: filterAttribute(attributes,"Ausdauer").mod mod: filterAttribute(attributes,"Ausdauer").mod
} }
json.attribute.asp = { json.asp = {
mod: filterAttribute(attributes,"Astralenergie").mod mod: filterAttribute(attributes,"Astralenergie").mod
} }
json.attribute.kap = { json.kap = {
mod: filterAttribute(attributes,"Karmaenergie").mod mod: filterAttribute(attributes,"Karmaenergie").mod
} }
let attribute = filterAttribute(attributes,"Karmaenergie") let attribute = filterAttribute(attributes,"Karmaenergie")
@ -242,7 +242,7 @@ function mapRawJson(actor, rawJson) {
aktuell: attribute.value aktuell: attribute.value
} }
attribute = filterAttribute(attributes,"ini") attribute = filterAttribute(attributes,"ini")
json.attribute.ini = { json.ini = {
mod: attribute.mod, mod: attribute.mod,
aktuell: attribute.value aktuell: attribute.value
} }

View File

@ -95,6 +95,7 @@
], ],
"documentTypes": { "documentTypes": {
"Actor": { "Actor": {
"creature": {},
"group": { "group": {
}, },
@ -216,8 +217,7 @@
"distance": 10, "distance": 10,
"units": "Schritt" "units": "Schritt"
}, },
"primaryTokenAttribute": "resources.sp", "primaryTokenAttribute": "lep.aktuell",
"secondaryTokenAttribute": "resources.aus",
"url": "https://git.macniel.online/macniel/foundry-dsa41-game", "url": "https://git.macniel.online/macniel/foundry-dsa41-game",
"manifest": "https://git.macniel.online/macniel/foundry-dsa41-game/releases/download/{{VERSION}}/system.json", "manifest": "https://git.macniel.online/macniel/foundry-dsa41-game/releases/download/{{VERSION}}/system.json",
"download": "https://git.macniel.online/macniel/foundry-dsa41-game/releases/download/{{VERSION}}/release.zip" "download": "https://git.macniel.online/macniel/foundry-dsa41-game/releases/download/{{VERSION}}/release.zip"