Zwergenhort #4

Merged
Byroks merged 11 commits from lefrique into develop 2024-01-07 14:31:21 +01:00
14 changed files with 234 additions and 34 deletions

View File

@ -1,4 +1,5 @@
{
"moduleName": "Midgard 5. Edition",
"repository": "https://git.byroks.de/Byroks/foundry-vtt-system-midgard5"
"repository": "https://github.com/Byroks/foundry-vtt-system-midgard5",
"rawURL": "https://raw.githubusercontent.com/Byroks/foundry-vtt-system-midgard5"
}

View File

@ -42,6 +42,7 @@
"midgard5.item-quantity": "Menge",
"midgard5.item-onbody": "Am Körper",
"midgard5.item-ismagic": "Ist Magisch",
"midgard5.item-wealth": "Vermögenswert",
"midgard5.actor-lp": "Lebenspunkte",
"midgard5.actor-lp-short": "LP",
@ -97,6 +98,12 @@
"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",
"midgard5.no-container": "Ohne",
@ -221,6 +228,7 @@
"midgard5.defensive-weapon": "Verteidigungswaffe",
"midgard5.no-skill": "Keine Fertigkeit",
"midgard5.magic": "magisch",
"midgard5.valuable": "Vermögen",
"midgard5.equipped": "Ausgerüstet",
"midgard5.active": "Aktiv",
"midgard5.rangedWeapon": "Schusswaffe",

View File

