From 519b5ea7b36ceceea93553908ad2b64c78f50617 Mon Sep 17 00:00:00 2001 From: bakbakbakbakbak Date: Sun, 9 Apr 2023 09:13:50 +0200 Subject: [PATCH 1/2] fix(monster): hd rolling --- .../actor/__tests__/entity-actor.test.ts | 89 +++++++++++++------ src/module/actor/entity.js | 24 +++-- 2 files changed, 80 insertions(+), 33 deletions(-) diff --git a/src/module/actor/__tests__/entity-actor.test.ts b/src/module/actor/__tests__/entity-actor.test.ts index aed9ca14..19a1cbd7 100644 --- a/src/module/actor/__tests__/entity-actor.test.ts +++ b/src/module/actor/__tests__/entity-actor.test.ts @@ -472,34 +472,69 @@ export default ({ ]; const levelSpread = Array.from({ length: 9 }, (_el, idx) => idx + 1); - conScoreSpread.forEach((con, idx) => { - const conMod = conBonusSpread[idx]; - const expectedTerms = conMod >= 0 ? 5 : 6; - const modSign = conMod < 0 ? "-" : "+"; - const modUnsigned = modSign === "-" ? conMod * -1 : conMod; - levelSpread.forEach((level) => { - it(`constructs the roll terms correctly with level ${level} and con ${con}`, async () => { - const actor = (await createMockActor("character")) as OseActor; - await actor?.update({ - system: { details: { level }, scores: { con: { value: con } } }, + describe("monster", () => { + it("constructs the roll terms correctly for monster actor", async () => { + const actor = (await createMockActor("monster")) as OseActor; + await actor?.update({ "system.hp.hd": "5d8" }); + + const roll = await actor.rollHitDice(); + + expect(roll.terms.length).equal(1); + expect(roll.terms[0].faces).equal(8); + expect(roll.terms[0].results.length).equal(5); + + await actor?.delete(); + }); + }); + + describe("character", () => { + conScoreSpread.forEach((con, idx) => { + const conMod = conBonusSpread[idx]; + const expectedTerms = conMod >= 0 ? 5 : 6; + const modSign = conMod < 0 ? "-" : "+"; + const modUnsigned = modSign === "-" ? conMod * -1 : conMod; + levelSpread.forEach((level) => { + it(`constructs the roll terms correctly with level ${level} and con ${con} for character actor`, async () => { + const actor = (await createMockActor("character")) as OseActor; + await actor?.update({ + system: { details: { level }, scores: { con: { value: con } } }, + }); + const roll = await actor.rollHitDice(); + + // Expect the roll constructed to look like for a character + // {level}{hd.type} + {con.mod}*{level} + // Expect the roll constructed to look like for a monster + // {hd} + + // Check the die type & amount of HD + expect(roll.terms.length).equal(expectedTerms); + expect(roll.terms[0].faces).equal( + parseInt( + actor?.system.hp.hd.slice(actor.system.hp.hd.indexOf("d") + 1), + 10 + ) + ); + expect(roll.terms[0].results.length).equal( + actor?.system.details.level + ); + + // Check the con mod + if (conMod < 0) { + expect(roll.terms[expectedTerms - 5].operator).equal("+"); + } + expect(roll.terms[expectedTerms - 4].operator).equal(modSign); + expect(roll.terms[expectedTerms - 3].expression).equal( + modUnsigned.toString() + ); + + // Check the level multiplier with level + expect(roll.terms[expectedTerms - 2].operator).equal("*"); + expect(roll.terms[expectedTerms - 1].number).equal(level); + + // Verify the con mod on the actor + expect(actor?.system.scores.con.mod).equal(conMod); + await actor?.delete(); }); - const roll = await actor.rollHitDice(); - - expect(roll.terms.length).equal(expectedTerms); - expect(roll.terms[0].expression).equal(actor?.system.hp.hd); - if (conMod < 0) { - expect(roll.terms[expectedTerms - 5].operator).equal("+"); - } - expect(roll.terms[expectedTerms - 4].operator).equal(modSign); - expect(roll.terms[expectedTerms - 3].expression).equal( - modUnsigned.toString() - ); - expect(roll.terms[expectedTerms - 2].operator).equal("+"); - expect(roll.terms[expectedTerms - 1].expression).equal( - level.toString() - ); - expect(actor?.system.scores.con.mod).equal(conMod); - await actor?.delete(); }); }); }); diff --git a/src/module/actor/entity.js b/src/module/actor/entity.js index 2b5a2f99..52914863 100644 --- a/src/module/actor/entity.js +++ b/src/module/actor/entity.js @@ -293,9 +293,19 @@ export default class OseActor extends Actor { const actorData = this.system; const label = game.i18n.localize(`OSE.roll.hd`); - const rollParts = [actorData.hp.hd]; + + const rollParts = []; + if (actorType === "character") { - rollParts.push(actorData.scores.con.mod * actorData.details.level); + const hd = `${actorData.details.level}${actorData.hp.hd.slice( + actorData.hp.hd.indexOf("d") + )}`; + rollParts.push(hd); + rollParts.push( + `${actorData.scores.con.mod} * ${actorData.details.level}` + ); + } else { + rollParts.push(actorData.hp.hd); } const data = { @@ -397,14 +407,14 @@ export default class OseActor extends Actor { }; const dmgParts = []; - if (attData.roll.dmg) { + if (attData.roll?.dmg) { dmgParts.push(attData.roll.dmg); } else { dmgParts.push("1d6"); } // Add Str to damage - if (attData.roll.type === "melee") { + if (attData.roll?.type === "melee") { dmgParts.push(data.scores.str.mod); } @@ -499,8 +509,10 @@ export default class OseActor extends Actor { } /** - * @param {number | string} amount - * @param {1 | -1} multiplier + * Applies damage to an actor + * + * @param {number | string} amount - Amount of damage, negative for healing + * @param {1 | -1} multiplier - Multiplier to damage, negative for healing * @returns */ async applyDamage(amount = 0, multiplier = 1) { From ac5df135e1e050a40802ef4cf8d75ec9b1c1a5ff Mon Sep 17 00:00:00 2001 From: bakbakbakbakbak Date: Sun, 9 Apr 2023 09:13:50 +0200 Subject: [PATCH 2/2] fix: Allow 2D6 roll for hitdice (cap. letter) --- src/module/actor/entity.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/module/actor/entity.js b/src/module/actor/entity.js index 52914863..3a275671 100644 --- a/src/module/actor/entity.js +++ b/src/module/actor/entity.js @@ -298,7 +298,7 @@ export default class OseActor extends Actor { if (actorType === "character") { const hd = `${actorData.details.level}${actorData.hp.hd.slice( - actorData.hp.hd.indexOf("d") + actorData.hp.hd.toLowerCase().indexOf("d") )}`; rollParts.push(hd); rollParts.push(