From 16df142d45bdb0f3b8d0123dd2930b2c2a0a540e Mon Sep 17 00:00:00 2001 From: Byroks Date: Tue, 28 Nov 2023 19:50:56 +0100 Subject: [PATCH] v2.0.0 (#8) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Squashed commit of the following: commit 0bfa224dae1ecd3123d032320652f92e9e04e514 Author: Byroks Date: Mon Nov 27 19:56:05 2023 +0100 V1.3.1 (#6) * v1.3.1 * v1.3.1 * update .gitingore commit 35a6b0fae99db5eadc21e491a2438c587b7180b2 Author: Byroks Date: Mon Nov 27 19:48:56 2023 +0100 v1.3.1 commit db21ca93b0458fdbe25b0d764be14bed033c7a6c Author: Byroks Date: Sun Nov 26 13:13:13 2023 +0100 subtract ap when casting spell Changes: + subtract AP when casting a spell * Dev Kampfkünste Items & Integration (#7) Changes: + add kampfkuenste template + add kampfkuenste tab + make kampfkuenste rollable + update localization * v2.0.0 --- gulpfile.ts | 2 +- lang/de.json | 31 ++++++ package.json | 2 +- .../blaupause-gegenstaende/kampfkunst.json | 33 +++++++ source/PreloadTemplates.ts | 1 + source/module/M5Base.ts | 1 + source/module/actors/M5Character.ts | 29 +++++- source/module/items/M5Item.ts | 31 +++++- source/module/rolls/M5Roll.ts | 21 ++++ source/module/sheets/M5CharacterSheet.ts | 2 +- source/system.json | 6 +- source/template.json | 53 +++++++++- templates/chat/roll-m5.hbs | 36 ++++++- templates/sheets/character/kampfkuenste.hbs | 33 +++++++ templates/sheets/character/main.hbs | 10 +- templates/sheets/item/kampfkunst.hbs | 99 +++++++++++++++++++ 16 files changed, 374 insertions(+), 16 deletions(-) create mode 100644 packs/items/blaupause-gegenstaende/kampfkunst.json create mode 100644 templates/sheets/character/kampfkuenste.hbs create mode 100644 templates/sheets/item/kampfkunst.hbs diff --git a/gulpfile.ts b/gulpfile.ts index 01faa71..d17b9ea 100644 --- a/gulpfile.ts +++ b/gulpfile.ts @@ -520,4 +520,4 @@ exports.clean = clean; exports.link = linkUserData; exports.package = packageBuild; exports.update = updateManifest; -exports.publish = gulp.series(clean, updateManifest, execBuild, bundleModule, packageBuild, gitTaskManifest, gitTaskBuild); +exports.publish = gulp.series(clean, updateManifest, execBuild, bundleModule, packageBuild, gitTaskManifest); diff --git a/lang/de.json b/lang/de.json index 20dc7f5..9d42861 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.type.kampfkunst": "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", @@ -238,6 +240,35 @@ "midgard5.spell-effectDuration": "Wirkungsdauer", "midgard5.spell-origin": "Ursprung", + "midgard5.kampfkunst-type": "Kampfkunst Art", + "midgard5.kampfkunst-variante": "Kampfkunst Variante", + "midgard5.kido-type": "Kido Art", + "midgard5.kido-variante": "Kido Variante", + + "midgard5.kampfkunst-type-angriff": "Angriffstechnik", + "midgard5.kampfkunst-type-verteidigung": "Verteidigungstechnik", + "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-variante-anstuermen": "Anstürmen", + "midgard5.kampfkunst-variante-attackieren": "Attackieren", + "midgard5.kampfkunst-variante-entwaffnen": "Entwaffnen", + + "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", + "midgard5.mod-operation-add100": "Addieren (max 100)", "midgard5.mod-operation-add": "Addieren", "midgard5.mod-operation-set": "Basiswert", diff --git a/package.json b/package.json index c4244e2..85606b7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "foundry-system-midgard5", - "version": "1.3.1", + "version": "2.0.0", "description": "", "main": "index.js", "scripts": { diff --git a/packs/items/blaupause-gegenstaende/kampfkunst.json b/packs/items/blaupause-gegenstaende/kampfkunst.json new file mode 100644 index 0000000..11524d8 --- /dev/null +++ b/packs/items/blaupause-gegenstaende/kampfkunst.json @@ -0,0 +1,33 @@ +{ + "name": "Kampfkunst", + "type": "kampfkunst", + "img": "icons/svg/item-bag.svg", + "data": { + "description": "", + "bonus": 0, + "type": "angriff", + "variante": "none", + "isKido": false, + "skillId": "", + "ap": 0, + "rolls": { + "formulas": { + "0": { + "formula": "1d20 + @i.calc.ew + @i.bonus", + "enabled": true, + "label": "Kampfkunst" + } + }, + "output": "" + }, + "calc": {} + }, + "effects": [], + "folder": null, + "sort": 0, + "permission": { + "default": 0, + "XD0IpWT6bN4AJiYQ": 3 + }, + "_id": "HQ469FvZkwKfzFff" +} diff --git a/source/PreloadTemplates.ts b/source/PreloadTemplates.ts index f7f94c7..4dc8b1b 100644 --- a/source/PreloadTemplates.ts +++ b/source/PreloadTemplates.ts @@ -11,6 +11,7 @@ const preloadTemplates = async (): Promise[]> = "sheets/character/skills.hbs", "sheets/character/gear.hbs", "sheets/character/spells.hbs", + "sheets/character/kampfkuenste.hbs", "sheets/character/effects.hbs", "sheets/item/rolls.hbs", "chat/roll-m5.hbs", diff --git a/source/module/M5Base.ts b/source/module/M5Base.ts index 9d2020a..27e40a2 100644 --- a/source/module/M5Base.ts +++ b/source/module/M5Base.ts @@ -170,6 +170,7 @@ export interface M5CharacterCalculatedData { effects: {}; }; spells: {}; + kampfkuenste: {}; } export function enumKeys(obj: O): K[] { diff --git a/source/module/actors/M5Character.ts b/source/module/actors/M5Character.ts index b67bab4..7bdd89f 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,22 @@ 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, + isKido: item.system.isKido, + type: item.system.type, + variante: item.system.variante, + calc: item.system.calc, + }; + }); + } + return ret; } diff --git a/source/module/items/M5Item.ts b/source/module/items/M5Item.ts index c759191..029f552 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,11 +108,32 @@ 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; + calc.bonus = 0; + calc.ew = 0; + calc.generalSkills = null; + + if (actor) { + const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true, effects: true, kampfkuenste: true }); + if (actorCalc) { + calc.generalSkills = actorCalc.skills.general; + } + + const skill = character.getItem(itemData.skillId); + if (skill) { + skill.prepareDerivedData(); + const skillData = skill.system; + calc.ew = skillData.calc.ew; + calc.fw = skillData.fw + calc.bonus; + itemData.rolls.formulas[0].label = skill.name; + } + } } else if (itemType === "item" || itemType === "effect") { calc.mods = {}; Object.keys(itemData?.mods).forEach((key) => { @@ -135,7 +156,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/module/sheets/M5CharacterSheet.ts b/source/module/sheets/M5CharacterSheet.ts index 655ef3e..338faed 100644 --- a/source/module/sheets/M5CharacterSheet.ts +++ b/source/module/sheets/M5CharacterSheet.ts @@ -206,7 +206,7 @@ export default class M5CharacterSheet extends ActorSheet { const item = this.actor.items.get(li.dataset.itemId); // limit transfer on personal weapons/armour/gear - if (["skill", "item", "weapon", "defensiveWeapon", "armor", "spell", "effect"].includes(item.type)) { + if (["skill", "item", "weapon", "defensiveWeapon", "armor", "spell", "effect", "kampfkunst"].includes(item.type)) { const dragData = { type: "Transfer", actorId: this.actor.id, diff --git a/source/system.json b/source/system.json index d65c1f2..f347969 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": "1.3.1", + "version": "2.0.0", "compatibility": { "minimum": "10", "verified": "11", @@ -89,8 +89,8 @@ "primaryTokenAttribute": "lp", "secondaryTokenAttribute": "ap", "url": "https://github.com/Byroks/foundry-vtt-system-midgard5", - "manifest": "https://github.com/Byroks/foundry-vtt-system-midgard5/releases/download/v1.3.1/system.json", - "download": "https://github.com/Byroks/foundry-vtt-system-midgard5/releases/download/v1.3.1/midgard5-v1.3.1.zip", + "manifest": "https://github.com/Byroks/foundry-vtt-system-midgard5/releases/download/v2.0.0/system.json", + "download": "https://github.com/Byroks/foundry-vtt-system-midgard5/releases/download/v2.0.0/midgard5-v2.0.0.zip", "initiative": "@c.calc.attributes.gw.value", "license": "LICENSE.txt" } \ No newline at end of file diff --git a/source/template.json b/source/template.json index aa632a2..7b06587 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,38 @@ "geist": "midgard5.spell-target-geist", "koerper": "midgard5.spell-target-koerper" } + }, + "kampfkunstSelection": { + "kampfkunstTypeSelection": { + "angriff": "midgard5.kampfkunst-type-angriff", + "verteidigung": "midgard5.kampfkunst-type-verteidigung", + "finte": "midgard5.kampfkunst-type-finte", + "geist": "midgard5.kampfkunst-type-geist", + "schießkunst": "midgard5.kampfkunst-type-schießkunst", + "fechten": "midgard5.kampfkunst-type-fechten" + }, + "kidoTypeSelection": { + "angriff": "midgard5.kido-type-angriff", + "verteidigung": "midgard5.kido-type-verteidigung", + "finte": "midgard5.kido-type-finte", + "leib": "midgard5.kido-type-leib" + }, + "kampfkunstVarianteSelection": { + "anstuermen": "midgard5.kampfkunst-variante-anstuermen", + "attackieren": "midgard5.kampfkunst-variante-attackieren", + "entwaffnen": "midgard5.kampfkunst-variante-entwaffnen" + }, + "kidoVarianteSelection": { + "none": "midgard5.spell-process-none", + "anspringen": "midgard5.kido-variante-anspringen", + "attackieren": "midgard5.kido-variante-attackieren", + "entwaffnen": "midgard5.kido-variante-entwaffnen", + "werfen": "midgard5.kido-variante-werfen", + "ausweichen": "midgard5.kido-variante-ausweichen", + "blockieren": "midgard5.kido-variante-blockieren", + "bewegen": "midgard5.kido-variante-bewegen", + "kontrollieren": "midgard5.kido-variante-kontrollieren" + } } }, "skill": { @@ -343,6 +375,25 @@ "output": "" }, "calc": {} + }, + "kampfkunst": { + "templates": ["itemDescription", "kampfkunstSelection"], + "bonus": 0, + "type": "", + "variante": "", + "isKido": false, + "ap": "", + "rolls": { + "formulas": { + "0": { + "formula": "1d20 + @i.calc.ew + @i.bonus", + "label": "Kampfkunst", + "enabled": true + } + }, + "output": "" + }, + "calc": {} } } } diff --git a/templates/chat/roll-m5.hbs b/templates/chat/roll-m5.hbs index b893ecb..c8bd1bb 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,40 @@ {{/if}} + {{#if (eq iType "kampfkunst")}} + {{#unless i.isKido}} + + + + + + + + + {{#if (eq i.type "angriff")}} + + + + + {{/if}} + {{else}} + + + + + + + + + {{#if (eq i.type "angriff")}} + + + + + {{/if}} + {{/unless}} + {{/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..aca42af --- /dev/null +++ b/templates/sheets/character/kampfkuenste.hbs @@ -0,0 +1,33 @@ +
{{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)}}
{{localize "midgard5.actor-ap"}}{{i.ap}}
{{localize "midgard5.kido-type"}}{{localize (m5concat "midgard5.kido-type-" i.type)}}
{{localize "midgard5.kido-variante"}}{{localize (m5concat "midgard5.kido-variante-" i.variante)}}
+ + + + + + + + + + {{#each data.calc.kampfkuenste as |item itemId|}} + + + + + + + {{/each}} + +
{{localize "ITEM.type.kampfkunst"}}{{localize "midgard5.ew"}}
+ {{item.label}} + {{#if item.isKido}} + {{localize (m5concat "midgard5.kido-type-" item.type)}} + {{#unless (eq item.type "finte")}} + ({{localize (m5concat "midgard5.kido-variante-" item.variante)}}) + {{/unless}} + {{else}} + {{localize (m5concat "midgard5.kampfkunst-type-" item.type)}} + {{#if (eq item.type "angriff")}} + ({{localize (m5concat "midgard5.kampfkunst-variante-" item.variante)}}) + {{/if}} + {{/if}} + {{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..6624265 --- /dev/null +++ b/templates/sheets/item/kampfkunst.hbs @@ -0,0 +1,99 @@ +
+
+ +

+
+
+ + + + + + + + + + + + + {{#unless item.system.isKido}} + + + {{else}} + + + {{/unless}} + {{#unless item.system.isKido}} + {{#if (eq item.system.type "angriff")}} + + + {{/if}} + {{else}} + {{#unless (eq item.system.type "finte")}} + + + {{/unless}} + {{/unless}} + + + + +
+
+ + + + +
+
{{localize "midgard5.bonus"}}{{localize "midgard5.actor-ap"}}
{{localize "midgard5.kampfkunst-type"}} + + {{localize "midgard5.kido-type"}} + + {{localize "midgard5.kampfkunst-variante"}} + + {{localize "midgard5.kido-variante"}} + +
{{localize "midgard5.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