From b04315946be9ffc80bd92902032df816a4db8dd7 Mon Sep 17 00:00:00 2001 From: macniel Date: Wed, 29 Oct 2025 10:46:21 +0100 Subject: [PATCH] shelving for now --- src/main.mjs | 2 +- src/module/data/miracle/liturgydata.mjs | 57 +++-- src/module/dialog/modify-liturgy.mjs | 239 +++++++++++++----- src/module/sheets/character/liturgies.mjs | 1 + src/module/sheets/characterSheet.mjs | 8 + .../liturgie-handwerksegen.json | 28 +- .../actor/character/tab-liturgies.hbs | 45 ++-- src/templates/dialog/liturgy-dialog.hbs | 66 +++++ src/templates/dialog/modify-liturgy.hbs | 36 --- 9 files changed, 330 insertions(+), 152 deletions(-) create mode 100644 src/templates/dialog/liturgy-dialog.hbs delete mode 100644 src/templates/dialog/modify-liturgy.hbs diff --git a/src/main.mjs b/src/main.mjs index 64bb6f40..2d12f38d 100644 --- a/src/main.mjs +++ b/src/main.mjs @@ -46,7 +46,7 @@ async function preloadHandlebarsTemplates() { 'systems/DSA_4-1/templates/ui/partial-action-button.hbs', 'systems/DSA_4-1/templates/ui/partial-equipment-button.hbs', 'systems/DSA_4-1/templates/ui/partial-array-editor.hbs', - 'systems/DSA_4-1/templates/dialog/modify-liturgy.hbs' + 'systems/DSA_4-1/templates/dialog/liturgy-dialog.hbs' ]); } diff --git a/src/module/data/miracle/liturgydata.mjs b/src/module/data/miracle/liturgydata.mjs index ee05e61a..7cfdac1a 100644 --- a/src/module/data/miracle/liturgydata.mjs +++ b/src/module/data/miracle/liturgydata.mjs @@ -3,8 +3,8 @@ export class LiturgyData { static ranks = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII"] static #ranks = [ - {index: 0, name: "O", lkp: 3, mod: 2, costKaP: 2, costKaPPermant: 0, duration: "{*} KR", strength: "{*}/2"}, - {index: 1, name: "I", lkp: 3, mod: 0, costKaP: 5, costKaPPermant: 0, duration: "{*} KR", strength: "{*}/2"}, + {index: 0, name: "O", lkp: 3, mod: 2, costKaP: 2, costKaPPermant: 0, duration: "LkP* KR", strength: "LkP*/2"}, + {index: 1, name: "I", lkp: 3, mod: 0, costKaP: 5, costKaPPermant: 0, duration: "LkP* KR", strength: "LkP*/2"}, { index: 2, name: "II", @@ -12,10 +12,19 @@ export class LiturgyData { mod: -2, costKaP: 10, costKaPPermant: 0, - duration: "{*}*10 KR", - strength: "{*}/2+5" + duration: "LkP*10 KR", + strength: "LkP/2+5" + }, + { + index: 3, + name: "III", + lkp: 9, + mod: -4, + costKaP: 15, + costKaPPermant: 0, + duration: "LkP* SR", + strength: "LkP*+5" }, - {index: 3, name: "III", lkp: 9, mod: -4, costKaP: 15, costKaPPermant: 0, duration: "{*} SR", strength: "{*}+5"}, { index: 4, name: "IV", @@ -23,8 +32,8 @@ export class LiturgyData { mod: -6, costKaP: 20, costKaPPermant: 0, - duration: "{*} Stunden", - strength: "{*}+10" + duration: "LkP* Stunden", + strength: "LkP*+10" }, { index: 5, @@ -33,8 +42,8 @@ export class LiturgyData { mod: -8, costKaP: 25, costKaPPermant: 1, - duration: "{*} Tage", - strength: "{*}+15" + duration: "LkP* Tage", + strength: "LkP*+15" }, { index: 6, @@ -43,8 +52,8 @@ export class LiturgyData { mod: -10, costKaP: 30, costKaPPermant: 3, - duration: "{*} Wochen", - strength: "{*}+20" + duration: "LkP* Wochen", + strength: "LkP*+20" }, { index: 7, @@ -53,8 +62,8 @@ export class LiturgyData { mod: -12, costKaP: 35, costKaPPermant: 5, - duration: "{*} Monate", - strength: "{*}+25" + duration: "LkP* Monate", + strength: "LkP*+25" }, { index: 8, @@ -63,9 +72,9 @@ export class LiturgyData { mod: -14, costKaP: 40, costKaPPermant: 7, - duration: "{*} Jahre oder permanent", + duration: "LkP* Jahre oder permanent", casttime: "", - strength: "{*}+30" + strength: "LkP*+30" }, ]; @@ -99,16 +108,28 @@ export class LiturgyData { } ] + static getModifiedStrength(originalString, rankIncrease) { + return this.#ranks[this.#ranks.findIndex(p => p.strength === originalString) + rankIncrease] + } + + static getModifiedDuration(originalString, rankIncrease) { + return this.#ranks[this.#ranks.findIndex(p => p.duration === originalString) + rankIncrease] + } + + static getModifiedRank(rank) { + return LiturgyData.#ranks[rank] + } + static getRankOfLiturgy(liturgy, deity) { const lookupData = liturgy.herkunft.find(p => p.name === deity) - const rank = lookupData?.grad; - return LiturgyData.#ranks[rank]; + const rank = lookupData?.grad + return LiturgyData.#ranks[rank] } static lookupAlias(alias) { return LiturgyData.#aliases.find((entry) => { return entry.aliases.indexOf(alias) !== -1 - })?.originalName ?? alias; // cant determine thus simply return the original query name + })?.originalName ?? alias // cant determine thus simply return the original query name } } diff --git a/src/module/dialog/modify-liturgy.mjs b/src/module/dialog/modify-liturgy.mjs index 5f3eb897..9d9767eb 100644 --- a/src/module/dialog/modify-liturgy.mjs +++ b/src/module/dialog/modify-liturgy.mjs @@ -1,6 +1,38 @@ import {LiturgyData} from "../data/miracle/liturgydata.mjs"; -export class ModifyLiturgy { +const {ApplicationV2, HandlebarsApplicationMixin} = foundry.applications.api + +export class LiturgyDialog extends HandlebarsApplicationMixin(ApplicationV2) { + + static DEFAULT_OPTIONS = { + classes: ['dsa41', 'dialog', 'liturgy'], + tag: "form", + position: { + width: 480, + height: 800 + }, + window: { + resizable: false, + title: "Liturgie wirken" + }, + form: { + submitOnChange: false, + closeOnSubmit: false, + handler: LiturgyDialog.#onSubmitForm + }, + actions: { + selectVariant: LiturgyDialog.#selectVariant, + addMod: LiturgyDialog.#addModification, + removeMod: LiturgyDialog.#removeModification, + } + } + + + static PARTS = { + form: { + template: 'systems/DSA_4-1/templates/dialog/liturgy-dialog.hbs', + } + } static data = {} static naming = { @@ -10,79 +42,156 @@ export class ModifyLiturgy { "castduration": "Wirkzeit", "duration": "Wirkdauer" } + static #romanNumerals = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"] + /** + * + * @type {Actor} + * @private + */ + _actor = null - constructor(data) { - ModifyLiturgy.data = data; - ModifyLiturgy.data.maxmods = Math.round(data.lkp / 3); - ModifyLiturgy.data.variation = null; - } + constructor(actor, liturgyValue, liturgyId, deity) { + super() + this._actor = actor + this._liturgy = this._actor.itemTypes["Liturgy"].find(p => p._id === liturgyId) + this._deity = deity + this._maxmods = Math.round(liturgyValue / 3) + this._variations = [] + Object.entries(this._liturgy.system.auswirkung).forEach(([rank, text]) => { - static renderMods(html) { - - let result = ''; - - ModifyLiturgy.data.mods.forEach(((mod, index) => { - - result += `${LiturgyData.ranks[mod.rank]}${ModifyLiturgy.naming[mod.mod]}` - })) - - return result; - - } - - handleRender(html) { - - - html.off('click', 'input[name="data.variation"]') - html.on('click', 'input[name="data.variation"]', (evt) => { - if (evt.currentTarget.checked) { - ModifyLiturgy.data.variation = evt.currentTarget.dataset['rank']; - ModifyLiturgy.data.mods = []; + if (text) { + this._variations.push({ + level: LiturgyDialog.#romanNumerals.findIndex(p => p === rank) + 1, + rank: rank, + effect: text + }) } - this.render(html) + }) - html.off('click', 'button[class="remove-mod"]') - html.on('click', 'button[class="remove-mod"]', (evt) => { - const {index} = evt.currentTarget.dataset; - ModifyLiturgy.data.mods.splice(index, 1); - this.render(html) - }) - html.off('change', 'select[name="mod"]') - html.on('change', 'select[name="mod"]', (evt) => { - const value = evt.currentTarget.value; - if (value === '') return; - const currentRank = ModifyLiturgy.data.mods.length + Number(ModifyLiturgy.data.rank); - ModifyLiturgy.data.mods.push({ - rank: currentRank, - mod: value, - }); - evt.currentTarget.value = ""; - this.render(html) + this._variation = this._variations[0] + this._mods = [] + this._initialRank = 0 + } + + static async #onSubmitForm(event, form, formData) { + event.preventDefault() + } + + static #selectVariant(event, target) { + if (target.checked) { + this._variation = this._variations.find(p => p.rank === target.dataset['rank']); + this._mods = []; + } + this.render({parts: ["form"]}) + event.stopPropagation() + event.preventDefault() + return false + } + + static #addModification(event, target) { + event.stopPropagation() + event.preventDefault() + const value = this.element.querySelector('select[name="mod"]').value + + if (value === '') return + const currentRank = this._mods.length + (this._variation?.level ?? 0) + this._mods.push({ + rank: currentRank, + displayRank: LiturgyDialog.#romanNumerals.findIndex(p => p === currentRank), + mod: value, }) + this.render({parts: ["form"]}) + return false + } - // render state - $('#mods', html).html(ModifyLiturgy.renderMods(html)) + static #removeModification(event, target) { + event.stopPropagation() + event.preventDefault() + const {index} = target.dataset + this._mods.splice(index, 1) + this.render({parts: ["form"]}) + return false + } + _configureRenderOptions(options) { + super._configureRenderOptions(options) - // state handling - - if (ModifyLiturgy.data.mods.length === ModifyLiturgy.data.maxmods) { - $(".editor, .editor *", html).attr('disabled', 'disabled'); - $(".editor select", html).hide(); - $('span#info', html).text('LkW lässt keine weitere Modifikationen zu') - $("#mod_rank", html).text(LiturgyData.ranks[ModifyLiturgy.data.mods.length + Number(ModifyLiturgy.data.rank)]); - } else if (ModifyLiturgy.data.variation == null) { - $(".editor select *", html).attr('disabled', 'disabled'); - $(".editor select", html).hide(); - $('span#info', html).text('Keine Variante ausgewählt') - $("#mod_rank", html).text(''); - } else { - $(".editor, .editor *", html).removeAttr('disabled'); - $(".editor select", html).show(); - $('span#info', html).text('') - $("#mod_rank", html).text(''); + if (options.window) { + if (this._liturgy) { + options.window.title = `${this._liturgy.name} wirken` + } } + return options } -} + #getLiturgyData() { + + let baseline = LiturgyData.getModifiedRank(this._variation?.level ?? 0) + + baseline.duration = this._liturgy.system.wirkungsdauer + + let upgradeDuration = false + let upgradeCastDuration = false + let upgradeStrength = false + + this._mods.forEach(({mod}) => { + switch (mod) { + case "range": + break; + case "strength": + upgradeStrength = true + break; + case "target": + break; + case "castduration": + upgradeCastDuration = true + break; + case "duration": + upgradeDuration = true + break; + } + }) + + baseline.name = this._liturgy.name + baseline.effectiveLevel = (this._variation?.level ?? 0) + this._mods.length + baseline.costKaP = LiturgyData.getModifiedRank(baseline.effectiveLevel).costKaP + baseline.costKaPPermanent = LiturgyData.getModifiedRank(baseline.effectiveLevel).costKaPPermanent + baseline.mod = LiturgyData.getModifiedRank(baseline.effectiveLevel).mod + baseline.rank = LiturgyData.getModifiedRank(baseline.effectiveLevel).name + + + // insert mods into text + baseline.text = this._variation.effect + + const strengthRegexp = /(LkP\*.*?)[ .]/g + + baseline.text = baseline.text.replace(strengthRegexp, LiturgyData.getModifiedRank((baseline.effectiveLevel ?? 0) + upgradeStrength).strength) + + const durationRegexp = /(LkP\*?.*?)(\*10 KR| Stunden| Tage| Wochen| Monate| Jahre oder permanent)/g + + const effectiveDuration = LiturgyData.getModifiedDuration((baseline.effectiveLevel ?? 0) + upgradeDuration + upgradeStrength).duration + + baseline.duration = baseline.duration.replace(durationRegexp, effectiveDuration.replace("{*}", "LkP")) + + return baseline + + } + + async _prepareContext(options) { + const context = await super._prepareContext(options) + context.actor = this._actor + context.liturgy = this._liturgy + context.mods = this._mods + context.variation = this._variation + context.maxmods = this._maxmods + context.variations = this._variations + + context.canMod = (this._maxmods - (this._variation?.level ?? 0) - this._mods.length) >= 0 + context.addingModRank = LiturgyDialog.#romanNumerals[(context._variation?.level ?? 0) + this._mods.length + 1] + + context.resultingLiturgy = this.#getLiturgyData() + + return context + } +} \ No newline at end of file diff --git a/src/module/sheets/character/liturgies.mjs b/src/module/sheets/character/liturgies.mjs index f31add4e..e32e3f85 100644 --- a/src/module/sheets/character/liturgies.mjs +++ b/src/module/sheets/character/liturgies.mjs @@ -57,6 +57,7 @@ export default { // sort by rank const rankData = LiturgyData.getRankOfLiturgy(item.system, deity) if (rankData) { + console.log(rankData) let {index, name, lkp, mod, costKaP} = rankData; insertObject["count" + name] = insertObject["count" + name] + 1; diff --git a/src/module/sheets/characterSheet.mjs b/src/module/sheets/characterSheet.mjs index da8df1df..4aa7ee09 100644 --- a/src/module/sheets/characterSheet.mjs +++ b/src/module/sheets/characterSheet.mjs @@ -11,6 +11,8 @@ import {CombatActionDialog} from "../dialog/combatAction.mjs"; import {ActionManager} from "./actions/action-manager.mjs"; import {DefenseActionDialog} from "../dialog/defenseAction.mjs"; import {RestingDialog} from "../dialog/restingDialog.mjs"; +import {Character} from "../documents/character.mjs"; +import {LiturgyDialog} from "../dialog/modify-liturgy.mjs"; const {HandlebarsApplicationMixin, DocumentSheetV2} = foundry.applications.api const {ActorSheetV2} = foundry.applications.sheets @@ -41,6 +43,7 @@ class CharacterSheet extends HandlebarsApplicationMixin(ActorSheetV2) { openCultureDocument: CharacterSheet.#openCultureDocument, openSpeciesDocument: CharacterSheet.#openSpeciesDocument, openCombatAction: CharacterSheet.#openCombatAction, + openLiturgyDialog: CharacterSheet.#openLiturgyDialog, progressCooldown: CharacterSheet.#progressCooldown, cancelCooldown: CharacterSheet.#cancelCooldown, activateCooldown: CharacterSheet.#activateCooldown, @@ -209,6 +212,11 @@ class CharacterSheet extends HandlebarsApplicationMixin(ActorSheetV2) { } } + static #openLiturgyDialog(event, target) { + const {id, lkp, deity} = target.dataset + new LiturgyDialog(this.document, lkp, id, deity).render(true) + } + static #startResting(event, target) { const dialog = new RestingDialog(this.document) diff --git a/src/packs/_source/liturgien-und-segnungen/liturgie-handwerksegen.json b/src/packs/_source/liturgien-und-segnungen/liturgie-handwerksegen.json index 10011275..a1d00a30 100644 --- a/src/packs/_source/liturgien-und-segnungen/liturgie-handwerksegen.json +++ b/src/packs/_source/liturgien-und-segnungen/liturgie-handwerksegen.json @@ -4,55 +4,55 @@ "Cereborns Handreichung (Handwerkssegen)", "Hauch der Leidenschaft (Handwerkssegen)" ], - "grad": 1, + "grad": 2, "herkunft": [ { "name": "Praios", - "grad": 1 + "grad": 2 }, { "name": "Rondra", - "grad": 1 + "grad": 2 }, { "name": "Efferd", - "grad": 1 + "grad": 2 }, { "name": "Travia", - "grad": 1 + "grad": 2 }, { "name": "Boron", - "grad": 1 + "grad": 2 }, { "name": "Hesinde", - "grad": 1 + "grad": 2 }, { "name": "Firun", - "grad": 1 + "grad": 2 }, { "name": "Tsa", - "grad": 1 + "grad": 2 }, { "name": "Phex", - "grad": 1 + "grad": 2 }, { "name": "Peraine", - "grad": 1 + "grad": 2 }, { "name": "Ingrerimm", - "grad": 1 + "grad": 2 }, { "name": "Rahja", - "grad": 1 + "grad": 2 } ], "reichweite": "Berührung", @@ -60,6 +60,6 @@ "zauberdauer": "1 Spielrunde (Gebet)", "wirkungsdauer": "bis zum Ende der Probe, maximal LkP* Tage", "auswirkung": { - "I": "Mit dieser Liturgie erfährt eine Person durch den Geweihten eine göttliche Inspiration in einem Talent, das für den Geweihten ein Mirakel+ Talent ist. Der TaW der inspirierten Person steigt für eine Probe um LkP*/2+5 Punkte. Solcherart geschaffene Werkstücke können bei vielen TaP* der Talentprobe nach Maßgabe des Meisters entweder besonders kunstfertig oder aber besonders robust sein, was beim Bau von Behelfsbrücken oder dergleichen wichtig sein kann." + "II": "Mit dieser Liturgie erfährt eine Person durch den Geweihten eine göttliche Inspiration in einem Talent, das für den Geweihten ein Mirakel+ Talent ist. Der TaW der inspirierten Person steigt für eine Probe um LkP*/2+5 Punkte. Solcherart geschaffene Werkstücke können bei vielen TaP* der Talentprobe nach Maßgabe des Meisters entweder besonders kunstfertig oder aber besonders robust sein, was beim Bau von Behelfsbrücken oder dergleichen wichtig sein kann." } } diff --git a/src/templates/actor/character/tab-liturgies.hbs b/src/templates/actor/character/tab-liturgies.hbs index 6bc342d8..77ff666a 100644 --- a/src/templates/actor/character/tab-liturgies.hbs +++ b/src/templates/actor/character/tab-liturgies.hbs @@ -33,8 +33,9 @@ {{#each this.O}} - + {{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }} @@ -52,8 +53,9 @@ {{#each this.I}} - + {{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }} @@ -72,8 +74,9 @@ {{#each this.II}} - + {{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }} {{#each this.III}} - + {{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }} {{#each this.IV}} - + {{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }} {{#each this.V}} - + {{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }} {{#each this.VI}} - + {{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }} {{#each this.VII}} - + {{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }} {{#each this.VIII}} - + {{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }} + + + + + + + {{#each variations}} + + + + + {{/each}} + + +
GradWirkung
{{this.effect}}
+ +

Modifizieren

+ + + + {{#each mods}} + + + + + + {{/each}} + +
{{this.displayRank}}{{this.mod}} + +
+ +
+
{{this.addingModRank}}
+
+ + + +
+
+ +
+ {{#if resultingLiturgy}} +
Liturgie: {{resultingLiturgy.name}}
+
Grad: {{resultingLiturgy.rank}}
+
Kosten:{{resultingLiturgy.costKaP}} KaP {{#if resultingLiturgy.costKaPPermanent}} + (davon {{resultingLiturgy.costKaP}} permanent){{/if}}
+
Ziel:{{resultingLiturgy.target}}
+
Wirkdauer:{{resultingLiturgy.duration}}
+
Wirkzeit:{{resultingLiturgy.casttime}}
+
{{resultingLiturgy.text}}
+ + {{/if}} +
+ \ No newline at end of file diff --git a/src/templates/dialog/modify-liturgy.hbs b/src/templates/dialog/modify-liturgy.hbs deleted file mode 100644 index ebf2fbdd..00000000 --- a/src/templates/dialog/modify-liturgy.hbs +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - {{#each variations}} - - - - - {{/each}} - - -
GradWirkung
{{this.effect}}
- -

Modifizieren

- -
- -
-
-
- - -
-
- -