diff --git a/lang/de.json b/lang/de.json index 20dc7f5..84bc56d 100644 --- a/lang/de.json +++ b/lang/de.json @@ -9,6 +9,7 @@ "TYPES.Item.armor": "Rüstung", "TYPES.Item.spell": "Zauber", "TYPES.Item.effect": "Aktive Effekte", + "ITEM.TypeKampfkunst": "Kampfkünste", "midgard5.doRoll": "Würfeln", "midgard5.learn": "Lernen", @@ -64,6 +65,7 @@ "midgard5.gear": "Ausrüstung", "midgard5.spells": "Zauber", "midgard5.effects": "Aktive Effekte", + "midgard5.kampfkuenste": "Kampfkünste", "midgard5.class": "Klasse", "midgard5.race": "Rasse", diff --git a/packs/items/blaupause-gegenstaende/kampfkuenste.json b/packs/items/blaupause-gegenstaende/kampfkuenste.json new file mode 100644 index 0000000..1e6f5a5 --- /dev/null +++ b/packs/items/blaupause-gegenstaende/kampfkuenste.json @@ -0,0 +1,51 @@ +{ + "name": "Kampfkünste", + "type": "kampfkunst", + "img": "icons/svg/item-bag.svg", + "data": { + "description": "", + "kampfkunstTypeSelection": { + "none": "midgard5.spell-process-none", + "angriff": "midgard5.kampfkunst-type-angriff", + "verteidigung": "midgard5.kampfkunst-type-verteidigung", + "finten": "midgard5.kampfkunst-type-finten", + "geist": "midgard5.kampfkunst-type-geist", + "schießkunst": "midgard5.kampfkunst-type-schießkunst", + "fechten": "midgard5.kampfkunst-type-fechten", + "kidoAngriff": "midgard5.kido-type-angriff", + "kidoVerteidigung": "midgard5.kido-type-verteidigung", + "kidoFinten": "midgard5.kido-type-finten", + "kidoLeib": "midgard5.kido-type-leub" + }, + "kampfkunstVarianteSelection": { + "none": "midgard5.spell-process-none", + "anstuermen": "midgard5.kampfkunst-variante-anstuermen", + "attackieren": "midgard5.kampfkunst-variante-attackieren", + "entwaffnen": "midgard5.kampfkunst-variante-entwaffnen" + }, + "bonus": 0, + "type": "angriff", + "variante": "none", + "skillId": "", + "ap": 0, + "rolls": { + "formulas": { + "0": { + "formula": "1d20 + @c.calc.stats.spellCasting.value + @i.bonus", + "enabled": true, + "label": "Zaubern" + } + }, + "output": "" + }, + "calc": {} + }, + "effects": [], + "folder": null, + "sort": 0, + "permission": { + "default": 0, + "XD0IpWT6bN4AJiYQ": 3 + }, + "_id": "HQ469FvZkwKfzFff" +} diff --git a/source/module/M5Base.ts b/source/module/M5Base.ts index 9d2020a..6a08889 100644 --- a/source/module/M5Base.ts +++ b/source/module/M5Base.ts @@ -1,4 +1,4 @@ -import { BooleanField } from "@league-of-foundry-developers/foundry-vtt-types/src/foundry/common/data/fields.mjs"; +import { BooleanField } from "@league-of-foundry-developers/foundry-vtt-types/src/foundry/common/data/fields.mjs";; export interface M5Skill { fw: number; @@ -163,15 +163,17 @@ export interface M5CharacterCalculatedData { custom: {}; }; gear: { - weapons: {}; - defensiveWeapons: {}; - armor: {}; + weapons: {};; + defensiveWeapons: {};; + armor: {};; items: {}; - effects: {}; - }; - spells: {}; + effects: {};; + };; + spells: {};; + kampfkuenste: {}; } export function enumKeys(obj: O): K[] { return Object.keys(obj).filter((k) => Number.isNaN(+k)) as K[]; + return Object.keys(obj).filter((k) => Number.isNaN(+k)) as K[]; } diff --git a/source/module/actors/M5Character.ts b/source/module/actors/M5Character.ts index b67bab4..81a82af 100644 --- a/source/module/actors/M5Character.ts +++ b/source/module/actors/M5Character.ts @@ -25,7 +25,17 @@ export class M5Character extends Actor { } derivedData( - skip: { mods?: boolean; skills?: boolean; weapons?: boolean; defensiveWeapons?: boolean; armor?: boolean; items?: boolean; spells?: boolean; effects?: boolean } = {} + skip: { + mods?: boolean; + skills?: boolean; + weapons?: boolean; + defensiveWeapons?: boolean; + armor?: boolean; + items?: boolean; + spells?: boolean; + effects?: boolean; + kampfkuenste?: boolean; + } = {} ): M5CharacterCalculatedData { let ret: M5CharacterCalculatedData = { level: 0, @@ -73,6 +83,7 @@ export class M5Character extends Actor { effects: {}, }, spells: {}, + kampfkuenste: {}, } as M5CharacterCalculatedData; const context = this as any; @@ -274,6 +285,20 @@ export class M5Character extends Actor { }); } + if (!skip?.kampfkuenste) { + context.items + ?.filter((item) => item.type === "kampfkunst") + .forEach((item) => { + item.prepareDerivedData(); + + ret.kampfkuenste[item.id] = { + label: item.name, + process: "midgard5.kampfkunst-type-" + item.system.type, + calc: item.system.calc, + }; + }); + } + return ret; } diff --git a/source/module/items/M5Item.ts b/source/module/items/M5Item.ts index 34e09bb..f9776cb 100644 --- a/source/module/items/M5Item.ts +++ b/source/module/items/M5Item.ts @@ -31,7 +31,7 @@ export class M5Item extends Item { ]; if (character) { - const actorCalc = character.derivedData({ skills: true, weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true, effects: true }); + const actorCalc = character.derivedData({ skills: true, weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true, effects: true, kampfkuenste: true }); if (actorCalc?.skillMods && Object.keys(actorCalc.skillMods).indexOf(itemId) !== -1) { pairs = pairs.concat(actorCalc.skillMods[itemId]); } @@ -65,7 +65,7 @@ export class M5Item extends Item { calc.combatSkills = null; if (actor) { - const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true, effects: true }); + const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true, effects: true, kampfkuenste: true }); if (actorCalc) { calc.ew += actorCalc.stats.attackBonus.value; calc.combatSkills = actorCalc.skills.combat; @@ -89,7 +89,7 @@ export class M5Item extends Item { calc.combatSkills = null; if (actor) { - const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true, effects: true }); + const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true, effects: true, kampfkuenste: true }); if (actorCalc) { calc.ew += actorCalc.stats.defense.value + actorCalc.stats.defenseBonus.value; calc.combatSkills = actorCalc.skills.combat; @@ -108,7 +108,15 @@ export class M5Item extends Item { } else if (itemType === "spell") { calc.fw = 0; if (actor) { - const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true, effects: true }); + const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true, effects: true, kampfkuenste: true }); + if (actorCalc) { + calc.ew = actorCalc.stats.spellCasting.value; + } + } + } else if (itemType === "kampfkunst") { + calc.fw = 0; + if (actor) { + const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true, kampfkuenste: true }); if (actorCalc) { calc.ew = actorCalc.stats.spellCasting.value; } @@ -135,7 +143,7 @@ export class M5Item extends Item { } case M5ModType.SKILL: { if (character) { - const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true, effects: true }); + const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true, effects: true, kampfkuenste: true }); if (actorCalc) { let category = (game as Game).i18n.localize("midgard5.skill"); Object.keys(actorCalc.skills.general).forEach((skillId) => { diff --git a/source/module/rolls/M5Roll.ts b/source/module/rolls/M5Roll.ts index b8c4f2d..141fb7e 100644 --- a/source/module/rolls/M5Roll.ts +++ b/source/module/rolls/M5Roll.ts @@ -245,6 +245,27 @@ export class M5Roll { return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.resistanceMind")); } + static async initativeRoll(actor: any) { + let newInitiative; // the initiative value for the combatant + + // ... + // The intnitiative value is calculated here + // ... + + let combatant = game["combat"].getCombatantByActor(actor._id); + if (!combatant) { + await game["combat"].createEmbeddedDocuments("Combatant", [{ actorId: actor._id }]); + combatant = game["combat"].getCombatantByActor(actor._id); + } + + const initiatives = { + _id: combatant._id, + initiative: actor.system.calc.attributes.gw.value, + }; + + await game["combat"].updateEmbeddedDocuments("Combatant", [initiatives]); + } + static resistanceBody(actor: any) { const rollData = actor.getRollData() as M5RollData; rollData.i = { diff --git a/source/template.json b/source/template.json index aa632a2..68701f9 100644 --- a/source/template.json +++ b/source/template.json @@ -145,7 +145,7 @@ } }, "Item": { - "types": ["skill", "weapon", "defensiveWeapon", "armor", "spell", "item", "effect"], + "types": ["skill", "weapon", "defensiveWeapon", "armor", "spell", "kampfkunst", "item", "effect"], "templates": { "itemDescription": { "description": "" @@ -232,6 +232,32 @@ "geist": "midgard5.spell-target-geist", "koerper": "midgard5.spell-target-koerper" } + }, + "kampfkunstSelection": { + "kampfkunstTypeSelection": { + "none": "midgard5.spell-process-none", + "angriff": "midgard5.kampfkunst-type-angriff", + "verteidigung": "midgard5.kampfkunst-type-verteidigung", + "finten": "midgard5.kampfkunst-type-finten", + "geist": "midgard5.kampfkunst-type-geist", + "schießkunst": "midgard5.kampfkunst-type-schießkunst", + "fechten": "midgard5.kampfkunst-type-fechten", + "kidoAngriff": "midgard5.kido-type-angriff", + "kidoVerteidigung": "midgard5.kido-type-verteidigung", + "kidoFinten": "midgard5.kido-type-finten", + "kidoLeib": "midgard5.kido-type-leub" + }, + "kampfkunstVarianteSelection": { + "none": "midgard5.spell-process-none", + "anstuermen": "midgard5.kampfkunst-variant-anstuermen", + "attackieren": "midgard5.kampfkunst-variant-attackieren", + "entwaffnen": "midgard5.kampfkunst-variant-entwaffnen" + }, + "spellTargetSelection": { + "umgebung": "midgard5.spell-target-umgebung", + "geist": "midgard5.spell-target-geist", + "koerper": "midgard5.spell-target-koerper" + } } }, "skill": { @@ -343,6 +369,28 @@ "output": "" }, "calc": {} + }, + "kampfkunst": { + "templates": ["itemDescription", "kampfkunstSelection"], + "bonus": 0, + "type": "", + "variante": "", + "ap": "", + "effectTarget": "", + "effectArea": "", + "effectDuration": "", + "origin": "", + "rolls": { + "formulas": { + "0": { + "formula": "1d20 + @c.calc.stats.spellCasting.value + @i.bonus", + "label": "Zaubern", + "enabled": true + } + }, + "output": "" + }, + "calc": {} } } } diff --git a/templates/chat/roll-m5.hbs b/templates/chat/roll-m5.hbs index b893ecb..5799d41 100644 --- a/templates/chat/roll-m5.hbs +++ b/templates/chat/roll-m5.hbs @@ -1,7 +1,7 @@

{{res.label}}

- + {{#if (eq iType "spell")}} @@ -43,6 +43,23 @@ {{/if}} + {{#if (eq iType "kampfkunst")}} + + + + + + + + + {{#if (eq i.type "angriff")}} + + + + + {{/if}} + {{/if}} + {{#each rolls as |roll index|}} {{#if roll.enabled}} diff --git a/templates/sheets/character/kampfkuenste.hbs b/templates/sheets/character/kampfkuenste.hbs new file mode 100644 index 0000000..f396524 --- /dev/null +++ b/templates/sheets/character/kampfkuenste.hbs @@ -0,0 +1,23 @@ +
{{localize "midgard5.actor-ap"}}{{i.ap}}
{{localize "midgard5.kampfkunst-type"}}{{localize (m5concat "midgard5.kampfkunst-type-" i.type)}}
{{localize "midgard5.kampfkunst-variante"}}{{localize (m5concat "midgard5.kampfkunst-variante-" i.variante)}}
+ + + + + + + + + + {{#each data.calc.kampfkuenste as |item itemId|}} + + + + + + + {{/each}} + +
{{localize "ITEM.TypeKampfkunst"}}{{localize "midgard5.ew"}}
+ {{item.label}} + {{localize item.process}} + {{item.calc.ew}}
\ No newline at end of file diff --git a/templates/sheets/character/main.hbs b/templates/sheets/character/main.hbs index 4e5c0c3..9f7f508 100644 --- a/templates/sheets/character/main.hbs +++ b/templates/sheets/character/main.hbs @@ -9,7 +9,10 @@ {{ localize "midgard5.base_values" }} {{ localize "midgard5.skills" }} {{ localize "midgard5.gear" }} - {{ localize "midgard5.spells" }} + {{#if actor.system.info.magicUsing }} + {{ localize "midgard5.spells" }} + {{/if}} + {{ localize "midgard5.kampfkuenste" }} {{ localize "midgard5.effects" }} @@ -31,9 +34,12 @@ {{> "systems/midgard5/templates/sheets/character/spells.hbs"}}
+
+ {{> "systems/midgard5/templates/sheets/character/kampfkuenste.hbs"}} +
+
{{> "systems/midgard5/templates/sheets/character/effects.hbs"}}
- \ No newline at end of file diff --git a/templates/sheets/item/kampfkunst.hbs b/templates/sheets/item/kampfkunst.hbs new file mode 100644 index 0000000..51bc198 --- /dev/null +++ b/templates/sheets/item/kampfkunst.hbs @@ -0,0 +1,75 @@ +
+
+ +

+
+
+ + + + + + + + + + + + + + + + + + {{#if (eq item.system.type "angriff")}} + + + {{/if}} + + + + +
{{localize "midgard5.bonus"}}{{localize "midgard5.actor-ap"}}
{{localize "midgard5.spell-effectTarget"}} + + {{localize "midgard5.spell-effectArea"}}
{{localize "midgard5.spell-type"}} + + {{localize "midgard5.spell-process"}} + +
{{localize "midgard5.weapon-skill"}} + {{#if data.calc.skills.general}} + + {{else}} + {{localize "midgard5.assignItemToCharacter"}} + {{/if}} +
+ + {{> "systems/midgard5/templates/sheets/item/rolls.hbs"}} + + {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
+
\ No newline at end of file