Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | 1x 1x 1x 1x 1x 25x 70x 24x 23x 22x 1x 24x 1x 1x 26x 51x 12x 13x 13x 12x 1x 1x 1x 1x | import { Fraction, RandomDevice } from "../math"; import { AttackDieFace } from "./AttackDieFace"; import { AttackResult, DefenseResult } from "./CampaignResult"; import { DefenseDieFace } from "./DefenseDieFace"; /** The Oath attack (red) die. */ export const AttackDie = new RandomDevice<AttackDieFace>([ [AttackDieFace.HOLLOW_SWORD, new Fraction(3, 6)], [AttackDieFace.SWORD, new Fraction(2, 6)], [AttackDieFace.TWO_SWORDS_AND_SKULL, new Fraction(1, 6)], ]); /** * Sums up a set of attack die faces into an attack roll result. * * @param {DieFace[]} faces * A set of attack die faces. * @returns {CampaignResult} * The attack roll result after adding all die faces. */ export function toAttackResult(faces: AttackDieFace[]): AttackResult { const raw = faces.sort().reduce( (acc: AttackResult, face: AttackDieFace) => { switch (face) { case AttackDieFace.HOLLOW_SWORD: return { ...acc, attack: acc.attack + 0.5 }; case AttackDieFace.SWORD: return { ...acc, attack: acc.attack + 1 }; case AttackDieFace.TWO_SWORDS_AND_SKULL: return { ...acc, attack: acc.attack + 2, kill: acc.kill + 1 }; default: throw new Error(`Unknown die face ${face}`); } }, { attack: 0, kill: 0 } ); return { ...raw, attack: Math.floor(raw.attack) }; } /** The Oath defense (blue) die. */ export const DefenseDie = new RandomDevice<DefenseDieFace>([ [DefenseDieFace.BLANK, new Fraction(2, 6)], [DefenseDieFace.SHIELD, new Fraction(2, 6)], [DefenseDieFace.TWO_SHIELDS, new Fraction(1, 6)], [DefenseDieFace.DOUBLE, new Fraction(1, 6)], ]); /** * Sums up a set of defense die faces into a defense roll result. * * @param {DieFace[]} faces * A set of defense die faces. * @returns {CampaignResult} * The defense roll result after adding all die faces. */ export function toDefenseResult(faces: DefenseDieFace[]): DefenseResult { return faces.sort().reduce( (acc: DefenseResult, face: DefenseDieFace) => { switch (face) { case DefenseDieFace.BLANK: return acc; case DefenseDieFace.SHIELD: return { ...acc, defense: acc.defense + 1 }; case DefenseDieFace.TWO_SHIELDS: return { ...acc, defense: acc.defense + 2 }; case DefenseDieFace.DOUBLE: return { ...acc, defense: acc.defense * 2 }; default: throw new Error(`Unknown die face ${face}`); } }, { defense: 0 } ); } export * from "./AttackDieFace"; export * from "./CampaignResult"; export * from "./DefenseDieFace"; |