Compare commits

...

1 Commits

Author SHA1 Message Date
Byroks 16df142d45
v2.0.0 (#8)
* Squashed commit of the following:

commit 0bfa224dae
Author: Byroks <byroks@gmail.com>
Date:   Mon Nov 27 19:56:05 2023 +0100

    V1.3.1 (#6)

    * v1.3.1

    * v1.3.1

    * update .gitingore

commit 35a6b0fae9
Author: Byroks <byroks@gmail.com>
Date:   Mon Nov 27 19:48:56 2023 +0100

    v1.3.1

commit db21ca93b0
Author: Byroks <byroks@gmail.com>
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
2023-11-28 19:50:56 +01:00
16 changed files with 374 additions and 16 deletions

View File

@ -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);

View File

@ -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",

View File

@ -1,6 +1,6 @@
{
"name": "foundry-system-midgard5",
"version": "1.3.1",
"version": "2.0.0",
"description": "",
"main": "index.js",
"scripts": {

View File

@ -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"
}

View File

@ -11,6 +11,7 @@ const preloadTemplates = async (): Promise<Handlebars.TemplateDelegate<any>[]> =
"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",

View File

@ -170,6 +170,7 @@ export interface M5CharacterCalculatedData {
effects: {};
};
spells: {};
kampfkuenste: {};
}
export function enumKeys<O extends object, K extends keyof O = keyof O>(obj: O): K[] {

View File

@ -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;
}

View File

@ -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) => {

View File

@ -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 = {

View File

@ -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,

View File

@ -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"
}

View File

@ -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": {}
}
}
}

View File

