mirror of
https://github.com/morbalint/kemkas.git
synced 2026-07-18 03:13:46 +00:00
fix tolvaj multiclass
This commit is contained in:
@@ -9,6 +9,7 @@ import {AllowedFegyver} from "../domain-models/allowed-fegyver";
|
|||||||
import {Osztaly2E} from "../domain-models/osztaly2E";
|
import {Osztaly2E} from "../domain-models/osztaly2E";
|
||||||
import {ChangeOsztalyAtSzint, DefaultKarakter, Karakter2E} from "../domain-models/karakter2E";
|
import {ChangeOsztalyAtSzint, DefaultKarakter, Karakter2E} from "../domain-models/karakter2E";
|
||||||
import {LevelUp} from "../domain-models/szintlepes";
|
import {LevelUp} from "../domain-models/szintlepes";
|
||||||
|
import {GetAvailableKepzettsegek} from "../domain-models/kepzettsegek2E";
|
||||||
|
|
||||||
function applyLevelUp(karakter: Karakter2E): Karakter2E {
|
function applyLevelUp(karakter: Karakter2E): Karakter2E {
|
||||||
let next: Karakter2E | undefined;
|
let next: Karakter2E | undefined;
|
||||||
@@ -154,4 +155,50 @@ describe("LevelUps Harcos specialization indexing", () => {
|
|||||||
|
|
||||||
expect(sut.queryByTestId("kaloz-krit-3")).toBeNull();
|
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(
|
||||||
|
<Provider store={store}>
|
||||||
|
<LevelUps
|
||||||
|
karakter={store.getState().character2E}
|
||||||
|
changeKarakter={(updated) => store.dispatch(setCharacter(updated))}
|
||||||
|
/>
|
||||||
|
</Provider>
|
||||||
|
);
|
||||||
|
|
||||||
|
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();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import {AllowedFegyver} from "./allowed-fegyver";
|
|||||||
import {BaseHP} from "./masodlagos_ertekek";
|
import {BaseHP} from "./masodlagos_ertekek";
|
||||||
import {dAny} from "../../shared/domain-models/kockak";
|
import {dAny} from "../../shared/domain-models/kockak";
|
||||||
import {KarakterVarazslat} from "./varazslat";
|
import {KarakterVarazslat} from "./varazslat";
|
||||||
|
import {GetAvailableKepzettsegek} from "./kepzettsegek2E";
|
||||||
|
|
||||||
export interface Karakter2E {
|
export interface Karakter2E {
|
||||||
id?: string,
|
id?: string,
|
||||||
@@ -51,13 +52,15 @@ export const DefaultKarakter: Karakter2E = {
|
|||||||
varazslatok: [],
|
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 prev = szintlepesek.slice(0, szint-1)
|
||||||
const current : Szintlepes = {
|
const current : Szintlepes = {
|
||||||
...szintlepesek[szint-1],
|
...szintlepesek[szint-1],
|
||||||
osztaly,
|
osztaly,
|
||||||
harcosFegyver: undefined,
|
harcosFegyver: undefined,
|
||||||
kalozKritikus: undefined
|
kalozKritikus: undefined,
|
||||||
|
tolvajExtraKepzettseg: undefined,
|
||||||
}
|
}
|
||||||
const tail = szintlepesek.slice(szint).map(x => {return {...x}})
|
const tail = szintlepesek.slice(szint).map(x => {return {...x}})
|
||||||
|
|
||||||
@@ -118,6 +121,37 @@ function setOsztalyForSzintLepes(szintlepesek: Szintlepes[], osztaly: Osztaly2E,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
const HD = BaseHP(osztaly)
|
||||||
if (szint === 1) {
|
if (szint === 1) {
|
||||||
current.HProll = HD
|
current.HProll = HD
|
||||||
@@ -138,6 +172,6 @@ export function ChangeLvl1Osztaly(karakter: Karakter2E, osztaly: Osztaly2E): Kar
|
|||||||
export function ChangeOsztalyAtSzint(karakter: Karakter2E, osztaly: Osztaly2E, szint: number): Karakter2E {
|
export function ChangeOsztalyAtSzint(karakter: Karakter2E, osztaly: Osztaly2E, szint: number): Karakter2E {
|
||||||
return {
|
return {
|
||||||
...karakter,
|
...karakter,
|
||||||
szintlepesek: setOsztalyForSzintLepes(karakter.szintlepesek, osztaly, szint)
|
szintlepesek: setOsztalyForSzintLepes(karakter, osztaly, szint)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,3 +58,49 @@ describe("Harcos specialization in multiclass level-ups", () => {
|
|||||||
expect(thirdHarcosLevelSpec).not.toBe(firstHarcosSpec);
|
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();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user