From c5fa7a92d9b8d569c403d8e0f27cf60a302bbd05 Mon Sep 17 00:00:00 2001 From: balint Date: Sun, 5 Apr 2026 12:47:53 +0200 Subject: [PATCH] tolvaj level 9 kepzettseg --- .../components/LevelUps.test.tsx | 44 ++++++++++++++++++ .../second-edition/components/LevelUps.tsx | 7 ++- .../domain-models/karakter2E.ts | 2 + .../domain-models/kepzettsegek2E.test.ts | 22 +++++++++ .../domain-models/kepzettsegek2E.ts | 10 ++++- .../szintlepes.multiclass.test.ts | 45 +++++++++++++++++++ .../domain-models/szintlepes.ts | 4 +- 7 files changed, 130 insertions(+), 4 deletions(-) diff --git a/frontend/src/second-edition/components/LevelUps.test.tsx b/frontend/src/second-edition/components/LevelUps.test.tsx index 85f838b..aaebc6f 100644 --- a/frontend/src/second-edition/components/LevelUps.test.tsx +++ b/frontend/src/second-edition/components/LevelUps.test.tsx @@ -201,4 +201,48 @@ describe("LevelUps Harcos specialization indexing", () => { expect(stateAfter.szintlepesek[5]?.tolvajExtraKepzettseg).toBe(nextKepzettseg); expect(stateAfter.szintlepesek[4]?.tolvajExtraKepzettseg).toBeUndefined(); }); + + it("at Tolvaj level 9 selector includes class-restricted non-Tolvaj skills", async () => { + const tolvajLevel9: Karakter2E = { + ...DefaultKarakter, + szint: 9, + szintlepesek: [ + { osztaly: Osztaly2E.Tolvaj, HProll: 6 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 5 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 4 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 3 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 2, tolvajExtraKepzettseg: "k_meregkeveres" }, + { osztaly: Osztaly2E.Tolvaj, HProll: 4 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 5 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 3 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 6, tolvajExtraKepzettseg: "k_alkimia" }, + ], + tolvajKepzettsegek: ["k_alcazas", "k_csapdak", "k_egyensulyozas", "k_hamisitas"], + varazslatok: [], + }; + + const store = configureStore({ + reducer: { + user: userReducer, + character2E: characterReducer, + }, + }); + store.dispatch(setCharacter(tolvajLevel9)); + + const sut = render( + + store.dispatch(setCharacter(updated))} + /> + + ); + + const selector = await sut.findByTestId("tolvaj-extra-kepzettseg-9"); + const arcaneOption = selector.querySelector('option[value="k_csillagjoslas"]'); + expect(arcaneOption).not.toBeNull(); + + fireEvent.change(selector, {target: {value: "k_csillagjoslas"}}); + expect(store.getState().character2E.szintlepesek[8]?.tolvajExtraKepzettseg).toBe("k_csillagjoslas"); + }); }); diff --git a/frontend/src/second-edition/components/LevelUps.tsx b/frontend/src/second-edition/components/LevelUps.tsx index 771ded8..0e60fba 100644 --- a/frontend/src/second-edition/components/LevelUps.tsx +++ b/frontend/src/second-edition/components/LevelUps.tsx @@ -90,7 +90,12 @@ function LevelUp(props: { diff --git a/frontend/src/second-edition/domain-models/karakter2E.ts b/frontend/src/second-edition/domain-models/karakter2E.ts index 4f89b32..6357d36 100644 --- a/frontend/src/second-edition/domain-models/karakter2E.ts +++ b/frontend/src/second-edition/domain-models/karakter2E.ts @@ -138,6 +138,8 @@ function setOsztalyForSzintLepes(karakter: Karakter2E, osztaly: Osztaly2E, szint faj: karakter.faj, kepzettsegek: karakter.kepzettsegek, tolvajKepzettsegek: karakter.tolvajKepzettsegek, + }, { + ignoreClassRestrictions: tSzint === 9, })[0]?.Id } diff --git a/frontend/src/second-edition/domain-models/kepzettsegek2E.test.ts b/frontend/src/second-edition/domain-models/kepzettsegek2E.test.ts index 30471b6..be0eb93 100644 --- a/frontend/src/second-edition/domain-models/kepzettsegek2E.test.ts +++ b/frontend/src/second-edition/domain-models/kepzettsegek2E.test.ts @@ -106,6 +106,28 @@ describe("Kepzettsegek 2E", () => { const actual = GetAvailableKepzettsegek(karakter) expect(actual).not.toContain(Kepzettsegek.k_meregkeveres) }) + + test("at Tolvaj level 9 extra skill can include class-restricted non-Tolvaj skills", () => { + const karakter = { + ...DefaultKarakter, + szintlepesek: [ + { osztaly: Osztaly2E.Tolvaj, HProll: 6, }, + { osztaly: Osztaly2E.Tolvaj, HProll: 6, }, + { osztaly: Osztaly2E.Tolvaj, HProll: 6, }, + { osztaly: Osztaly2E.Tolvaj, HProll: 6, tulajdonsagNoveles: Tulajdonsag2E.Ugyesseg }, + { osztaly: Osztaly2E.Tolvaj, HProll: 6, tolvajExtraKepzettseg: Kepzettsegek.k_meregkeveres.Id }, + { osztaly: Osztaly2E.Tolvaj, HProll: 6, }, + { osztaly: Osztaly2E.Tolvaj, HProll: 6, }, + { osztaly: Osztaly2E.Tolvaj, HProll: 6, }, + ] + } + + const restricted = GetAvailableKepzettsegek(karakter) + expect(restricted).not.toContain(Kepzettsegek.k_csillagjoslas) + + const unrestricted = GetAvailableKepzettsegek(karakter, { ignoreClassRestrictions: true }) + expect(unrestricted).toContain(Kepzettsegek.k_csillagjoslas) + }) }) test("multiclass characters get access to kepzettsegek from all classes", () => { const karakter = { diff --git a/frontend/src/second-edition/domain-models/kepzettsegek2E.ts b/frontend/src/second-edition/domain-models/kepzettsegek2E.ts index 96fa52f..37a0e93 100644 --- a/frontend/src/second-edition/domain-models/kepzettsegek2E.ts +++ b/frontend/src/second-edition/domain-models/kepzettsegek2E.ts @@ -27,9 +27,15 @@ export function GetNumberOfKepzettsegek(t_int: number, faj: Faj2E, max: number = return numberOfKepzettseg; } -export function GetAvailableKepzettsegek(karakter: Pick): Kepzettseg[] { +export function GetAvailableKepzettsegek( + karakter: Pick, + options?: { ignoreClassRestrictions?: boolean } +): Kepzettseg[] { const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly)) - const availableKepzettsegek = availableKezpettsegListFajjal(karakter.faj, ...osztalyok) + const baseKepzettsegList = options?.ignoreClassRestrictions + ? KepzettsegLista + : availableKezpettsegListFajjal(karakter.faj, ...osztalyok) + const availableKepzettsegek = baseKepzettsegList .filter(k => !karakter.kepzettsegek.includes(k.Id)) if (!osztalyok.has(Osztaly2E.Tolvaj)) { 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 1ba9e25..339395c 100644 --- a/frontend/src/second-edition/domain-models/szintlepes.multiclass.test.ts +++ b/frontend/src/second-edition/domain-models/szintlepes.multiclass.test.ts @@ -103,4 +103,49 @@ describe("Tolvaj extra skill in multiclass level-ups", () => { expect(fifthLevel?.osztaly).toBe(Osztaly2E.Tolvaj); expect(fifthLevel?.tolvajExtraKepzettseg).toBeDefined(); }); + + it("at Tolvaj class level 9 LevelUp can auto-pick a class-restricted non-Tolvaj skill", () => { + const karakter: Karakter2E = { + ...DefaultKarakter, + szint: 8, + szintlepesek: [ + { osztaly: Osztaly2E.Tolvaj, HProll: 6 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 5 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 4 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 3 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 2, tolvajExtraKepzettseg: "k_meregkeveres" }, + { 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 afterLevel9 = applyLevelUp(karakter); + expect(afterLevel9.szintlepesek[8]?.tolvajExtraKepzettseg).toBe("k_alkimia"); + }); + + it("at Tolvaj class level 9 class-change recomputation can set non-Tolvaj restricted skill", () => { + const karakter: Karakter2E = { + ...DefaultKarakter, + szint: 9, + szintlepesek: [ + { osztaly: Osztaly2E.Tolvaj, HProll: 6 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 5 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 4 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 3 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 2, tolvajExtraKepzettseg: "k_meregkeveres" }, + { osztaly: Osztaly2E.Tolvaj, HProll: 4 }, + { osztaly: Osztaly2E.Tolvaj, HProll: 5 }, + { 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, 9); + expect(changed.szintlepesek[8]?.tolvajExtraKepzettseg).toBe("k_alkimia"); + }); }); diff --git a/frontend/src/second-edition/domain-models/szintlepes.ts b/frontend/src/second-edition/domain-models/szintlepes.ts index db2cb43..a37ebd5 100644 --- a/frontend/src/second-edition/domain-models/szintlepes.ts +++ b/frontend/src/second-edition/domain-models/szintlepes.ts @@ -67,7 +67,9 @@ export function LevelUp(karakter: Karakter2E, changeKarakter: (input: Karakter2E if (autoPickedOsztaly === Osztaly2E.Tolvaj){ const tolvajSzint = 1 + karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Tolvaj).length if (tolvajSzint === 5 || tolvajSzint === 9) { - const availableKepzettsegek = GetAvailableKepzettsegek(karakter) + const availableKepzettsegek = GetAvailableKepzettsegek(karakter, { + ignoreClassRestrictions: tolvajSzint === 9, + }) szintlepes.tolvajExtraKepzettseg = availableKepzettsegek[0].Id; } }