@ -8,6 +8,7 @@ const preloadTemplates = async (): Promise<Handlebars.TemplateDelegate<any>[]> =
const templates: Array<string> = [
"sheets/character/attribute.hbs",
"sheets/character/base_values.hbs",
"sheets/character/main.hbs",
"sheets/character/skills.hbs",
"sheets/character/gear.hbs",
"sheets/character/spells.hbs",

View File

@ -86,6 +86,10 @@ export enum M5Stats {
PROTECTION_AP = "apProtection",
PERCEPTION = "perception",
DRINKING = "drinking",
HOARD = "hoard",
HOARD_NEXT = "hoardNext",
HOARD_MIN = "hoardMin",
WEALTH = "wealth",
}
export enum M5ModType {
@ -173,6 +177,10 @@ export interface M5CharacterCalculatedData {
perceptionFW: number;
drinking: M5ModResult;
drinkingFW: number;
hoard: number;
hoardNext: number;
hoardMin: number;
wealth: number;
};
skillMods: {};
skills: {

View File

@ -1,7 +1,6 @@
import { M5Item } from "../items/M5Item";
import { M5Attribute, M5CharacterCalculatedData, M5ItemMod, M5ModOperation, M5ModResult, M5RollData, M5Skill, M5SkillCalculated, M5SkillLearned } from "../M5Base";
import M5ModAggregate from "./M5ModAggregate";
export class M5Character extends Actor {
// constructor(
// data: ConstructorParameters<typeof foundry.documents.BaseActor>[0],
@ -72,6 +71,7 @@ export class M5Character extends Actor {
perceptionFW: 0,
drinking: { value: 0, mods: [] },
drinkingFW: 0,
hoard: 0,
},
skillMods: {},
skills: {
@ -99,7 +99,7 @@ export class M5Character extends Actor {
const data = (this as any).system;
if (!data) return null;
ret.level = M5Character.levelFromExp(data.es);
ret.level = M5Character.levelFromExp(data.info.race === "Zwerg" ? Math.min(data.calc.stats?.hoard * 2 || 0, data.es) : data.es);
ret.attributes.st.value = M5Character.attributeMinMax(data.attributes.st); // TODO item effects
ret.attributes.gs.value = M5Character.attributeMinMax(data.attributes.gs);
@ -145,6 +145,11 @@ export class M5Character extends Actor {
ret.stats.perceptionFW = 6;
ret.stats.drinking = this.modResult(0);
ret.stats.drinkingFW = Math.floor(ret.attributes.ko.value / 10);
ret.stats.hoardMin = M5Character.levelThreshold.at (ret.level - 1)/2;
ret.stats.hoardNext = M5Character.levelThreshold.at (ret.level)/2;
ret.stats.wealth = data.info.gold + data.info.silver/10 + data.info.copper/100;
ret.stats.hoard = 0;
if (!skip?.mods) {
const aggregate = new M5ModAggregate(data, ret);
@ -172,7 +177,14 @@ export class M5Character extends Actor {
let label = item.name;
if (item.system.magic) {
label += "*";
};
if (item.system.valuable) {
ret.stats.wealth += item.system.value || 0;
};
if (item.system.hoarded) {
ret.stats.hoard += item.system.value || 0;
}
let icon = item.img;
let rollable = false;
@ -183,12 +195,15 @@ export class M5Character extends Actor {
break;
}
}
ret.gear.items[item.id] = {
label: label,
icon: icon,
magic: item.system.magic,
calc: item.system.calc,
equipped: item.system?.equipped,
valuable: item.system?.valuable,
hoarded: item.system?.hoarded,
weight: item.system.weight || 0,
containerId: item.system.containerId || "",
value: item.system.value || 0,
@ -223,6 +238,8 @@ export class M5Character extends Actor {
label: label,
icon: icon,
magic: item.system.magic,
valuable: item.system?.valuable,
hoarded: item.system?.hoarded,
calc: item.system.calc,
equipped: item.system?.equipped,
weight: item.system.weight || 0,
@ -232,6 +249,7 @@ export class M5Character extends Actor {
quantity: item.system.quantity || 0,
rollExist: rollable,
};
});
}
@ -244,8 +262,8 @@ export class M5Character extends Actor {
let label = item.name;
if (item.system.magic) {
label += "*";
}
};
ret.gear.effects[item.id] = {
label: label,
magic: item.system.magic,
@ -288,12 +306,21 @@ export class M5Character extends Actor {
(item.system.stats.damageBonus < 0 ? "" : "+") +
item.system.stats.damageBonus +
")";
};
if (item.system.valuable) {
ret.stats.wealth += item.system.value || 0;
};
if (item.system.hoarded) {
ret.stats.hoard += item.system.value || 0;
}
ret.gear.weapons[item.id] = {
label: label,
skillId: item.system.skillId,
magic: item.system.magic,
valuable: item.system?.valuable,
hoarded: item.system?.hoarded,
value: item.system.value || 0,
calc: item.system.calc,
};
});
@ -308,12 +335,21 @@ export class M5Character extends Actor {
let label = item.name;
if (item.system.magic) {
label += "*(" + (item.system.stats.defenseBonus < 0 ? "" : "+") + item.system.stats.defenseBonus + ")";
};
if (item.system.valuable) {
ret.stats.wealth += item.system.value || 0;
};
if (item.system.hoarded) {
ret.stats.hoard += item.system.value || 0;
}
ret.gear.defensiveWeapons[item.id] = {
label: label,
skillId: item.system.skillId,
magic: item.system.magic,
valuable: item.system?.valuable,
hoarded: item.system?.hoarded,
value: item.system.value || 0,
calc: item.system.calc,
};
});
@ -328,11 +364,20 @@ export class M5Character extends Actor {
let label = item.name;
if (item.system.magic) {
label += "*";
};
if (item.system.valuable) {
ret.stats.wealth += item.system.value || 0;
};
if (item.system.hoarded) {
ret.stats.hoard += item.system.value || 0;
}
ret.gear.armor[item.id] = {
label: label,
magic: item.system.magic,
valuable: item.system?.valuable,
hoarded: item.system?.hoarded,
value: item.system.value || 0,
calc: item.system.calc,
equipped: item.system?.equipped,
};

View File

@ -9,7 +9,7 @@
"verified": "11",
"maximum": "11"
},
"authors": [{ "name": "Byroks" }],
"authors": [{"name": "Byroks"}],
"scripts": ["bundle.js"],
"styles": ["bundle.css"],
"packs": [
@ -103,25 +103,41 @@
"name": "Midgard 5",
"sorting": "a",
"color": "#0000FF",
"packs": ["blaupause-spielfiguren", "tabellen-kritische-ereignisse", "makros-kritische-ereignisse", "makros-standardwurfel"],
"packs": [
"blaupause-spielfiguren",
"tabellen-kritische-ereignisse",
"makros-kritische-ereignisse",
"makros-standardwurfel"
],
"folders": [
{
"name": "Ausrüstung",
"sorting": "a",
"color": "#008000",
"packs": ["ausruestung", "ruestkammer", "waffenkammer"]
"packs": [
"ausruestung",
"ruestkammer",
"waffenkammer"
]
},
{
"name": "Effekte",
"sorting": "a",
"color": "#800080",
"packs": ["kampfzustaende", "verletzungen", "zauberwirkungen"]
"packs": [
"kampfzustaende",
"verletzungen",
"zauberwirkungen"
]
},
{
"name": "Fähigkeiten",
"sorting": "a",
"color": "#800000",
"packs": ["fertigkeiten", "kampf"]
"packs": [
"fertigkeiten",
"kampf"
]
}
]
}
@ -137,9 +153,9 @@
"gridUnits": "m",
"primaryTokenAttribute": "lp",
"secondaryTokenAttribute": "ap",
"url": "https://git.byroks.de/Byroks/foundry-vtt-system-midgard5",
"manifest": "https://git.byroks.de/Byroks/foundry-vtt-system-midgard5/releases/download/v2.3.1/system.json",
"download": "https://git.byroks.de/Byroks/foundry-vtt-system-midgard5/releases/download/v2.3.1/midgard5-v2.3.1.zip",
"url": "https://github.com/Byroks/foundry-vtt-system-midgard5",
"manifest": "https://github.com/Byroks/foundry-vtt-system-midgard5/releases/download/v2.3.1/system.json",
"download": "https://github.com/Byroks/foundry-vtt-system-midgard5/releases/download/v2.3.1/midgard5-v2.3.1.zip",
"initiative": "@c.calc.attributes.gw.value",
"license": "LICENSE.txt"
}
}

View File

@ -204,6 +204,14 @@
"equippable": false,
"equipped": true
},
"valuable": {
"valuable": false,
"item-wealth": true
},
"hoarded": {
"hoarded": false,
"inHoard": true
},
"physical": {
"value": 0,
"weight": 0,
@ -303,7 +311,7 @@
"calc": {}
},
"item": {
"templates": ["itemDescription", "equippable", "physical"],
"templates": ["itemDescription", "equippable", "physical","valuable","hoarded"],
"rolls": {
"formulas": {},
"output": ""
@ -330,9 +338,11 @@
"calc": {}
},
"weapon": {
"templates": ["itemDescription", "stats", "equippable", "physical"],
"templates": ["itemDescription", "stats", "equippable", "physical","valuable","hoarded"],
"special": false,
"ranged": false,
"valuable": false,
"hoarded": false,
"skillId": "",
"damageBase": "1d6",
"rolls": {
@ -353,8 +363,10 @@
"calc": {}
},
"defensiveWeapon": {
"templates": ["itemDescription", "stats", "equippable", "physical"],
"templates": ["itemDescription", "stats", "equippable", "physical","valuable","hoarded"],
"special": false,
"valuable": false,
"hoarded": false,
"skillId": "",
"rolls": {
"formulas": {
@ -369,9 +381,11 @@
"calc": {}
},
"armor": {
"templates": ["itemDescription", "stats", "equippable", "attributeMod", "physical"],
"templates": ["itemDescription", "stats", "equippable", "attributeMod", "physical","valuable","hoarded"],
"lpProtection": 0,
"apProtection": 0,
"valuable": false,
"hoarded": false,
"rolls": {
"formulas": {},
"output": ""

View File

@ -109,17 +109,21 @@
<td>{{localize "midgard5.resistanceBody"}}</td>
<td class="fixed-value">{{data.calc.stats.resistanceBody.value}}</td>
</tr>
<tr>
<td>{{localize "midgard5.resistanceMind"}}</td>
<td class="fixed-value">{{data.calc.stats.resistanceMind.value}}</td>
<td>{{localize "midgard5.resistanceBody"}}</td>
<td class="fixed-value">{{data.calc.stats.resistanceBody.value}}</td>
</tr>
<tr>
<td>{{localize "midgard5.movementRange"}}</td>
<td class="fixed-value">{{data.calc.stats.movement.value}}</td>
<td>{{localize "midgard5.actor-git-long"}}</td>
<td class="fixed-value">{{data.calc.stats.poisonResistance.value}}</td>
{{#if (eq data.info.race "Zwerg")}}
<td>{{localize "midgard5.hoard"}}</td>
<td class="fixed-value">{{data.calc.stats.hoard}}</td>
{{/if}}
</tr>
<tr>
{{#if (eq data.info.race "Zwerg")}}
<td>{{localize "midgard5.hoardMin"}}</td>
<td class="fixed-value">{{data.calc.stats.hoardMin}}</td>
<td>{{localize "midgard5.hoard-next"}}</td>
<td class="fixed-value">{{data.calc.stats.hoardNext}}</td>
{{/if}}
</tr>
<tr height = 10px></tr>
</tbody>

View File

@ -6,17 +6,25 @@
<table>
<thead class="theader">
<tr>
<th class="title" style="text-align: center">{{localize "midgard5.currency-wealth"}}</th>
<th class="title" style="text-align: center">{{localize "midgard5.currency-gold"}}</th>
<th class="title" style="text-align: center">{{localize "midgard5.currency-silver"}}</th>
<th class="title" style="text-align: center">{{localize "midgard5.currency-copper"}}</th>
{{#if (eq data.info.race "Zwerg")}}
<th class="title" style="text-align: center">{{localize "midgard5.hoard"}}</th>
{{/if}}
</tr>
</thead>
<tbody>
<tr height = 10px></tr>
<tr>
<td class="fixed-value"><input type="number" name="data.info.wealth" value="{{data.calc.stats.wealth}}"></td>
<td class="fixed-value"><input type="number" name="data.info.gold" value="{{data.info.gold}}"></td>
<td class="fixed-value"><input type="number" name="data.info.silver" value="{{data.info.silver}}"></td>
<td class="fixed-value"><input type="number" name="data.info.copper" value="{{data.info.copper}}"></td>
{{#if (eq data.info.race "Zwerg")}}
<td class="fixed-value"><input type="number" name="midgard5.hoard" value="{{data.calc.stats.hoard}}"></td>
{{/if}}
</tr>
</tbody>
</table>

View File

@ -7,7 +7,7 @@
<td></td>
<td colspan="5" style="font-size: x-large; font-weigh: bold;"><input name="name" type="text" value="{{actor.name}}" data-dtype="String" /></td>
<td style="font-size: x-large; font-weigh: bold; text-align: center; text-align-vertical: middle;" ><div style="border: 2px solid black; border-radius: 10px; background-color: white;">{{data.calc.level}}</div></td>
</tr>
</tr>
<tr>
<td></td>
<td colspan="5"><b>Name</b></td>

View File

@ -18,6 +18,34 @@
<input id="data.magic" type="checkbox" name="data.magic" {{checked data.magic}} />
<label for="data.magic">{{localize "midgard5.magic"}}</label>
</span>
<span>
<input id="data.valuable" type="checkbox" name="data.valuable" {{checked data.valuable}}>
<label for="data.valuable">{{localize "midgard5.valuable"}}</label>
</span>
{{#if (eq item.parent.system.info.race "Zwerg")}}
<span>
<input id="data.hoarded" type="checkbox" name="data.hoarded" {{checked data.hoarded}}>
<label for="data.hoarded">{{localize "midgard5.hoarded"}}</label>
</span>
{{/if}}
</div>
</td>
</tr>
<tr>
<td colspan="4">
<div class="flexrow">
<span>{{localize "midgard5.item-value"}}</span>
<input name="data.value" type="number" value="{{data.value}}" data-dtype="Number" />
<select class="select-mod-operation" name="data.currency" data-type="String">
{{#select data.currency}}
<option value=""></option>
<option value="copper">{{localize "midgard5.currency-copper"}}</option>
<option value="silver">{{localize "midgard5.currency-silver"}}</option>
<option value="gold">{{localize "midgard5.currency-gold"}}</option>
{{/select}}
</select>
</div>
</td>
</tr>

View File

@ -7,7 +7,7 @@
<table>
<tbody>
<tr>
<td colspan=4>
<td colspan="4">
<div class="flexrow">
<span>
<input id="data.magic" type="checkbox" name="data.magic" {{checked data.magic}}>
@ -18,6 +18,34 @@
<input id="data.special" type="checkbox" name="data.special" {{checked data.special}}>
<label for="data.special">{{localize "midgard5.special"}}</label>
</span>
<span>
<input id="data.valuable" type="checkbox" name="data.valuable" {{checked data.valuable}}>
<label for="data.valuable">{{localize "midgard5.valuable"}}</label>
</span>
{{#if (eq item.parent.system.info.race "Zwerg")}}
<span>
<input id="data.hoarded" type="checkbox" name="data.hoarded" {{checked data.hoarded}}>
<label for="data.hoarded">{{localize "midgard5.hoarded"}}</label>
</span>
{{/if}}
</div>
</td>
</tr>
<tr>
<td colspan="4">
<div class="flexrow">
<span>{{localize "midgard5.item-value"}}</span>
<input name="data.value" type="number" value="{{data.value}}" data-dtype="Number" />
<select class="select-mod-operation" name="data.currency" data-type="String">
{{#select data.currency}}
<option value=""></option>
<option value="copper">{{localize "midgard5.currency-copper"}}</option>
<option value="silver">{{localize "midgard5.currency-silver"}}</option>
<option value="gold">{{localize "midgard5.currency-gold"}}</option>
{{/select}}
</select>
</div>
</td>
</tr>

View File

@ -6,7 +6,7 @@
<div class="sheet-content">
<table>
<tr>
<td colspan=4>
<td colspan="4">
<div class="flexrow">
<span>
<input id="data.equipped" type="checkbox" name="data.equipped" {{checked data.equipped}}>
@ -16,6 +16,17 @@
<input id="data.magic" type="checkbox" name="data.magic" {{checked data.magic}}>
<label for="data.magic">{{localize "midgard5.magic"}}</label>
</span>
<span>
<input id="data.valuable" type="checkbox" name="data.valuable" {{checked data.valuable}}>
<label for="data.valuable">{{localize "midgard5.valuable"}}</label>
</span>
{{#if (eq item.parent.system.info.race "Zwerg")}}
<span>
<input id="data.hoarded" type="checkbox" name="data.hoarded" {{checked data.hoarded}}>
<label for="data.hoarded">{{localize "midgard5.hoarded"}}</label>
</span>
{{/if}}
</div>
</td>
</tr>
@ -28,7 +39,7 @@
</td>
</tr>
<tr>
<td>
<td colspan="4">
<div class="flexrow">
<span>{{localize "midgard5.item-value"}}</span>
<input name="data.value" type="number" value="{{data.value}}" data-dtype="Number" />

View File

@ -7,7 +7,7 @@
<table>
<tbody>
<tr>
<td colspan=4>
<td colspan="5">
<div class="flexrow">
<span>
<input id="data.magic" type="checkbox" name="data.magic" {{checked data.magic}}>
@ -23,6 +23,34 @@
<input id="data.special" type="checkbox" name="data.special" {{checked data.special}}>
<label for="data.special">{{localize "midgard5.special"}}</label>
</span>
<span>
<input id="data.valuable" type="checkbox" name="data.valuable" {{checked data.valuable}}>
<label for="data.valuable">{{localize "midgard5.valuable"}}</label>
</span>
{{#if (eq item.parent.system.info.race "Zwerg")}}
<span>
<input id="data.hoarded" type="checkbox" name="data.hoarded" {{checked data.hoarded}}>
<label for="data.hoarded">{{localize "midgard5.hoarded"}}</label>
</span>
{{/if}}
</div>
</td>
</tr>
<tr>
<td colspan="4">
<div class="flexrow">
<span>{{localize "midgard5.item-value"}}</span>
<input name="data.value" type="number" value="{{data.value}}" data-dtype="Number" />
<select class="select-mod-operation" name="data.currency" data-type="String">
{{#select data.currency}}
<option value=""></option>
<option value="copper">{{localize "midgard5.currency-copper"}}</option>
<option value="silver">{{localize "midgard5.currency-silver"}}</option>
<option value="gold">{{localize "midgard5.currency-gold"}}</option>
{{/select}}
</select>
</div>
</td>
</tr>