From 700684ecfdfce30141b312f4d986a0c61fdf73b2 Mon Sep 17 00:00:00 2001 From: balint Date: Sun, 5 Apr 2026 11:46:25 +0200 Subject: [PATCH] fix tolvaj multiclass --- .../components/LevelUps.test.tsx | 47 +++++++++++++++++++ .../domain-models/karakter2E.ts | 40 ++++++++++++++-- .../szintlepes.multiclass.test.ts | 46 ++++++++++++++++++ 3 files changed, 130 insertions(+), 3 deletions(-) diff --git a/frontend/src/second-edition/components/LevelUps.test.tsx b/frontend/src/second-edition/components/LevelUps.test.tsx index ec0a592..85f838b 100644 --- a/frontend/src/second-edition/components/LevelUps.test.tsx +++ b/frontend/src/second-edition/components/LevelUps.test.tsx @@ -9,6 +9,7 @@ import {AllowedFegyver} from "../domain-models/allowed-fegyver"; import {Osztaly2E} from "../domain-models/osztaly2E"; import {ChangeOsztalyAtSzint, DefaultKarakter, Karakter2E} from "../domain-models/karakter2E"; import {LevelUp} from "../domain-models/szintlepes"; +import {GetAvailableKepzettsegek} from "../domain-models/kepzettsegek2E"; function applyLevelUp(karakter: Karakter2E): Karakter2E { let next: Karakter2E | undefined; @@ -154,4 +155,50 @@ describe("LevelUps Harcos specialization indexing", () => { expect(sut.queryByTestId("kaloz-krit-3")).toBeNull(); }); + + it("shows and updates Tolvaj extra skill on multiclass Tolvaj level 5", async () => { + const multiclassTolvaj: Karakter2E = { + ...DefaultKarakter, + szint: 6, + szintlepesek: [ + { osztaly: Osztaly2E.Tolvaj, HProll: 6 }, + { osztaly: Osztaly2E.Harcos, HProll: 10 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 4 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 5 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 6 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 3, tolvajExtraKepzettseg: "k_meregkeveres" }, + ], + tolvajKepzettsegek: ["k_alcazas", "k_csapdak", "k_egyensulyozas", "k_hamisitas"], + varazslatok: [], + }; + + const store = configureStore({ + reducer: { + user: userReducer, + character2E: characterReducer, + }, + }); + store.dispatch(setCharacter(multiclassTolvaj)); + + const sut = render( + + store.dispatch(setCharacter(updated))} + /> + + ); + + const selector = await sut.findByTestId("tolvaj-extra-kepzettseg-6"); + const nextKepzettseg = GetAvailableKepzettsegek(multiclassTolvaj) + .map(x => x.Id) + .find(id => id !== multiclassTolvaj.szintlepesek[5]?.tolvajExtraKepzettseg); + + expect(nextKepzettseg).toBeDefined(); + fireEvent.change(selector, {target: {value: nextKepzettseg as string}}); + + const stateAfter = store.getState().character2E; + expect(stateAfter.szintlepesek[5]?.tolvajExtraKepzettseg).toBe(nextKepzettseg); + expect(stateAfter.szintlepesek[4]?.tolvajExtraKepzettseg).toBeUndefined(); + }); }); diff --git a/frontend/src/second-edition/domain-models/karakter2E.ts b/frontend/src/second-edition/domain-models/karakter2E.ts index d16fae4..4f89b32 100644 --- a/frontend/src/second-edition/domain-models/karakter2E.ts +++ b/frontend/src/second-edition/domain-models/karakter2E.ts @@ -9,6 +9,7 @@ import {AllowedFegyver} from "./allowed-fegyver"; import {BaseHP} from "./masodlagos_ertekek"; import {dAny} from "../../shared/domain-models/kockak"; import {KarakterVarazslat} from "./varazslat"; +import {GetAvailableKepzettsegek} from "./kepzettsegek2E"; export interface Karakter2E { id?: string, @@ -51,13 +52,15 @@ export const DefaultKarakter: Karakter2E = { varazslatok: [], } -function setOsztalyForSzintLepes(szintlepesek: Szintlepes[], osztaly: Osztaly2E, szint: number): Szintlepes[] { +function setOsztalyForSzintLepes(karakter: Karakter2E, osztaly: Osztaly2E, szint: number): Szintlepes[] { + const szintlepesek = karakter.szintlepesek const prev = szintlepesek.slice(0, szint-1) const current : Szintlepes = { ...szintlepesek[szint-1], osztaly, harcosFegyver: undefined, - kalozKritikus: undefined + kalozKritikus: undefined, + tolvajExtraKepzettseg: undefined, } const tail = szintlepesek.slice(szint).map(x => {return {...x}}) @@ -117,6 +120,37 @@ function setOsztalyForSzintLepes(szintlepesek: Szintlepes[], osztaly: Osztaly2E, tail[i].kalozKritikus = kalozKritAtSzint(kalozSzint) } } + + let tolvajSzint = prev.filter(x => x.osztaly === Osztaly2E.Tolvaj).length + const existingTolvajExtraKepzettsegek = szintlepesek + .map(x => x.tolvajExtraKepzettseg) + .filter(x => x != null) as KepzettsegId[] + const tolvajExtraKepzettsegAtSzint = (tSzint: number, atLevelSzintlepesek: Szintlepes[]): (KepzettsegId | undefined) => { + if (tSzint !== 5 && tSzint !== 9) { + return undefined + } + const extraIndex = tSzint === 5 ? 0 : 1 + if (existingTolvajExtraKepzettsegek.length > extraIndex) { + return existingTolvajExtraKepzettsegek[extraIndex] + } + return GetAvailableKepzettsegek({ + szintlepesek: atLevelSzintlepesek, + faj: karakter.faj, + kepzettsegek: karakter.kepzettsegek, + tolvajKepzettsegek: karakter.tolvajKepzettsegek, + })[0]?.Id + } + + if (osztaly === Osztaly2E.Tolvaj) { + tolvajSzint++ + current.tolvajExtraKepzettseg = tolvajExtraKepzettsegAtSzint(tolvajSzint, [...prev, current]) + } + for (let i = 0; i < tail.length; i++) { + if (tail[i].osztaly === Osztaly2E.Tolvaj) { + tolvajSzint++ + tail[i].tolvajExtraKepzettseg = tolvajExtraKepzettsegAtSzint(tolvajSzint, [...prev, current, ...tail.slice(0, i+1)]) + } + } const HD = BaseHP(osztaly) if (szint === 1) { @@ -138,6 +172,6 @@ export function ChangeLvl1Osztaly(karakter: Karakter2E, osztaly: Osztaly2E): Kar export function ChangeOsztalyAtSzint(karakter: Karakter2E, osztaly: Osztaly2E, szint: number): Karakter2E { return { ...karakter, - szintlepesek: setOsztalyForSzintLepes(karakter.szintlepesek, osztaly, szint) + szintlepesek: setOsztalyForSzintLepes(karakter, osztaly, szint) } } diff --git a/frontend/src/second-edition/domain-models/szintlepes.multiclass.test.ts b/frontend/src/second-edition/domain-models/szintlepes.multiclass.test.ts index 5bc6d9a..1ba9e25 100644 --- a/frontend/src/second-edition/domain-models/szintlepes.multiclass.test.ts +++ b/frontend/src/second-edition/domain-models/szintlepes.multiclass.test.ts @@ -58,3 +58,49 @@ describe("Harcos specialization in multiclass level-ups", () => { expect(thirdHarcosLevelSpec).not.toBe(firstHarcosSpec); }); }); + +describe("Tolvaj extra skill in multiclass level-ups", () => { + it("adds extra skill when Tolvaj class reaches level 5 at higher character level", () => { + const karakter: Karakter2E = { + ...DefaultKarakter, + szint: 5, + szintlepesek: [ + { osztaly: Osztaly2E.Tolvaj, HProll: 6 }, + { osztaly: Osztaly2E.Harcos, HProll: 10 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 4 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 5 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 3 }, + ], + tolvajKepzettsegek: ["k_alcazas", "k_csapdak", "k_egyensulyozas", "k_hamisitas"], + varazslatok: [], + }; + + const afterLevel6 = applyLevelUp(karakter); + const sixthLevel = afterLevel6.szintlepesek[5]; + + expect(sixthLevel?.osztaly).toBe(Osztaly2E.Tolvaj); + expect(sixthLevel?.tolvajExtraKepzettseg).toBeDefined(); + }); + + it("recomputes missing extra skill when class change makes current level Tolvaj level 5", () => { + const karakter: Karakter2E = { + ...DefaultKarakter, + szint: 5, + szintlepesek: [ + { osztaly: Osztaly2E.Tolvaj, HProll: 6 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 5 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 4 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 3 }, + { osztaly: Osztaly2E.Harcos, HProll: 8 }, + ], + tolvajKepzettsegek: ["k_alcazas", "k_csapdak", "k_egyensulyozas", "k_hamisitas"], + varazslatok: [], + }; + + const changed = ChangeOsztalyAtSzint(karakter, Osztaly2E.Tolvaj, 5); + const fifthLevel = changed.szintlepesek[4]; + + expect(fifthLevel?.osztaly).toBe(Osztaly2E.Tolvaj); + expect(fifthLevel?.tolvajExtraKepzettseg).toBeDefined(); + }); +});