From 7333b54a3533b6b7032bce0d675adadbdb2b0d3a Mon Sep 17 00:00:00 2001 From: Ender Date: Sun, 24 Mar 2024 23:44:29 +0100 Subject: [PATCH 1/6] Anpassung Zauber und Kampftabs --- source/module/M5Base.ts | 1 + source/module/rolls/M5Roll.ts | 2 +- source/module/sheets/M5CharacterSheet.ts | 52 +++++++++++++++++++++++- templates/chat/task-check-dialog.hbs | 20 +++++++++ 4 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 templates/chat/task-check-dialog.hbs diff --git a/source/module/M5Base.ts b/source/module/M5Base.ts index 586b84f..11b9a8c 100644 --- a/source/module/M5Base.ts +++ b/source/module/M5Base.ts @@ -180,6 +180,7 @@ export interface M5CharacterCalculatedData { pa: M5AttributeCalculated; wk: M5AttributeCalculated; }; + stats: { lp: M5ModResult; ap: M5ModResult; diff --git a/source/module/rolls/M5Roll.ts b/source/module/rolls/M5Roll.ts index 9a5f316..b3a67b3 100644 --- a/source/module/rolls/M5Roll.ts +++ b/source/module/rolls/M5Roll.ts @@ -314,7 +314,7 @@ export class M5Roll { return null; } } - + interface FormulaParseResult { sides: number; type: string; diff --git a/source/module/sheets/M5CharacterSheet.ts b/source/module/sheets/M5CharacterSheet.ts index 7cbc2ff..56bf187 100644 --- a/source/module/sheets/M5CharacterSheet.ts +++ b/source/module/sheets/M5CharacterSheet.ts @@ -77,7 +77,17 @@ export default class M5CharacterSheet extends ActorSheet { let target = event.target.closest("[data-attribute]") as HTMLElement; let attributeValue = target ? parseInt(target.dataset.value) : null; let attributeStr = target ? target.dataset.attribute : null; - + let hasFortune: boolean; + let taskType: string; + let useFortune: boolean; + let modifier: number; + let difficulty: number; + let closedRoll: boolean; + let checkOptions = await GetRollOptions({ hasFortune, taskType, useFortune, modifier, difficulty, closedRoll }); + console.log("Check Options", checkOptions); + if (checkOptions["cancelled"]) { + return; + } const roll = M5Roll.fromAttributeValue(this.actor, attributeStr, attributeValue); await roll.toMessage(); }); @@ -517,3 +527,43 @@ export default class M5CharacterSheet extends ActorSheet { return true; } } +async function GetRollOptions({ + hasFortune = true, + taskType = null, + useFortune = false, + difficulty = 0, + modifier = 0, + closedRoll = false, + template = "systems/midgard5/templates/chat/task-check-dialog.hbs" } = {}) { + const html = await renderTemplate(template, { hasFortune, useFortune, difficulty, modifier, closedRoll }); + + return new Promise(resolve => { + const data = { + title: (game as Game).i18n.format("midgard5.chat.taskCheck.title", { type: taskType }), + content: html, + buttons: { + normal: { + label: (game as Game).i18n.localize("midgard5.chat.actions.roll"), + callback: html => resolve(_processTaskCheckOptions(html[0].querySelector("form"))) + }, + cancel: { + label: (game as Game).i18n.localize("midgard5.chat.actions.cancel"), + callback: html => resolve({ cancelled: true }) + } + }, + default: "normal", + close: () => resolve({ cancelled: true }) + }; + + new Dialog(data, null).render(true); + }); + } + + function _processTaskCheckOptions(form) { + return { + difficulty: parseInt(form.difficulty?.value), + modifier: parseInt(form.modifier?.value), + useFortune: form.useFortune?.checked, + closedRoll: form.closedRoll?.checked + } + } diff --git a/templates/chat/task-check-dialog.hbs b/templates/chat/task-check-dialog.hbs new file mode 100644 index 0000000..74482ce --- /dev/null +++ b/templates/chat/task-check-dialog.hbs @@ -0,0 +1,20 @@ +
+
+ + +
+
+ + +
+ {{#if hasFortune}} +
+ + +
+ {{/if}} +
+ + +
+
\ No newline at end of file -- 2.40.1 From 332f0358469aa2debccfeeee6332e439888af4cb Mon Sep 17 00:00:00 2001 From: Byroks Date: Mon, 25 Mar 2024 21:55:44 +0100 Subject: [PATCH 2/6] =?UTF-8?q?Modifikation=20f=C3=BCr=20alle=20W=C3=BCrfe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/module/M5Base.ts | 3 +- source/module/rolls/M5Roll.ts | 54 +++++++++++++++++++++++- source/module/sheets/M5CharacterSheet.ts | 51 ---------------------- 3 files changed, 54 insertions(+), 54 deletions(-) diff --git a/source/module/M5Base.ts b/source/module/M5Base.ts index 11b9a8c..917e9ee 100644 --- a/source/module/M5Base.ts +++ b/source/module/M5Base.ts @@ -28,6 +28,7 @@ export interface M5Attribute { export interface M5RollData { c: any; i: any; + b: any; iType: string; rolls: {}; res: { @@ -180,7 +181,7 @@ export interface M5CharacterCalculatedData { pa: M5AttributeCalculated; wk: M5AttributeCalculated; }; - + stats: { lp: M5ModResult; ap: M5ModResult; diff --git a/source/module/rolls/M5Roll.ts b/source/module/rolls/M5Roll.ts index b3a67b3..ffa61bb 100644 --- a/source/module/rolls/M5Roll.ts +++ b/source/module/rolls/M5Roll.ts @@ -26,6 +26,7 @@ export class M5Roll { .map((rollName, index) => { indexMap.set(index, rollName); const formula = this.data.rolls[rollName]; + formula.formula = index === 0 ? formula.formula + " + " + this.data.b.modifier : formula.formula; const roll = new Roll(formula.formula, this.data); return roll; }); @@ -66,7 +67,7 @@ export class M5Roll { const parseResult = M5Roll.parseDiceSides(rollResult.formula); //console.log("evaluate roll", parseResult) if (parseResult?.sides === 20) { - if (roll.total < 20) { + if (roll.total < this.data.b.difficulty) { if (rowRes === M5EwResult.TBD || rowRes === M5EwResult.HIGH) rowRes = M5EwResult.FAIL; } else { if (rowRes === M5EwResult.TBD) rowRes = M5EwResult.PASS; @@ -99,6 +100,13 @@ export class M5Roll { } async toMessage() { + let checkOptions = await this.popUp(); + if (checkOptions["cancelled"]) { + return; + } else { + this.data.b = checkOptions; + } + if (!this._evaluated) await this.evaluate(); const rMode = (game as Game).settings.get("core", "rollMode"); @@ -313,8 +321,50 @@ export class M5Roll { return null; } + + async popUp({ + hasFortune = true, + taskType = null, + useFortune = false, + difficulty = 20, + modifier = 0, + closedRoll = false, + template = "systems/midgard5/templates/chat/task-check-dialog.hbs", + } = {}) { + const html = await renderTemplate(template, { hasFortune, useFortune, difficulty, modifier, closedRoll }); + + return new Promise((resolve) => { + const data = { + title: (game as Game).i18n.format("midgard5.chat.taskCheck.title", { type: taskType }), + content: html, + buttons: { + normal: { + label: (game as Game).i18n.localize("midgard5.chat.actions.roll"), + callback: (html) => resolve(this._processTaskCheckOptions(html[0].querySelector("form"))), + }, + cancel: { + label: (game as Game).i18n.localize("midgard5.chat.actions.cancel"), + callback: (html) => resolve({ cancelled: true }), + }, + }, + default: "normal", + close: () => resolve({ cancelled: true }), + }; + + new Dialog(data, null).render(true); + }); + } + + _processTaskCheckOptions(form) { + return { + difficulty: parseInt(form.difficulty?.value), + modifier: parseInt(form.modifier?.value), + useFortune: form.useFortune?.checked, + closedRoll: form.closedRoll?.checked, + }; + } } - + interface FormulaParseResult { sides: number; type: string; diff --git a/source/module/sheets/M5CharacterSheet.ts b/source/module/sheets/M5CharacterSheet.ts index 56bf187..b86ebf0 100644 --- a/source/module/sheets/M5CharacterSheet.ts +++ b/source/module/sheets/M5CharacterSheet.ts @@ -77,17 +77,6 @@ export default class M5CharacterSheet extends ActorSheet { let target = event.target.closest("[data-attribute]") as HTMLElement; let attributeValue = target ? parseInt(target.dataset.value) : null; let attributeStr = target ? target.dataset.attribute : null; - let hasFortune: boolean; - let taskType: string; - let useFortune: boolean; - let modifier: number; - let difficulty: number; - let closedRoll: boolean; - let checkOptions = await GetRollOptions({ hasFortune, taskType, useFortune, modifier, difficulty, closedRoll }); - console.log("Check Options", checkOptions); - if (checkOptions["cancelled"]) { - return; - } const roll = M5Roll.fromAttributeValue(this.actor, attributeStr, attributeValue); await roll.toMessage(); }); @@ -527,43 +516,3 @@ export default class M5CharacterSheet extends ActorSheet { return true; } } -async function GetRollOptions({ - hasFortune = true, - taskType = null, - useFortune = false, - difficulty = 0, - modifier = 0, - closedRoll = false, - template = "systems/midgard5/templates/chat/task-check-dialog.hbs" } = {}) { - const html = await renderTemplate(template, { hasFortune, useFortune, difficulty, modifier, closedRoll }); - - return new Promise(resolve => { - const data = { - title: (game as Game).i18n.format("midgard5.chat.taskCheck.title", { type: taskType }), - content: html, - buttons: { - normal: { - label: (game as Game).i18n.localize("midgard5.chat.actions.roll"), - callback: html => resolve(_processTaskCheckOptions(html[0].querySelector("form"))) - }, - cancel: { - label: (game as Game).i18n.localize("midgard5.chat.actions.cancel"), - callback: html => resolve({ cancelled: true }) - } - }, - default: "normal", - close: () => resolve({ cancelled: true }) - }; - - new Dialog(data, null).render(true); - }); - } - - function _processTaskCheckOptions(form) { - return { - difficulty: parseInt(form.difficulty?.value), - modifier: parseInt(form.modifier?.value), - useFortune: form.useFortune?.checked, - closedRoll: form.closedRoll?.checked - } - } -- 2.40.1 From 05bed77ce5589b4091e94ae890fef61accbe5d6b Mon Sep 17 00:00:00 2001 From: Byroks Date: Wed, 27 Mar 2024 12:10:10 +0100 Subject: [PATCH 3/6] Implement Reroll --- lang/de.json | 746 ++++++++++++++------------- source/index.ts | 12 + source/module/rolls/M5Roll.ts | 28 +- source/module/rolls/reroll.ts | 107 ++++ templates/chat/reroll-dialog.hbs | 18 + templates/chat/task-check-dialog.hbs | 36 +- 6 files changed, 550 insertions(+), 397 deletions(-) create mode 100644 source/module/rolls/reroll.ts create mode 100644 templates/chat/reroll-dialog.hbs diff --git a/lang/de.json b/lang/de.json index 4ed4493..a083c65 100644 --- a/lang/de.json +++ b/lang/de.json @@ -12,402 +12,420 @@ "TYPES.Item.effect": "Aktiver Effekt", "TYPES.Item.kampfkunst": "Kampfkunst", "TYPES.Item.container": "Aufbewahrung", + "TYPES.Item.class": "Klasse", - "midgard5.phase-action": "Handlungsphase", - "midgard5.phase-movement": "Bewegungsphase", - "midgard5.no-encounter": "Kein Kampf", - "midgard5.encounter-not-started": "Kein aktiver Kampf", - "midgard5.initiative": "Initiative", - "midgard5.actionrank": "Handlungsrang", + "midgard5": { + "phase-action": "Handlungsphase", + "phase-movement": "Bewegungsphase", + "no-encounter": "Kein Kampf", + "encounter-not-started": "Kein aktiver Kampf", + "initiative": "Initiative", + "actionrank": "Handlungsrang", - "midgard5.combat-join": "Kampf Beitreten/Handlungsrang zurücksetzen", - "midgard5.combat-ranged": "Fernangriff", - "midgard5.combat-spell": "Zaubern (10 Sec)", + "combat-join": "Kampf Beitreten/Handlungsrang zurücksetzen", + "combat-ranged": "Fernangriff", + "combat-spell": "Zaubern (10 Sec)", - "midgard5.time-duration": "Dauer", - "midgard5.time-round": "Runde(n)", - "midgard5.time-minute": "Minute(n)", - "midgard5.time-hour": "Stunde(n)", - "midgard5.time-limitless": "Unbegrenzt", + "time-duration": "Dauer", + "time-round": "Runde(n)", + "time-minute": "Minute(n)", + "time-hour": "Stunde(n)", + "time-limitless": "Unbegrenzt", - "midgard5.doRoll": "Würfeln", - "midgard5.learn": "Lernen", + "doRoll": "Würfeln", + "learn": "Lernen", - "midgard5.label": "Bezeichnung", - "midgard5.description": "Beschreibung", - "midgard5.Characteristic": "Merkmal", - "midgard5.characteristics": "Merkmale", - "midgard5.background": "Hintergrund", - "midgard5.attribute": "Eigenschaft", - "midgard5.attributes": "Eigenschaften", - "midgard5.points": "Punkte", - "midgard5.calculated-value": "Berechneter Wert", - "midgard5.calculated-values": "Werte und Boni", + "label": "Bezeichnung", + "description": "Beschreibung", + "Characteristic": "Merkmal", + "characteristics": "Merkmale", + "background": "Hintergrund", + "attribute": "Eigenschaft", + "attributes": "Eigenschaften", + "points": "Punkte", + "calculated-value": "Berechneter Wert", + "calculated-values": "Werte und Boni", - "midgard5.skill": "Fertigkeit", - "midgard5.skill-value": "Fertigkeitswert", - "midgard5.fw": "FW", - "midgard5.bonus": "Bonus", - "midgard5.bonuses": "Boni", - "midgard5.ew": "EW", - "midgard5.pp-short": "PP", - "midgard5.pp": "Praxispunkte", + "skill": "Fertigkeit", + "skill-value": "Fertigkeitswert", + "fw": "FW", + "bonus": "Bonus", + "bonuses": "Boni", + "ew": "EW", + "pp-short": "PP", + "pp": "Praxispunkte", - "midgard5.item-value": "Wert", - "midgard5.item-quantity": "Menge", - "midgard5.item-onbody": "Am Körper", - "midgard5.item-ismagic": "Ist Magisch", - "midgard5.item-wealth": "Vermögenswert", - "midgard5.item-weight": "Gewicht", + "item-value": "Wert", + "item-quantity": "Menge", + "item-onbody": "Am Körper", + "item-ismagic": "Ist Magisch", + "item-wealth": "Vermögenswert", + "item-weight": "Gewicht", - "midgard5.actor-lp": "Lebenspunkte", - "midgard5.actor-lp-short": "LP", - "midgard5.actor-ap": "Ausdauerpunkte", - "midgard5.actor-ap-short": "AP", - "midgard5.actor-st": "St", - "midgard5.actor-st-long": "Stärke", - "midgard5.actor-ko": "Ko", - "midgard5.actor-ko-long": "Konstitution", - "midgard5.actor-au": "Au", - "midgard5.actor-au-long": "Aussehen", - "midgard5.actor-gs": "Gs", - "midgard5.actor-gs-long": "Geschicklichkeit", - "midgard5.actor-in": "In", - "midgard5.actor-in-long": "Intelligenz", - "midgard5.actor-pa": "pA", - "midgard5.actor-pa-long": "persönliche Ausstrahlung", - "midgard5.actor-gw": "Gw", - "midgard5.actor-gw-long": "Gewandtheit", - "midgard5.actor-zt": "Zt", - "midgard5.actor-zt-long": "Zaubertalent", - "midgard5.actor-wk": "Wk", - "midgard5.actor-wk-long": "Willenskraft", - "midgard5.actor-git": "GiT", - "midgard5.actor-git-long": "Gifttolleranz", + "actor-lp": "Lebenspunkte", + "actor-lp-short": "LP", + "actor-ap": "Ausdauerpunkte", + "actor-ap-short": "AP", + "actor-st": "St", + "actor-st-long": "Stärke", + "actor-ko": "Ko", + "actor-ko-long": "Konstitution", + "actor-au": "Au", + "actor-au-long": "Aussehen", + "actor-gs": "Gs", + "actor-gs-long": "Geschicklichkeit", + "actor-in": "In", + "actor-in-long": "Intelligenz", + "actor-pa": "pA", + "actor-pa-long": "persönliche Ausstrahlung", + "actor-gw": "Gw", + "actor-gw-long": "Gewandtheit", + "actor-zt": "Zt", + "actor-zt-long": "Zaubertalent", + "actor-wk": "Wk", + "actor-wk-long": "Willenskraft", + "actor-git": "GiT", + "actor-git-long": "Gifttolleranz", - "midgard5.aktuell": "Akt.", - "midgard5.maximum": "Max.", - "midgard5.attrvalue": "Wert", - "midgard5.movementRange": "Bewegungsweite", + "aktuell": "Akt.", + "maximum": "Max.", + "attrvalue": "Wert", + "movementRange": "Bewegungsweite", - "midgard5.base_values": "Grundwerte", - "midgard5.skills": "Fertigkeiten", - "midgard5.gear": "Ausrüstung", - "midgard5.spells": "Zauber", - "midgard5.effects": "Aktive Effekte", - "midgard5.kampfkuenste": "Kampfkünste", - "midgard5.combat": "Kampf", + "base_values": "Grundwerte", + "skills": "Fertigkeiten", + "gear": "Ausrüstung", + "spells": "Zauber", + "effects": "Aktive Effekte", + "kampfkuenste": "Kampfkünste", + "combat": "Kampf", - "midgard5.actor-name": "Figur", - "midgard5.level": "Grad", - "midgard5.class": "Typ", - "midgard5.race": "Rasse", - "midgard5.magicUsing": "Zauberkundig", - "midgard5.gender": "Geschlecht", - "midgard5.weight": "Gewicht", - "midgard5.height": "Größe", - "midgard5.shape": "Gestalt", - "midgard5.age": "Alter", - "midgard5.caste": "Stand", - "midgard5.occupation": "Beruf", - "midgard5.origin": "Heimat", - "midgard5.faith": "Glaube", + "actor-name": "Figur", + "level": "Grad", + "class": "Typ", + "race": "Rasse", + "magicUsing": "Zauberkundig", + "gender": "Geschlecht", + "weight": "Gewicht", + "height": "Größe", + "shape": "Gestalt", + "age": "Alter", + "caste": "Stand", + "occupation": "Beruf", + "origin": "Heimat", + "faith": "Glaube", - "midgard5.currency": "Geld", - "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", + "currency": "Geld", + "currency-gold": "Gold", + "currency-silver": "Silber", + "currency-copper": "Kupfer", + "currency-wealth": "Vermögen in GS", + "currency-available": "verfügbares Vermögen", + "hoard": "aktueller Hort", + "hoardMin": "benötigter Mindesthort", + "hoard-next": "Hort für nächsten Grad", + "hoarded": "Hort", - "midgard5.no-container": "Ohne", + "no-container": "Ohne", - "midgard5.encumbrance": "Getragene Last", - "midgard5.load": "Normallast", - "midgard5.heavy-load": "Schwere Last", - "midgard5.thrust-load": "Schublast", - "midgard5.load-max": "Höchstlast", - "midgard5.load-capacity": "Tragkraft", + "encumbrance": "Getragene Last", + "load": "Normallast", + "heavy-load": "Schwere Last", + "thrust-load": "Schublast", + "load-max": "Höchstlast", + "load-capacity": "Tragkraft", - "midgard5.exp-overall": "Erfahrungsschatz", - "midgard5.exp-available": "Erfahrungspunkte", - "midgard5.grace": "Göttliche Gnade", - "midgard5.destiny": "Schicksalsgunst", - "midgard5.luckPoints": "Glückspunkte", + "exp-overall": "Erfahrungsschatz", + "exp-available": "Erfahrungspunkte", + "grace": "Göttliche Gnade", + "destiny": "Schicksalsgunst", + "luckPoints": "Glückspunkte", - "midgard5.abrichten": "Abrichten", - "midgard5.akrobatik": "Akrobatik", - "midgard5.alchimie": "Alchimie", - "midgard5.anfuehren": "Anführen", - "midgard5.askese": "Askese", - "midgard5.astrologie": "Astrologie", - "midgard5.athletik": "Athletik", - "midgard5.balancieren": "Balancieren", - "midgard5.beidhaendigerKampf": "Beidhändiger Kampf", - "midgard5.bergreiten": "Bergreiten", - "midgard5.beredsamkeit": "Beredsamkeit", - "midgard5.betaeuben": "Betäuben", - "midgard5.betaeubungsgriff": "Betäubungsgriff", - "midgard5.bootfahren": "Bootfahren", - "midgard5.dickhaeuterLenken": "Dickhäuter lenken", - "midgard5.ersteHilfe": "Erste Hilfe", - "midgard5.etikette": "Etikette", - "midgard5.fallenEntdecken": "Fallen entdecken", - "midgard5.fallenmechanik": "Fallenmechanik", - "midgard5.faelschen": "Fälschen", - "midgard5.fangen": "Fangen", - "midgard5.fechten": "Fechten", - "midgard5.feueralchimie": "Feueralchimie", - "midgard5.gassenwissen": "Gassenwissen", - "midgard5.gaukeln": "Gaukeln", - "midgard5.gelaendelauf": "Geländelauf", - "midgard5.geraetekunde": "Gerätekunde", - "midgard5.geschaeftssinn": "Geschäftssinn", - "midgard5.gluecksspiel": "Glücksspiel", - "midgard5.heilkunde": "Heilkunde", - "midgard5.kampfInVollruestung": "Kampf in Vollrüstung", - "midgard5.kampfInSchlachtreihe": "Kampf in Schlachtreihe", - "midgard5.kampfkunst": "Kampfkunst", - "midgard5.kido": "Kido", - "midgard5.klettern": "Klettern", - "midgard5.landeskunde": "Landeskunde", - "midgard5.laufen": "Laufen", - "midgard5.lesenVonZauberschrift": "Lesen von Zauberschrift", - "midgard5.lesenVonZauberrunen": "Lesen von Zauberrunen", - "midgard5.meditieren": "Meditieren", - "midgard5.menschenkenntnis": "Menschenkenntnis", - "midgard5.meucheln": "Meucheln", - "midgard5.musizieren": "Musizieren", - "midgard5.naturkunde": "Naturkunde", - "midgard5.ninjutsu": "NinJutsu", - "midgard5.orakelkunst": "Orakelkunst", - "midgard5.pflanzenkunde": "Pflanzenkunde", - "midgard5.raunen": "Raunen", - "midgard5.reiten": "Reiten", - "midgard5.reiterkampf": "Reiterkampf", - "midgard5.rutengehen": "Rutengehen", - "midgard5.scharfschiessen": "Scharfschießen", - "midgard5.schiesskunst": "Schießkunst", - "midgard5.schleichen": "Schleichen", - "midgard5.schloesserOeffnen": "Schlösser öffnen", - "midgard5.schmerzErtragen": "Schmerzen ertragen", - "midgard5.schwimmen": "Schwimmen", - "midgard5.seilkunst": "Seilkunst", - "midgard5.selbstkontrolle": "Selbstkontrolle", - "midgard5.singen": "Singen", - "midgard5.skifahren": "Skifahren", - "midgard5.spinnengang": "Spinnengang", - "midgard5.speerfechten": "Speerfechten", - "midgard5.spurensuche": "Spurensuche", - "midgard5.stehlen": "Stehlen", - "midgard5.taitschi": "TaiTschi", - "midgard5.tarnen": "Tarnen", - "midgard5.tanzen": "Tanzen", - "midgard5.tauchen": "Tauchen", - "midgard5.thaumagraphie": "Thaumagraphie", - "midgard5.thaumalogie": "Thaumalogie", - "midgard5.tierkunde": "Tierkunde", - "midgard5.ueberleben": "Überleben", - "midgard5.verfuehren": "Verführen", - "midgard5.verhoeren": "Verhören", - "midgard5.verstellen": "Verstellen", - "midgard5.volkstanz": "Volkstanz", - "midgard5.wagenlenken": "Wagenlenken", - "midgard5.wahrsagen": "Wahrsagen", - "midgard5.wasserkampf": "Wasserkampf", - "midgard5.zauberkunde": "Zauberkunde", + "abrichten": "Abrichten", + "akrobatik": "Akrobatik", + "alchimie": "Alchimie", + "anfuehren": "Anführen", + "askese": "Askese", + "astrologie": "Astrologie", + "athletik": "Athletik", + "balancieren": "Balancieren", + "beidhaendigerKampf": "Beidhändiger Kampf", + "bergreiten": "Bergreiten", + "beredsamkeit": "Beredsamkeit", + "betaeuben": "Betäuben", + "betaeubungsgriff": "Betäubungsgriff", + "bootfahren": "Bootfahren", + "dickhaeuterLenken": "Dickhäuter lenken", + "ersteHilfe": "Erste Hilfe", + "etikette": "Etikette", + "fallenEntdecken": "Fallen entdecken", + "fallenmechanik": "Fallenmechanik", + "faelschen": "Fälschen", + "fangen": "Fangen", + "fechten": "Fechten", + "feueralchimie": "Feueralchimie", + "gassenwissen": "Gassenwissen", + "gaukeln": "Gaukeln", + "gelaendelauf": "Geländelauf", + "geraetekunde": "Gerätekunde", + "geschaeftssinn": "Geschäftssinn", + "gluecksspiel": "Glücksspiel", + "heilkunde": "Heilkunde", + "kampfInVollruestung": "Kampf in Vollrüstung", + "kampfInSchlachtreihe": "Kampf in Schlachtreihe", + "kampfkunst": "Kampfkunst", + "kido": "Kido", + "klettern": "Klettern", + "landeskunde": "Landeskunde", + "laufen": "Laufen", + "lesenVonZauberschrift": "Lesen von Zauberschrift", + "lesenVonZauberrunen": "Lesen von Zauberrunen", + "meditieren": "Meditieren", + "menschenkenntnis": "Menschenkenntnis", + "meucheln": "Meucheln", + "musizieren": "Musizieren", + "naturkunde": "Naturkunde", + "ninjutsu": "NinJutsu", + "orakelkunst": "Orakelkunst", + "pflanzenkunde": "Pflanzenkunde", + "raunen": "Raunen", + "reiten": "Reiten", + "reiterkampf": "Reiterkampf", + "rutengehen": "Rutengehen", + "scharfschiessen": "Scharfschießen", + "schiesskunst": "Schießkunst", + "schleichen": "Schleichen", + "schloesserOeffnen": "Schlösser öffnen", + "schmerzErtragen": "Schmerzen ertragen", + "schwimmen": "Schwimmen", + "seilkunst": "Seilkunst", + "selbstkontrolle": "Selbstkontrolle", + "singen": "Singen", + "skifahren": "Skifahren", + "spinnengang": "Spinnengang", + "speerfechten": "Speerfechten", + "spurensuche": "Spurensuche", + "stehlen": "Stehlen", + "taitschi": "TaiTschi", + "tarnen": "Tarnen", + "tanzen": "Tanzen", + "tauchen": "Tauchen", + "thaumagraphie": "Thaumagraphie", + "thaumalogie": "Thaumalogie", + "tierkunde": "Tierkunde", + "ueberleben": "Überleben", + "verfuehren": "Verführen", + "verhoeren": "Verhören", + "verstellen": "Verstellen", + "volkstanz": "Volkstanz", + "wagenlenken": "Wagenlenken", + "wahrsagen": "Wahrsagen", + "wasserkampf": "Wasserkampf", + "zauberkunde": "Zauberkunde", - "midgard5.armor": "Rüstung", - "midgard5.defense": "Abwehr", - "midgard5.damageBonus": "Schadensbonus", - "midgard5.damageBonus-short": "SchB", - "midgard5.attackBonus": "Angriffsbonus", - "midgard5.attackBonus-short": "AnB", - "midgard5.defenseBonus": "Abwehrbonus", - "midgard5.defenseBonus-short": "AbB", - "midgard5.movementBonus": "Bewegunsbonus", - "midgard5.resistanceMind": "Resistenz Geist", - "midgard5.resistanceBody": "Resistenz Körper", - "midgard5.spellCasting": "Zaubern", - "midgard5.spellBonus": "Zauberbonus", - "midgard5.brawl": "Raufen", - "midgard5.poisonResistance": "Gifttolleranz", - "midgard5.enduranceBonus": "Ausdauerbonus", - "midgard5.lpProtection": "Rüstungsschutz (LP)", - "midgard5.apProtection": "Rüstungsschutz (AP)", - "midgard5.perception": "Wahrnehmung", - "midgard5.drinking": "Trinken", + "armor": "Rüstung", + "defense": "Abwehr", + "damageBonus": "Schadensbonus", + "damageBonus-short": "SchB", + "attackBonus": "Angriffsbonus", + "attackBonus-short": "AnB", + "defenseBonus": "Abwehrbonus", + "defenseBonus-short": "AbB", + "movementBonus": "Bewegunsbonus", + "resistanceMind": "Resistenz Geist", + "resistanceBody": "Resistenz Körper", + "spellCasting": "Zaubern", + "spellBonus": "Zauberbonus", + "brawl": "Raufen", + "poisonResistance": "Gifttolleranz", + "enduranceBonus": "Ausdauerbonus", + "lpProtection": "Rüstungsschutz (LP)", + "apProtection": "Rüstungsschutz (AP)", + "perception": "Wahrnehmung", + "drinking": "Trinken", - "midgard5.new-skill": "Neue Fertigkeit", - "midgard5.special": "Spezial", - "midgard5.learned-skill": "Gelernte Fertigkeit", - "midgard5.learned-skills": "Gelernte Fertigkeiten", - "midgard5.language": "Sprache", - "midgard5.languages": "Sprachen", - "midgard5.writings": "Schriften", - "midgard5.weapon-skill": "Waffenfertigkeit", - "midgard5.weapon-skills": "Waffenfertigkeiten", - "midgard5.unlearned-skill": "Ungelernte Fertigkeit", - "midgard5.unlearned-skills": "Ungelernte Fertigkeiten", - "midgard5.innate-ability": "Angeborene/Besondere Fähigkeit", - "midgard5.innate-abilities": "Angeborene und besondere Fähigkeiten", + "new-skill": "Neue Fertigkeit", + "special": "Spezial", + "learned-skill": "Gelernte Fertigkeit", + "learned-skills": "Gelernte Fertigkeiten", + "language": "Sprache", + "languages": "Sprachen", + "writings": "Schriften", + "weapon-skill": "Waffenfertigkeit", + "weapon-skills": "Waffenfertigkeiten", + "unlearned-skill": "Ungelernte Fertigkeit", + "unlearned-skills": "Ungelernte Fertigkeiten", + "innate-ability": "Angeborene/Besondere Fähigkeit", + "innate-abilities": "Angeborene und besondere Fähigkeiten", - "midgard5.base-damage": "Grundschaden", - "midgard5.weapon": "Waffe", - "midgard5.weapons": "Waffen", - "midgard5.defensive-weapon": "Verteidigungswaffe", - "midgard5.defensive-weapons": "Verteidigungswaffen", - "midgard5.no-skill": "Keine Fertigkeit", - "midgard5.magic": "magisch", - "midgard5.valuable": "Vermögen", - "midgard5.equipped": "Ausgerüstet", - "midgard5.active": "Aktiv", - "midgard5.rangedWeapon": "Schusswaffe", - "midgard5.assignItemToCharacter": "Füge Gegenstand einem Charakter hinzu, um hier etwas auswählen zu können", - "midgard5.showAll": "Alle anzeigen", - "midgard5.wealthAndWeight": "Vermögen und Lasten", - "midgard5.itemsInContainers": "Gegenstände in Aufbewahrung", - "midgard5.allItems": "Alle Gegenstände", + "base-damage": "Grundschaden", + "weapon": "Waffe", + "weapons": "Waffen", + "defensive-weapon": "Verteidigungswaffe", + "defensive-weapons": "Verteidigungswaffen", + "no-skill": "Keine Fertigkeit", + "magic": "magisch", + "valuable": "Vermögen", + "equipped": "Ausgerüstet", + "active": "Aktiv", + "rangedWeapon": "Schusswaffe", + "assignItemToCharacter": "Füge Gegenstand einem Charakter hinzu, um hier etwas auswählen zu können", + "showAll": "Alle anzeigen", + "wealthAndWeight": "Vermögen und Lasten", + "itemsInContainers": "Gegenstände in Aufbewahrung", + "allItems": "Alle Gegenstände", - "midgard5.pw": "Prüfwurf", - "midgard5.attack": "Angriff", - "midgard5.damage": "Schaden", + "pw": "Prüfwurf", + "attack": "Angriff", + "damage": "Schaden", - "midgard5.spell-process-none": "Ohne", - "midgard5.spell-process-artefakte": "Artefakte", - "midgard5.spell-process-beherrschen": "Beherrschen", - "midgard5.spell-process-bewegen": "Bewegen", - "midgard5.spell-process-beschwoeren": "Beschwören", - "midgard5.spell-process-blutmagie": "Blutmagie", - "midgard5.spell-process-chaoswunder": "Chaoswunder", - "midgard5.spell-process-dweomer": "Dweomer", - "midgard5.spell-process-erkennen": "Erkennen", - "midgard5.spell-process-erschaffen": "Erschaffen", - "midgard5.spell-process-erhaltung": "Erhaltung", - "midgard5.spell-process-formen": "Formen", - "midgard5.spell-process-finstere_magie": "Finstere Magie", - "midgard5.spell-process-kampfverse": "Kampfverse", - "midgard5.spell-process-namensmagie": "Namensmagie", - "midgard5.spell-process-nekromantie": "Nekromantie", - "midgard5.spell-process-runenstaebe": "Runenstäbe", - "midgard5.spell-process-thaumatherapie": "Thaumatherapie", - "midgard5.spell-process-veraendern": "Verändern", - "midgard5.spell-process-vigilsignien": "Vigilsignien", - "midgard5.spell-process-wundertat": "Wundertat", - "midgard5.spell-process-wilder_Dweomer": "Wilder Dweomer", - "midgard5.spell-process-zerstoeren": "Zerstören", - "midgard5.spell-process-zauberlied": "Zauberlieder", - "midgard5.spell-process-zaubersalz": "Zaubersalze", - "midgard5.spell-process-zaubermittel": "Zaubermittel", - "midgard5.spell-process-zauberschutz": "Zauberschutz", - "midgard5.spell-process-zauberrunen": "Zauberrunen", - "midgard5.spell-process-zaubersiegel": "Zaubersiegel", - "midgard5.spell-process-zaubertaenze": "Zaubertänze", - "midgard5.spell-process-zauberblaetter": "Zauberblätter", + "spell-process-none": "Ohne", + "spell-process-artefakte": "Artefakte", + "spell-process-beherrschen": "Beherrschen", + "spell-process-bewegen": "Bewegen", + "spell-process-beschwoeren": "Beschwören", + "spell-process-blutmagie": "Blutmagie", + "spell-process-chaoswunder": "Chaoswunder", + "spell-process-dweomer": "Dweomer", + "spell-process-erkennen": "Erkennen", + "spell-process-erschaffen": "Erschaffen", + "spell-process-erhaltung": "Erhaltung", + "spell-process-formen": "Formen", + "spell-process-finstere_magie": "Finstere Magie", + "spell-process-kampfverse": "Kampfverse", + "spell-process-namensmagie": "Namensmagie", + "spell-process-nekromantie": "Nekromantie", + "spell-process-runenstaebe": "Runenstäbe", + "spell-process-thaumatherapie": "Thaumatherapie", + "spell-process-veraendern": "Verändern", + "spell-process-vigilsignien": "Vigilsignien", + "spell-process-wundertat": "Wundertat", + "spell-process-wilder_Dweomer": "Wilder Dweomer", + "spell-process-zerstoeren": "Zerstören", + "spell-process-zauberlied": "Zauberlieder", + "spell-process-zaubersalz": "Zaubersalze", + "spell-process-zaubermittel": "Zaubermittel", + "spell-process-zauberschutz": "Zauberschutz", + "spell-process-zauberrunen": "Zauberrunen", + "spell-process-zaubersiegel": "Zaubersiegel", + "spell-process-zaubertaenze": "Zaubertänze", + "spell-process-zauberblaetter": "Zauberblätter", - "midgard5.spell-type-gedanke": "Gedanke", - "midgard5.spell-type-geste": "Geste", - "midgard5.spell-type-wort": "Wort", + "spell-type-gedanke": "Gedanke", + "spell-type-geste": "Geste", + "spell-type-wort": "Wort", - "midgard5.spell-target-umgebung": "Umgebung", - "midgard5.spell-target-geist": "Geist", - "midgard5.spell-target-koerper": "Körper", + "spell-target-umgebung": "Umgebung", + "spell-target-geist": "Geist", + "spell-target-koerper": "Körper", - "midgard5.spell-type": "Art", - "midgard5.spell-process": "Prozess", - "midgard5.spell-castDuration": "Zauberdauer", - "midgard5.spell-castDuration-short": "Zd", - "midgard5.spell-range": "Reichweite", - "midgard5.spell-range-short": "Rw", - "midgard5.spell-effectTarget": "Wirkunsziel", - "midgard5.spell-effectTarget-short": "Wz", - "midgard5.spell-effectArea": "Wirkungsbereich", - "midgard5.spell-effectArea-short": "Wb", - "midgard5.spell-effectDuration": "Wirkungsdauer", - "midgard5.spell-effectDuration-short": "Wd", - "midgard5.spell-origin": "Ursprung", - "midgard5.spell-agens": "Agens", - "midgard5.spell-reagens": "Reagens", - "midgard5.spell-material": "Zaubermaterial", + "spell-type": "Art", + "spell-process": "Prozess", + "spell-castDuration": "Zauberdauer", + "spell-castDuration-short": "Zd", + "spell-range": "Reichweite", + "spell-range-short": "Rw", + "spell-effectTarget": "Wirkunsziel", + "spell-effectTarget-short": "Wz", + "spell-effectArea": "Wirkungsbereich", + "spell-effectArea-short": "Wb", + "spell-effectDuration": "Wirkungsdauer", + "spell-effectDuration-short": "Wd", + "spell-origin": "Ursprung", + "spell-agens": "Agens", + "spell-reagens": "Reagens", + "spell-material": "Zaubermaterial", - "midgard5.kampfkunst-type": "Form", - "midgard5.kampfkunst-variante": "Variante", - "midgard5.kampfkunst-variante-short": "Var", - "midgard5.kampfkunst-ep": "Erfahrungspunkte", - "midgard5.kampfkunst-rank": "Stufe", - "midgard5.kampfkunst-weapon": "Waffengruppe", - "midgard5.kampfkunst-enemy": "Einschränkungen durch Art der Gegner", + "kampfkunst-type": "Form", + "kampfkunst-variante": "Variante", + "kampfkunst-variante-short": "Var", + "kampfkunst-ep": "Erfahrungspunkte", + "kampfkunst-rank": "Stufe", + "kampfkunst-weapon": "Waffengruppe", + "kampfkunst-enemy": "Einschränkungen durch Art der Gegner", - "midgard5.kampfkunst-type-angriff": "Angriff", - "midgard5.kampfkunst-type-verteidigung": "Verteidigung", - "midgard5.kampfkunst-type-finte": "Finte", - "midgard5.kampfkunst-type-geist": "Geistestechnik", - "midgard5.kampfkunst-type-schießkunst": "Schießkunst", - "midgard5.kampfkunst-type-fechtkunst": "Fechtkunst", + "kampfkunst-type-angriff": "Angriff", + "kampfkunst-type-verteidigung": "Verteidigung", + "kampfkunst-type-finte": "Finte", + "kampfkunst-type-geist": "Geistestechnik", + "kampfkunst-type-schießkunst": "Schießkunst", + "kampfkunst-type-fechtkunst": "Fechtkunst", - "midgard5.kampfkunst-variante-anstuermen": "Anstürmen", - "midgard5.kampfkunst-variante-attackieren": "Attackieren", - "midgard5.kampfkunst-variante-entwaffnen": "Entwaffnen", - "midgard5.kampfkunst-variante-fechten": "Fechten", - "midgard5.kampfkunst-variante-schusstechnik": "Schusstechnik", - "midgard5.kampfkunst-variante-finten": "Finten", - "midgard5.kampfkunst-variante-geistestechnik": "Geistestechnik", - "midgard5.kampfkunst-variante-verteidigung": "Verteidigung", + "kampfkunst-variante-anstuermen": "Anstürmen", + "kampfkunst-variante-attackieren": "Attackieren", + "kampfkunst-variante-entwaffnen": "Entwaffnen", + "kampfkunst-variante-fechten": "Fechten", + "kampfkunst-variante-schusstechnik": "Schusstechnik", + "kampfkunst-variante-finten": "Finten", + "kampfkunst-variante-geistestechnik": "Geistestechnik", + "kampfkunst-variante-verteidigung": "Verteidigung", - "midgard5.kido-type": "KiDo Form", - "midgard5.kido-variante": "KiDo Variante", - "midgard5.kido-color": "Kampfstilfarbe", - "midgard5.kido-style": "Art der Technik", + "kido-type": "KiDo Form", + "kido-variante": "KiDo Variante", + "kido-color": "Kampfstilfarbe", + "kido-style": "Art der Technik", - "midgard5.kido-type-angriff": "Kido Angriff", - "midgard5.kido-type-verteidigung": "Kido Verteidigung", - "midgard5.kido-type-finte": "Kido Finte", - "midgard5.kido-type-leib": "Kido Leibestechnik", + "kido-type-angriff": "Kido Angriff", + "kido-type-verteidigung": "Kido Verteidigung", + "kido-type-finte": "Kido Finte", + "kido-type-leib": "Kido Leibestechnik", - "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", + "kido-variante-anspringen": "Anspringen", + "kido-variante-attackieren": "Attackieren", + "kido-variante-entwaffnen": "Entwaffnen", + "kido-variante-werfen": "Werfen", + "kido-variante-ausweichen": "Ausweichen", + "kido-variante-blockieren": "Blockieren", + "kido-variante-bewegen": "Bewegen", + "kido-variante-kontrollieren": "Kontrollieren", - "midgard5.mod-operation-add100": "Addieren (max 100)", - "midgard5.mod-operation-roll": "Wurf Modifikation", - "midgard5.mod-operation-add": "Addieren", - "midgard5.mod-operation-set": "Basiswert", - "midgard5.mod-operation-fixed": "Fester Wert", - "midgard5.mod-operation-subtract": "Subtrahieren", - "midgard5.mod-operation-multiply": "Multiplizieren", - "midgard5.mod-operation-division": "Dividieren", + "mod-operation-add100": "Addieren (max 100)", + "mod-operation-roll": "Wurf Modifikation", + "mod-operation-add": "Addieren", + "mod-operation-set": "Basiswert", + "mod-operation-fixed": "Fester Wert", + "mod-operation-subtract": "Subtrahieren", + "mod-operation-multiply": "Multiplizieren", + "mod-operation-division": "Dividieren", - "midgard5.mod-stat-defenseBonus": "Abwehrbonus", - "midgard5.mod-stat-attackBonus": "Angriffsbonus", - "midgard5.mod-stat-damageBonus": "Schadensbonus", - "midgard5.mod-stat-movement": "Bewegung", - "midgard5.mod-stat-resistanceMind": "Resistenz Geist", - "midgard5.mod-stat-resistanceBody": "Resistenz Körper", - "midgard5.mod-stat-spellCasting": "Zaubern", - "midgard5.mod-stat-brawl": "Raufen", - "midgard5.mod-stat-poisonResistance": "Gifttolleranz", - "midgard5.mod-stat-lp": "Lebenspunkte", - "midgard5.mod-stat-ap": "Ausdauerpunkte", - "midgard5.mod-stat-lpProtection": "Rüstungsschutz (LP)", - "midgard5.mod-stat-apProtection": "Rüstungsschutz (AP)", - "midgard5.mod-stat-perception": "Wahrnehmung", - "midgard5.mod-stat-drinking": "Trinken", + "mod-stat-defenseBonus": "Abwehrbonus", + "mod-stat-attackBonus": "Angriffsbonus", + "mod-stat-damageBonus": "Schadensbonus", + "mod-stat-movement": "Bewegung", + "mod-stat-resistanceMind": "Resistenz Geist", + "mod-stat-resistanceBody": "Resistenz Körper", + "mod-stat-spellCasting": "Zaubern", + "mod-stat-brawl": "Raufen", + "mod-stat-poisonResistance": "Gifttolleranz", + "mod-stat-lp": "Lebenspunkte", + "mod-stat-ap": "Ausdauerpunkte", + "mod-stat-lpProtection": "Rüstungsschutz (LP)", + "mod-stat-apProtection": "Rüstungsschutz (AP)", + "mod-stat-perception": "Wahrnehmung", + "mod-stat-drinking": "Trinken", - "midgard5.mod-type": "Typ der Modifikation", - "midgard5.mod-id": "Was soll modifiziert werden", - "midgard5.mod-operation": "Wie soll modifiziert werden", - "midgard5.mod-value": "Wert", + "mod-type": "Typ der Modifikation", + "mod-id": "Was soll modifiziert werden", + "mod-operation": "Wie soll modifiziert werden", + "mod-value": "Wert", - "midgard5.type": "Typ", - "midgard5.formula": "Formel", - "midgard5.roll": "Wurf" + "type": "Typ", + "formula": "Formel", + "roll": "Wurf", + + "chat": { + "luckPoint": "Glückspunkt", + "destiny": "Schicksalsgunst", + "modify": "Nachträglich +2", + "cancel": "Abbrechen", + "roll": "Würfeln", + "reroll": "Neuwürfeln", + + "options": { + "modifier": "Modifikator", + "difficulty": "Schwellenwert", + "rollMode": "Würfel Modus" + } + } + } } diff --git a/source/index.ts b/source/index.ts index 49f7311..693967e 100644 --- a/source/index.ts +++ b/source/index.ts @@ -5,6 +5,7 @@ import { M5Character } from "./module/actors/M5Character"; import { M5ItemMod, M5ModOperation, M5Skill, M5TimeUnit } from "./module/M5Base"; import { M5ItemSheet } from "./module/sheets/M5ItemSheet"; import { M5Item } from "./module/items/M5Item"; +import { reroll } from "./module/rolls/reroll"; Hooks.once("init", async () => { Logger.log("M5 | Initialisierung Midgard 5"); @@ -172,6 +173,17 @@ Hooks.on("getChatLogEntryContext", function (html, options) { return (game["user"].character || game["canvas"].tokens.controlled) && damageRolls > 0; }, callback: (li) => applyDamage(li, -2), + }, + { + name: "Redo", + icon: '', + condition: (li) => { + const message = (game as Game).messages.get(li.attr("data-message-id")); + + // All must be true to show the reroll dialogue + return game["user"].character.id === (game as Game).actors.get(message["speaker"].actor).id && !message["flags"].rerolled; + }, + callback: (li) => reroll(li), } ); }); diff --git a/source/module/rolls/M5Roll.ts b/source/module/rolls/M5Roll.ts index ffa61bb..7d57af8 100644 --- a/source/module/rolls/M5Roll.ts +++ b/source/module/rolls/M5Roll.ts @@ -109,7 +109,7 @@ export class M5Roll { if (!this._evaluated) await this.evaluate(); - const rMode = (game as Game).settings.get("core", "rollMode"); + const rMode = checkOptions["rollMode"] || (game as Game).settings.get("core", "rollMode"); const chatData = { type: CONST.CHAT_MESSAGE_TYPES.ROLL, @@ -117,10 +117,11 @@ export class M5Roll { speaker: ChatMessage.getSpeaker({ actor: this.actor }), sound: CONFIG.sounds.dice, roll: Roll.fromTerms([this.pool]), + flags: { data: this.data }, }; - ChatMessage.applyRollMode(chatData, rMode); - return ChatMessage.create(chatData); + let foo = ChatMessage.applyRollMode(chatData, rMode); + return ChatMessage.implementation["create"](foo, { rollMode: rMode }); } static fromAttributeValue(actor: any, attributeKey: string, attributeValue: number) { @@ -323,31 +324,29 @@ export class M5Roll { } async popUp({ - hasFortune = true, - taskType = null, useFortune = false, difficulty = 20, modifier = 0, - closedRoll = false, + rollModes = CONFIG.Dice.rollModes, + rollMode = "", template = "systems/midgard5/templates/chat/task-check-dialog.hbs", } = {}) { - const html = await renderTemplate(template, { hasFortune, useFortune, difficulty, modifier, closedRoll }); - + const html = await renderTemplate(template, { useFortune, difficulty, modifier, rollModes, rollMode }); return new Promise((resolve) => { const data = { - title: (game as Game).i18n.format("midgard5.chat.taskCheck.title", { type: taskType }), + title: (game as Game).i18n.localize("midgard5.chat.roll"), content: html, buttons: { - normal: { - label: (game as Game).i18n.localize("midgard5.chat.actions.roll"), + roll: { + label: (game as Game).i18n.localize("midgard5.chat.roll"), callback: (html) => resolve(this._processTaskCheckOptions(html[0].querySelector("form"))), }, cancel: { - label: (game as Game).i18n.localize("midgard5.chat.actions.cancel"), + label: (game as Game).i18n.localize("midgard5.chat.cancel"), callback: (html) => resolve({ cancelled: true }), }, }, - default: "normal", + default: "roll", close: () => resolve({ cancelled: true }), }; @@ -359,8 +358,7 @@ export class M5Roll { return { difficulty: parseInt(form.difficulty?.value), modifier: parseInt(form.modifier?.value), - useFortune: form.useFortune?.checked, - closedRoll: form.closedRoll?.checked, + rollMode: form.rollMode?.value, }; } } diff --git a/source/module/rolls/reroll.ts b/source/module/rolls/reroll.ts new file mode 100644 index 0000000..32eee57 --- /dev/null +++ b/source/module/rolls/reroll.ts @@ -0,0 +1,107 @@ +import { M5RollData, M5RollResult } from "../M5Base"; +import { M5Roll } from "./M5Roll"; + +export const reroll = async (roll) => { + const message = (game as Game).messages.get(roll.attr("data-message-id")); + const actor = (game as Game).actors.get(message["speaker"].actor); + + const template = "systems/midgard5/templates/chat/reroll-dialog.hbs"; + const html = await renderTemplate(template, { sg: actor.system.sg, gp: actor.system.gp }); + // Button defining + let buttons = {}; + buttons = { + destiny: { + icon: '', + label: (game as Game).i18n.localize("midgard5.chat.destiny"), + callback: () => rerollDie("destiny", "sg"), + }, + luckPoints: { + icon: '', + label: (game as Game).i18n.localize("midgard5.chat.luckPoint"), + callback: () => rerollDie("luckPoint", "gp"), + }, + modify: { + icon: '', + label: (game as Game).i18n.localize("midgard5.chat.modify"), + callback: () => rerollDie("modify", "gp"), + }, + cancel: { + icon: '', + label: (game as Game).i18n.localize("midgard5.chat.cancel"), + }, + }; + + // Dialog object + new Dialog( + { + title: (game as Game).i18n.localize("midgard5.chat.reroll"), + content: html, + buttons, + render: function () {}, + default: "luckPoints", + }, + { + classes: ["midgard5"], + } + ).render(true); + + async function rerollDie(type, target) { + // Update the "content" field + let rollData = actor.getRollData() as M5RollData; + const flagData = message["flags"].data; + rollData.i = flagData.i; + rollData.b = flagData.b; + rollData.iType = flagData.iType; + rollData.res.label = flagData.res.label + " (" + (game as Game).i18n.localize(`midgard5.chat.${type}`) + ")"; + actor.update({ + system: { + [target]: actor.system[target] - 1, + }, + }); + if (type !== "modify") { + for (var key in flagData.rolls) { + if (!!flagData.rolls[key]) { + rollData.rolls[key] = { + formula: flagData.rolls[key]?.formula, + enabled: flagData.rolls[key]?.enabled, + label: flagData.rolls[key]?.label, + result: "", + total: 0, + totalStr: "", + dice: {}, + css: "", + } as M5RollResult; + } + } + } else { + for (var key in flagData.rolls) { + if (!!flagData.rolls[key]) { + rollData.rolls[key] = { + formula: key === "0" ? flagData.rolls[key]?.result + " + 2" : flagData.rolls[key]?.result, + enabled: flagData.rolls[key]?.enabled, + label: flagData.rolls[key]?.label, + result: "", + total: 0, + totalStr: "", + dice: {}, + css: "", + } as M5RollResult; + } + } + } + + const newRoll = new M5Roll(rollData, actor, rollData.res.label); + if (!newRoll._evaluated) await newRoll.evaluate(); + + const chatData = { + type: CONST.CHAT_MESSAGE_TYPES.ROLL, + content: await newRoll.render(), + speaker: ChatMessage.getSpeaker({ actor: actor }), + sound: CONFIG.sounds.dice, + roll: Roll.fromTerms([newRoll.pool]), + flags: { rerolled: true }, + }; + + message.update(chatData); + } +}; diff --git a/templates/chat/reroll-dialog.hbs b/templates/chat/reroll-dialog.hbs new file mode 100644 index 0000000..a1b9583 --- /dev/null +++ b/templates/chat/reroll-dialog.hbs @@ -0,0 +1,18 @@ +
+
+ +
+ +
+
+ {{localize "midgard5.destiny"}}: + {{sg}} +
+
+ {{localize "midgard5.luckPoints"}}: + {{gp}} +
+
+
+
+
\ No newline at end of file diff --git a/templates/chat/task-check-dialog.hbs b/templates/chat/task-check-dialog.hbs index 74482ce..fe969f5 100644 --- a/templates/chat/task-check-dialog.hbs +++ b/templates/chat/task-check-dialog.hbs @@ -1,20 +1,20 @@
-
- - -
-
- - -
- {{#if hasFortune}} -
- - -
- {{/if}} -
- - -
+
+ + +
+
+ + +
+
+ + +
\ No newline at end of file -- 2.40.1 From 4ce31a97dfd23e94d19cf82a46d10195fef860e7 Mon Sep 17 00:00:00 2001 From: Byroks Date: Thu, 28 Mar 2024 17:05:28 +0100 Subject: [PATCH 4/6] Mod applies to roll not total MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes: + modifier wird auf den wurf gerechnet und nicht auf das gesamt ergebniss (Wichtig für d100 würfe + Zeig modifier hinter dem wurf label an --- lang/de.json | 2 +- source/index.ts | 2 +- source/module/rolls/M5Roll.ts | 7 +++---- source/module/rolls/reroll.ts | 6 ++++-- templates/chat/roll-m5.hbs | 2 +- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lang/de.json b/lang/de.json index a083c65..3be5527 100644 --- a/lang/de.json +++ b/lang/de.json @@ -416,7 +416,7 @@ "chat": { "luckPoint": "Glückspunkt", "destiny": "Schicksalsgunst", - "modify": "Nachträglich +2", + "modify": "Nachträglich", "cancel": "Abbrechen", "roll": "Würfeln", "reroll": "Neuwürfeln", diff --git a/source/index.ts b/source/index.ts index 693967e..927f44d 100644 --- a/source/index.ts +++ b/source/index.ts @@ -181,7 +181,7 @@ Hooks.on("getChatLogEntryContext", function (html, options) { const message = (game as Game).messages.get(li.attr("data-message-id")); // All must be true to show the reroll dialogue - return game["user"].character.id === (game as Game).actors.get(message["speaker"].actor).id && !message["flags"].rerolled; + return (game["user"].isGM || game["user"].character?.id === (game as Game).actors.get(message["speaker"].actor)?.id) && !message["flags"].rerolled; }, callback: (li) => reroll(li), } diff --git a/source/module/rolls/M5Roll.ts b/source/module/rolls/M5Roll.ts index 7d57af8..3935929 100644 --- a/source/module/rolls/M5Roll.ts +++ b/source/module/rolls/M5Roll.ts @@ -26,11 +26,11 @@ export class M5Roll { .map((rollName, index) => { indexMap.set(index, rollName); const formula = this.data.rolls[rollName]; - formula.formula = index === 0 ? formula.formula + " + " + this.data.b.modifier : formula.formula; + formula.formula = index === 0 ? formula.formula.replace(/(\d*d\d*)/, `{$1 + ${this.data.b.modifier}}`) : formula.formula; const roll = new Roll(formula.formula, this.data); return roll; }); - + console.log(rolls); this.pool = PoolTerm.fromRolls(rolls); console.log("evaluate", this._evaluated, this.pool); return this.pool.evaluate({ async: true }).then((results) => { @@ -110,14 +110,13 @@ export class M5Roll { if (!this._evaluated) await this.evaluate(); const rMode = checkOptions["rollMode"] || (game as Game).settings.get("core", "rollMode"); - const chatData = { type: CONST.CHAT_MESSAGE_TYPES.ROLL, content: await this.render(), speaker: ChatMessage.getSpeaker({ actor: this.actor }), sound: CONFIG.sounds.dice, roll: Roll.fromTerms([this.pool]), - flags: { data: this.data }, + flags: { data: this.data, rerolled: false, faces: this.pool.dice.map((x) => x.faces) }, }; let foo = ChatMessage.applyRollMode(chatData, rMode); diff --git a/source/module/rolls/reroll.ts b/source/module/rolls/reroll.ts index 32eee57..774eb3c 100644 --- a/source/module/rolls/reroll.ts +++ b/source/module/rolls/reroll.ts @@ -4,9 +4,11 @@ import { M5Roll } from "./M5Roll"; export const reroll = async (roll) => { const message = (game as Game).messages.get(roll.attr("data-message-id")); const actor = (game as Game).actors.get(message["speaker"].actor); + // const die const template = "systems/midgard5/templates/chat/reroll-dialog.hbs"; const html = await renderTemplate(template, { sg: actor.system.sg, gp: actor.system.gp }); + console.log(message["flags"].faces[0]); // Button defining let buttons = {}; buttons = { @@ -22,7 +24,7 @@ export const reroll = async (roll) => { }, modify: { icon: '', - label: (game as Game).i18n.localize("midgard5.chat.modify"), + label: (game as Game).i18n.localize("midgard5.chat.modify") + " +" + (message["flags"].faces[0] === 100 ? 10 : 2), callback: () => rerollDie("modify", "gp"), }, cancel: { @@ -77,7 +79,7 @@ export const reroll = async (roll) => { for (var key in flagData.rolls) { if (!!flagData.rolls[key]) { rollData.rolls[key] = { - formula: key === "0" ? flagData.rolls[key]?.result + " + 2" : flagData.rolls[key]?.result, + formula: key === "0" ? flagData.rolls[key]?.result + " + " + (message["flags"].faces[0] === 100 ? 10 : 2) : flagData.rolls[key]?.result, enabled: flagData.rolls[key]?.enabled, label: flagData.rolls[key]?.label, result: "", diff --git a/templates/chat/roll-m5.hbs b/templates/chat/roll-m5.hbs index 1613af5..9e516fd 100644 --- a/templates/chat/roll-m5.hbs +++ b/templates/chat/roll-m5.hbs @@ -125,7 +125,7 @@ {{#each rolls as |roll index|}} {{#if roll.enabled}} - {{roll.label}} + {{roll.label}} {{#if (eq index '0')}} {{#if (gt ../b.modifier 0)}}+{{../b.modifier}}{{/if}}{{#if (gt 0 ../b.modifier)}}{{../b.modifier}}{{/if}}{{/if}} {{roll.totalStr}} {{roll.result}} -- 2.40.1 From e6479feaa6c9411caf43284a8d4c7428aade3347 Mon Sep 17 00:00:00 2001 From: Byroks Date: Thu, 28 Mar 2024 17:25:19 +0100 Subject: [PATCH 5/6] Versteck schwellenwert bei PW --- source/module/rolls/M5Roll.ts | 8 +++++--- templates/chat/task-check-dialog.hbs | 10 ++++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/source/module/rolls/M5Roll.ts b/source/module/rolls/M5Roll.ts index 3935929..f018d66 100644 --- a/source/module/rolls/M5Roll.ts +++ b/source/module/rolls/M5Roll.ts @@ -100,7 +100,7 @@ export class M5Roll { } async toMessage() { - let checkOptions = await this.popUp(); + let checkOptions = await this.popUp({ isPW: this.data.rolls[0].label === (game as Game).i18n.localize("midgard5.pw") }); if (checkOptions["cancelled"]) { return; } else { @@ -108,6 +108,7 @@ export class M5Roll { } if (!this._evaluated) await this.evaluate(); + const faces = this.pool.dice.map((x) => x.faces); const rMode = checkOptions["rollMode"] || (game as Game).settings.get("core", "rollMode"); const chatData = { @@ -116,7 +117,7 @@ export class M5Roll { speaker: ChatMessage.getSpeaker({ actor: this.actor }), sound: CONFIG.sounds.dice, roll: Roll.fromTerms([this.pool]), - flags: { data: this.data, rerolled: false, faces: this.pool.dice.map((x) => x.faces) }, + flags: { data: this.data, rerolled: false, faces: faces }, }; let foo = ChatMessage.applyRollMode(chatData, rMode); @@ -329,8 +330,9 @@ export class M5Roll { rollModes = CONFIG.Dice.rollModes, rollMode = "", template = "systems/midgard5/templates/chat/task-check-dialog.hbs", + isPW = false, } = {}) { - const html = await renderTemplate(template, { useFortune, difficulty, modifier, rollModes, rollMode }); + const html = await renderTemplate(template, { useFortune, difficulty, modifier, rollModes, rollMode, isPW }); return new Promise((resolve) => { const data = { title: (game as Game).i18n.localize("midgard5.chat.roll"), diff --git a/templates/chat/task-check-dialog.hbs b/templates/chat/task-check-dialog.hbs index fe969f5..6604497 100644 --- a/templates/chat/task-check-dialog.hbs +++ b/templates/chat/task-check-dialog.hbs @@ -3,10 +3,12 @@ -
- - -
+ {{#unless isPW}} +
+ + +
+ {{/unless}}