From eb077928cfae15446ee3c11c7281b88424460f28 Mon Sep 17 00:00:00 2001 From: Balint Morasz Date: Thu, 14 Sep 2023 21:28:51 +0200 Subject: [PATCH] WIP basic level up 2nd round --- src/components/FajSelector.tsx | 2 +- src/components/Level2.tsx | 46 ++++++++++----- src/components/OsztalySelector.tsx | 2 +- src/components/TulajdonsagInput.tsx | 2 +- src/domain-models/karakter.ts | 68 +++++++++++++++++----- src/domain-models/tamadas_bonus_tabla.json | 68 ++++++++++++++++++++++ src/pages/CreateCharacter.tsx | 15 ++++- src/pdf/character.pdf.ts | 16 ++--- 8 files changed, 179 insertions(+), 40 deletions(-) create mode 100644 src/domain-models/tamadas_bonus_tabla.json diff --git a/src/components/FajSelector.tsx b/src/components/FajSelector.tsx index ac7da52..098b483 100644 --- a/src/components/FajSelector.tsx +++ b/src/components/FajSelector.tsx @@ -6,7 +6,7 @@ function FajSelector(props: { faj: Faj, changeFaj: (val: Faj) => void }) { return <>
- changeFaj(e.target.value as Faj)}> diff --git a/src/components/Level2.tsx b/src/components/Level2.tsx index c3ccd05..837808a 100644 --- a/src/components/Level2.tsx +++ b/src/components/Level2.tsx @@ -1,37 +1,57 @@ import React from "react"; -import {Osztaly} from "../domain-models/osztaly"; +import {KarakterClass, KarakterInputs} from "../domain-models/karakter"; import {SignedNumberToText} from "./Helpers"; -import {Modifier} from "../domain-models/tulajdonsag"; function Level2(props: { - osztaly: Osztaly + karakter: KarakterInputs rolledHP: number - t_egs: number + changeRolledHP: (hp: number) => void, }) { - const {osztaly, rolledHP, t_egs} = props + const {karakter, rolledHP, changeRolledHP} = props + const karakterClass = new KarakterClass(karakter) + return <>
2. Szint
-
+
- - {SignedNumberToText(rolledHP + Modifier(t_egs))} + +
+ changeRolledHP(Number(e.target.value))} /> +
-
-
- + +1
-
-
+1
+
+
+ + {karakterClass.HP()} +
+
+ + {karakterClass.TamadasBonusz().map(SignedNumberToText).join("/")} +
+
+ + {SignedNumberToText(karakterClass.KitartasMentoAlap())} +
+
} diff --git a/src/components/OsztalySelector.tsx b/src/components/OsztalySelector.tsx index cc6c09f..3dea3fd 100644 --- a/src/components/OsztalySelector.tsx +++ b/src/components/OsztalySelector.tsx @@ -14,7 +14,7 @@ function OsztalySelector(props: {currentFaj: Faj, currentOsztaly: Osztaly, chang return <>
- changeOsztaly(e.target.value as Osztaly)} > {currentFaj === Faj.Amazon && ( diff --git a/src/components/TulajdonsagInput.tsx b/src/components/TulajdonsagInput.tsx index 7898dea..4806ada 100644 --- a/src/components/TulajdonsagInput.tsx +++ b/src/components/TulajdonsagInput.tsx @@ -31,7 +31,7 @@ function TulajdonsagInput(props: { return (
- changeValue(Number(e.target.value))} /> + changeValue(Number(e.target.value))} />
{fajiModositoText(currentFaj, fajiModosito)} diff --git a/src/domain-models/karakter.ts b/src/domain-models/karakter.ts index dd5fbe5..c1f7748 100644 --- a/src/domain-models/karakter.ts +++ b/src/domain-models/karakter.ts @@ -3,6 +3,7 @@ import {Osztaly} from "./osztaly"; import {KarakterTulajdonsagok, Modifier} from "./tulajdonsag"; import {CalculateMasodlagosErtekek, KarakterMasodlagosErtekek} from "./masodlagos_ertekek"; import {Kepzettseg, Kepzettsegek, KepzettsegId} from "./kepzettsegek"; +import TamadasBonuszTabla from './tamadas_bonus_tabla.json'; export interface Karakter { Name: string @@ -17,8 +18,8 @@ export interface Karakter { VO: () => number Mozgas: () => number Kezdemenyezes: () => number - KozelharciTB: () => number - CelzoTB: () => number + KozelharciTB: () => number[] + CelzoTB: () => number[] KitartasMentoAlap: () => number ReflexMentoAlap: () => number AkarateroMentoAlap: () => number @@ -54,6 +55,7 @@ export class KarakterClass implements Karakter { public TolvajKepzettsegek: Kepzettseg[] private MasodlagosErtekek : KarakterMasodlagosErtekek + private HProlls: number[] constructor(inputs: KarakterInputs) { this.Name = inputs.name @@ -66,10 +68,14 @@ export class KarakterClass implements Karakter { this.MasodlagosErtekek = CalculateMasodlagosErtekek(inputs.osztaly, inputs.tulajdonsagok) this.Kepzettsegek = inputs.kepzettsegek.map(k => Kepzettsegek[k]) this.TolvajKepzettsegek = (inputs.tolvajKepzettsegek || []).map(k => Kepzettsegek[k]) - this.Szint = inputs.szint + this.Szint = Math.min(Math.max(1,inputs.szint), 20) + this.HProlls = inputs.HProlls } - public HP = () => this.MasodlagosErtekek.HP + public HP = () => this.baseHP() + Modifier(this.Tulajdonsagok.t_egs) + this.HProlls + // https://lfg.hu/forum/topic/15079-kard-es-magia/page/219/#comment-2218333 + .map(hp => Math.max(1, hp + Modifier(this.Tulajdonsagok.t_egs))) + .reduce((sum, val) => sum + val, 0) public VO = () => this.MasodlagosErtekek.VO @@ -79,32 +85,42 @@ export class KarakterClass implements Karakter { return Modifier(this.Tulajdonsagok.t_ugy) + (this.Osztaly === Osztaly.Tolvaj ? 4 : 0) } - public TamadasBonusz() : number { + public TamadasBonusz() : number[] { + let base = [] switch (this.Osztaly){ case Osztaly.Barbar: case Osztaly.Amazon: case Osztaly.Ijasz: case Osztaly.Kaloz: case Osztaly.Harcos: - return 2; + base = TamadasBonuszTabla['elsodleges']; + break; case Osztaly.Pap: case Osztaly.Tolvaj: - return 0; + base = TamadasBonuszTabla['ketharmados']; + break; case Osztaly.Varazslo: case Osztaly.Illuzionista: - return 0; + base = TamadasBonuszTabla['feles']; + break; } + return base[this.Szint-1] } - public KozelharciTB(): number { + public KozelharciTB(): number[] { const base = this.TamadasBonusz(); + let modifier = Modifier(this.Tulajdonsagok.t_ero) if (this.Osztaly === Osztaly.Kaloz && this.Tulajdonsagok.t_ugy > this.Tulajdonsagok.t_ero) { - return base + Modifier(this.Tulajdonsagok.t_ugy) + modifier = Modifier(this.Tulajdonsagok.t_ugy) } - return base + Modifier(this.Tulajdonsagok.t_ero) + return base.map(v => v + modifier) } - public CelzoTB(): number { - return this.TamadasBonusz() + Modifier(this.Tulajdonsagok.t_ugy) + public CelzoTB(): number[] { + let base = this.TamadasBonusz() + if (this.Osztaly === Osztaly.Ijasz) { + base = [base[0], ...base] + } + return base.map(v => v + Modifier(this.Tulajdonsagok.t_ugy)) } public KitartasMentoAlap() : number { @@ -154,4 +170,30 @@ export class KarakterClass implements Karakter { return 0; } } + + public baseHP() { + let base = 4; + switch (this.Osztaly){ + case Osztaly.Barbar: + base = 12 + break; + case Osztaly.Amazon: + case Osztaly.Ijasz: + case Osztaly.Kaloz: + case Osztaly.Harcos: + base = 10; + break + case Osztaly.Pap: + base = 8; + break; + case Osztaly.Tolvaj: + base = 6; + break; + case Osztaly.Varazslo: + case Osztaly.Illuzionista: + base = 4; + break; + } + return base + } } \ No newline at end of file diff --git a/src/domain-models/tamadas_bonus_tabla.json b/src/domain-models/tamadas_bonus_tabla.json new file mode 100644 index 0000000..5110fb7 --- /dev/null +++ b/src/domain-models/tamadas_bonus_tabla.json @@ -0,0 +1,68 @@ +{ + "elsodleges": [ + [1], + [2], + [3], + [4], + [5], + [6,1], + [7,2], + [8,3], + [9,4], + [10,5], + [10,6,1], + [10,7,2], + [10,8,3], + [10,9,4], + [10,10,5], + [10,10,6], + [10,10,7], + [10,10,8], + [10,10,9], + [10,10,10] + ], + "ketharmados": [ + [0], + [1], + [2], + [2], + [3], + [4], + [4], + [5], + [6,1], + [6,1], + [7,2], + [8,3], + [8,3], + [9,4], + [10,5], + [10,5], + [10,6], + [10,7], + [10,7], + [10,8] + ], + "feles": [ + [0], + [1], + [1], + [2], + [2], + [3], + [3], + [4], + [4], + [5], + [5], + [6], + [6], + [7], + [7], + [8], + [8], + [9], + [9], + [10] + ] +} \ No newline at end of file diff --git a/src/pages/CreateCharacter.tsx b/src/pages/CreateCharacter.tsx index cad7a1e..f5e3829 100644 --- a/src/pages/CreateCharacter.tsx +++ b/src/pages/CreateCharacter.tsx @@ -13,6 +13,7 @@ import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek"; import {CreatePDF} from "../pdf/character.pdf"; import {KarakterClass, KarakterInputs} from "../domain-models/karakter"; import Level2 from "../components/Level2"; +import {getRandomInt} from "../domain-models/kockak"; const tulajdonsagDefaults: KarakterTulajdonsagok = { t_ero: 10, @@ -63,11 +64,19 @@ function CreateCharacterPage() { } function levelUp() { - changeKarakter({...karakter, szint: karakter.szint + 1, HProlls: [...karakter.HProlls, 1]}) + const dice = new KarakterClass(karakter).baseHP() + const roll = getRandomInt(dice) + console.log(`Level 2 HP roll on d${dice} is: ${roll}`) + changeKarakter({...karakter, szint: karakter.szint + 1, HProlls: [...karakter.HProlls, roll]}) } function levelDown() { - changeKarakter({...karakter, szint: karakter.szint - 1, HProlls: karakter.HProlls.slice(0, karakter.HProlls.length - 1)}) + changeKarakter({...karakter, szint: karakter.szint - 1, HProlls: karakter.HProlls.slice(0, -1)}) + } + + function chageLevel2HProll(newHProll: number) { + changeKarakter({...karakter, HProlls: [newHProll, ...karakter.HProlls.slice(1)]}) + console.log(karakter) } return ( @@ -137,7 +146,7 @@ function CreateCharacterPage() {
- {karakter.szint > 1 && } + {karakter.szint > 1 && }
{karakter.szint < 2 && } diff --git a/src/pdf/character.pdf.ts b/src/pdf/character.pdf.ts index 4ffc71c..f8495fe 100644 --- a/src/pdf/character.pdf.ts +++ b/src/pdf/character.pdf.ts @@ -253,19 +253,19 @@ export async function CreatePDF(karakter: Karakter) { font: pdfFont, color: rgb(0.75, 0.75, 0.75), }) - const kozelharciTB = SignedNumberToText(karakter.KozelharciTB()) + const kozelharciTB = karakter.KozelharciTB().map(SignedNumberToText).join("/") page.drawText(kozelharciTB, { - x: 258, - y: 382, - size: kozelharciTB.length > 2 ? (fontSizeBase * 1.5) : fontSizeBase * 2, + x: 254, + y: kozelharciTB.length > 2 ? 386 : 382, + size: kozelharciTB.length > 2 ? fontSizeBase : fontSizeBase * 2, font: pdfFont, color: rgb(0, 0, 0), }) - const celzoTB = SignedNumberToText(karakter.CelzoTB()) + const celzoTB = karakter.CelzoTB().map(SignedNumberToText).join("/") page.drawText(celzoTB, { - x: 347, - y: 382, - size: celzoTB.length > 2 ? (fontSizeBase * 1.5) : fontSizeBase * 2, + x: 344, + y: celzoTB.length > 2 ? 386 : 382, + size: celzoTB.length > 5 ? fontSizeBase * 0.5 : celzoTB.length > 2 ? fontSizeBase : fontSizeBase * 2, font: pdfFont, color: rgb(0, 0, 0), })