From a03af1828154ecfda157df776a65436c8651777d Mon Sep 17 00:00:00 2001 From: oskaloq Date: Wed, 13 Mar 2024 22:22:54 +0100 Subject: [PATCH 01/10] =?UTF-8?q?Zaubertab=20erg=C3=A4nzen=20#79=20+=20Kam?= =?UTF-8?q?pftab=20erg=C3=A4nzen=20#78=20(#87)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Zaubertab um Header (Zaubern + Resistenzen) ergänzt (Footer steht noch aus; am besten zusammen mit der PP Überarbeitung) - Werte in der Zauber Tabelle ergänzt - Zauber "ausrüstbar" gemacht, so dass sie im Kampftab angezeigt werden - Kampftab um Initiative (Anführen) ergänzt Co-authored-by: Ender Reviewed-on: https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/pulls/87 Reviewed-by: Byroks --- lang/de.json | 8 +- source/index.ts | 9 +++ source/module/actors/M5Character.ts | 8 ++ source/template.json | 3 +- templates/sheets/character/combat.hbs | 55 +++++++++++++- templates/sheets/character/gear.hbs | 4 + templates/sheets/character/skills.hbs | 2 +- templates/sheets/character/spells.hbs | 101 ++++++++++++++++++++------ 8 files changed, 163 insertions(+), 27 deletions(-) diff --git a/lang/de.json b/lang/de.json index 7ceaf1c..bd65e5d 100644 --- a/lang/de.json +++ b/lang/de.json @@ -17,7 +17,8 @@ "midgard5.phase-movement": "Bewegungsphase", "midgard5.no-encounter": "Kein Kampf", "midgard5.encounter-not-started": "Kein aktiver Kampf", - "midgard5.initiative": "Handlungsrang", + "midgard5.initiative": "Initiative", + "midgard5.actionrank": "Handlungsrang", "midgard5.combat-join": "Kampf Beitreten/Handlungsrang zurücksetzen", "midgard5.combat-ranged": "Fernangriff", @@ -311,10 +312,15 @@ "midgard5.spell-type": "Art", "midgard5.spell-process": "Prozess", "midgard5.spell-castDuration": "Zauberdauer", + "midgard5.spell-castDuration-short": "Zd", "midgard5.spell-range": "Reichweite", + "midgard5.spell-range-short": "Rw", "midgard5.spell-effectTarget": "Wirkunsziel", + "midgard5.spell-effectTarget-short": "Wz", "midgard5.spell-effectArea": "Wirkungsbereich", + "midgard5.spell-effectArea-short": "Wb", "midgard5.spell-effectDuration": "Wirkungsdauer", + "midgard5.spell-effectDuration-short": "Wd", "midgard5.spell-origin": "Ursprung", "midgard5.spell-agens": "Agens", "midgard5.spell-reagens": "Reagens", diff --git a/source/index.ts b/source/index.ts index deb2690..49f7311 100644 --- a/source/index.ts +++ b/source/index.ts @@ -81,6 +81,15 @@ Hooks.once("init", async () => { return false; }); + Handlebars.registerHelper("skillEwInList", (skillName: string, list: any) => { + for (let key in list) { + if (list[key]?.label?.toLowerCase() === skillName?.toLowerCase()) { + return list[key].calc.ew; + } + } + return false; + }); + Handlebars.registerHelper("stripHtml", function (param) { var regex = /(<([^>]+)>)/gi; return param.replace(regex, ""); diff --git a/source/module/actors/M5Character.ts b/source/module/actors/M5Character.ts index 46f2263..290bae8 100644 --- a/source/module/actors/M5Character.ts +++ b/source/module/actors/M5Character.ts @@ -572,6 +572,14 @@ export class M5Character extends Actor { label: item.name, process: "midgard5.spell-process-" + item.system.process, calc: item.system.calc, + type: item.system.type, + castDuration: item.system.castDuration || 0, + ap: item.system.ap || 0, + range: item.system.range|| 0, + effectTarget: item.system.effectTarget, + effectArea: item.system.effectArea, + effectDuration: item.system.effectDuration || 0, + equipped: item.system?.equipped || false, }; }); } diff --git a/source/template.json b/source/template.json index 928e687..de65935 100644 --- a/source/template.json +++ b/source/template.json @@ -264,7 +264,8 @@ "umgebung": "midgard5.spell-target-umgebung", "geist": "midgard5.spell-target-geist", "koerper": "midgard5.spell-target-koerper" - } + }, + "spellSpecialization": "none" }, "kampfkunstSelection": { "kampfkunstTypeSelection": { diff --git a/templates/sheets/character/combat.hbs b/templates/sheets/character/combat.hbs index 9231f72..44abf11 100644 --- a/templates/sheets/character/combat.hbs +++ b/templates/sheets/character/combat.hbs @@ -8,9 +8,22 @@ {{localize "midgard5.movementRange"}} {{data.calc.stats.movement.value}} + + + + {{localize "midgard5.initiative"}} + + {{#if (isSkillInList (localizeMidgard "anfuehren") data.calc.skills.general)}} + {{skillEwInList (localizeMidgard "anfuehren") data.calc.skills.general}} + {{else}} + {{skillEw actor._id data.skills.general.anfuehren}} + {{/if}} + + {{localize "midgard5.actionrank"}} {{data.calc.attributes.gw.value}} + {{localize "midgard5.defense"}} {{data.calc.stats.defense.value}} {{localize "midgard5.defenseBonus"}} @@ -28,7 +41,7 @@
-
{{localize "midgard5.initiative"}}
+
{{localize "midgard5.actionrank"}}
@@ -196,4 +209,44 @@
+ + {{#if actor.system.info.magicUsing }} +
+
+
{{localize "TYPES.Item.spell"}}
+ + + + + + + + + + + + + {{#each data.calc.spells as |item itemId|}} + {{#if item.equipped}} + + + + + + + + + {{/if}} + {{/each}} + +
{{localize "TYPES.Item.spell"}}{{localize "midgard5.spell-castDuration"}}{{localize "midgard5.actor-ap"}}{{localize "midgard5.ew"}}
{{item.label}}{{#if item.special}}(*){{/if}}{{item.castDuration}}{{item.ap}}{{item.calc.ew}} + {{#if item.equipped}} + + {{else}} + + {{/if}} +
+
+
+ {{/if}} diff --git a/templates/sheets/character/gear.hbs b/templates/sheets/character/gear.hbs index 4a5158a..d56105a 100644 --- a/templates/sheets/character/gear.hbs +++ b/templates/sheets/character/gear.hbs @@ -59,6 +59,7 @@ +{{#unless (eq (count data.calc.gear.containers) 0)}}

{{localize "midgard5.itemsInContainers"}}

{{#each data.calc.gear.containers as |container containerId|}} @@ -205,6 +206,9 @@
{{/each}} +{{/unless}} + +

{{localize "midgard5.allItems"}} diff --git a/templates/sheets/character/skills.hbs b/templates/sheets/character/skills.hbs index c85769e..bea88e2 100644 --- a/templates/sheets/character/skills.hbs +++ b/templates/sheets/character/skills.hbs @@ -67,7 +67,7 @@ {{skill.fw}} - {{!-- {{{{skill.fw}}}} --}} + {{skill.calc.bonus}} {{skill.calc.ew}} {{skill.pp}} diff --git a/templates/sheets/character/spells.hbs b/templates/sheets/character/spells.hbs index 90d636a..d54a85d 100644 --- a/templates/sheets/character/spells.hbs +++ b/templates/sheets/character/spells.hbs @@ -1,23 +1,78 @@ - - - - - - - - - - {{#each data.calc.spells as |item itemId|}} - - - - - - - {{/each}} - -
{{localize "TYPES.Item.spell"}}{{localize "midgard5.ew"}} -
- {{item.label}} - {{localize item.process}} - {{item.calc.ew}}
\ No newline at end of file +
+ +
+
+
{{localize "midgard5.spellCasting"}}
+ + + + + + + + + + + + + + + + +
{{localize "midgard5.spellCasting"}}{{data.calc.stats.spellCasting.value}}{{localize "midgard5.defense"}}{{add data.calc.stats.defense.value data.calc.stats.defenseBonus.value}}{{localize "midgard5.resistanceMind"}}{{data.calc.stats.resistanceMind.value}}{{localize "midgard5.resistanceBody"}}{{data.calc.stats.resistanceBody.value}}
+
+
+ + +
+
+
{{localize "TYPES.Item.spell"}}
+ + + + + + + + + + + + + + + + + + {{#each data.calc.spells as |item itemId|}} + + + + + + + + + + + + + + + {{/each}} + +
{{localize "TYPES.Item.spell"}}{{localize "midgard5.spell-type"}}{{localize "midgard5.spell-castDuration-short"}}{{localize "midgard5.actor-ap-short"}}{{localize "midgard5.spell-range-short"}}{{localize "midgard5.spell-effectTarget"}}{{localize "midgard5.spell-effectArea-short"}}{{localize "midgard5.spell-effectDuration-short"}}{{localize "midgard5.ew"}} +
+ {{item.label}} + {{localize item.process}} + {{localize (m5concat 'midgard5.spell-type-' item.type)}}{{item.castDuration}}{{item.ap}}{{item.range}}{{localize (m5concat 'midgard5.spell-target-' item.effectTarget)}}{{item.effectArea}}{{item.effectDuration}}{{item.calc.ew}} + {{#if item.equipped}} + + {{else}} + + {{/if}} +
+
+
+
+ From 43375a19c8cc8a94d9b71a45a3e25546917a3802 Mon Sep 17 00:00:00 2001 From: LeFrique Date: Thu, 14 Mar 2024 11:35:26 +0100 Subject: [PATCH 02/10] Kampfkunstupdate (#86) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + Added more types & variants + Modified Kampfkunstitem, Combatsheet and rollmessage Hab grad die Kampfkünste in der extension anscheinend direkt nach develop durchgepusht ohne meine kampfkunstbranch dazwischen, hier dann auch die Anpassungen im System dafür. Läuft beides bei mir rund. Reviewed-on: https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/pulls/86 Reviewed-by: oskaloq Co-authored-by: LeFrique Co-committed-by: LeFrique --- lang/de.json | 35 +++++++++++++++------- source/template.json | 15 ++++++++-- templates/chat/roll-m5.hbs | 42 +++++++++++++++++++++++---- templates/sheets/character/combat.hbs | 4 +-- templates/sheets/item/kampfkunst.hbs | 14 +++++++-- 5 files changed, 86 insertions(+), 24 deletions(-) diff --git a/lang/de.json b/lang/de.json index bd65e5d..327c633 100644 --- a/lang/de.json +++ b/lang/de.json @@ -326,26 +326,39 @@ "midgard5.spell-reagens": "Reagens", "midgard5.spell-material": "Zaubermaterial", - "midgard5.kampfkunst-type": "Kampfkunst Art", - "midgard5.kampfkunst-variante": "Kampfkunst Variante", + "midgard5.kampfkunst-type": "Form", + "midgard5.kampfkunst-variante": "Variante", "midgard5.kampfkunst-variante-short": "Var", - "midgard5.kido-type": "Kido Art", - "midgard5.kido-variante": "Kido Variante", + "midgard5.kampfkunst-ep": "Erfahrungspunkte", + "midgard5.kampfkunst-rank": "Stufe", + "midgard5.kampfkunst-weapon": "Waffengruppe", + "midgard5.kampfkunst-enemy": "Einschränkungen durch Art der Gegner", - "midgard5.kampfkunst-type-angriff": "Angriffstechnik", - "midgard5.kampfkunst-type-verteidigung": "Verteidigungstechnik", + "midgard5.kampfkunst-type-angriff": "Angriff", + "midgard5.kampfkunst-type-verteidigung": "Verteidigung", "midgard5.kampfkunst-type-finte": "Finte", "midgard5.kampfkunst-type-geist": "Geistestechnik", "midgard5.kampfkunst-type-schießkunst": "Schießkunst", - "midgard5.kampfkunst-type-fechten": "Fechtkunst", - "midgard5.kido-type-angriff": "Kido Angriffstechnik", - "midgard5.kido-type-verteidigung": "Kido Verteidigungstechnik", - "midgard5.kido-type-finte": "Kido Finte", - "midgard5.kido-type-leib": "Kido Leibestechnik", + "midgard5.kampfkunst-type-fechtkunst": "Fechtkunst", "midgard5.kampfkunst-variante-anstuermen": "Anstürmen", "midgard5.kampfkunst-variante-attackieren": "Attackieren", "midgard5.kampfkunst-variante-entwaffnen": "Entwaffnen", + "midgard5.kampfkunst-variante-fechten": "Fechten", + "midgard5.kampfkunst-variante-schusstechnik": "Schusstechnik", + "midgard5.kampfkunst-variante-finten": "Finten", + "midgard5.kampfkunst-variante-geistestechnik": "Geistestechnik", + "midgard5.kampfkunst-variante-verteidigung": "Verteidigung", + + "midgard5.kido-type": "KiDo Form", + "midgard5.kido-variante": "KiDo Variante", + "midgard5.kido-color": "Kampfstilfarbe", + "midgard5.kido-style": "Art der Technik", + + "midgard5.kido-type-angriff": "Kido Angriff", + "midgard5.kido-type-verteidigung": "Kido Verteidigung", + "midgard5.kido-type-finte": "Kido Finte", + "midgard5.kido-type-leib": "Kido Leibestechnik", "midgard5.kido-variante-anspringen": "Anspringen", "midgard5.kido-variante-attackieren": "Attackieren", diff --git a/source/template.json b/source/template.json index de65935..ddf875d 100644 --- a/source/template.json +++ b/source/template.json @@ -274,7 +274,7 @@ "finte": "midgard5.kampfkunst-type-finte", "geist": "midgard5.kampfkunst-type-geist", "schießkunst": "midgard5.kampfkunst-type-schießkunst", - "fechten": "midgard5.kampfkunst-type-fechten" + "fechtkunst": "midgard5.kampfkunst-type-fechtkunst" }, "kidoTypeSelection": { "angriff": "midgard5.kido-type-angriff", @@ -285,7 +285,12 @@ "kampfkunstVarianteSelection": { "anstuermen": "midgard5.kampfkunst-variante-anstuermen", "attackieren": "midgard5.kampfkunst-variante-attackieren", - "entwaffnen": "midgard5.kampfkunst-variante-entwaffnen" + "entwaffnen": "midgard5.kampfkunst-variante-entwaffnen", + "fechten": "midgard5.kampfkunst-variante-fechten", + "schusstechnik": "midgard5.kampfkunst-variante-schusstechnik", + "finten": "midgard5.kampfkunst-variante-finten", + "geistestechnik": "midgard5.kampfkunst-variante-geistestechnik", + "verteidigung": "midgard5.kampfkunst-variante-verteidigung" }, "kidoVarianteSelection": { "none": "midgard5.spell-process-none", @@ -437,6 +442,12 @@ "variante": "", "isKido": false, "ap": "", + "weapon": "", + "ep": "", + "rank": "", + "enemy": "", + "color": "", + "style": "", "rolls": { "formulas": { "0": { diff --git a/templates/chat/roll-m5.hbs b/templates/chat/roll-m5.hbs index 8e06f8e..1613af5 100644 --- a/templates/chat/roll-m5.hbs +++ b/templates/chat/roll-m5.hbs @@ -64,21 +64,43 @@ {{localize "midgard5.actor-ap"}} {{i.ap}} + + {{localize "midgard5.kampfkunst-ep"}} + {{i.ep}} + {{localize "midgard5.kampfkunst-type"}} {{localize (m5concat "midgard5.kampfkunst-type-" i.type)}} - {{#if (eq i.type "angriff")}} - - {{localize "midgard5.kampfkunst-variante"}} - {{localize (m5concat "midgard5.kampfkunst-variante-" i.variante)}} - - {{/if}} + + {{localize "midgard5.kampfkunst-variante"}} + {{localize (m5concat "midgard5.kampfkunst-variante-" i.variante)}} + + + {{localize "midgard5.kampfkunst-enemy"}} + {{i.enemy}} + + + {{localize "midgard5.kampfkunst-weapon"}} + {{i.weapon}} + {{else}} {{localize "midgard5.actor-ap"}} {{i.ap}} + + {{localize "midgard5.kampfkunst-ep"}} + {{i.ep}} + + + {{localize "midgard5.kampfkunst-color"}} + {{i.color}} + + + {{localize "midgard5.kampfkunst-style"}} + {{i.style}} + {{localize "midgard5.kido-type"}} {{localize (m5concat "midgard5.kido-type-" i.type)}} @@ -88,6 +110,14 @@ {{localize "midgard5.kido-variante"}} {{localize (m5concat "midgard5.kido-variante-" i.variante)}} + + {{localize "midgard5.kampfkunst-enemy"}} + {{i.enemy}} + + + {{localize "midgard5.kampfkunst-weapon"}} + {{i.weapon}} + {{/if}} {{/unless}} {{/if}} diff --git a/templates/sheets/character/combat.hbs b/templates/sheets/character/combat.hbs index 44abf11..d2a38f2 100644 --- a/templates/sheets/character/combat.hbs +++ b/templates/sheets/character/combat.hbs @@ -112,9 +112,7 @@ {{/unless}} {{else}} {{localize (m5concat "midgard5.kampfkunst-type-" item.type)}} - {{#if (eq item.type "angriff")}} - ({{localize (m5concat "midgard5.kampfkunst-variante-" item.variante)}}) - {{/if}} + ({{localize (m5concat "midgard5.kampfkunst-variante-" item.variante)}}) {{/if}} {{item.calc.ew}} diff --git a/templates/sheets/item/kampfkunst.hbs b/templates/sheets/item/kampfkunst.hbs index d97e4ba..962dd93 100644 --- a/templates/sheets/item/kampfkunst.hbs +++ b/templates/sheets/item/kampfkunst.hbs @@ -22,6 +22,18 @@ {{localize "midgard5.actor-ap"}} + + {{localize "midgard5.kampfkunst-ep"}} + + {{localize "midgard5.kampfkunst-rank"}} + + + + {{localize "midgard5.kampfkunst-weapon"}} + + {{localize "midgard5.kampfkunst-enemy"}} + + {{#unless item.system.isKido}} {{localize "midgard5.kampfkunst-type"}} @@ -47,7 +59,6 @@ {{/unless}} {{#unless item.system.isKido}} - {{#if (eq item.system.type "angriff")}} {{localize "midgard5.kampfkunst-variante"}} - {{/if}} {{else}} {{#unless (eq item.system.type "finte")}} {{localize "midgard5.kido-variante"}} From af6fdbbf89584f3ec9343c2e46e154f9e665c911 Mon Sep 17 00:00:00 2001 From: LeFrique Date: Thu, 14 Mar 2024 20:58:52 +0100 Subject: [PATCH 03/10] Skill & Sheets Update (#88) + Added FW-Increase/Decrease on Weapon and Language Skills + Added ItemIcons for Skills, Gear, Spells, Combat and Effects + Re-Added Belastungseffect with all mods working nearly smoothless (only bugging on new actors once created; could be commented out if not approvable until better solution exists) ![grafik](/attachments/451f5642-8250-4331-bdb7-04019ce2525c) Reviewed-on: https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/pulls/88 Reviewed-by: Byroks Co-authored-by: LeFrique Co-committed-by: LeFrique --- lang/de.json | 1 + source/module/actors/M5Character.ts | 93 ++++++++++++-------------- templates/sheets/character/combat.hbs | 12 ++++ templates/sheets/character/effects.hbs | 4 ++ templates/sheets/character/gear.hbs | 15 +++++ templates/sheets/character/skills.hbs | 38 ++++++++--- templates/sheets/character/spells.hbs | 8 ++- 7 files changed, 106 insertions(+), 65 deletions(-) diff --git a/lang/de.json b/lang/de.json index 327c633..efd3e95 100644 --- a/lang/de.json +++ b/lang/de.json @@ -248,6 +248,7 @@ "midgard5.learned-skills": "Gelernte Fertigkeiten", "midgard5.language": "Sprache", "midgard5.languages": "Sprachen", + "midgard5.writings": "Schriften", "midgard5.weapon-skill": "Waffenfertigkeit", "midgard5.weapon-skills": "Waffenfertigkeiten", "midgard5.unlearned-skill": "Ungelernte Fertigkeit", diff --git a/source/module/actors/M5Character.ts b/source/module/actors/M5Character.ts index 290bae8..0f07a15 100644 --- a/source/module/actors/M5Character.ts +++ b/source/module/actors/M5Character.ts @@ -363,6 +363,7 @@ export class M5Character extends Actor { ret.gear.weapons[item.id] = { label: label, + icon: item.img, skillId: item.system.skillId, magic: item.system.magic, valuable: item.system?.valuable, @@ -405,6 +406,7 @@ export class M5Character extends Actor { ret.gear.defensiveWeapons[item.id] = { label: label, + icon: item.img, skillId: item.system.skillId, magic: item.system.magic, valuable: item.system?.valuable, @@ -448,6 +450,7 @@ export class M5Character extends Actor { ret.gear.armor[item.id] = { label: label, + icon: item.img, magic: item.system.magic, valuable: item.system?.valuable, hoarded: item.system?.hoarded, @@ -460,57 +463,41 @@ export class M5Character extends Actor { containerId: item.system.containerId || "", }; }); - - // if (!skip?.encumbrance) { - // const item = context.items.filter((x) => x.name === "Belastung"); - // if (ret.stats.encumbrance > ret.stats.heavyLoad) { - // if (item.length === 0) { - // this.createEffect("Belastung", [{ id: "movement", operation: M5ModOperation.DIVISION, type: M5ModType.STAT, value: 2 }]); - // } else if (item.length === 1) { - // item[0].update({ - // data: { - // equipped: true, - // }, - // }); - // } else if (item.length === 2) { - // item[1]?.delete(); - // } - // } else if (ret.stats.encumbrance <= ret.stats.heavyLoad) { - // if (item.length === 1) { - // item[0]?.update({ - // data: { - // equipped: false, - // }, - // }); - // } - // } - // } - - // if (!skip?.encumbrance) { - // const item = context.items.filter((x) => x.name === "Höchstlast"); - // if (ret.stats.encumbrance > ret.stats.loadMax) { - // if (item.length === 0) { - // this.createEffect("Höchstlast", [{ id: "ap", operation: M5ModOperation.SUBTRACT, type: M5ModType.STAT, value: 1 }]); - // } else if (item.length === 1) { - // item[0].update({ - // data: { - // equipped: true, - // }, - // }); - // } else if (item.length === 2) { - // item[1]?.delete(); - // } - // } else if (ret.stats.encumbrance <= ret.stats.loadMax) { - // if (item.length === 1) { - // item[0]?.update({ - // data: { - // equipped: false, - // }, - // }); - // } - // } - // } - } + + //if (!skip?.encumbrance) { + //const item = context.items.filter((x) => x.name === "Belastung"); + //if (item.length === 0) { + // this.createEffect("Belastung", [ + // { id: "movement", operation: M5ModOperation.DIVISION, type: M5ModType.STAT, value: 2 }, + // { id: "attackBonus", operation: M5ModOperation.SUBTRACT, type: M5ModType.STAT, value: 4 }, + // { id: "defenseBonus", operation: M5ModOperation.SUBTRACT, type: M5ModType.STAT, value: 4 } + // ]); + //} else if (item.length === 2) { + // item[1]?.delete(); + //} + // + //if (item.length === 1) { + // item[0]?.update({ + // img: "icons/containers/bags/sack-simple-leather-orange.webp" }); + // } + // + //if (ret.stats.encumbrance <= ret.stats.heavyLoad) { + // item[0]?.update({ + // data: { + // equipped: false, + // } + // }); + // } + // + //if (ret.stats.encumbrance > ret.stats.heavyLoad) { + // item[0].update({ + // data: { + // equipped: true, + // }, + // }); + // } + //} + } if (!skip?.effects) { context.items @@ -526,6 +513,7 @@ export class M5Character extends Actor { ret.gear.effects[item.id] = { label: label, + icon: item.img, magic: item.system.magic, calc: item.system.calc, equipped: item.system?.equipped || false, @@ -543,6 +531,7 @@ export class M5Character extends Actor { const skillMap = ret.skills[item.system.type]; skillMap[item.id] = { label: item.name, + icon: item.img, fw: item.system.fw, attribute: item.system.attribute, pp: item.system.pp, @@ -570,6 +559,7 @@ export class M5Character extends Actor { ret.spells[item.id] = { label: item.name, + icon: item.img, process: "midgard5.spell-process-" + item.system.process, calc: item.system.calc, type: item.system.type, @@ -593,6 +583,7 @@ export class M5Character extends Actor { ret.kampfkuenste[item.id] = { label: item.name, + icon: item.img, isKido: item.system.isKido, type: item.system.type, variante: item.system.variante, diff --git a/templates/sheets/character/combat.hbs b/templates/sheets/character/combat.hbs index d2a38f2..bd11d3c 100644 --- a/templates/sheets/character/combat.hbs +++ b/templates/sheets/character/combat.hbs @@ -54,6 +54,7 @@ + @@ -65,6 +66,7 @@ {{#each data.calc.gear.weapons as |item itemId|}} {{#if item.equipped}} + @@ -81,6 +83,7 @@ {{/each}} + @@ -93,6 +96,7 @@
{{localize "TYPES.Item.weapon"}} {{localize "midgard5.ew"}} {{localize "midgard5.damage"}}
{{item.label}}{{#if item.special}}(*){{/if}} {{item.calc.ew}} {{item.damageBase}}
{{localize "midgard5.brawl"}} {{data.calc.stats.brawlFw}} 1d6 -4
+ @@ -103,6 +107,7 @@ {{#each data.calc.kampfkuenste as |item itemId|}} + {{/each}} -
{{localize "TYPES.Item.kampfkunst"}} {{localize "midgard5.kampfkunst-variante-short"}} {{localize "midgard5.ew"}}
{{item.label}} {{#if item.isKido}} @@ -131,17 +136,20 @@ + + + @@ -151,6 +159,7 @@
{{localize "midgard5.defense"}} {{add data.calc.stats.defense.value data.calc.stats.defenseBonus.value}}
{{localize "midgard5.resistanceMind"}} {{data.calc.stats.resistanceMind.value}}
{{localize "midgard5.resistanceBody"}} {{data.calc.stats.resistanceBody.value}}
+ @@ -162,6 +171,7 @@ {{#each data.calc.gear.defensiveWeapons as |item itemId|}} {{#if item.equipped}} + @@ -182,6 +192,7 @@
{{localize "TYPES.Item.defensiveWeapon"}} {{localize "midgard5.ew"}} {{localize "midgard5.defenseBonus-short"}}
{{item.label}} {{item.calc.ew}} {{item.defenseBonus}}
+ @@ -191,6 +202,7 @@ {{#each data.calc.gear.armor as |item itemId|}} {{#if item.equipped}} + - - - + + + @@ -231,6 +231,7 @@ + + {{/each}} - - - - - - - - - - - - - - - - - -
{{localize "TYPES.Item.armor"}} {{localize "midgard5.actor-lp-short"}}
{{item.label}} {{lpProtection}} diff --git a/templates/sheets/character/effects.hbs b/templates/sheets/character/effects.hbs index 59808f5..1d06a1b 100644 --- a/templates/sheets/character/effects.hbs +++ b/templates/sheets/character/effects.hbs @@ -1,6 +1,7 @@ + {{#each data.calc.gear.effects as |item itemId|}} + + {{!--{{#unless (eq item.label "Belastung")}}--}} + {{!--{{/unless}}--}} {{/each}} diff --git a/templates/sheets/character/gear.hbs b/templates/sheets/character/gear.hbs index d56105a..78f5384 100644 --- a/templates/sheets/character/gear.hbs +++ b/templates/sheets/character/gear.hbs @@ -69,6 +69,7 @@
{{localize "TYPES.Item.effect"}} @@ -9,6 +10,7 @@
{{item.label}} {{#if item.equipped}} @@ -18,7 +20,9 @@ {{/unless}} {{/if}}
+ @@ -83,6 +84,7 @@ {{#each ../data.calc.gear.items as |item itemId|}} {{#if (eq item.containerId containerId)}} + @@ -116,6 +118,7 @@ {{#each ../data.calc.gear.weapons as |item itemId|}} {{#if (eq item.containerId containerId)}} + @@ -145,6 +148,7 @@ {{#each ../data.calc.gear.defensiveWeapons as |item itemId|}} {{#if (eq item.containerId containerId)}} + @@ -174,6 +178,7 @@ {{#each ../data.calc.gear.armor as |item itemId|}} {{#if (eq item.containerId containerId)}} + @@ -222,6 +227,7 @@
{{localize "TYPES.Item.item"}} {{localize "midgard5.item-quantity"}} {{localize "midgard5.item-value"}}
{{item.label}}
{{item.label}}
{{item.label}}
{{item.label}}
+ @@ -234,6 +240,7 @@ {{#each data.calc.gear.containers as |item itemId|}} + @@ -269,6 +276,7 @@
{{localize "TYPES.Item.container"}} {{localize "midgard5.item-value"}} {{localize "midgard5.item-weight"}}
{{item.label}}
+ @@ -283,6 +291,7 @@ {{#each data.calc.gear.items as |item itemId|}} {{#if (or ../data.info.showAllItems (eq item.containerId ""))}} + @@ -325,6 +334,7 @@
{{localize "TYPES.Item.item"}} {{localize "midgard5.item-quantity"}} {{localize "midgard5.item-value"}}
{{item.label}}
+ @@ -337,6 +347,7 @@ {{#each data.calc.gear.weapons as |item itemId|}} {{#if (or ../data.info.showAllItems (eq item.containerId ""))}} + - + From 046d5f02864722b9b23d302edde1dd9d1c4428c4 Mon Sep 17 00:00:00 2001 From: Byroks Date: Sun, 24 Mar 2024 15:09:08 +0100 Subject: [PATCH 06/10] #91 Automatische Praxispunkte (#93) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes: + implementation von Automatischen Praxispunkten + Hinzufügen von System Settings zur abschaltung von Automatischen Praxispunkten + Aufräumen von Helpers und settings in eigene Dateien Co-authored-by: LeFrique Reviewed-on: https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/pulls/93 --- lang/de.json | 8 ++- source/helpers.ts | 110 ++++++++++++++++++++++++++++++++ source/index.ts | 107 ++----------------------------- source/module/M5Base.ts | 2 +- source/module/items/M5Item.ts | 2 +- source/module/rolls/M5Roll.ts | 46 ++++++++++++- source/settings.ts | 16 +++++ source/template.json | 6 +- templates/sheets/item/class.hbs | 2 +- 9 files changed, 192 insertions(+), 107 deletions(-) create mode 100644 source/helpers.ts create mode 100644 source/settings.ts diff --git a/lang/de.json b/lang/de.json index 4ed4493..d6aff9d 100644 --- a/lang/de.json +++ b/lang/de.json @@ -181,7 +181,11 @@ "midgard5.meditieren": "Meditieren", "midgard5.menschenkenntnis": "Menschenkenntnis", "midgard5.meucheln": "Meucheln", - "midgard5.musizieren": "Musizieren", + "midgard5.musizierenFloete": "Musizieren (Flöten)", + "midgard5.musizierenBlas": "Musizieren (Blasinstrumente)", + "midgard5.musizierenRythmus": "Musizieren (Rythmusinstrumente)", + "midgard5.musizierenStreich": "Musizieren (Streichinstrumente)", + "midgard5.musizierenZupf": "Musizieren (Zupfinstrumente)", "midgard5.naturkunde": "Naturkunde", "midgard5.ninjutsu": "NinJutsu", "midgard5.orakelkunst": "Orakelkunst", @@ -298,7 +302,7 @@ "midgard5.spell-process-veraendern": "Verändern", "midgard5.spell-process-vigilsignien": "Vigilsignien", "midgard5.spell-process-wundertat": "Wundertat", - "midgard5.spell-process-wilder_Dweomer": "Wilder Dweomer", + "midgard5.spell-process-wilder_dweomer": "Wilder Dweomer", "midgard5.spell-process-zerstoeren": "Zerstören", "midgard5.spell-process-zauberlied": "Zauberlieder", "midgard5.spell-process-zaubersalz": "Zaubersalze", diff --git a/source/helpers.ts b/source/helpers.ts new file mode 100644 index 0000000..f0c0572 --- /dev/null +++ b/source/helpers.ts @@ -0,0 +1,110 @@ +/* global Handlebars, game, TextEditor, WOD5E */ + +import { M5Skill } from "./module/M5Base"; +import { M5Character } from "./module/actors/M5Character"; + +/** + * Define any helpers necessary for working with Handlebars + * @return {Promise} + */ +export const loadHelpers = async function () { + Handlebars.registerHelper("times", (n: number, block) => { + var accum = ""; + for (let i = 0; i < n; ++i) accum += block.fn(i); + return accum; + }); + + Handlebars.registerHelper("array", (arr: any[], index: number) => { + return arr[index]; + }); + + Handlebars.registerHelper("m5concat", (...values) => { + const options = values.pop(); + const join = options.hash?.join || ""; + //return new Handlebars.SafeString(values.join(join)); + return values.map((val) => val.toString()).join(join); + }); + + Handlebars.registerHelper("add", (...values) => { + const options = values.pop(); + return values.reduce((prev, cur) => prev + cur); + }); + + Handlebars.registerHelper("localizeMidgard", (str: string) => { + const template = Handlebars.compile("{{localize value}}"); + return template({ + value: "midgard5." + str, + }); + }); + + Handlebars.registerHelper("skillBonus", (actorId: string, skill: M5Skill) => { + const actor = (game as Game).actors.get(actorId) as M5Character; + return actor.skillBonus(skill).toString(); + }); + + Handlebars.registerHelper("skillEw", (actorId: string, skill: M5Skill) => { + const actor = (game as Game).actors.get(actorId) as M5Character; + return actor.skillEw(skill).toString(); + }); + + Handlebars.registerHelper("skill", (skillId: string) => { + return (game as Game).items.get(skillId); + }); + + Handlebars.registerHelper("itemValue", (id: string, path: string) => { + let obj = (game as Game).items.get(id); + path.split(".").forEach((p) => (obj = obj[p])); + return `${obj}`; + }); + + Handlebars.registerHelper("actorItemValue", (actorId: any, itemId: string, path: string, token?: boolean) => { + //console.log("actorItemValue", actorId, itemId, path) + const actor = (game as Game).actors.get(actorId); + let obj = actor.items.get(itemId)?.system; + path.split(".").forEach((p) => { + if (obj) obj = obj[p]; + }); + return `${obj}`; + }); + + Handlebars.registerHelper("icon", (relpath: string) => { + return `systems/midgard5/assets/icons/${relpath}`; + }); + + Handlebars.registerHelper("isSkillInList", (skillName: string, list: any) => { + for (let key in list) { + if (list[key]?.label?.toLowerCase() === skillName?.toLowerCase()) { + return true; + } + } + return false; + }); + + Handlebars.registerHelper("skillEwInList", (skillName: string, list: any) => { + for (let key in list) { + if (list[key]?.label?.toLowerCase() === skillName?.toLowerCase()) { + return list[key].calc.ew; + } + } + return false; + }); + + Handlebars.registerHelper("stripHtml", function (param) { + var regex = /(<([^>]+)>)/gi; + return param.replace(regex, ""); + }); + + Handlebars.registerHelper("contains", (label: string, contains: string) => { + return label.toLowerCase().includes(contains.toLowerCase()); + }); + + Handlebars.registerHelper("count", (object: any) => { + var length = 0; + for (var key in object) { + if (object.hasOwnProperty(key)) { + ++length; + } + } + return length; + }); +}; diff --git a/source/index.ts b/source/index.ts index 49f7311..2d4de52 100644 --- a/source/index.ts +++ b/source/index.ts @@ -2,112 +2,17 @@ import Logger from "./utils/Logger"; import M5CharacterSheet from "./module/sheets/M5CharacterSheet"; import preloadTemplates from "./PreloadTemplates"; import { M5Character } from "./module/actors/M5Character"; -import { M5ItemMod, M5ModOperation, M5Skill, M5TimeUnit } from "./module/M5Base"; +import { M5ModOperation, M5TimeUnit } from "./module/M5Base"; import { M5ItemSheet } from "./module/sheets/M5ItemSheet"; import { M5Item } from "./module/items/M5Item"; +import { loadHelpers } from "./helpers"; +import { loadSettings } from "./settings"; Hooks.once("init", async () => { Logger.log("M5 | Initialisierung Midgard 5"); - Handlebars.registerHelper("times", (n: number, block) => { - var accum = ""; - for (let i = 0; i < n; ++i) accum += block.fn(i); - return accum; - }); - - Handlebars.registerHelper("array", (arr: any[], index: number) => { - return arr[index]; - }); - - Handlebars.registerHelper("m5concat", (...values) => { - const options = values.pop(); - const join = options.hash?.join || ""; - //return new Handlebars.SafeString(values.join(join)); - return values.map((val) => val.toString()).join(join); - }); - - Handlebars.registerHelper("add", (...values) => { - const options = values.pop(); - return values.reduce((prev, cur) => prev + cur); - }); - - Handlebars.registerHelper("localizeMidgard", (str: string) => { - const template = Handlebars.compile("{{localize value}}"); - return template({ - value: "midgard5." + str, - }); - }); - - Handlebars.registerHelper("skillBonus", (actorId: string, skill: M5Skill) => { - const actor = (game as Game).actors.get(actorId) as M5Character; - return actor.skillBonus(skill).toString(); - }); - - Handlebars.registerHelper("skillEw", (actorId: string, skill: M5Skill) => { - const actor = (game as Game).actors.get(actorId) as M5Character; - return actor.skillEw(skill).toString(); - }); - - Handlebars.registerHelper("skill", (skillId: string) => { - return (game as Game).items.get(skillId); - }); - - Handlebars.registerHelper("itemValue", (id: string, path: string) => { - let obj = (game as Game).items.get(id); - path.split(".").forEach((p) => (obj = obj[p])); - return `${obj}`; - }); - - Handlebars.registerHelper("actorItemValue", (actorId: any, itemId: string, path: string, token?: boolean) => { - //console.log("actorItemValue", actorId, itemId, path) - const actor = (game as Game).actors.get(actorId); - let obj = actor.items.get(itemId)?.system; - path.split(".").forEach((p) => { - if (obj) obj = obj[p]; - }); - return `${obj}`; - }); - - Handlebars.registerHelper("icon", (relpath: string) => { - return `systems/midgard5/assets/icons/${relpath}`; - }); - - Handlebars.registerHelper("isSkillInList", (skillName: string, list: any) => { - for (let key in list) { - if (list[key]?.label?.toLowerCase() === skillName?.toLowerCase()) { - return true; - } - } - return false; - }); - - Handlebars.registerHelper("skillEwInList", (skillName: string, list: any) => { - for (let key in list) { - if (list[key]?.label?.toLowerCase() === skillName?.toLowerCase()) { - return list[key].calc.ew; - } - } - return false; - }); - - Handlebars.registerHelper("stripHtml", function (param) { - var regex = /(<([^>]+)>)/gi; - return param.replace(regex, ""); - }); - - Handlebars.registerHelper("contains", (label: string, contains: string) => { - return label.toLowerCase().includes(contains.toLowerCase()); - }); - - Handlebars.registerHelper("count", (object: any) => { - var length = 0; - for (var key in object) { - if (object.hasOwnProperty(key)) { - ++length; - } - } - return length; - }); + // Load settings into Foundry + loadSettings(); // Default Sheet für Items definieren und das Standardsheet deaktivieren Items.unregisterSheet("core", ItemSheet); @@ -121,6 +26,8 @@ Hooks.once("init", async () => { CONFIG.Item.documentClass = M5Item; //RegisterSettings(); await preloadTemplates(); + + loadHelpers(); }); Hooks.once("setup", () => { diff --git a/source/module/M5Base.ts b/source/module/M5Base.ts index 586b84f..004e1f1 100644 --- a/source/module/M5Base.ts +++ b/source/module/M5Base.ts @@ -29,7 +29,7 @@ export interface M5RollData { c: any; i: any; iType: string; - rolls: {}; + rolls: any; res: { label: string; }; diff --git a/source/module/items/M5Item.ts b/source/module/items/M5Item.ts index c4eb60c..72845cc 100644 --- a/source/module/items/M5Item.ts +++ b/source/module/items/M5Item.ts @@ -323,7 +323,7 @@ export class M5Item extends Item { } } - const roll = new M5Roll(rollData, this.actor, item.name); + const roll = new M5Roll(rollData, this.actor, item.name, item.id); return roll.toMessage(); } else { ChatMessage.create({ diff --git a/source/module/rolls/M5Roll.ts b/source/module/rolls/M5Roll.ts index a7ad922..aab59a2 100644 --- a/source/module/rolls/M5Roll.ts +++ b/source/module/rolls/M5Roll.ts @@ -11,7 +11,7 @@ export class M5Roll { public _total: number = 0; public pool: PoolTerm = null; - constructor(public data: M5RollData, public actor: any, public label: string) { + constructor(public data: M5RollData, public actor: any, public label: string, public id?: string) { //super(null) //this.data = rollData } @@ -88,6 +88,50 @@ export class M5Roll { }); this.data.res.label = this.label; + if ((game as Game).settings.get("midgard5", "automatedPP")) { + if ((this.data.i.type === "language" || this.data.i.type === "general") && this.data.rolls[0].dice[0] >= 16) { + this.actor.items.get(this.id).update({ + system: { + pp: this.data.i.pp + 1, + }, + }); + } else if (this.data.rolls[0].dice[0] === 20) { + if (this.data.i.type === "combat") { + // Rolling through skill + this.actor.items.get(this.id).update({ + system: { + pp: this.data.i.pp + 1, + }, + }); + } else if (this.data.iType === "weapon") { + // Rolling through Weapon Item + const skill = this.actor.items.get(this.data.i.skillId); + skill.update({ + system: { + pp: skill.system.pp + 1, + }, + }); + } else if (this.data.iType === "defensiveWeapon") { + // Rolling through defensiveWeapon Item + const skill = this.actor.items.get(this.data.i.skillId); + skill.update({ + system: { + pp: skill.system.pp + 1, + }, + }); + } else if (this.data.iType === "spell") { + // Rolling through Spell Item + const klasse = this.actor.items.find((x) => x.type === "class" && x.system.equipped); + klasse.update({ + system: { + lernKostenZauber: { + [this.data.i.process]: { pp: klasse.system.lernKostenZauber[this.data.i.process].pp + 1 }, + }, + }, + }); + } + } + } this._evaluated = true; return this; diff --git a/source/settings.ts b/source/settings.ts new file mode 100644 index 0000000..d9ba705 --- /dev/null +++ b/source/settings.ts @@ -0,0 +1,16 @@ +/* global game */ + +/** + * Define all game settings here + * @return {Promise} + */ +export const loadSettings = async function () { + (game as Game).settings.register("midgard5", "automatedPP", { + name: "Automatische Praxispunkte", + hint: "Falls aktiv, werden Praxispunkte automatisch angerechnet.", + scope: "world", + config: true, + default: true, + type: Boolean, + }); +}; diff --git a/source/template.json b/source/template.json index 23483b4..de2ef9e 100644 --- a/source/template.json +++ b/source/template.json @@ -101,7 +101,11 @@ "meditieren": { "fw": 0, "attribute": "wk", "initial": 8, "pp": 0 }, "menschenkenntnis": { "fw": 3, "attribute": "in", "initial": 8, "pp": 0 }, "meucheln": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 }, - "musizieren": { "fw": 0, "attribute": "gs", "initial": 12, "pp": 0 }, + "musizierenFloete": { "fw": 0, "attribute": "gs", "initial": 12, "pp": 0 }, + "musizierenBlas": { "fw": 0, "attribute": "gs", "initial": 12, "pp": 0 }, + "musizierenRythmus": { "fw": 0, "attribute": "gs", "initial": 12, "pp": 0 }, + "musizierenStreich": { "fw": 0, "attribute": "gs", "initial": 12, "pp": 0 }, + "musizierenZupf": { "fw": 0, "attribute": "gs", "initial": 12, "pp": 0 }, "ninjutsu": { "fw": 0, "attribute": "gw", "initial": 8, "pp": 0 }, "naturkunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 }, "orakelkunst": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 }, diff --git a/templates/sheets/item/class.hbs b/templates/sheets/item/class.hbs index e12e040..6e657c0 100644 --- a/templates/sheets/item/class.hbs +++ b/templates/sheets/item/class.hbs @@ -89,7 +89,7 @@ {{#each data.lernKostenZauber as |wert name|}} - + {{/each}} From 7ac704cc619cf4a3f4b8d407a2c69929f431a425 Mon Sep 17 00:00:00 2001 From: LeFrique Date: Sun, 24 Mar 2024 20:02:24 +0100 Subject: [PATCH 07/10] Entbehrungen (#89) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ich habe die Entbehrungswerte für Zähigkeit unter den Grundwerten abgelegt und werde die Tage noch Entbehrungseffekte und ein Macro in der Extension dafür anlegen. Die Boni für die Klassen wie zB Barbar +10 könnten wir dann da direkt mit in der jeweilige Klasse berücksichtigen. Grundsätzlich kann man das aber jetzt schonmal nutzen und der Grundwertebogen war mir zu leer ;) ![grafik](/attachments/fbb80a27-91d7-4b00-bd39-7c24af3bda60) Co-authored-by: Byroks Reviewed-on: https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/pulls/89 Co-authored-by: LeFrique Co-committed-by: LeFrique --- lang/de.json | 20 ++++--- source/module/M5Base.ts | 21 ++----- source/module/actors/M5Character.ts | 66 ++++------------------ source/module/actors/M5ModAggregate.ts | 5 +- source/module/items/M5Item.ts | 24 ++++++++ source/module/rolls/M5Roll.ts | 62 ++++++++++++-------- source/module/sheets/M5CharacterSheet.ts | 13 +++-- source/template.json | 9 ++- templates/sheets/character/base_values.hbs | 52 +++++++++++------ templates/sheets/character/gear.hbs | 12 +++- templates/sheets/character/skills.hbs | 18 ------ templates/sheets/character/spells.hbs | 4 +- templates/sheets/item/class.hbs | 2 +- templates/sheets/item/container.hbs | 12 ++++ 14 files changed, 174 insertions(+), 146 deletions(-) diff --git a/lang/de.json b/lang/de.json index d6aff9d..6f95cdd 100644 --- a/lang/de.json +++ b/lang/de.json @@ -40,7 +40,7 @@ "midgard5.background": "Hintergrund", "midgard5.attribute": "Eigenschaft", "midgard5.attributes": "Eigenschaften", - "midgard5.points": "Punkte", + "midgard5.points": "Erfahrung", "midgard5.calculated-value": "Berechneter Wert", "midgard5.calculated-values": "Werte und Boni", @@ -131,7 +131,7 @@ "midgard5.heavy-load": "Schwere Last", "midgard5.thrust-load": "Schublast", "midgard5.load-max": "Höchstlast", - "midgard5.load-capacity": "Tragkraft", + "midgard5.capacity": "Tragkraft", "midgard5.exp-overall": "Erfahrungsschatz", "midgard5.exp-available": "Erfahrungspunkte", @@ -215,7 +215,9 @@ "midgard5.thaumagraphie": "Thaumagraphie", "midgard5.thaumalogie": "Thaumalogie", "midgard5.tierkunde": "Tierkunde", - "midgard5.ueberleben": "Überleben", + "midgard5.ueberlebenWald": "Überleben (Wald)", + "midgard5.ueberlebenSteppe": "Überleben (Steppe)", + "midgard5.ueberlebenGebirge": "Überleben (Gebirge)", "midgard5.verfuehren": "Verführen", "midgard5.verhoeren": "Verhören", "midgard5.verstellen": "Verstellen", @@ -243,8 +245,11 @@ "midgard5.enduranceBonus": "Ausdauerbonus", "midgard5.lpProtection": "Rüstungsschutz (LP)", "midgard5.apProtection": "Rüstungsschutz (AP)", - "midgard5.perception": "Wahrnehmung", - "midgard5.drinking": "Trinken", + "midgard5.deprivation": "Zähigkeit", + "midgard5.deprivations": "Entbehrungen", + "midgard5.deprivationCold": "Zähigkeit Kälte", + "midgard5.deprivationHeat": "Zähigkeit Hitze", + "midgard5.deprivationFood": "Zähigkeit Durst/Hunger", "midgard5.new-skill": "Neue Fertigkeit", "midgard5.special": "Spezial", @@ -403,8 +408,9 @@ "midgard5.mod-stat-ap": "Ausdauerpunkte", "midgard5.mod-stat-lpProtection": "Rüstungsschutz (LP)", "midgard5.mod-stat-apProtection": "Rüstungsschutz (AP)", - "midgard5.mod-stat-perception": "Wahrnehmung", - "midgard5.mod-stat-drinking": "Trinken", + "midgard5.mod-stat-deprivationCold": "Entbehrungen Kälte", + "midgard5.mod-stat-deprivationHeat": "Entbehrungen Hitze", + "midgard5.mod-stat-deprivationFood": "Entbehrungen Durst/Hunger", "midgard5.mod-type": "Typ der Modifikation", "midgard5.mod-id": "Was soll modifiziert werden", diff --git a/source/module/M5Base.ts b/source/module/M5Base.ts index 004e1f1..d31f2b1 100644 --- a/source/module/M5Base.ts +++ b/source/module/M5Base.ts @@ -103,17 +103,9 @@ export enum M5Stats { AP = "ap", PROTECTION_LP = "lpProtection", PROTECTION_AP = "apProtection", - PERCEPTION = "perception", - DRINKING = "drinking", - HOARD = "hoard", - HOARD_NEXT = "hoardNext", - HOARD_MIN = "hoardMin", - WEALTH = "wealth", - LOAD = "load", - HEAVY_LOAD = "heavyLoad", - LOAD_MAX = "loadMax", - THRUST_LOAD = "thrustLoad", - ENCUMBRANCE = "encumbrance", + DEPRIVATION_COLD = "deprivationCold", + DEPRIVATION_HEAT = "deprivationHeat", + DEPRIVATION_FOOD = "deprivationFood", } export enum M5ModType { @@ -197,10 +189,9 @@ export interface M5CharacterCalculatedData { brawlFw: number; poisonResistance: M5ModResult; enduranceBonus: number; - perception: M5ModResult; - perceptionFW: number; - drinking: M5ModResult; - drinkingFW: number; + deprivationCold: M5ModResult; + deprivationHeat: M5ModResult; + deprivationFood: M5ModResult; hoard: number; hoardNext: number; hoardMin: number; diff --git a/source/module/actors/M5Character.ts b/source/module/actors/M5Character.ts index 8c6e8bb..4b9546e 100644 --- a/source/module/actors/M5Character.ts +++ b/source/module/actors/M5Character.ts @@ -114,10 +114,9 @@ export class M5Character extends Actor { brawlFw: 0, poisonResistance: { value: 0, mods: [] }, enduranceBonus: 0, - perception: { value: 0, mods: [] }, - perceptionFW: 0, - drinking: { value: 0, mods: [] }, - drinkingFW: 0, + deprivationCold: { value: 0, mods: [] }, + deprivationHeat: { value: 0, mods: [] }, + deprivationFood: { value: 0, mods: [] }, hoard: 0, encumbrance: 0, load: 0, @@ -189,10 +188,9 @@ export class M5Character extends Actor { ret.stats.brawlFw = ret.stats.brawl.value + ret.stats.attackBonus.value + (data.info.race === "Zwerg" ? 1 : 0); ret.stats.poisonResistance = this.modResult(30 + Math.floor(ret.attributes.ko.value / 2)); ret.stats.enduranceBonus = Math.floor(ret.attributes.ko.value / 10) + Math.floor(ret.attributes.st.value / 20); - ret.stats.perception = this.modResult(0); - ret.stats.perceptionFW = 6; - ret.stats.drinking = this.modResult(0); - ret.stats.drinkingFW = Math.floor(ret.attributes.ko.value / 10); + ret.stats.deprivationCold = this.modResult(Math.floor(ret.attributes.ko.value / 2)); + ret.stats.deprivationHeat = this.modResult(Math.floor(ret.attributes.ko.value / 2)); + ret.stats.deprivationFood = this.modResult(Math.floor(40 + ret.attributes.ko.value / 2)); ret.stats.hoardMin = M5Character.levelThreshold.at(ret.level - 1) / 2; ret.stats.hoardNext = M5Character.levelThreshold.at(ret.level) / 2; ret.stats.wealth = parseFloat((data.info.gold + data.info.silver / 10 + data.info.copper / 100).toPrecision(3)); @@ -207,7 +205,10 @@ export class M5Character extends Actor { const aggregate = new M5ModAggregate(data, ret); context.items - ?.filter((item) => (item.type === "item" || item.type === "effect" || item.type === "armor" || item.type === "container" || item.type === "class") && item.system.equipped) + ?.filter( + (item) => + (item.type === "item" || item.type === "skill" || item.type === "effect" || item.type === "armor" || item.type === "container" || item.type === "class") && item.system.equipped + ) .forEach((item) => { const mods = item.system.mods; //console.log("Actor item mods", mods) @@ -250,6 +251,7 @@ export class M5Character extends Actor { calc: item.system.calc, equipped: item.system?.equipped, weight: item.system.weight || 0, + capacity: item.system.capacity || 0, value: item.system.value || 0, currency: item.system.currency || "", quantity: item.system.quantity || 0, @@ -447,41 +449,7 @@ export class M5Character extends Actor { containerId: item.system.containerId || "", }; }); - - //if (!skip?.encumbrance) { - //const item = context.items.filter((x) => x.name === "Belastung"); - //if (item.length === 0) { - // this.createEffect("Belastung", [ - // { id: "movement", operation: M5ModOperation.DIVISION, type: M5ModType.STAT, value: 2 }, - // { id: "attackBonus", operation: M5ModOperation.SUBTRACT, type: M5ModType.STAT, value: 4 }, - // { id: "defenseBonus", operation: M5ModOperation.SUBTRACT, type: M5ModType.STAT, value: 4 } - // ]); - //} else if (item.length === 2) { - // item[1]?.delete(); - //} - // - //if (item.length === 1) { - // item[0]?.update({ - // img: "icons/containers/bags/sack-simple-leather-orange.webp" }); - // } - // - //if (ret.stats.encumbrance <= ret.stats.heavyLoad) { - // item[0]?.update({ - // data: { - // equipped: false, - // } - // }); - // } - // - //if (ret.stats.encumbrance > ret.stats.heavyLoad) { - // item[0].update({ - // data: { - // equipped: true, - // }, - // }); - // } - //} - } + } if (!skip?.class) { context.items @@ -540,16 +508,6 @@ export class M5Character extends Actor { pp: item.system.pp, calc: item.system.calc, } as M5SkillCalculated; - - // Adjust attribute Aussehen based on Athletik skill - if (item.name === "Athletik") { - ret.attributes.au.value += Math.floor(item.system.fw / 3); - } - - // Adjust stat Bewegungsweite based on Laufen skill - if (item.name === "Laufen") { - ret.stats.movement.value += Math.floor(item.system.fw / 3); - } }); } diff --git a/source/module/actors/M5ModAggregate.ts b/source/module/actors/M5ModAggregate.ts index 63350eb..f1eca6b 100644 --- a/source/module/actors/M5ModAggregate.ts +++ b/source/module/actors/M5ModAggregate.ts @@ -41,8 +41,9 @@ export default class M5ModAggregate { this.push({ type: M5ModType.STAT, id: M5Stats.AP, operation: M5ModOperation.SET, value: calc.stats.ap.value }, characterString); this.push({ type: M5ModType.STAT, id: M5Stats.PROTECTION_LP, operation: M5ModOperation.SET, value: calc.stats.lpProtection.value }, characterString); this.push({ type: M5ModType.STAT, id: M5Stats.PROTECTION_AP, operation: M5ModOperation.SET, value: calc.stats.apProtection.value }, characterString); - this.push({ type: M5ModType.STAT, id: M5Stats.PERCEPTION, operation: M5ModOperation.SET, value: calc.stats.perception.value }, characterString); - this.push({ type: M5ModType.STAT, id: M5Stats.DRINKING, operation: M5ModOperation.SET, value: calc.stats.drinking.value }, characterString); + this.push({ type: M5ModType.STAT, id: M5Stats.DEPRIVATION_COLD, operation: M5ModOperation.SET, value: calc.stats.deprivationCold.value }, characterString); + this.push({ type: M5ModType.STAT, id: M5Stats.DEPRIVATION_HEAT, operation: M5ModOperation.SET, value: calc.stats.deprivationHeat.value }, characterString); + this.push({ type: M5ModType.STAT, id: M5Stats.DEPRIVATION_FOOD, operation: M5ModOperation.SET, value: calc.stats.deprivationFood.value }, characterString); } push(mod: M5ItemMod, source: string) { diff --git a/source/module/items/M5Item.ts b/source/module/items/M5Item.ts index 72845cc..24b7c3f 100644 --- a/source/module/items/M5Item.ts +++ b/source/module/items/M5Item.ts @@ -13,6 +13,7 @@ export class M5Item extends Item { const character = actor as M5Character; const itemData = (this as any).system; const calc = itemData.calc; + const name = (this as any).name; if (itemType === "item") { calc.containers = null; @@ -45,6 +46,29 @@ export class M5Item extends Item { }, ]; + // Adjust attribute Aussehen based on Athletik skill + if (name === "Athletik") { + itemData.mods[0] = { type: "attribute", id: "au", operation: "add100", value: Math.floor(calc.fw / 3) }; + } + // Adjust stat Bewegungsweite based on Laufen skill + if (name === "Laufen") { + itemData.mods[0] = { type: "stat", id: "movement", operation: "add", value: Math.floor(calc.fw / 3) }; + } + + // Adjust stat Kälte based on Überleben (Gebirge) skill + if (name === "Überleben (Gebirge)") { + itemData.mods[0] = { type: "stat", id: "deprivationCold", operation: "add", value: Math.floor(calc.fw * 5) }; + } + + // // Adjust stat Kälte based on Überleben (Steppe) skill + if (name === "Überleben (Steppe)") { + itemData.mods[0] = { type: "stat", id: "deprivationHeat", operation: "add", value: Math.floor(calc.fw * 5) }; + } + // // Adjust stat Durst & Hunger based on Robustheit skill + if (name === "Robustheit") { + itemData.mods[0] = { type: "stat", id: "deprivationFood", operation: "add", value: Math.floor(calc.fw * 5) }; + } + if (character) { const actorCalc = character.derivedData({ containers: true, diff --git a/source/module/rolls/M5Roll.ts b/source/module/rolls/M5Roll.ts index aab59a2..5e80689 100644 --- a/source/module/rolls/M5Roll.ts +++ b/source/module/rolls/M5Roll.ts @@ -88,7 +88,8 @@ export class M5Roll { }); this.data.res.label = this.label; - if ((game as Game).settings.get("midgard5", "automatedPP")) { + console.log(this.data); + if ((game as Game).settings.get("midgard5", "automatedPP") && this.data.iType !== null) { if ((this.data.i.type === "language" || this.data.i.type === "general") && this.data.rolls[0].dice[0] >= 16) { this.actor.items.get(this.id).update({ system: { @@ -239,13 +240,13 @@ export class M5Roll { return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.brawl")); } - static perception(actor: any) { + static deprivationCold(actor: any) { const rollData = actor.getRollData() as M5RollData; rollData.rolls["0"] = { - formula: "1d20 + @c.calc.stats.perception.value + @c.calc.stats.perceptionFW", + formula: "@c.calc.stats.deprivationCold.value -1D100", enabled: true, - label: (game as Game).i18n.localize("midgard5.perception"), + label: (game as Game).i18n.localize("midgard5.deprivationCold"), result: "", total: 0, totalStr: "", @@ -253,7 +254,41 @@ export class M5Roll { css: "", } as M5RollResult; - return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.perception")); + return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.deprivationCold")); + } + + static deprivationHeat(actor: any) { + const rollData = actor.getRollData() as M5RollData; + + rollData.rolls["0"] = { + formula: "@c.calc.stats.deprivationHeat.value -1D100", + enabled: true, + label: (game as Game).i18n.localize("midgard5.deprivationHeat"), + result: "", + total: 0, + totalStr: "", + dice: {}, + css: "", + } as M5RollResult; + + return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.deprivationHeat")); + } + + static deprivationFood(actor: any) { + const rollData = actor.getRollData() as M5RollData; + + rollData.rolls["0"] = { + formula: "@c.calc.stats.deprivationFood.value -1D100", + enabled: true, + label: (game as Game).i18n.localize("midgard5.deprivationFood"), + result: "", + total: 0, + totalStr: "", + dice: {}, + css: "", + } as M5RollResult; + + return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.deprivationFood")); } static cleanSpell(actor: any) { @@ -273,23 +308,6 @@ export class M5Roll { return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.spellCasting")); } - static drinking(actor: any) { - const rollData = actor.getRollData() as M5RollData; - - rollData.rolls["0"] = { - formula: "1d20 + @c.calc.stats.drinking.value + @c.calc.stats.drinkingFW", - enabled: true, - label: (game as Game).i18n.localize("midgard5.drinking"), - result: "", - total: 0, - totalStr: "", - dice: {}, - css: "", - } as M5RollResult; - - return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.drinking")); - } - static defense(actor: any) { const rollData = actor.getRollData() as M5RollData; rollData.i = { diff --git a/source/module/sheets/M5CharacterSheet.ts b/source/module/sheets/M5CharacterSheet.ts index d34d69c..234c992 100644 --- a/source/module/sheets/M5CharacterSheet.ts +++ b/source/module/sheets/M5CharacterSheet.ts @@ -252,13 +252,18 @@ export default class M5CharacterSheet extends ActorSheet { await roll.toMessage(); }); - html.find(".roll-perception-button").on("click", async (event) => { - const roll = M5Roll.perception(this.actor); + html.find(".roll-deprivationCold-button").on("click", async (event) => { + const roll = M5Roll.deprivationCold(this.actor); await roll.toMessage(); }); - html.find(".roll-drinking-button").on("click", async (event) => { - const roll = M5Roll.drinking(this.actor); + html.find(".roll-deprivationHeat-button").on("click", async (event) => { + const roll = M5Roll.deprivationHeat(this.actor); + await roll.toMessage(); + }); + + html.find(".roll-deprivationFood-button").on("click", async (event) => { + const roll = M5Roll.deprivationFood(this.actor); await roll.toMessage(); }); diff --git a/source/template.json b/source/template.json index de2ef9e..ba41359 100644 --- a/source/template.json +++ b/source/template.json @@ -135,7 +135,9 @@ "tauchen": { "fw": 6, "attribute": "ko", "initial": 8, "pp": 0 }, "tanzen": { "fw": 6, "attribute": "ko", "initial": 8, "pp": 0 }, "tierkunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 }, - "ueberleben": { "fw": 6, "attribute": "in", "initial": 8, "pp": 0 }, + "ueberlebenWald": { "fw": 6, "attribute": "in", "initial": 8, "pp": 0 }, + "ueberlebenSteppe": { "fw": 6, "attribute": "in", "initial": 8, "pp": 0 }, + "ueberlebenGebirge": { "fw": 6, "attribute": "in", "initial": 8, "pp": 0 }, "verfuehren": { "fw": 3, "attribute": "pa", "initial": 8, "pp": 0 }, "verhoeren": { "fw": 3, "attribute": "pa", "initial": 8, "pp": 0 }, "verstellen": { "fw": 3, "attribute": "pa", "initial": 8, "pp": 0 }, @@ -220,6 +222,7 @@ "physical": { "value": 0, "weight": 0, + "capacity": 0, "containerId": "", "magic": false }, @@ -319,6 +322,7 @@ "templates": ["itemDescription", "attributeSelection"], "fw": 0, "attribute": "st", + "equipped": true, "skill": "", "type": "general", "rolls": { @@ -332,7 +336,8 @@ "output": "" }, "pp": 0, - "calc": {} + "calc": {}, + "mods": {} }, "item": { "templates": ["itemDescription", "equippable", "physical", "valuable", "hoarded"], diff --git a/templates/sheets/character/base_values.hbs b/templates/sheets/character/base_values.hbs index b3bfae8..20b25b7 100644 --- a/templates/sheets/character/base_values.hbs +++ b/templates/sheets/character/base_values.hbs @@ -46,8 +46,8 @@ - - + + @@ -104,23 +104,43 @@ {{#if (eq data.info.race "Zwerg")}} - - - - - - - - - - - - + + + + + + + + + + {{/if}} -
{{localize "TYPES.Item.weapon"}} {{localize "midgard5.item-value"}} {{localize "midgard5.item-weight"}}
{{item.label}} {{#unless (or (eq item.value 0) (eq item.currency ""))}} @@ -370,6 +381,7 @@ + @@ -381,6 +393,7 @@ {{#each data.calc.gear.defensiveWeapons as |item itemId|}} {{#if (or ../data.info.showAllItems (eq item.containerId ""))}} + - + diff --git a/templates/sheets/character/main.hbs b/templates/sheets/character/main.hbs index 1039fc3..d5cef81 100644 --- a/templates/sheets/character/main.hbs +++ b/templates/sheets/character/main.hbs @@ -15,7 +15,14 @@ - +
{{localize "TYPES.Item.defensiveWeapon"}} {{localize "midgard5.item-value"}} {{localize "midgard5.item-weight"}}
{{item.label}} {{#unless (or (eq item.value 0) (eq item.currency ""))}} @@ -414,6 +427,7 @@ + @@ -425,6 +439,7 @@ {{#each data.calc.gear.armor as |item itemId|}} {{#if (or ../data.info.showAllItems (eq item.containerId ""))}} +
{{localize "TYPES.Item.armor"}} {{localize "midgard5.item-value"}} {{localize "midgard5.item-weight"}}
{{item.label}} {{#unless (or (eq item.value 0) (eq item.currency ""))}} diff --git a/templates/sheets/character/skills.hbs b/templates/sheets/character/skills.hbs index bea88e2..23c8c18 100644 --- a/templates/sheets/character/skills.hbs +++ b/templates/sheets/character/skills.hbs @@ -6,6 +6,7 @@ + @@ -17,6 +18,7 @@ {{#each data.calc.skills.innate as |skill skillId|}} + @@ -26,14 +28,7 @@ {{/each}} - - - - - - - - + @@ -41,6 +36,15 @@ + + + + + + + + +
{{localize "midgard5.innate-ability"}} {{localize "midgard5.fw"}} {{localize "midgard5.bonus"}}
{{skill.label}} {{skill.fw}} {{skill.calc.bonus}}
{{localize "midgard5.perception"}}{{data.calc.stats.perceptionFW}}{{data.calc.stats.perception.value}}{{add data.calc.stats.perception.value data.calc.stats.perceptionFW}}
{{localize "midgard5.drinking"}} {{data.calc.stats.drinkingFW}} {{data.calc.stats.drinking.value}}
{{localize "midgard5.perception"}}{{data.calc.stats.perceptionFW}}{{data.calc.stats.perception.value}}{{add data.calc.stats.perception.value data.calc.stats.perceptionFW}}
@@ -84,6 +88,7 @@ + @@ -96,8 +101,13 @@ {{#each data.calc.skills.combat as |skill skillId|}} + - + @@ -110,10 +120,11 @@
-
{{localize "midgard5.languages"}}
+
{{localize "midgard5.languages"}} & {{localize "midgard5.writings"}}
{{localize "midgard5.weapon-skill"}} {{localize "midgard5.fw"}} {{localize "midgard5.bonus"}}
{{skill.label}}{{skill.fw}} + + {{skill.fw}} + + {{skill.calc.bonus}} {{skill.calc.ew}} {{skill.pp}}
+ @@ -126,8 +137,13 @@ {{#each data.calc.skills.language as |skill skillId|}} + - + diff --git a/templates/sheets/character/spells.hbs b/templates/sheets/character/spells.hbs index d54a85d..df236c5 100644 --- a/templates/sheets/character/spells.hbs +++ b/templates/sheets/character/spells.hbs @@ -30,6 +30,7 @@
{{localize "midgard5.language"}} {{localize "midgard5.fw"}} {{localize "midgard5.bonus"}}
{{skill.label}}{{skill.fw}} + + {{skill.fw}} + + {{skill.calc.bonus}} {{skill.calc.ew}} {{skill.pp}}
+ @@ -40,13 +41,14 @@ - + {{#each data.calc.spells as |item itemId|}} + {{/each}} - -
{{localize "TYPES.Item.spell"}} {{localize "midgard5.spell-type"}} {{localize "midgard5.spell-castDuration-short"}}{{localize "midgard5.spell-effectDuration-short"}} {{localize "midgard5.ew"}}
{{item.label}} {{localize item.process}} @@ -70,8 +72,8 @@
+
+ From 12e6412a9ff5f12e987adaecc91b91458e047270 Mon Sep 17 00:00:00 2001 From: Byroks Date: Sat, 23 Mar 2024 19:17:54 +0100 Subject: [PATCH 04/10] #70-classes-as-items (#92) Co-authored-by: LeFrique Reviewed-on: https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/pulls/92 --- lang/de.json | 27 ++- source/module/actors/M5Character.ts | 47 ++--- source/module/items/M5Item.ts | 17 +- source/module/sheets/M5CharacterSheet.ts | 8 + source/module/sheets/M5ItemSheet.ts | 7 + source/style/Character-sheet.less | 23 +++ source/style/item-sheet.less | 9 +- source/template.json | 204 ++++++++++++++++++--- templates/sheets/character/base_values.hbs | 2 +- templates/sheets/character/main.hbs | 21 ++- templates/sheets/item/class.hbs | 109 +++++++++++ 11 files changed, 399 insertions(+), 75 deletions(-) create mode 100644 templates/sheets/item/class.hbs diff --git a/lang/de.json b/lang/de.json index efd3e95..4ed4493 100644 --- a/lang/de.json +++ b/lang/de.json @@ -278,29 +278,36 @@ "midgard5.damage": "Schaden", "midgard5.spell-process-none": "Ohne", + "midgard5.spell-process-artefakte": "Artefakte", "midgard5.spell-process-beherrschen": "Beherrschen", "midgard5.spell-process-bewegen": "Bewegen", - "midgard5.spell-process-blutzauber": "Blutmagie", + "midgard5.spell-process-beschwoeren": "Beschwören", + "midgard5.spell-process-blutmagie": "Blutmagie", "midgard5.spell-process-chaoswunder": "Chaoswunder", + "midgard5.spell-process-dweomer": "Dweomer", "midgard5.spell-process-erkennen": "Erkennen", "midgard5.spell-process-erschaffen": "Erschaffen", + "midgard5.spell-process-erhaltung": "Erhaltung", "midgard5.spell-process-formen": "Formen", "midgard5.spell-process-finstere_magie": "Finstere Magie", - "midgard5.spell-process-veraendern": "Verändern", - "midgard5.spell-process-zerstoeren": "Zerstören", - "midgard5.spell-process-wundertat": "Wundertat", - "midgard5.spell-process-dweomer": "Dweomer", - "midgard5.spell-process-wilder_Dweomer": "Wilder Dweomer", - "midgard5.spell-process-zauberlied": "Zauberlied", - "midgard5.spell-process-salz": "Salz", - "midgard5.spell-process-thaumagraphie": "Thaumagraphie", - "midgard5.spell-process-beschwoeren": "Beschwören", + "midgard5.spell-process-kampfverse": "Kampfverse", + "midgard5.spell-process-namensmagie": "Namensmagie", "midgard5.spell-process-nekromantie": "Nekromantie", + "midgard5.spell-process-runenstaebe": "Runenstäbe", "midgard5.spell-process-thaumatherapie": "Thaumatherapie", + "midgard5.spell-process-veraendern": "Verändern", + "midgard5.spell-process-vigilsignien": "Vigilsignien", + "midgard5.spell-process-wundertat": "Wundertat", + "midgard5.spell-process-wilder_Dweomer": "Wilder Dweomer", + "midgard5.spell-process-zerstoeren": "Zerstören", + "midgard5.spell-process-zauberlied": "Zauberlieder", + "midgard5.spell-process-zaubersalz": "Zaubersalze", "midgard5.spell-process-zaubermittel": "Zaubermittel", "midgard5.spell-process-zauberschutz": "Zauberschutz", "midgard5.spell-process-zauberrunen": "Zauberrunen", "midgard5.spell-process-zaubersiegel": "Zaubersiegel", + "midgard5.spell-process-zaubertaenze": "Zaubertänze", + "midgard5.spell-process-zauberblaetter": "Zauberblätter", "midgard5.spell-type-gedanke": "Gedanke", "midgard5.spell-type-geste": "Geste", diff --git a/source/module/actors/M5Character.ts b/source/module/actors/M5Character.ts index 0f07a15..8c6e8bb 100644 --- a/source/module/actors/M5Character.ts +++ b/source/module/actors/M5Character.ts @@ -1,18 +1,5 @@ import { M5Item } from "../items/M5Item"; -import { - M5Attribute, - M5CharacterCalculatedData, - M5ItemMod, - M5ItemType, - M5ModOperation, - M5ModResult, - M5ModType, - M5RollData, - M5Skill, - M5SkillCalculated, - M5SkillLearned, - M5SkillType, -} from "../M5Base"; +import { M5Attribute, M5CharacterCalculatedData, M5ItemMod, M5ItemType, M5ModOperation, M5ModResult, M5RollData, M5Skill, M5SkillCalculated } from "../M5Base"; import M5ModAggregate from "./M5ModAggregate"; export class M5Character extends Actor { // constructor( @@ -94,6 +81,7 @@ export class M5Character extends Actor { containers?: boolean; kampfkuenste?: boolean; encumbrance?: boolean; + class?: boolean; } = {} ): M5CharacterCalculatedData { let ret: M5CharacterCalculatedData = { @@ -194,12 +182,8 @@ export class M5Character extends Actor { ret.stats.attackBonus = this.modResult(ret.attributes.gs.bonus); ret.stats.defenseBonus = this.modResult(ret.attributes.gw.bonus); ret.stats.movement = this.modResult(data.movement); - ret.stats.resistanceMind = this.modResult( - (data.info.magicUsing ? 2 : 0) + ret.stats.defense.value + (data.info.race === "Mensch" ? ret.attributes.in.bonus : this.raceBonus(data.info.race)) - ); - ret.stats.resistanceBody = this.modResult( - (data.info.magicUsing ? 2 : 1) + ret.stats.defense.value + (data.info.race === "Mensch" ? ret.attributes.ko.bonus : this.raceBonus(data.info.race)) - ); + ret.stats.resistanceMind = this.modResult(ret.stats.defense.value + (data.info.race === "Mensch" ? ret.attributes.in.bonus : this.raceBonus(data.info.race))); + ret.stats.resistanceBody = this.modResult(ret.stats.defense.value + (data.info.race === "Mensch" ? ret.attributes.ko.bonus : this.raceBonus(data.info.race))); ret.stats.spellCasting = this.modResult((data.info.magicUsing ? M5Character.spellCastingFromLevel(ret.level) : 3) + ret.attributes.zt.bonus); ret.stats.brawl = this.modResult(Math.floor((ret.attributes.st.value + ret.attributes.gw.value) / 20)); ret.stats.brawlFw = ret.stats.brawl.value + ret.stats.attackBonus.value + (data.info.race === "Zwerg" ? 1 : 0); @@ -223,7 +207,7 @@ export class M5Character extends Actor { const aggregate = new M5ModAggregate(data, ret); context.items - ?.filter((item) => (item.type === "item" || item.type === "effect" || item.type === "armor" || item.type === "container") && item.system.equipped) + ?.filter((item) => (item.type === "item" || item.type === "effect" || item.type === "armor" || item.type === "container" || item.type === "class") && item.system.equipped) .forEach((item) => { const mods = item.system.mods; //console.log("Actor item mods", mods) @@ -499,6 +483,25 @@ export class M5Character extends Actor { //} } + if (!skip?.class) { + context.items + ?.filter((item) => item.type === "class") + .sort((a, b) => b?.system.magicUsing - a?.system.magicUsing) + .forEach((item, index) => { + if (index !== 0) { + item.system.equipped = false; + } else { + item.system.equipped = true; + data.info.magicUsing = item.system.magicUsing; + } + + if (typeof data.info.class === "string") { + data.info.class = {}; + } + data.info.class[item.id] = item.name; + }); + } + if (!skip?.effects) { context.items ?.filter((item) => item.type === "effect") @@ -565,7 +568,7 @@ export class M5Character extends Actor { type: item.system.type, castDuration: item.system.castDuration || 0, ap: item.system.ap || 0, - range: item.system.range|| 0, + range: item.system.range || 0, effectTarget: item.system.effectTarget, effectArea: item.system.effectArea, effectDuration: item.system.effectDuration || 0, diff --git a/source/module/items/M5Item.ts b/source/module/items/M5Item.ts index 85c6e9b..c4eb60c 100644 --- a/source/module/items/M5Item.ts +++ b/source/module/items/M5Item.ts @@ -18,7 +18,7 @@ export class M5Item extends Item { calc.containers = null; if (actor) { - const actorCalc = actor.derivedData({ containers: false, items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true }); + const actorCalc = actor.derivedData({ containers: false, items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true }); if (actorCalc) { calc.containers = actorCalc.gear.containers; } @@ -47,12 +47,14 @@ export class M5Item extends Item { if (character) { const actorCalc = character.derivedData({ + containers: true, skills: true, items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, + class: true, }); if (actorCalc?.skillMods && Object.keys(actorCalc.skillMods).indexOf(itemId) !== -1) { pairs = pairs.concat(actorCalc.skillMods[itemId]); @@ -89,7 +91,7 @@ export class M5Item extends Item { calc.containers = null; if (actor) { - const actorCalc = character.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true }); + const actorCalc = character.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true }); if (actorCalc) { calc.ew += actorCalc.stats.attackBonus.value; calc.combatSkills = actorCalc.skills.combat; @@ -124,7 +126,7 @@ export class M5Item extends Item { calc.containers = null; if (actor) { - const actorCalc = character.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true }); + const actorCalc = character.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true }); if (actorCalc) { calc.ew += actorCalc.stats.defense.value + actorCalc.stats.defenseBonus.value; calc.combatSkills = actorCalc.skills.combat; @@ -157,7 +159,7 @@ export class M5Item extends Item { itemData.mods[5] = { type: "stat", id: "apProtection", operation: "set", value: itemData.apProtection }; calc.containers = null; if (actor) { - const actorCalc = actor.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true }); + const actorCalc = actor.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true }); if (actorCalc) { calc.containers = actorCalc.gear.containers; } @@ -171,7 +173,7 @@ export class M5Item extends Item { } else if (itemType === "spell") { calc.fw = 0; if (actor) { - const actorCalc = character.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true }); + const actorCalc = character.derivedData({ containers: true, items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true }); if (actorCalc) { calc.ew = actorCalc.stats.spellCasting.value; } @@ -183,7 +185,7 @@ export class M5Item extends Item { calc.generalSkills = null; if (actor) { - const actorCalc = character.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true }); + const actorCalc = character.derivedData({ containers: true, items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true }); if (actorCalc) { calc.generalSkills = actorCalc.skills.general; } @@ -197,6 +199,9 @@ export class M5Item extends Item { itemData.rolls.formulas[0].label = skill.name; } } + } else if (itemType === "class") { + itemData.mods[0] = { type: "stat", id: "resistanceBody", operation: "add", value: itemData.resistanceBody }; + itemData.mods[1] = { type: "stat", id: "resistanceMind", operation: "add", value: itemData.resistanceMind }; } if (itemData?.mods) { calc.mods = {}; diff --git a/source/module/sheets/M5CharacterSheet.ts b/source/module/sheets/M5CharacterSheet.ts index 454a7ab..7cbc2ff 100644 --- a/source/module/sheets/M5CharacterSheet.ts +++ b/source/module/sheets/M5CharacterSheet.ts @@ -433,6 +433,14 @@ export default class M5CharacterSheet extends ActorSheet { } }); + html.find(".class-item-edit").on("click", async (event) => { + this.actor.items.find((x) => x.type === "class").sheet.render(true); + }); + + html.find(".class-item-delete").on("click", async (event) => { + this.actor.items.find((x) => x.type === "class").delete(); + }); + // Drag & Drop const dragDrop = new DragDrop({ dragSelector: ".items-list .item", diff --git a/source/module/sheets/M5ItemSheet.ts b/source/module/sheets/M5ItemSheet.ts index 1274a50..1403e2b 100644 --- a/source/module/sheets/M5ItemSheet.ts +++ b/source/module/sheets/M5ItemSheet.ts @@ -7,6 +7,13 @@ export class M5ItemSheet extends ItemSheet { width: 640, height: 480, classes: ["midgard5", "sheet", "item"], + tabs: [ + { + navSelector: ".sheet-navigation", + contentSelector: ".sheet-content", + initial: "base_values", + }, + ], }); } diff --git a/source/style/Character-sheet.less b/source/style/Character-sheet.less index 68c3dcc..898b404 100644 --- a/source/style/Character-sheet.less +++ b/source/style/Character-sheet.less @@ -365,4 +365,27 @@ } } } + + .chip { + display: inline-block; + padding: 0 25px; + height: 35px; + font-size: 16px; + line-height: 35px; + border-radius: 25px; + background-color: #f1f1f1; + } + + .closebtn { + padding-left: 10px; + color: #888; + font-weight: bold; + float: right; + font-size: 20px; + cursor: pointer; + } + + .closebtn:hover { + color: #000; + } } diff --git a/source/style/item-sheet.less b/source/style/item-sheet.less index 57133d6..fc1faf6 100644 --- a/source/style/item-sheet.less +++ b/source/style/item-sheet.less @@ -1,6 +1,6 @@ // main: midgard5.less -.midgard5.sheet.item { +.midgard5.sheet.item { form { display: flex; flex-direction: column; @@ -15,10 +15,11 @@ } .item-img { height: 64px; - width: 64px; + width: 64px; } - td, th { + td, + th { padding: 0 0.5rem 0 0.5rem; &.center { @@ -40,7 +41,7 @@ .col-create { width: 3rem; text-align: center; - + button { background: rgba(255, 255, 255, 0.5); } diff --git a/source/template.json b/source/template.json index ddf875d..23483b4 100644 --- a/source/template.json +++ b/source/template.json @@ -6,7 +6,7 @@ "info": { "description": "", "background": "", - "class": "", + "class": {}, "race": "", "magicUsing": false, "showAllItems": false, @@ -140,12 +140,11 @@ "wahrsagen": { "fw": 0, "attribute": "zt", "initial": 8, "pp": 0 }, "wasserkampf": { "fw": 0, "attribute": "gw", "initial": 8, "pp": 0 }, "zauberkunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 } - } + } } }, "gear": { - "gear": { - } + "gear": {} } }, "character": { @@ -154,7 +153,7 @@ } }, "Item": { - "types": ["skill", "weapon", "defensiveWeapon", "armor", "spell", "kampfkunst", "item", "effect", "container"], + "types": ["skill", "weapon", "defensiveWeapon", "armor", "spell", "kampfkunst", "item", "effect", "container", "class"], "templates": { "itemDescription": { "description": "" @@ -207,11 +206,11 @@ "equipped": false }, "valuable": { - "valuable": false, + "valuable": false, "item-wealth": true }, "hoarded": { - "hoarded": false, + "hoarded": false, "inHoard": true }, "physical": { @@ -231,29 +230,36 @@ "spellSelection": { "spellProcessSelection": { "none": "midgard5.spell-process-none", + "artefakte": "midgard5.spell-process-artefakte", "beherrschen": "midgard5.spell-process-beherrschen", "bewegen": "midgard5.spell-process-bewegen", - "blutzauber": "midgard5.spell-process-blutzauber", + "beschwoeren": "midgard5.spell-process-beschwoeren", + "blutmagie": "midgard5.spell-process-blutmagie", "chaoswunder": "midgard5.spell-process-chaoswunder", + "dweomer": "midgard5.spell-process-dweomer", + "erhaltung": "midgard5.spell-process-erhaltung", "erkennen": "midgard5.spell-process-erkennen", "erschaffen": "midgard5.spell-process-erschaffen", "formen": "midgard5.spell-process-formen", "finstere_magie": "midgard5.spell-process-finstere_magie", - "veraendern": "midgard5.spell-process-veraendern", - "zerstoeren": "midgard5.spell-process-zerstoeren", - "wundertat": "midgard5.spell-process-wundertat", - "dweomer": "midgard5.spell-process-dweomer", - "wilder_dweomer": "midgard5.spell-process-wilder_dweomer", - "zauberlied": "midgard5.spell-process-zauberlied", - "salz": "midgard5.spell-process-salz", - "thaumagraphie": "midgard5.spell-process-thaumagraphie", - "beschwoeren": "midgard5.spell-process-beschwoeren", + "kampfverse": "midgard5.spell-process-kampfverse", + "namensmagie": "midgard5.spell-process-namensmagie", "nekromantie": "midgard5.spell-process-nekromantie", - "thaumatherapie": "midgard5.spell-process-thaumatherapie", + "runenstaebe": "midgard5.spell-process-zauberrunen", + "thaumatherapie": "midgard5.spell-process-runenstaebe", + "veraendern": "midgard5.spell-process-veraendern", + "vigilsignien": "midgard5.spell-process-vigilsignien", + "wilder_dweomer": "midgard5.spell-process-wilder_dweomer", + "wundertat": "midgard5.spell-process-wundertat", + "zauberblaetter": "midgard5.spell-process-zauberblaetter", + "zauberlied": "midgard5.spell-process-zauberlied", "zaubermittel": "midgard5.spell-process-zaubermittel", - "zauberschutz": "midgard5.spell-process-zauberschutz", "zauberrunen": "midgard5.spell-process-zauberrunen", - "zaubersiegel": "midgard5.spell-process-siegel" + "zaubersalz": "midgard5.spell-process-zaubersalz", + "zauberschutz": "midgard5.spell-process-zauberschutz", + "zaubersiegel": "midgard5.spell-process-zaubersiegel", + "zaubertaenze": "midgard5.spell-process-zaubertaenze", + "zerstoeren": "midgard5.spell-process-zerstoeren" }, "spellTypeSelection": { "gedanke": "midgard5.spell-type-gedanke", @@ -289,7 +295,7 @@ "fechten": "midgard5.kampfkunst-variante-fechten", "schusstechnik": "midgard5.kampfkunst-variante-schusstechnik", "finten": "midgard5.kampfkunst-variante-finten", - "geistestechnik": "midgard5.kampfkunst-variante-geistestechnik", + "geistestechnik": "midgard5.kampfkunst-variante-geistestechnik", "verteidigung": "midgard5.kampfkunst-variante-verteidigung" }, "kidoVarianteSelection": { @@ -325,7 +331,7 @@ "calc": {} }, "item": { - "templates": ["itemDescription", "equippable", "physical","valuable","hoarded"], + "templates": ["itemDescription", "equippable", "physical", "valuable", "hoarded"], "rolls": { "formulas": {}, "output": "" @@ -352,7 +358,7 @@ "calc": {} }, "weapon": { - "templates": ["itemDescription", "stats", "equippable", "physical","valuable","hoarded"], + "templates": ["itemDescription", "stats", "equippable", "physical", "valuable", "hoarded"], "special": false, "ranged": false, "valuable": false, @@ -377,7 +383,7 @@ "calc": {} }, "defensiveWeapon": { - "templates": ["itemDescription", "stats", "equippable", "physical","valuable","hoarded"], + "templates": ["itemDescription", "stats", "equippable", "physical", "valuable", "hoarded"], "special": false, "valuable": false, "hoarded": false, @@ -395,7 +401,7 @@ "calc": {} }, "armor": { - "templates": ["itemDescription", "stats", "equippable", "attributeMod", "physical","valuable","hoarded"], + "templates": ["itemDescription", "stats", "equippable", "attributeMod", "physical", "valuable", "hoarded"], "lpProtection": 0, "apProtection": 0, "valuable": false, @@ -459,6 +465,154 @@ "output": "" }, "calc": {} + }, + "class": { + "templates": ["itemDescription"], + "magicUsing": false, + "equipped": true, + "resistanceBody": 1, + "resistanceMind": 0, + "calc": {}, + "mods": {}, + "lernKostenAllgemein": { + "alltag": 20, + "freiland": 20, + "halbwelt": 20, + "kampf": 20, + "koerper": 20, + "sozial": 20, + "unterwelt": 20, + "waffen": 20, + "wissen": 20 + }, + "lernKostenZauber": { + "beherrschen": { + "kosten": 0, + "pp": 0 + }, + "bewegen": { + "kosten": 0, + "pp": 0 + }, + "erkennen": { + "kosten": 0, + "pp": 0 + }, + "erschaffen": { + "kosten": 0, + "pp": 0 + }, + "formen": { + "kosten": 0, + "pp": 0 + }, + "veraendern": { + "kosten": 0, + "pp": 0 + }, + "zerstoeren": { + "kosten": 0, + "pp": 0 + }, + "wundertat": { + "kosten": 0, + "pp": 0 + }, + "dweomer": { + "kosten": 0, + "pp": 0 + }, + "zauberlied": { + "kosten": 0, + "pp": 0 + }, + "kampfverse": { + "kosten": 0, + "pp": 0 + }, + "zaubertaenze": { + "kosten": 0, + "pp": 0 + }, + "zaubersalz": { + "kosten": 0, + "pp": 0 + }, + "runenstaebe": { + "kosten": 0, + "pp": 0 + }, + "zaubersiegel": { + "kosten": 0, + "pp": 0 + }, + "zauberrunen": { + "kosten": 0, + "pp": 0 + }, + "thaumagraphie": { + "kosten": 0, + "pp": 0 + }, + "erhaltung": { + "kosten": 0, + "pp": 0 + }, + "zaubermittel": { + "kosten": 0, + "pp": 0 + }, + "zauberschutz": { + "kosten": 0, + "pp": 0 + }, + "zauberblaetter": { + "kosten": 0, + "pp": 0 + }, + "vigilsignien": { + "kosten": 0, + "pp": 0 + }, + "artefakte": { + "kosten": 0, + "pp": 0 + }, + "chaoswunder": { + "kosten": 0, + "pp": 0 + }, + "wilder_dweomer": { + "kosten": 0, + "pp": 0 + }, + "nekromantie": { + "kosten": 0, + "pp": 0 + }, + "finstere_magie": { + "kosten": 0, + "pp": 0 + }, + "blutmagie": { + "kosten": 0, + "pp": 0 + }, + "beschwoeren": { + "kosten": 0, + "pp": 0 + }, + "namensmagie": { + "kosten": 0, + "pp": 0 + } + }, + "lernKostenKamptechnik": { + "kampfkunst": 90, + "fechtkunst": 90, + "schiesskunst": 90, + "kido": 90 + } } } } diff --git a/templates/sheets/character/base_values.hbs b/templates/sheets/character/base_values.hbs index b7b9556..b3bfae8 100644 --- a/templates/sheets/character/base_values.hbs +++ b/templates/sheets/character/base_values.hbs @@ -63,7 +63,7 @@
{{localize "midgard5.magicUsing"}} {{localize "midgard5.movementRange"}}
{{localize "midgard5.class"}} + {{#each data.info.class as |class id|}} +
+ {{class}} + +
+ {{/each}} +
{{localize "midgard5.level"}} {{data.calc.level}}
@@ -132,26 +139,26 @@ {{> "systems/midgard5/templates/sheets/character/base_values.hbs"}} -
+
{{> "systems/midgard5/templates/sheets/character/skills.hbs"}}
-
+
{{> "systems/midgard5/templates/sheets/character/gear.hbs"}}
-
+
{{> "systems/midgard5/templates/sheets/character/combat.hbs"}}
-
+
{{> "systems/midgard5/templates/sheets/character/spells.hbs"}}
-
+
{{> "systems/midgard5/templates/sheets/character/effects.hbs"}}
-
+
{{> "systems/midgard5/templates/sheets/character/description.hbs"}}
diff --git a/templates/sheets/item/class.hbs b/templates/sheets/item/class.hbs new file mode 100644 index 0000000..e12e040 --- /dev/null +++ b/templates/sheets/item/class.hbs @@ -0,0 +1,109 @@ +
+
+ +

+
+ + +
+ +
+ + + + + + + + + + + + + + +
+
+ + + + +
+
{{localize "midgard5.resistanceMind"}}{{localize "midgard5.resistanceBody"}}
+ +
+ +
+ + + + + + +
+
+ {{#each data.lernKostenAllgemein as |wert name|}} + + + + + {{/each}} +
+
+
+ +
+ + + + + + +
+
+ {{#each data.lernKostenKamptechnik as |wert name|}} + + + + + {{/each}} +
+
+
+ +
+ + + + + + +
+
+ + {{#each data.lernKostenZauber as |wert name|}} + + + + + {{/each}} +
+
+
+ +
+ {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} + +
+ +
+ +
\ No newline at end of file From 3a58485d27ada9ff569bfea3b6647454119dc34c Mon Sep 17 00:00:00 2001 From: Byroks Date: Sun, 24 Mar 2024 15:06:30 +0100 Subject: [PATCH 05/10] #90 Clean Spell Button funktioniert nicht (#94) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes: + hinzufügen von roll funktion für Zauberwert Reviewed-on: https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/pulls/94 Reviewed-by: Le-Frique --- source/module/rolls/M5Roll.ts | 17 +++++++++++++++++ source/module/sheets/M5CharacterSheet.ts | 5 +++++ templates/sheets/character/spells.hbs | 2 +- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/source/module/rolls/M5Roll.ts b/source/module/rolls/M5Roll.ts index 9a5f316..a7ad922 100644 --- a/source/module/rolls/M5Roll.ts +++ b/source/module/rolls/M5Roll.ts @@ -212,6 +212,23 @@ export class M5Roll { return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.perception")); } + static cleanSpell(actor: any) { + const rollData = actor.getRollData() as M5RollData; + + rollData.rolls["0"] = { + formula: "1d20 + @c.calc.stats.spellCasting.value", + enabled: true, + label: (game as Game).i18n.localize("midgard5.spellCasting"), + result: "", + total: 0, + totalStr: "", + dice: {}, + css: "", + } as M5RollResult; + + return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.spellCasting")); + } + static drinking(actor: any) { const rollData = actor.getRollData() as M5RollData; diff --git a/source/module/sheets/M5CharacterSheet.ts b/source/module/sheets/M5CharacterSheet.ts index 7cbc2ff..d34d69c 100644 --- a/source/module/sheets/M5CharacterSheet.ts +++ b/source/module/sheets/M5CharacterSheet.ts @@ -247,6 +247,11 @@ export default class M5CharacterSheet extends ActorSheet { await roll.toMessage(); }); + html.find(".roll-cleanSpell-button").on("click", async (event) => { + const roll = M5Roll.cleanSpell(this.actor); + await roll.toMessage(); + }); + html.find(".roll-perception-button").on("click", async (event) => { const roll = M5Roll.perception(this.actor); await roll.toMessage(); diff --git a/templates/sheets/character/spells.hbs b/templates/sheets/character/spells.hbs index df236c5..9fbd500 100644 --- a/templates/sheets/character/spells.hbs +++ b/templates/sheets/character/spells.hbs @@ -8,7 +8,7 @@
{{localize "midgard5.spellCasting"}} {{data.calc.stats.spellCasting.value}} {{localize "midgard5.defense"}} {{add data.calc.stats.defense.value data.calc.stats.defenseBonus.value}}
{{localize "midgard5.luckPoints"}} {{localize "midgard5.valuable"}}{{data.calc.stats.wealth}}
{{data.calc.stats.resistanceBody.value}}
{{localize "midgard5.hoard"}}{{data.calc.stats.hoard}}
{{localize "midgard5.hoardMin"}}{{data.calc.stats.hoardMin}}{{localize "midgard5.hoard-next"}}{{data.calc.stats.hoardNext}}
{{localize "midgard5.hoard"}}{{data.calc.stats.hoard}}
{{localize "midgard5.hoardMin"}}{{data.calc.stats.hoardMin}}{{localize "midgard5.hoard-next"}}{{data.calc.stats.hoardNext}}
- \ No newline at end of file + + +
+
+
{{localize "midgard5.deprivations"}} & {{localize "midgard5.deprivation"}}
+ + + + + + + + + + + + + + + + +
{{localize "midgard5.deprivationFood"}}{{data.calc.stats.deprivationFood.value}}{{localize "midgard5.deprivationHeat"}}{{ data.calc.stats.deprivationHeat.value}}{{localize "midgard5.deprivationCold"}}{{data.calc.stats.deprivationCold.value}}
+
+
\ No newline at end of file diff --git a/templates/sheets/character/gear.hbs b/templates/sheets/character/gear.hbs index 78f5384..79efc09 100644 --- a/templates/sheets/character/gear.hbs +++ b/templates/sheets/character/gear.hbs @@ -48,9 +48,9 @@
{{localize "TYPES.Item.container"}} {{localize "midgard5.item-value"}} {{localize "midgard5.item-weight"}}{{localize "midgard5.capacity"}} @@ -254,6 +255,11 @@ {{item.weight}} kg {{/unless}} + {{#unless (eq item.capacity "")}} + {{item.capacity}} kg + {{/unless}} + {{#if item.equipped}} diff --git a/templates/sheets/character/skills.hbs b/templates/sheets/character/skills.hbs index 23c8c18..cbebdde 100644 --- a/templates/sheets/character/skills.hbs +++ b/templates/sheets/character/skills.hbs @@ -27,24 +27,6 @@
{{localize "midgard5.drinking"}}{{data.calc.stats.drinkingFW}}{{data.calc.stats.drinking.value}}{{add data.calc.stats.drinking.value data.calc.stats.drinkingFW}}
{{localize "midgard5.perception"}}{{data.calc.stats.perceptionFW}}{{data.calc.stats.perception.value}}{{add data.calc.stats.perception.value data.calc.stats.perceptionFW}}
diff --git a/templates/sheets/character/spells.hbs b/templates/sheets/character/spells.hbs index 9fbd500..34fe0a0 100644 --- a/templates/sheets/character/spells.hbs +++ b/templates/sheets/character/spells.hbs @@ -72,8 +72,8 @@
- + + diff --git a/templates/sheets/item/class.hbs b/templates/sheets/item/class.hbs index 6e657c0..2d8e4ba 100644 --- a/templates/sheets/item/class.hbs +++ b/templates/sheets/item/class.hbs @@ -89,7 +89,7 @@ {{#each data.lernKostenZauber as |wert name|}} - + {{/each}} diff --git a/templates/sheets/item/container.hbs b/templates/sheets/item/container.hbs index 2add63f..13c1a87 100644 --- a/templates/sheets/item/container.hbs +++ b/templates/sheets/item/container.hbs @@ -26,6 +26,12 @@ + +
+ {{localize "midgard5.capacity"}} + +
+ @@ -42,6 +48,12 @@ + +
+ {{localize "midgard5.item-weight"}} + +
+ From a4cf10c5f126e7540677a2dac605d866aa025eaa Mon Sep 17 00:00:00 2001 From: Byroks Date: Fri, 29 Mar 2024 14:02:47 +0100 Subject: [PATCH 08/10] #64-anzeige-von-zauber-pp (#96) Reviewed-on: https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/pulls/96 --- lang/de.json | 12 ++++++++++ source/helpers.ts | 4 ++++ source/module/actors/M5Character.ts | 1 + source/module/sheets/M5CharacterSheet.ts | 30 ++++++++++++++++++++++++ source/style/Character-sheet.less | 9 +++++++ templates/sheets/character/spells.hbs | 30 ++++++++++++++++++++++-- templates/sheets/item/class.hbs | 2 +- 7 files changed, 85 insertions(+), 3 deletions(-) diff --git a/lang/de.json b/lang/de.json index 6f95cdd..d976b42 100644 --- a/lang/de.json +++ b/lang/de.json @@ -161,6 +161,7 @@ "midgard5.faelschen": "Fälschen", "midgard5.fangen": "Fangen", "midgard5.fechten": "Fechten", + "midgard5.fechtkunst": "Fechtkunst", "midgard5.feueralchimie": "Feueralchimie", "midgard5.gassenwissen": "Gassenwissen", "midgard5.gaukeln": "Gaukeln", @@ -286,6 +287,16 @@ "midgard5.attack": "Angriff", "midgard5.damage": "Schaden", + "midgard5.skill-goup-alltag": "Alltag", + "midgard5.skill-goup-freiland": "Freiland", + "midgard5.skill-goup-halbwelt": "Halbwelt", + "midgard5.skill-goup-kampf": "Kampf", + "midgard5.skill-goup-koerper": "Körper", + "midgard5.skill-goup-sozial": "Sozial", + "midgard5.skill-goup-unterwelt": "Unterwelt", + "midgard5.skill-goup-waffen": "Waffen", + "midgard5.skill-goup-wissen": "Wissen", + "midgard5.spell-process-none": "Ohne", "midgard5.spell-process-artefakte": "Artefakte", "midgard5.spell-process-beherrschen": "Beherrschen", @@ -304,6 +315,7 @@ "midgard5.spell-process-nekromantie": "Nekromantie", "midgard5.spell-process-runenstaebe": "Runenstäbe", "midgard5.spell-process-thaumatherapie": "Thaumatherapie", + "midgard5.spell-process-thaumagraphie": "Thaumagraphie", "midgard5.spell-process-veraendern": "Verändern", "midgard5.spell-process-vigilsignien": "Vigilsignien", "midgard5.spell-process-wundertat": "Wundertat", diff --git a/source/helpers.ts b/source/helpers.ts index f0c0572..845cc7b 100644 --- a/source/helpers.ts +++ b/source/helpers.ts @@ -107,4 +107,8 @@ export const loadHelpers = async function () { } return length; }); + + Handlebars.registerHelper("console", (object: any) => { + console.log(object); + }); }; diff --git a/source/module/actors/M5Character.ts b/source/module/actors/M5Character.ts index 4b9546e..3f83d15 100644 --- a/source/module/actors/M5Character.ts +++ b/source/module/actors/M5Character.ts @@ -461,6 +461,7 @@ export class M5Character extends Actor { } else { item.system.equipped = true; data.info.magicUsing = item.system.magicUsing; + data.lernKostenZauber = item.system.lernKostenZauber; } if (typeof data.info.class === "string") { diff --git a/source/module/sheets/M5CharacterSheet.ts b/source/module/sheets/M5CharacterSheet.ts index 234c992..62b2e71 100644 --- a/source/module/sheets/M5CharacterSheet.ts +++ b/source/module/sheets/M5CharacterSheet.ts @@ -194,6 +194,36 @@ export default class M5CharacterSheet extends ActorSheet { }); }); + html.find(".pp-increase").on("click", async (event) => { + let target = event.target.closest("[data-pp-name]") as HTMLElement; + let ppName = target ? target.dataset.ppName : null; + const context = this.actor as any; + const item = context.items.find((x) => x.type === "class" && x.system.equipped); + item.update({ + system: { + lernKostenZauber: { + [ppName]: { pp: context.system.lernKostenZauber[ppName].pp + 1 }, + }, + }, + }); + this.render(); + }); + + html.find(".pp-decrease").on("click", async (event) => { + let target = event.target.closest("[data-pp-name]") as HTMLElement; + let ppName = target ? target.dataset.ppName : null; + const context = this.actor as any; + const item = context.items.find((x) => x.type === "class" && x.system.equipped); + item.update({ + system: { + lernKostenZauber: { + [ppName]: { pp: context.system.lernKostenZauber[ppName].pp - 1 }, + }, + }, + }); + this.render(); + }); + html.find(".fw-increase").on("click", async (event) => { let target = event.target.closest("[data-item-id]") as HTMLElement; let itemId = target ? target.dataset.itemId : null; diff --git a/source/style/Character-sheet.less b/source/style/Character-sheet.less index 898b404..e8ebd2c 100644 --- a/source/style/Character-sheet.less +++ b/source/style/Character-sheet.less @@ -388,4 +388,13 @@ .closebtn:hover { color: #000; } + + .pp-listing { + margin: 0 2rem; + flex: 1 0 16%; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: baseline; + } } diff --git a/templates/sheets/character/spells.hbs b/templates/sheets/character/spells.hbs index 34fe0a0..6884d0a 100644 --- a/templates/sheets/character/spells.hbs +++ b/templates/sheets/character/spells.hbs @@ -1,5 +1,4 @@
-
{{localize "midgard5.spellCasting"}}
@@ -41,7 +40,7 @@ {{localize "midgard5.spell-effectDuration-short"}} {{localize "midgard5.ew"}} - + @@ -77,4 +76,31 @@
+ +
+
+
{{localize "midgard5.pp"}} {{localize "midgard5.spells"}}
+ + + + + + +
+
+ + {{#each data.lernKostenZauber as |group name|}} + + + + + + + + + {{/each}} +
+
+
+
diff --git a/templates/sheets/item/class.hbs b/templates/sheets/item/class.hbs index 2d8e4ba..80604a3 100644 --- a/templates/sheets/item/class.hbs +++ b/templates/sheets/item/class.hbs @@ -49,7 +49,7 @@
{{#each data.lernKostenAllgemein as |wert name|}} - + {{/each}} From 2a1262662ff720575f002d2dd2382917d24a195c Mon Sep 17 00:00:00 2001 From: Byroks Date: Fri, 29 Mar 2024 14:28:49 +0100 Subject: [PATCH 09/10] Situationsbedingte-Boni/Mali-#41 (#95) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes: + Popup für Situationsbedinge Boni/Mali, Schwellenwert und RollMode (Sichtbarkeit) + neuwürfel/verändern des wurfes durch glückspunkte und schicksalsgunst Co-authored-by: Ender Reviewed-on: https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/pulls/95 --- lang/de.json | 788 ++++++++++++----------- source/index.ts | 12 + source/module/M5Base.ts | 2 + source/module/rolls/M5Roll.ts | 61 +- source/module/rolls/reroll.ts | 108 ++++ source/module/sheets/M5CharacterSheet.ts | 1 - templates/chat/reroll-dialog.hbs | 18 + templates/chat/roll-m5.hbs | 2 +- templates/chat/task-check-dialog.hbs | 22 + 9 files changed, 620 insertions(+), 394 deletions(-) create mode 100644 source/module/rolls/reroll.ts create mode 100644 templates/chat/reroll-dialog.hbs create mode 100644 templates/chat/task-check-dialog.hbs diff --git a/lang/de.json b/lang/de.json index d976b42..c6cc2eb 100644 --- a/lang/de.json +++ b/lang/de.json @@ -12,424 +12,442 @@ "TYPES.Item.effect": "Aktiver Effekt", "TYPES.Item.kampfkunst": "Kampfkunst", "TYPES.Item.container": "Aufbewahrung", + "TYPES.Item.class": "Klasse", - "midgard5.phase-action": "Handlungsphase", - "midgard5.phase-movement": "Bewegungsphase", - "midgard5.no-encounter": "Kein Kampf", - "midgard5.encounter-not-started": "Kein aktiver Kampf", - "midgard5.initiative": "Initiative", - "midgard5.actionrank": "Handlungsrang", + "midgard5": { + "phase-action": "Handlungsphase", + "phase-movement": "Bewegungsphase", + "no-encounter": "Kein Kampf", + "encounter-not-started": "Kein aktiver Kampf", + "initiative": "Initiative", + "actionrank": "Handlungsrang", - "midgard5.combat-join": "Kampf Beitreten/Handlungsrang zurücksetzen", - "midgard5.combat-ranged": "Fernangriff", - "midgard5.combat-spell": "Zaubern (10 Sec)", + "combat-join": "Kampf Beitreten/Handlungsrang zurücksetzen", + "combat-ranged": "Fernangriff", + "combat-spell": "Zaubern (10 Sec)", - "midgard5.time-duration": "Dauer", - "midgard5.time-round": "Runde(n)", - "midgard5.time-minute": "Minute(n)", - "midgard5.time-hour": "Stunde(n)", - "midgard5.time-limitless": "Unbegrenzt", + "time-duration": "Dauer", + "time-round": "Runde(n)", + "time-minute": "Minute(n)", + "time-hour": "Stunde(n)", + "time-limitless": "Unbegrenzt", - "midgard5.doRoll": "Würfeln", - "midgard5.learn": "Lernen", + "doRoll": "Würfeln", + "learn": "Lernen", - "midgard5.label": "Bezeichnung", - "midgard5.description": "Beschreibung", - "midgard5.Characteristic": "Merkmal", - "midgard5.characteristics": "Merkmale", - "midgard5.background": "Hintergrund", - "midgard5.attribute": "Eigenschaft", - "midgard5.attributes": "Eigenschaften", - "midgard5.points": "Erfahrung", - "midgard5.calculated-value": "Berechneter Wert", - "midgard5.calculated-values": "Werte und Boni", + "label": "Bezeichnung", + "description": "Beschreibung", + "Characteristic": "Merkmal", + "characteristics": "Merkmale", + "background": "Hintergrund", + "attribute": "Eigenschaft", + "attributes": "Eigenschaften", + "points": "Punkte", + "calculated-value": "Berechneter Wert", + "calculated-values": "Werte und Boni", - "midgard5.skill": "Fertigkeit", - "midgard5.skill-value": "Fertigkeitswert", - "midgard5.fw": "FW", - "midgard5.bonus": "Bonus", - "midgard5.bonuses": "Boni", - "midgard5.ew": "EW", - "midgard5.pp-short": "PP", - "midgard5.pp": "Praxispunkte", + "skill": "Fertigkeit", + "skill-value": "Fertigkeitswert", + "fw": "FW", + "bonus": "Bonus", + "bonuses": "Boni", + "ew": "EW", + "pp-short": "PP", + "pp": "Praxispunkte", - "midgard5.item-value": "Wert", - "midgard5.item-quantity": "Menge", - "midgard5.item-onbody": "Am Körper", - "midgard5.item-ismagic": "Ist Magisch", - "midgard5.item-wealth": "Vermögenswert", - "midgard5.item-weight": "Gewicht", + "item-value": "Wert", + "item-quantity": "Menge", + "item-onbody": "Am Körper", + "item-ismagic": "Ist Magisch", + "item-wealth": "Vermögenswert", + "item-weight": "Gewicht", - "midgard5.actor-lp": "Lebenspunkte", - "midgard5.actor-lp-short": "LP", - "midgard5.actor-ap": "Ausdauerpunkte", - "midgard5.actor-ap-short": "AP", - "midgard5.actor-st": "St", - "midgard5.actor-st-long": "Stärke", - "midgard5.actor-ko": "Ko", - "midgard5.actor-ko-long": "Konstitution", - "midgard5.actor-au": "Au", - "midgard5.actor-au-long": "Aussehen", - "midgard5.actor-gs": "Gs", - "midgard5.actor-gs-long": "Geschicklichkeit", - "midgard5.actor-in": "In", - "midgard5.actor-in-long": "Intelligenz", - "midgard5.actor-pa": "pA", - "midgard5.actor-pa-long": "persönliche Ausstrahlung", - "midgard5.actor-gw": "Gw", - "midgard5.actor-gw-long": "Gewandtheit", - "midgard5.actor-zt": "Zt", - "midgard5.actor-zt-long": "Zaubertalent", - "midgard5.actor-wk": "Wk", - "midgard5.actor-wk-long": "Willenskraft", - "midgard5.actor-git": "GiT", - "midgard5.actor-git-long": "Gifttolleranz", + "actor-lp": "Lebenspunkte", + "actor-lp-short": "LP", + "actor-ap": "Ausdauerpunkte", + "actor-ap-short": "AP", + "actor-st": "St", + "actor-st-long": "Stärke", + "actor-ko": "Ko", + "actor-ko-long": "Konstitution", + "actor-au": "Au", + "actor-au-long": "Aussehen", + "actor-gs": "Gs", + "actor-gs-long": "Geschicklichkeit", + "actor-in": "In", + "actor-in-long": "Intelligenz", + "actor-pa": "pA", + "actor-pa-long": "persönliche Ausstrahlung", + "actor-gw": "Gw", + "actor-gw-long": "Gewandtheit", + "actor-zt": "Zt", + "actor-zt-long": "Zaubertalent", + "actor-wk": "Wk", + "actor-wk-long": "Willenskraft", + "actor-git": "GiT", + "actor-git-long": "Gifttolleranz", - "midgard5.aktuell": "Akt.", - "midgard5.maximum": "Max.", - "midgard5.attrvalue": "Wert", - "midgard5.movementRange": "Bewegungsweite", + "aktuell": "Akt.", + "maximum": "Max.", + "attrvalue": "Wert", + "movementRange": "Bewegungsweite", - "midgard5.base_values": "Grundwerte", - "midgard5.skills": "Fertigkeiten", - "midgard5.gear": "Ausrüstung", - "midgard5.spells": "Zauber", - "midgard5.effects": "Aktive Effekte", - "midgard5.kampfkuenste": "Kampfkünste", - "midgard5.combat": "Kampf", + "base_values": "Grundwerte", + "skills": "Fertigkeiten", + "gear": "Ausrüstung", + "spells": "Zauber", + "effects": "Aktive Effekte", + "kampfkuenste": "Kampfkünste", + "combat": "Kampf", - "midgard5.actor-name": "Figur", - "midgard5.level": "Grad", - "midgard5.class": "Typ", - "midgard5.race": "Rasse", - "midgard5.magicUsing": "Zauberkundig", - "midgard5.gender": "Geschlecht", - "midgard5.weight": "Gewicht", - "midgard5.height": "Größe", - "midgard5.shape": "Gestalt", - "midgard5.age": "Alter", - "midgard5.caste": "Stand", - "midgard5.occupation": "Beruf", - "midgard5.origin": "Heimat", - "midgard5.faith": "Glaube", + "actor-name": "Figur", + "level": "Grad", + "class": "Typ", + "race": "Rasse", + "magicUsing": "Zauberkundig", + "gender": "Geschlecht", + "weight": "Gewicht", + "height": "Größe", + "shape": "Gestalt", + "age": "Alter", + "caste": "Stand", + "occupation": "Beruf", + "origin": "Heimat", + "faith": "Glaube", - "midgard5.currency": "Geld", - "midgard5.currency-gold": "Gold", - "midgard5.currency-silver": "Silber", - "midgard5.currency-copper": "Kupfer", - "midgard5.currency-wealth": "Vermögen in GS", - "midgard5.currency-available": "verfügbares Vermögen", - "midgard5.hoard": "aktueller Hort", - "midgard5.hoardMin": "benötigter Mindesthort", - "midgard5.hoard-next": "Hort für nächsten Grad", - "midgard5.hoarded": "Hort", + "currency": "Geld", + "currency-gold": "Gold", + "currency-silver": "Silber", + "currency-copper": "Kupfer", + "currency-wealth": "Vermögen in GS", + "currency-available": "verfügbares Vermögen", + "hoard": "aktueller Hort", + "hoardMin": "benötigter Mindesthort", + "hoard-next": "Hort für nächsten Grad", + "hoarded": "Hort", - "midgard5.no-container": "Ohne", + "no-container": "Ohne", - "midgard5.encumbrance": "Getragene Last", - "midgard5.load": "Normallast", - "midgard5.heavy-load": "Schwere Last", - "midgard5.thrust-load": "Schublast", - "midgard5.load-max": "Höchstlast", - "midgard5.capacity": "Tragkraft", + "encumbrance": "Getragene Last", + "load": "Normallast", + "heavy-load": "Schwere Last", + "thrust-load": "Schublast", + "load-max": "Höchstlast", + "load-capacity": "Tragkraft", - "midgard5.exp-overall": "Erfahrungsschatz", - "midgard5.exp-available": "Erfahrungspunkte", - "midgard5.grace": "Göttliche Gnade", - "midgard5.destiny": "Schicksalsgunst", - "midgard5.luckPoints": "Glückspunkte", + "exp-overall": "Erfahrungsschatz", + "exp-available": "Erfahrungspunkte", + "grace": "Göttliche Gnade", + "destiny": "Schicksalsgunst", + "luckPoints": "Glückspunkte", - "midgard5.abrichten": "Abrichten", - "midgard5.akrobatik": "Akrobatik", - "midgard5.alchimie": "Alchimie", - "midgard5.anfuehren": "Anführen", - "midgard5.askese": "Askese", - "midgard5.astrologie": "Astrologie", - "midgard5.athletik": "Athletik", - "midgard5.balancieren": "Balancieren", - "midgard5.beidhaendigerKampf": "Beidhändiger Kampf", - "midgard5.bergreiten": "Bergreiten", - "midgard5.beredsamkeit": "Beredsamkeit", - "midgard5.betaeuben": "Betäuben", - "midgard5.betaeubungsgriff": "Betäubungsgriff", - "midgard5.bootfahren": "Bootfahren", - "midgard5.dickhaeuterLenken": "Dickhäuter lenken", - "midgard5.ersteHilfe": "Erste Hilfe", - "midgard5.etikette": "Etikette", - "midgard5.fallenEntdecken": "Fallen entdecken", - "midgard5.fallenmechanik": "Fallenmechanik", - "midgard5.faelschen": "Fälschen", - "midgard5.fangen": "Fangen", - "midgard5.fechten": "Fechten", - "midgard5.fechtkunst": "Fechtkunst", - "midgard5.feueralchimie": "Feueralchimie", - "midgard5.gassenwissen": "Gassenwissen", - "midgard5.gaukeln": "Gaukeln", - "midgard5.gelaendelauf": "Geländelauf", - "midgard5.geraetekunde": "Gerätekunde", - "midgard5.geschaeftssinn": "Geschäftssinn", - "midgard5.gluecksspiel": "Glücksspiel", - "midgard5.heilkunde": "Heilkunde", - "midgard5.kampfInVollruestung": "Kampf in Vollrüstung", - "midgard5.kampfInSchlachtreihe": "Kampf in Schlachtreihe", - "midgard5.kampfkunst": "Kampfkunst", - "midgard5.kido": "Kido", - "midgard5.klettern": "Klettern", - "midgard5.landeskunde": "Landeskunde", - "midgard5.laufen": "Laufen", - "midgard5.lesenVonZauberschrift": "Lesen von Zauberschrift", - "midgard5.lesenVonZauberrunen": "Lesen von Zauberrunen", - "midgard5.meditieren": "Meditieren", - "midgard5.menschenkenntnis": "Menschenkenntnis", - "midgard5.meucheln": "Meucheln", - "midgard5.musizierenFloete": "Musizieren (Flöten)", - "midgard5.musizierenBlas": "Musizieren (Blasinstrumente)", - "midgard5.musizierenRythmus": "Musizieren (Rythmusinstrumente)", - "midgard5.musizierenStreich": "Musizieren (Streichinstrumente)", - "midgard5.musizierenZupf": "Musizieren (Zupfinstrumente)", - "midgard5.naturkunde": "Naturkunde", - "midgard5.ninjutsu": "NinJutsu", - "midgard5.orakelkunst": "Orakelkunst", - "midgard5.pflanzenkunde": "Pflanzenkunde", - "midgard5.raunen": "Raunen", - "midgard5.reiten": "Reiten", - "midgard5.reiterkampf": "Reiterkampf", - "midgard5.rutengehen": "Rutengehen", - "midgard5.scharfschiessen": "Scharfschießen", - "midgard5.schiesskunst": "Schießkunst", - "midgard5.schleichen": "Schleichen", - "midgard5.schloesserOeffnen": "Schlösser öffnen", - "midgard5.schmerzErtragen": "Schmerzen ertragen", - "midgard5.schwimmen": "Schwimmen", - "midgard5.seilkunst": "Seilkunst", - "midgard5.selbstkontrolle": "Selbstkontrolle", - "midgard5.singen": "Singen", - "midgard5.skifahren": "Skifahren", - "midgard5.spinnengang": "Spinnengang", - "midgard5.speerfechten": "Speerfechten", - "midgard5.spurensuche": "Spurensuche", - "midgard5.stehlen": "Stehlen", - "midgard5.taitschi": "TaiTschi", - "midgard5.tarnen": "Tarnen", - "midgard5.tanzen": "Tanzen", - "midgard5.tauchen": "Tauchen", - "midgard5.thaumagraphie": "Thaumagraphie", - "midgard5.thaumalogie": "Thaumalogie", - "midgard5.tierkunde": "Tierkunde", - "midgard5.ueberlebenWald": "Überleben (Wald)", - "midgard5.ueberlebenSteppe": "Überleben (Steppe)", - "midgard5.ueberlebenGebirge": "Überleben (Gebirge)", - "midgard5.verfuehren": "Verführen", - "midgard5.verhoeren": "Verhören", - "midgard5.verstellen": "Verstellen", - "midgard5.volkstanz": "Volkstanz", - "midgard5.wagenlenken": "Wagenlenken", - "midgard5.wahrsagen": "Wahrsagen", - "midgard5.wasserkampf": "Wasserkampf", - "midgard5.zauberkunde": "Zauberkunde", + "abrichten": "Abrichten", + "akrobatik": "Akrobatik", + "alchimie": "Alchimie", + "anfuehren": "Anführen", + "askese": "Askese", + "astrologie": "Astrologie", + "athletik": "Athletik", + "balancieren": "Balancieren", + "beidhaendigerKampf": "Beidhändiger Kampf", + "bergreiten": "Bergreiten", + "beredsamkeit": "Beredsamkeit", + "betaeuben": "Betäuben", + "betaeubungsgriff": "Betäubungsgriff", + "bootfahren": "Bootfahren", + "dickhaeuterLenken": "Dickhäuter lenken", + "ersteHilfe": "Erste Hilfe", + "etikette": "Etikette", + "fallenEntdecken": "Fallen entdecken", + "fallenmechanik": "Fallenmechanik", + "faelschen": "Fälschen", + "fangen": "Fangen", + "fechten": "Fechten", + "fechtkunst": "Fechtkunst", + "feueralchimie": "Feueralchimie", + "gassenwissen": "Gassenwissen", + "gaukeln": "Gaukeln", + "gelaendelauf": "Geländelauf", + "geraetekunde": "Gerätekunde", + "geschaeftssinn": "Geschäftssinn", + "gluecksspiel": "Glücksspiel", + "heilkunde": "Heilkunde", + "kampfInVollruestung": "Kampf in Vollrüstung", + "kampfInSchlachtreihe": "Kampf in Schlachtreihe", + "kampfkunst": "Kampfkunst", + "kido": "Kido", + "klettern": "Klettern", + "landeskunde": "Landeskunde", + "laufen": "Laufen", + "lesenVonZauberschrift": "Lesen von Zauberschrift", + "lesenVonZauberrunen": "Lesen von Zauberrunen", + "meditieren": "Meditieren", + "menschenkenntnis": "Menschenkenntnis", + "meucheln": "Meucheln", + "musizierenFloete": "Musizieren (Flöten)", + "musizierenBlas": "Musizieren (Blasinstrumente)", + "musizierenRythmus": "Musizieren (Rythmusinstrumente)", + "musizierenStreich": "Musizieren (Streichinstrumente)", + "musizierenZupf": "Musizieren (Zupfinstrumente)", + "naturkunde": "Naturkunde", + "ninjutsu": "NinJutsu", + "orakelkunst": "Orakelkunst", + "pflanzenkunde": "Pflanzenkunde", + "raunen": "Raunen", + "reiten": "Reiten", + "reiterkampf": "Reiterkampf", + "rutengehen": "Rutengehen", + "scharfschiessen": "Scharfschießen", + "schiesskunst": "Schießkunst", + "schleichen": "Schleichen", + "schloesserOeffnen": "Schlösser öffnen", + "schmerzErtragen": "Schmerzen ertragen", + "schwimmen": "Schwimmen", + "seilkunst": "Seilkunst", + "selbstkontrolle": "Selbstkontrolle", + "singen": "Singen", + "skifahren": "Skifahren", + "spinnengang": "Spinnengang", + "speerfechten": "Speerfechten", + "spurensuche": "Spurensuche", + "stehlen": "Stehlen", + "taitschi": "TaiTschi", + "tarnen": "Tarnen", + "tanzen": "Tanzen", + "tauchen": "Tauchen", + "thaumagraphie": "Thaumagraphie", + "thaumalogie": "Thaumalogie", + "tierkunde": "Tierkunde", + "ueberlebenWald": "Überleben (Wald)", + "ueberlebenSteppe": "Überleben (Steppe)", + "ueberlebenGebirge": "Überleben (Gebirge)", + "verfuehren": "Verführen", + "verhoeren": "Verhören", + "verstellen": "Verstellen", + "volkstanz": "Volkstanz", + "wagenlenken": "Wagenlenken", + "wahrsagen": "Wahrsagen", + "wasserkampf": "Wasserkampf", + "zauberkunde": "Zauberkunde", - "midgard5.armor": "Rüstung", - "midgard5.defense": "Abwehr", - "midgard5.damageBonus": "Schadensbonus", - "midgard5.damageBonus-short": "SchB", - "midgard5.attackBonus": "Angriffsbonus", - "midgard5.attackBonus-short": "AnB", - "midgard5.defenseBonus": "Abwehrbonus", - "midgard5.defenseBonus-short": "AbB", - "midgard5.movementBonus": "Bewegunsbonus", - "midgard5.resistanceMind": "Resistenz Geist", - "midgard5.resistanceBody": "Resistenz Körper", - "midgard5.spellCasting": "Zaubern", - "midgard5.spellBonus": "Zauberbonus", - "midgard5.brawl": "Raufen", - "midgard5.poisonResistance": "Gifttolleranz", - "midgard5.enduranceBonus": "Ausdauerbonus", - "midgard5.lpProtection": "Rüstungsschutz (LP)", - "midgard5.apProtection": "Rüstungsschutz (AP)", - "midgard5.deprivation": "Zähigkeit", - "midgard5.deprivations": "Entbehrungen", - "midgard5.deprivationCold": "Zähigkeit Kälte", - "midgard5.deprivationHeat": "Zähigkeit Hitze", - "midgard5.deprivationFood": "Zähigkeit Durst/Hunger", + "armor": "Rüstung", + "defense": "Abwehr", + "damageBonus": "Schadensbonus", + "damageBonus-short": "SchB", + "attackBonus": "Angriffsbonus", + "attackBonus-short": "AnB", + "defenseBonus": "Abwehrbonus", + "defenseBonus-short": "AbB", + "movementBonus": "Bewegunsbonus", + "resistanceMind": "Resistenz Geist", + "resistanceBody": "Resistenz Körper", + "spellCasting": "Zaubern", + "spellBonus": "Zauberbonus", + "brawl": "Raufen", + "poisonResistance": "Gifttolleranz", + "enduranceBonus": "Ausdauerbonus", + "lpProtection": "Rüstungsschutz (LP)", + "apProtection": "Rüstungsschutz (AP)", + "deprivation": "Zähigkeit", + "deprivations": "Entbehrungen", + "deprivationCold": "Zähigkeit Kälte", + "deprivationHeat": "Zähigkeit Hitze", + "deprivationFood": "Zähigkeit Durst/Hunger", - "midgard5.new-skill": "Neue Fertigkeit", - "midgard5.special": "Spezial", - "midgard5.learned-skill": "Gelernte Fertigkeit", - "midgard5.learned-skills": "Gelernte Fertigkeiten", - "midgard5.language": "Sprache", - "midgard5.languages": "Sprachen", - "midgard5.writings": "Schriften", - "midgard5.weapon-skill": "Waffenfertigkeit", - "midgard5.weapon-skills": "Waffenfertigkeiten", - "midgard5.unlearned-skill": "Ungelernte Fertigkeit", - "midgard5.unlearned-skills": "Ungelernte Fertigkeiten", - "midgard5.innate-ability": "Angeborene/Besondere Fähigkeit", - "midgard5.innate-abilities": "Angeborene und besondere Fähigkeiten", + "new-skill": "Neue Fertigkeit", + "special": "Spezial", + "learned-skill": "Gelernte Fertigkeit", + "learned-skills": "Gelernte Fertigkeiten", + "language": "Sprache", + "languages": "Sprachen", + "writings": "Schriften", + "weapon-skill": "Waffenfertigkeit", + "weapon-skills": "Waffenfertigkeiten", + "unlearned-skill": "Ungelernte Fertigkeit", + "unlearned-skills": "Ungelernte Fertigkeiten", + "innate-ability": "Angeborene/Besondere Fähigkeit", + "innate-abilities": "Angeborene und besondere Fähigkeiten", - "midgard5.base-damage": "Grundschaden", - "midgard5.weapon": "Waffe", - "midgard5.weapons": "Waffen", - "midgard5.defensive-weapon": "Verteidigungswaffe", - "midgard5.defensive-weapons": "Verteidigungswaffen", - "midgard5.no-skill": "Keine Fertigkeit", - "midgard5.magic": "magisch", - "midgard5.valuable": "Vermögen", - "midgard5.equipped": "Ausgerüstet", - "midgard5.active": "Aktiv", - "midgard5.rangedWeapon": "Schusswaffe", - "midgard5.assignItemToCharacter": "Füge Gegenstand einem Charakter hinzu, um hier etwas auswählen zu können", - "midgard5.showAll": "Alle anzeigen", - "midgard5.wealthAndWeight": "Vermögen und Lasten", - "midgard5.itemsInContainers": "Gegenstände in Aufbewahrung", - "midgard5.allItems": "Alle Gegenstände", + "base-damage": "Grundschaden", + "weapon": "Waffe", + "weapons": "Waffen", + "defensive-weapon": "Verteidigungswaffe", + "defensive-weapons": "Verteidigungswaffen", + "no-skill": "Keine Fertigkeit", + "magic": "magisch", + "valuable": "Vermögen", + "equipped": "Ausgerüstet", + "active": "Aktiv", + "rangedWeapon": "Schusswaffe", + "assignItemToCharacter": "Füge Gegenstand einem Charakter hinzu, um hier etwas auswählen zu können", + "showAll": "Alle anzeigen", + "wealthAndWeight": "Vermögen und Lasten", + "itemsInContainers": "Gegenstände in Aufbewahrung", + "allItems": "Alle Gegenstände", - "midgard5.pw": "Prüfwurf", - "midgard5.attack": "Angriff", - "midgard5.damage": "Schaden", + "pw": "Prüfwurf", + "attack": "Angriff", + "damage": "Schaden", - "midgard5.skill-goup-alltag": "Alltag", - "midgard5.skill-goup-freiland": "Freiland", - "midgard5.skill-goup-halbwelt": "Halbwelt", - "midgard5.skill-goup-kampf": "Kampf", - "midgard5.skill-goup-koerper": "Körper", - "midgard5.skill-goup-sozial": "Sozial", - "midgard5.skill-goup-unterwelt": "Unterwelt", - "midgard5.skill-goup-waffen": "Waffen", - "midgard5.skill-goup-wissen": "Wissen", + "skill-goup-alltag": "Alltag", + "skill-goup-freiland": "Freiland", + "skill-goup-halbwelt": "Halbwelt", + "skill-goup-kampf": "Kampf", + "skill-goup-koerper": "Körper", + "skill-goup-sozial": "Sozial", + "skill-goup-unterwelt": "Unterwelt", + "skill-goup-waffen": "Waffen", + "skill-goup-wissen": "Wissen", - "midgard5.spell-process-none": "Ohne", - "midgard5.spell-process-artefakte": "Artefakte", - "midgard5.spell-process-beherrschen": "Beherrschen", - "midgard5.spell-process-bewegen": "Bewegen", - "midgard5.spell-process-beschwoeren": "Beschwören", - "midgard5.spell-process-blutmagie": "Blutmagie", - "midgard5.spell-process-chaoswunder": "Chaoswunder", - "midgard5.spell-process-dweomer": "Dweomer", - "midgard5.spell-process-erkennen": "Erkennen", - "midgard5.spell-process-erschaffen": "Erschaffen", - "midgard5.spell-process-erhaltung": "Erhaltung", - "midgard5.spell-process-formen": "Formen", - "midgard5.spell-process-finstere_magie": "Finstere Magie", - "midgard5.spell-process-kampfverse": "Kampfverse", - "midgard5.spell-process-namensmagie": "Namensmagie", - "midgard5.spell-process-nekromantie": "Nekromantie", - "midgard5.spell-process-runenstaebe": "Runenstäbe", - "midgard5.spell-process-thaumatherapie": "Thaumatherapie", - "midgard5.spell-process-thaumagraphie": "Thaumagraphie", - "midgard5.spell-process-veraendern": "Verändern", - "midgard5.spell-process-vigilsignien": "Vigilsignien", - "midgard5.spell-process-wundertat": "Wundertat", - "midgard5.spell-process-wilder_dweomer": "Wilder Dweomer", - "midgard5.spell-process-zerstoeren": "Zerstören", - "midgard5.spell-process-zauberlied": "Zauberlieder", - "midgard5.spell-process-zaubersalz": "Zaubersalze", - "midgard5.spell-process-zaubermittel": "Zaubermittel", - "midgard5.spell-process-zauberschutz": "Zauberschutz", - "midgard5.spell-process-zauberrunen": "Zauberrunen", - "midgard5.spell-process-zaubersiegel": "Zaubersiegel", - "midgard5.spell-process-zaubertaenze": "Zaubertänze", - "midgard5.spell-process-zauberblaetter": "Zauberblätter", + "spell-process-none": "Ohne", + "spell-process-artefakte": "Artefakte", + "spell-process-beherrschen": "Beherrschen", + "spell-process-bewegen": "Bewegen", + "spell-process-beschwoeren": "Beschwören", + "spell-process-blutmagie": "Blutmagie", + "spell-process-chaoswunder": "Chaoswunder", + "spell-process-dweomer": "Dweomer", + "spell-process-erkennen": "Erkennen", + "spell-process-erschaffen": "Erschaffen", + "spell-process-erhaltung": "Erhaltung", + "spell-process-formen": "Formen", + "spell-process-finstere_magie": "Finstere Magie", + "spell-process-kampfverse": "Kampfverse", + "spell-process-namensmagie": "Namensmagie", + "spell-process-nekromantie": "Nekromantie", + "spell-process-runenstaebe": "Runenstäbe", + "spell-process-thaumatherapie": "Thaumatherapie", + "spell-process-thaumagraphie": "Thaumagraphie", + "spell-process-veraendern": "Verändern", + "spell-process-vigilsignien": "Vigilsignien", + "spell-process-wundertat": "Wundertat", + "spell-process-wilder_dweomer": "Wilder Dweomer", + "spell-process-zerstoeren": "Zerstören", + "spell-process-zauberlied": "Zauberlieder", + "spell-process-zaubersalz": "Zaubersalze", + "spell-process-zaubermittel": "Zaubermittel", + "spell-process-zauberschutz": "Zauberschutz", + "spell-process-zauberrunen": "Zauberrunen", + "spell-process-zaubersiegel": "Zaubersiegel", + "spell-process-zaubertaenze": "Zaubertänze", + "spell-process-zauberblaetter": "Zauberblätter", - "midgard5.spell-type-gedanke": "Gedanke", - "midgard5.spell-type-geste": "Geste", - "midgard5.spell-type-wort": "Wort", + "spell-type-gedanke": "Gedanke", + "spell-type-geste": "Geste", + "spell-type-wort": "Wort", - "midgard5.spell-target-umgebung": "Umgebung", - "midgard5.spell-target-geist": "Geist", - "midgard5.spell-target-koerper": "Körper", + "spell-target-umgebung": "Umgebung", + "spell-target-geist": "Geist", + "spell-target-koerper": "Körper", - "midgard5.spell-type": "Art", - "midgard5.spell-process": "Prozess", - "midgard5.spell-castDuration": "Zauberdauer", - "midgard5.spell-castDuration-short": "Zd", - "midgard5.spell-range": "Reichweite", - "midgard5.spell-range-short": "Rw", - "midgard5.spell-effectTarget": "Wirkunsziel", - "midgard5.spell-effectTarget-short": "Wz", - "midgard5.spell-effectArea": "Wirkungsbereich", - "midgard5.spell-effectArea-short": "Wb", - "midgard5.spell-effectDuration": "Wirkungsdauer", - "midgard5.spell-effectDuration-short": "Wd", - "midgard5.spell-origin": "Ursprung", - "midgard5.spell-agens": "Agens", - "midgard5.spell-reagens": "Reagens", - "midgard5.spell-material": "Zaubermaterial", + "spell-type": "Art", + "spell-process": "Prozess", + "spell-castDuration": "Zauberdauer", + "spell-castDuration-short": "Zd", + "spell-range": "Reichweite", + "spell-range-short": "Rw", + "spell-effectTarget": "Wirkunsziel", + "spell-effectTarget-short": "Wz", + "spell-effectArea": "Wirkungsbereich", + "spell-effectArea-short": "Wb", + "spell-effectDuration": "Wirkungsdauer", + "spell-effectDuration-short": "Wd", + "spell-origin": "Ursprung", + "spell-agens": "Agens", + "spell-reagens": "Reagens", + "spell-material": "Zaubermaterial", - "midgard5.kampfkunst-type": "Form", - "midgard5.kampfkunst-variante": "Variante", - "midgard5.kampfkunst-variante-short": "Var", - "midgard5.kampfkunst-ep": "Erfahrungspunkte", - "midgard5.kampfkunst-rank": "Stufe", - "midgard5.kampfkunst-weapon": "Waffengruppe", - "midgard5.kampfkunst-enemy": "Einschränkungen durch Art der Gegner", + "kampfkunst-type": "Form", + "kampfkunst-variante": "Variante", + "kampfkunst-variante-short": "Var", + "kampfkunst-ep": "Erfahrungspunkte", + "kampfkunst-rank": "Stufe", + "kampfkunst-weapon": "Waffengruppe", + "kampfkunst-enemy": "Einschränkungen durch Art der Gegner", - "midgard5.kampfkunst-type-angriff": "Angriff", - "midgard5.kampfkunst-type-verteidigung": "Verteidigung", - "midgard5.kampfkunst-type-finte": "Finte", - "midgard5.kampfkunst-type-geist": "Geistestechnik", - "midgard5.kampfkunst-type-schießkunst": "Schießkunst", - "midgard5.kampfkunst-type-fechtkunst": "Fechtkunst", + "kampfkunst-type-angriff": "Angriff", + "kampfkunst-type-verteidigung": "Verteidigung", + "kampfkunst-type-finte": "Finte", + "kampfkunst-type-geist": "Geistestechnik", + "kampfkunst-type-schießkunst": "Schießkunst", + "kampfkunst-type-fechtkunst": "Fechtkunst", - "midgard5.kampfkunst-variante-anstuermen": "Anstürmen", - "midgard5.kampfkunst-variante-attackieren": "Attackieren", - "midgard5.kampfkunst-variante-entwaffnen": "Entwaffnen", - "midgard5.kampfkunst-variante-fechten": "Fechten", - "midgard5.kampfkunst-variante-schusstechnik": "Schusstechnik", - "midgard5.kampfkunst-variante-finten": "Finten", - "midgard5.kampfkunst-variante-geistestechnik": "Geistestechnik", - "midgard5.kampfkunst-variante-verteidigung": "Verteidigung", + "kampfkunst-variante-anstuermen": "Anstürmen", + "kampfkunst-variante-attackieren": "Attackieren", + "kampfkunst-variante-entwaffnen": "Entwaffnen", + "kampfkunst-variante-fechten": "Fechten", + "kampfkunst-variante-schusstechnik": "Schusstechnik", + "kampfkunst-variante-finten": "Finten", + "kampfkunst-variante-geistestechnik": "Geistestechnik", + "kampfkunst-variante-verteidigung": "Verteidigung", - "midgard5.kido-type": "KiDo Form", - "midgard5.kido-variante": "KiDo Variante", - "midgard5.kido-color": "Kampfstilfarbe", - "midgard5.kido-style": "Art der Technik", + "kido-type": "KiDo Form", + "kido-variante": "KiDo Variante", + "kido-color": "Kampfstilfarbe", + "kido-style": "Art der Technik", - "midgard5.kido-type-angriff": "Kido Angriff", - "midgard5.kido-type-verteidigung": "Kido Verteidigung", - "midgard5.kido-type-finte": "Kido Finte", - "midgard5.kido-type-leib": "Kido Leibestechnik", + "kido-type-angriff": "Kido Angriff", + "kido-type-verteidigung": "Kido Verteidigung", + "kido-type-finte": "Kido Finte", + "kido-type-leib": "Kido Leibestechnik", - "midgard5.kido-variante-anspringen": "Anspringen", - "midgard5.kido-variante-attackieren": "Attackieren", - "midgard5.kido-variante-entwaffnen": "Entwaffnen", - "midgard5.kido-variante-werfen": "Werfen", - "midgard5.kido-variante-ausweichen": "Ausweichen", - "midgard5.kido-variante-blockieren": "Blockieren", - "midgard5.kido-variante-bewegen": "Bewegen", - "midgard5.kido-variante-kontrollieren": "Kontrollieren", + "kido-variante-anspringen": "Anspringen", + "kido-variante-attackieren": "Attackieren", + "kido-variante-entwaffnen": "Entwaffnen", + "kido-variante-werfen": "Werfen", + "kido-variante-ausweichen": "Ausweichen", + "kido-variante-blockieren": "Blockieren", + "kido-variante-bewegen": "Bewegen", + "kido-variante-kontrollieren": "Kontrollieren", - "midgard5.mod-operation-add100": "Addieren (max 100)", - "midgard5.mod-operation-roll": "Wurf Modifikation", - "midgard5.mod-operation-add": "Addieren", - "midgard5.mod-operation-set": "Basiswert", - "midgard5.mod-operation-fixed": "Fester Wert", - "midgard5.mod-operation-subtract": "Subtrahieren", - "midgard5.mod-operation-multiply": "Multiplizieren", - "midgard5.mod-operation-division": "Dividieren", + "mod-operation-add100": "Addieren (max 100)", + "mod-operation-roll": "Wurf Modifikation", + "mod-operation-add": "Addieren", + "mod-operation-set": "Basiswert", + "mod-operation-fixed": "Fester Wert", + "mod-operation-subtract": "Subtrahieren", + "mod-operation-multiply": "Multiplizieren", + "mod-operation-division": "Dividieren", - "midgard5.mod-stat-defenseBonus": "Abwehrbonus", - "midgard5.mod-stat-attackBonus": "Angriffsbonus", - "midgard5.mod-stat-damageBonus": "Schadensbonus", - "midgard5.mod-stat-movement": "Bewegung", - "midgard5.mod-stat-resistanceMind": "Resistenz Geist", - "midgard5.mod-stat-resistanceBody": "Resistenz Körper", - "midgard5.mod-stat-spellCasting": "Zaubern", - "midgard5.mod-stat-brawl": "Raufen", - "midgard5.mod-stat-poisonResistance": "Gifttolleranz", - "midgard5.mod-stat-lp": "Lebenspunkte", - "midgard5.mod-stat-ap": "Ausdauerpunkte", - "midgard5.mod-stat-lpProtection": "Rüstungsschutz (LP)", - "midgard5.mod-stat-apProtection": "Rüstungsschutz (AP)", - "midgard5.mod-stat-deprivationCold": "Entbehrungen Kälte", - "midgard5.mod-stat-deprivationHeat": "Entbehrungen Hitze", - "midgard5.mod-stat-deprivationFood": "Entbehrungen Durst/Hunger", + "mod-stat-defenseBonus": "Abwehrbonus", + "mod-stat-attackBonus": "Angriffsbonus", + "mod-stat-damageBonus": "Schadensbonus", + "mod-stat-movement": "Bewegung", + "mod-stat-resistanceMind": "Resistenz Geist", + "mod-stat-resistanceBody": "Resistenz Körper", + "mod-stat-spellCasting": "Zaubern", + "mod-stat-brawl": "Raufen", + "mod-stat-poisonResistance": "Gifttolleranz", + "mod-stat-lp": "Lebenspunkte", + "mod-stat-ap": "Ausdauerpunkte", + "mod-stat-lpProtection": "Rüstungsschutz (LP)", + "mod-stat-apProtection": "Rüstungsschutz (AP)", + "mod-stat-deprivationCold": "Entbehrungen Kälte", + "mod-stat-deprivationHeat": "Entbehrungen Hitze", + "mod-stat-deprivationFood": "Entbehrungen Durst/Hunger", - "midgard5.mod-type": "Typ der Modifikation", - "midgard5.mod-id": "Was soll modifiziert werden", - "midgard5.mod-operation": "Wie soll modifiziert werden", - "midgard5.mod-value": "Wert", + "mod-type": "Typ der Modifikation", + "mod-id": "Was soll modifiziert werden", + "mod-operation": "Wie soll modifiziert werden", + "mod-value": "Wert", - "midgard5.type": "Typ", - "midgard5.formula": "Formel", - "midgard5.roll": "Wurf" + "type": "Typ", + "formula": "Formel", + "roll": "Wurf", + + "chat": { + "luckPoint": "Glückspunkt", + "destiny": "Schicksalsgunst", + "modify": "Nachträglich", + "cancel": "Abbrechen", + "roll": "Würfeln", + "reroll": "Neuwürfeln", + + "options": { + "modifier": "Modifikator", + "difficulty": "Schwellenwert", + "rollMode": "Würfel Modus" + } + } + } } diff --git a/source/index.ts b/source/index.ts index 2d4de52..7dcdff9 100644 --- a/source/index.ts +++ b/source/index.ts @@ -5,6 +5,7 @@ import { M5Character } from "./module/actors/M5Character"; import { M5ModOperation, M5TimeUnit } from "./module/M5Base"; import { M5ItemSheet } from "./module/sheets/M5ItemSheet"; import { M5Item } from "./module/items/M5Item"; +import { reroll } from "./module/rolls/reroll"; import { loadHelpers } from "./helpers"; import { loadSettings } from "./settings"; @@ -79,6 +80,17 @@ Hooks.on("getChatLogEntryContext", function (html, options) { return (game["user"].character || game["canvas"].tokens.controlled) && damageRolls > 0; }, callback: (li) => applyDamage(li, -2), + }, + { + name: "Redo", + icon: '', + condition: (li) => { + const message = (game as Game).messages.get(li.attr("data-message-id")); + + // All must be true to show the reroll dialogue + return (game["user"].isGM || game["user"].character?.id === (game as Game).actors.get(message["speaker"].actor)?.id) && !message["flags"].rerolled; + }, + callback: (li) => reroll(li), } ); }); diff --git a/source/module/M5Base.ts b/source/module/M5Base.ts index d31f2b1..e890123 100644 --- a/source/module/M5Base.ts +++ b/source/module/M5Base.ts @@ -28,6 +28,7 @@ export interface M5Attribute { export interface M5RollData { c: any; i: any; + b: any; iType: string; rolls: any; res: { @@ -172,6 +173,7 @@ export interface M5CharacterCalculatedData { pa: M5AttributeCalculated; wk: M5AttributeCalculated; }; + stats: { lp: M5ModResult; ap: M5ModResult; diff --git a/source/module/rolls/M5Roll.ts b/source/module/rolls/M5Roll.ts index 5e80689..81f49fb 100644 --- a/source/module/rolls/M5Roll.ts +++ b/source/module/rolls/M5Roll.ts @@ -26,10 +26,10 @@ export class M5Roll { .map((rollName, index) => { indexMap.set(index, rollName); const formula = this.data.rolls[rollName]; + formula.formula = index === 0 && this.id !== "-1" ? formula.formula.replace(/(\d*d\d*)/, `{$1 + ${this.data.b.modifier}}`) : formula.formula; const roll = new Roll(formula.formula, this.data); return roll; }); - this.pool = PoolTerm.fromRolls(rolls); console.log("evaluate", this._evaluated, this.pool); return this.pool.evaluate({ async: true }).then((results) => { @@ -66,7 +66,7 @@ export class M5Roll { const parseResult = M5Roll.parseDiceSides(rollResult.formula); //console.log("evaluate roll", parseResult) if (parseResult?.sides === 20) { - if (roll.total < 20) { + if (roll.total < this.data.b.difficulty) { if (rowRes === M5EwResult.TBD || rowRes === M5EwResult.HIGH) rowRes = M5EwResult.FAIL; } else { if (rowRes === M5EwResult.TBD) rowRes = M5EwResult.PASS; @@ -88,7 +88,6 @@ export class M5Roll { }); this.data.res.label = this.label; - console.log(this.data); if ((game as Game).settings.get("midgard5", "automatedPP") && this.data.iType !== null) { if ((this.data.i.type === "language" || this.data.i.type === "general") && this.data.rolls[0].dice[0] >= 16) { this.actor.items.get(this.id).update({ @@ -144,20 +143,28 @@ export class M5Roll { } async toMessage() { + let checkOptions = await this.popUp({ isPW: this.data.rolls[0].label === (game as Game).i18n.localize("midgard5.pw") }); + if (checkOptions["cancelled"]) { + return; + } else { + this.data.b = checkOptions; + } + if (!this._evaluated) await this.evaluate(); + const faces = this.pool.dice.map((x) => x.faces); - const rMode = (game as Game).settings.get("core", "rollMode"); - + const rMode = checkOptions["rollMode"] || (game as Game).settings.get("core", "rollMode"); const chatData = { type: CONST.CHAT_MESSAGE_TYPES.ROLL, content: await this.render(), speaker: ChatMessage.getSpeaker({ actor: this.actor }), sound: CONFIG.sounds.dice, roll: Roll.fromTerms([this.pool]), + flags: { data: this.data, rerolled: false, faces: faces }, }; - ChatMessage.applyRollMode(chatData, rMode); - return ChatMessage.create(chatData); + let foo = ChatMessage.applyRollMode(chatData, rMode); + return ChatMessage.implementation["create"](foo, { rollMode: rMode }); } static fromAttributeValue(actor: any, attributeKey: string, attributeValue: number) { @@ -392,6 +399,46 @@ export class M5Roll { return null; } + + async popUp({ + useFortune = false, + difficulty = 20, + modifier = 0, + rollModes = CONFIG.Dice.rollModes, + rollMode = "", + template = "systems/midgard5/templates/chat/task-check-dialog.hbs", + isPW = false, + } = {}) { + const html = await renderTemplate(template, { useFortune, difficulty, modifier, rollModes, rollMode, isPW }); + return new Promise((resolve) => { + const data = { + title: (game as Game).i18n.localize("midgard5.chat.roll"), + content: html, + buttons: { + roll: { + label: (game as Game).i18n.localize("midgard5.chat.roll"), + callback: (html) => resolve(this._processTaskCheckOptions(html[0].querySelector("form"))), + }, + cancel: { + label: (game as Game).i18n.localize("midgard5.chat.cancel"), + callback: (html) => resolve({ cancelled: true }), + }, + }, + default: "roll", + close: () => resolve({ cancelled: true }), + }; + + new Dialog(data, null).render(true); + }); + } + + _processTaskCheckOptions(form) { + return { + difficulty: parseInt(form.difficulty?.value), + modifier: parseInt(form.modifier?.value), + rollMode: form.rollMode?.value, + }; + } } interface FormulaParseResult { diff --git a/source/module/rolls/reroll.ts b/source/module/rolls/reroll.ts new file mode 100644 index 0000000..9fa565a --- /dev/null +++ b/source/module/rolls/reroll.ts @@ -0,0 +1,108 @@ +import { M5RollData, M5RollResult } from "../M5Base"; +import { M5Roll } from "./M5Roll"; + +export const reroll = async (roll) => { + const message = (game as Game).messages.get(roll.attr("data-message-id")); + const actor = (game as Game).actors.get(message["speaker"].actor); + + const template = "systems/midgard5/templates/chat/reroll-dialog.hbs"; + const html = await renderTemplate(template, { sg: actor.system.sg, gp: actor.system.gp }); + // Button defining + let buttons = {}; + buttons = { + destiny: { + icon: '', + label: (game as Game).i18n.localize("midgard5.chat.destiny"), + callback: () => rerollDie("destiny", "sg"), + }, + luckPoints: { + icon: '', + label: (game as Game).i18n.localize("midgard5.chat.luckPoint"), + callback: () => rerollDie("luckPoint", "gp"), + }, + modify: { + icon: '', + label: (game as Game).i18n.localize("midgard5.chat.modify") + " +" + (message["flags"].faces[0] === 100 ? 10 : 2), + callback: () => rerollDie("modify", "gp"), + }, + cancel: { + icon: '', + label: (game as Game).i18n.localize("midgard5.chat.cancel"), + }, + }; + + // Dialog object + new Dialog( + { + title: (game as Game).i18n.localize("midgard5.chat.reroll"), + content: html, + buttons, + render: function () {}, + default: "luckPoints", + }, + { + classes: ["midgard5"], + } + ).render(true); + + async function rerollDie(type, target) { + // Update the "content" field + let rollData = actor.getRollData() as M5RollData; + const flagData = message["flags"].data; + rollData.c = flagData.c; + rollData.i = flagData.i; + rollData.b = flagData.b; + rollData.iType = flagData.iType; + rollData.res.label = flagData.res.label + " (" + (game as Game).i18n.localize(`midgard5.chat.${type}`) + ")"; + actor.update({ + system: { + [target]: actor.system[target] - 1, + }, + }); + if (type !== "modify") { + for (var key in flagData.rolls) { + if (!!flagData.rolls[key]) { + rollData.rolls[key] = { + formula: flagData.rolls[key]?.formula, + enabled: flagData.rolls[key]?.enabled, + label: flagData.rolls[key]?.label, + result: "", + total: 0, + totalStr: "", + dice: {}, + css: "", + } as M5RollResult; + } + } + } else { + for (var key in flagData.rolls) { + if (!!flagData.rolls[key]) { + rollData.rolls[key] = { + formula: key === "0" ? flagData.rolls[key]?.result + " + " + (message["flags"].faces[0] === 100 ? 10 : 2) : flagData.rolls[key]?.result, + enabled: flagData.rolls[key]?.enabled, + label: flagData.rolls[key]?.label, + result: "", + total: 0, + totalStr: "", + dice: {}, + css: "", + } as M5RollResult; + } + } + } + + const newRoll = new M5Roll(rollData, actor, rollData.res.label, "-1"); + if (!newRoll._evaluated) await newRoll.evaluate(); + + const chatData = { + type: CONST.CHAT_MESSAGE_TYPES.ROLL, + content: await newRoll.render(), + speaker: ChatMessage.getSpeaker({ actor: actor }), + sound: CONFIG.sounds.dice, + roll: Roll.fromTerms([newRoll.pool]), + flags: { rerolled: true }, + }; + + message.update(chatData); + } +}; diff --git a/source/module/sheets/M5CharacterSheet.ts b/source/module/sheets/M5CharacterSheet.ts index 62b2e71..01b8b5b 100644 --- a/source/module/sheets/M5CharacterSheet.ts +++ b/source/module/sheets/M5CharacterSheet.ts @@ -77,7 +77,6 @@ export default class M5CharacterSheet extends ActorSheet { let target = event.target.closest("[data-attribute]") as HTMLElement; let attributeValue = target ? parseInt(target.dataset.value) : null; let attributeStr = target ? target.dataset.attribute : null; - const roll = M5Roll.fromAttributeValue(this.actor, attributeStr, attributeValue); await roll.toMessage(); }); diff --git a/templates/chat/reroll-dialog.hbs b/templates/chat/reroll-dialog.hbs new file mode 100644 index 0000000..a1b9583 --- /dev/null +++ b/templates/chat/reroll-dialog.hbs @@ -0,0 +1,18 @@ +
+
+ +
+ +
+
+ {{localize "midgard5.destiny"}}: + {{sg}} +
+
+ {{localize "midgard5.luckPoints"}}: + {{gp}} +
+
+
+
+
\ No newline at end of file diff --git a/templates/chat/roll-m5.hbs b/templates/chat/roll-m5.hbs index 1613af5..9e516fd 100644 --- a/templates/chat/roll-m5.hbs +++ b/templates/chat/roll-m5.hbs @@ -125,7 +125,7 @@ {{#each rolls as |roll index|}} {{#if roll.enabled}} - {{roll.label}} + {{roll.label}} {{#if (eq index '0')}} {{#if (gt ../b.modifier 0)}}+{{../b.modifier}}{{/if}}{{#if (gt 0 ../b.modifier)}}{{../b.modifier}}{{/if}}{{/if}} {{roll.totalStr}} {{roll.result}} diff --git a/templates/chat/task-check-dialog.hbs b/templates/chat/task-check-dialog.hbs new file mode 100644 index 0000000..6604497 --- /dev/null +++ b/templates/chat/task-check-dialog.hbs @@ -0,0 +1,22 @@ +
+
+ + +
+ {{#unless isPW}} +
+ + +
+ {{/unless}} +
+ + +
+
\ No newline at end of file From fb30f8fe40c5d1a5d8119d89c4b59633004ce007 Mon Sep 17 00:00:00 2001 From: Byroks Date: Fri, 29 Mar 2024 14:32:33 +0100 Subject: [PATCH 10/10] v2.6.0 --- package.json | 2 +- source/system.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index eef0591..b3dc8bc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "foundry-system-midgard5", - "version": "2.5.0", + "version": "2.6.0", "description": "", "main": "index.js", "scripts": { diff --git a/source/system.json b/source/system.json index 85b1db3..c4d5528 100644 --- a/source/system.json +++ b/source/system.json @@ -3,7 +3,7 @@ "name": "midgard5", "title": "Midgard 5. Edition", "description": "The German RPG Midgard 5. Edition", - "version": "2.5.0", + "version": "2.6.0", "compatibility": { "minimum": "10", "verified": "11", @@ -28,8 +28,8 @@ "primaryTokenAttribute": "lp", "secondaryTokenAttribute": "ap", "url": "https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5", - "manifest": "https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/releases/download/v2.5.0/system.json", - "download": "https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/releases/download/v2.5.0/midgard5-v2.5.0.zip", + "manifest": "https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/releases/download/v2.6.0/system.json", + "download": "https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/releases/download/v2.6.0/midgard5-v2.6.0.zip", "initiative": "@c.calc.attributes.gw.value", "license": "LICENSE.txt" } \ No newline at end of file