#91 Automatische Praxispunkte #93

Merged
Byroks merged 2 commits from #91-automatische-praxispunkte into develop 2024-03-24 15:09:10 +01:00
8 changed files with 175 additions and 105 deletions
Showing only changes of commit 34e8998305 - Show all commits

View File

@ -295,10 +295,11 @@
"midgard5.spell-process-nekromantie": "Nekromantie", "midgard5.spell-process-nekromantie": "Nekromantie",
"midgard5.spell-process-runenstaebe": "Runenstäbe", "midgard5.spell-process-runenstaebe": "Runenstäbe",
"midgard5.spell-process-thaumatherapie": "Thaumatherapie", "midgard5.spell-process-thaumatherapie": "Thaumatherapie",
"midgard5.spell-process-thaumagraphie": "Thaumagraphie",
"midgard5.spell-process-veraendern": "Verändern", "midgard5.spell-process-veraendern": "Verändern",
"midgard5.spell-process-vigilsignien": "Vigilsignien", "midgard5.spell-process-vigilsignien": "Vigilsignien",
"midgard5.spell-process-wundertat": "Wundertat", "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-zerstoeren": "Zerstören",
"midgard5.spell-process-zauberlied": "Zauberlieder", "midgard5.spell-process-zauberlied": "Zauberlieder",
"midgard5.spell-process-zaubersalz": "Zaubersalze", "midgard5.spell-process-zaubersalz": "Zaubersalze",

110
source/helpers.ts Normal file
View File

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

View File

@ -2,112 +2,17 @@ import Logger from "./utils/Logger";
import M5CharacterSheet from "./module/sheets/M5CharacterSheet"; import M5CharacterSheet from "./module/sheets/M5CharacterSheet";
import preloadTemplates from "./PreloadTemplates"; import preloadTemplates from "./PreloadTemplates";
import { M5Character } from "./module/actors/M5Character"; 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 { M5ItemSheet } from "./module/sheets/M5ItemSheet";
import { M5Item } from "./module/items/M5Item"; import { M5Item } from "./module/items/M5Item";
import { loadHelpers } from "./helpers";
import { loadSettings } from "./settings";
Hooks.once("init", async () => { Hooks.once("init", async () => {
Logger.log("M5 | Initialisierung Midgard 5"); Logger.log("M5 | Initialisierung Midgard 5");
Handlebars.registerHelper("times", (n: number, block) => { // Load settings into Foundry
var accum = ""; loadSettings();
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;
});
// Default Sheet für Items definieren und das Standardsheet deaktivieren // Default Sheet für Items definieren und das Standardsheet deaktivieren
Items.unregisterSheet("core", ItemSheet); Items.unregisterSheet("core", ItemSheet);
@ -121,6 +26,8 @@ Hooks.once("init", async () => {
CONFIG.Item.documentClass = M5Item; CONFIG.Item.documentClass = M5Item;
//RegisterSettings(); //RegisterSettings();
await preloadTemplates(); await preloadTemplates();
loadHelpers();
}); });
Hooks.once("setup", () => { Hooks.once("setup", () => {

View File

@ -29,7 +29,7 @@ export interface M5RollData {
c: any; c: any;
i: any; i: any;
iType: string; iType: string;
rolls: {}; rolls: any;
res: { res: {
label: string; label: string;
}; };

View File

@ -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(); return roll.toMessage();
} else { } else {
ChatMessage.create({ ChatMessage.create({

View File

@ -11,7 +11,7 @@ export class M5Roll {
public _total: number = 0; public _total: number = 0;
public pool: PoolTerm = null; 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) //super(null)
//this.data = rollData //this.data = rollData
} }
@ -88,6 +88,42 @@ export class M5Roll {
}); });
this.data.res.label = this.label; 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] >= 0) {
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 === "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; this._evaluated = true;
return this; return this;

16
source/settings.ts Normal file
View File

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

View File

@ -89,7 +89,7 @@
{{#each data.lernKostenZauber as |wert name|}} {{#each data.lernKostenZauber as |wert name|}}
<span style="flex: 1 0 26%"> <span style="flex: 1 0 26%">
<label for="data.lernKostenZauber.{{name}}">{{localize (m5concat "midgard5.spell-process-" name)}}</label> <label for="data.lernKostenZauber.{{name}}">{{localize (m5concat "midgard5.spell-process-" name)}}</label>
<input style="width:35px" name="data.lernKostenZauber.{{name}}" type="number" value={{wert.kosten}} data-dtype="Number" /> <input style="width:35px" name="data.lernKostenZauber.{{name}}.wert" type="number" value={{wert.kosten}} data-dtype="Number" />
</span> </span>
{{/each}} {{/each}}
</div> </div>