@ -1,7 +1,7 @@
<div class="dice-roll m5-roll">
<div class="flexcol">
<h3 class="roll-title">{{res.label}}</h3>
<table>
<tbody>
{{#if (eq iType "spell")}}
@ -43,6 +43,40 @@
</tr>
{{/if}}
{{#if (eq iType "kampfkunst")}}
{{#unless i.isKido}}
<tr>
<td>{{localize "midgard5.actor-ap"}}</td>
<td class="roll-spell-details">{{i.ap}}</td>
</tr>
<tr>
<td>{{localize "midgard5.kampfkunst-type"}}</td>
<td class="roll-spell-details">{{localize (m5concat "midgard5.kampfkunst-type-" i.type)}}</td>
</tr>
{{#if (eq i.type "angriff")}}
<tr>
<td>{{localize "midgard5.kampfkunst-variante"}}</td>
<td class="roll-spell-details">{{localize (m5concat "midgard5.kampfkunst-variante-" i.variante)}}</td>
</tr>
{{/if}}
{{else}}
<tr>
<td>{{localize "midgard5.actor-ap"}}</td>
<td class="roll-spell-details">{{i.ap}}</td>
</tr>
<tr>
<td>{{localize "midgard5.kido-type"}}</td>
<td class="roll-spell-details">{{localize (m5concat "midgard5.kido-type-" i.type)}}</td>
</tr>
{{#if (eq i.type "angriff")}}
<tr>
<td>{{localize "midgard5.kido-variante"}}</td>
<td class="roll-spell-details">{{localize (m5concat "midgard5.kido-variante-" i.variante)}}</td>
</tr>
{{/if}}
{{/unless}}
{{/if}}
{{#each rolls as |roll index|}}
{{#if roll.enabled}}
<tr class="roll-row {{roll.css}}">

View File

@ -0,0 +1,33 @@
<table>
<thead>
<tr>
<th>{{localize "ITEM.type.kampfkunst"}}</th>
<th>{{localize "midgard5.ew"}}</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{{#each data.calc.kampfkuenste as |item itemId|}}
<tr data-item="{{itemId}}">
<td class="padding edit-item">
<span>{{item.label}}</span>
{{#if item.isKido}}
<span class="spell-process">{{localize (m5concat "midgard5.kido-type-" item.type)}}</span>
{{#unless (eq item.type "finte")}}
<span class="spell-process">({{localize (m5concat "midgard5.kido-variante-" item.variante)}})</span>
{{/unless}}
{{else}}
<span class="spell-process">{{localize (m5concat "midgard5.kampfkunst-type-" item.type)}}</span>
{{#if (eq item.type "angriff")}}
<span class="spell-process">({{localize (m5concat "midgard5.kampfkunst-variante-" item.variante)}})</span>
{{/if}}
{{/if}}
</td>
<td class="fixed-value">{{item.calc.ew}}</td>
<td class="fixed-value"><button class="roll-button roll-weapon-button" /></td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
</tbody>
</table>

View File

@ -9,7 +9,10 @@
<a class="item active" data-tab="base_values">{{ localize "midgard5.base_values" }}</a>
<a class="item" data-tab="skills">{{ localize "midgard5.skills" }}</a>
<a class="item" data-tab="gear">{{ localize "midgard5.gear" }}</a>
<a class="item" data-tab="spells">{{ localize "midgard5.spells" }}</a>
{{#if actor.system.info.magicUsing }}
<a class="item" data-tab="spells">{{ localize "midgard5.spells" }}</a>
{{/if}}
<a class="item" data-tab="kampfkuenste">{{ localize "midgard5.kampfkuenste" }}</a>
<a class="item" data-tab="effects">{{ localize "midgard5.effects" }}</a>
</nav>
@ -31,9 +34,12 @@
{{> "systems/midgard5/templates/sheets/character/spells.hbs"}}
</div>
<div class="tab base_values flexcol" data-group="primary" data-tab="kampfkuenste">
{{> "systems/midgard5/templates/sheets/character/kampfkuenste.hbs"}}
</div>
<div class="tab base_values flexcol" data-group="primary" data-tab="effects">
{{> "systems/midgard5/templates/sheets/character/effects.hbs"}}
</div>
</section>
</form>

View File

@ -0,0 +1,99 @@
<form class="item-sheet {{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<h1><input name="name" type="text" value="{{item.name}}" placeholder="Name" /></h1>
</header>
<div class="sheet-content">
<table>
<tbody>
<tr>
<td colspan=4>
<div class="flexrow">
<span>
<input id="data.isKido" type="checkbox" name="data.isKido" {{checked data.isKido}}>
<label for="data.isKido">{{localize "midgard5.kido"}}</label>
</span>
</div>
</td>
</tr>
<tr>
<td>{{localize "midgard5.bonus"}}</td>
<td><input name="data.bonus" type="text" value="{{data.bonus}}" data-dtype="Number" /></td>
<td>{{localize "midgard5.actor-ap"}}</td>
<td><input name="data.ap" type="text" value="{{data.ap}}" data-dtype="String" /></td>
</tr>
<tr>
{{#unless item.system.isKido}}
<td>{{localize "midgard5.kampfkunst-type"}}</td>
<td>
<select class="select-type" name="data.type" data-type="String">
{{#select data.type}}
{{#each data.kampfkunstTypeSelection as |label key|}}
<option value="{{key}}">{{localize label}}</option>
{{/each}}
{{/select}}
</select>
</td>
{{else}}
<td>{{localize "midgard5.kido-type"}}</td>
<td>
<select class="select-type" name="data.type" data-type="String">
{{#select data.type}}
{{#each data.kidoTypeSelection as |label key|}}
<option value="{{key}}">{{localize label}}</option>
{{/each}}
{{/select}}
</select>
</td>
{{/unless}}
{{#unless item.system.isKido}}
{{#if (eq item.system.type "angriff")}}
<td>{{localize "midgard5.kampfkunst-variante"}}</td>
<td>
<select class="select-variante" name="data.variante" data-type="String">
{{#select data.variante}}
{{#each data.kampfkunstVarianteSelection as |label key|}}
<option value="{{key}}">{{localize label}}</option>
{{/each}}
{{/select}}
</select>
</td>
{{/if}}
{{else}}
{{#unless (eq item.system.type "finte")}}
<td>{{localize "midgard5.kido-variante"}}</td>
<td>
<select class="select-variante" name="data.variante" data-type="String">
{{#select data.variante}}
{{#each data.kidoVarianteSelection as |label key|}}
<option value="{{key}}">{{localize label}}</option>
{{/each}}
{{/select}}
</select>
</td>
{{/unless}}
{{/unless}}
</tr>
<td>{{localize "midgard5.skill"}}</td>
<td>
{{!-- {{#if data.calc.skills.general}} --}}
<select class="select-skill" name="data.skillId" data-type="String">
{{#select data.skillId}}
<option value="">{{localize "midgard5.no-skill"}}</option>
{{#each data.calc.generalSkills as |skill key|}}
<option value="{{key}}">{{skill.label}}</option>
{{/each}}
{{/select}}
</select>
{{!-- {{else}}
<span>{{localize "midgard5.assignItemToCharacter"}}</span>
{{/if}} --}}
</td>
</tbody>
</table>
{{> "systems/midgard5/templates/sheets/item/rolls.hbs"}}
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div>
</form>