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;
}
}