fix tolvajkepzettseg
This commit is contained in:
@@ -2,11 +2,10 @@ import React from "react";
|
|||||||
import KepzettsegSelector from "../display-components/KepzettsegSelector2E";
|
import KepzettsegSelector from "../display-components/KepzettsegSelector2E";
|
||||||
import {
|
import {
|
||||||
GetKepzettsegListaN,
|
GetKepzettsegListaN,
|
||||||
GetNumberOfKepzettsegek,
|
GetNumberOfKepzettsegek, GetTolvajKepzettsegListaN,
|
||||||
Kepzettseg,
|
Kepzettseg,
|
||||||
Kepzettsegek,
|
Kepzettsegek,
|
||||||
KepzettsegId,
|
KepzettsegId,
|
||||||
TolvajKepzettsegList,
|
|
||||||
} from "../domain-models/kepzettsegek2E";
|
} from "../domain-models/kepzettsegek2E";
|
||||||
import {arraySetN} from "../../util";
|
import {arraySetN} from "../../util";
|
||||||
import {useDispatch, useSelector} from "react-redux";
|
import {useDispatch, useSelector} from "react-redux";
|
||||||
@@ -79,13 +78,6 @@ function KarakterKepzettsegek () {
|
|||||||
const changeKepzettsegek = (k: KepzettsegId[]) => dispatch(setKepzettsegek(k))
|
const changeKepzettsegek = (k: KepzettsegId[]) => dispatch(setKepzettsegek(k))
|
||||||
const changeTolvajKepzettsegek = (k: KepzettsegId[]) => dispatch(setTolvajKepzettsegek(k))
|
const changeTolvajKepzettsegek = (k: KepzettsegId[]) => dispatch(setTolvajKepzettsegek(k))
|
||||||
|
|
||||||
// TODO: Birodalmi tolvajnal az Alikmia, vagy Meregkeveres kezelese
|
|
||||||
|
|
||||||
const getTolvajKepzettsegListaN = (n: number) : Kepzettseg[] => {
|
|
||||||
const tolvajKepzettsegekWithoutN = [...tolvajKepzettsegek.slice(0, n), ...tolvajKepzettsegek.slice(n+1)]
|
|
||||||
return TolvajKepzettsegList.filter(x => !kepzettsegek.includes(x.Id) && !tolvajKepzettsegekWithoutN.includes(x.Id))
|
|
||||||
}
|
|
||||||
|
|
||||||
return <>
|
return <>
|
||||||
<InternalKepzettsegekSelector
|
<InternalKepzettsegekSelector
|
||||||
title="Képzettségek"
|
title="Képzettségek"
|
||||||
@@ -102,7 +94,7 @@ function KarakterKepzettsegek () {
|
|||||||
{tolvajKepzettsegek.length > 0 && <InternalKepzettsegekSelector
|
{tolvajKepzettsegek.length > 0 && <InternalKepzettsegekSelector
|
||||||
title="Tolvaj képzettségek"
|
title="Tolvaj képzettségek"
|
||||||
numberOfKepzettseg={4}
|
numberOfKepzettseg={4}
|
||||||
getKepzettsegListaN={getTolvajKepzettsegListaN}
|
getKepzettsegListaN={GetTolvajKepzettsegListaN(karakter)}
|
||||||
changeKepzettsegek={changeTolvajKepzettsegek}
|
changeKepzettsegek={changeTolvajKepzettsegek}
|
||||||
kepzettsegek={tolvajKepzettsegek}
|
kepzettsegek={tolvajKepzettsegek}
|
||||||
dataTestId={"tolvaj-kepzettseg"}
|
dataTestId={"tolvaj-kepzettseg"}
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ import HarcosFegyverSpecializacio from "./HarcosFegyverSpec";
|
|||||||
|
|
||||||
import MultiClassOsztalySelector2E from "./MultiClassOsztalySelector2E";
|
import MultiClassOsztalySelector2E from "./MultiClassOsztalySelector2E";
|
||||||
import {getClassLevels} from "../domain-models/szintlepes";
|
import {getClassLevels} from "../domain-models/szintlepes";
|
||||||
|
import KepzettsegSelector from "../display-components/KepzettsegSelector2E";
|
||||||
|
import {GetAvailableKepzettsegek, Kepzettsegek, KepzettsegId} from "../domain-models/kepzettsegek2E";
|
||||||
|
|
||||||
function LevelUp(props: {
|
function LevelUp(props: {
|
||||||
szint: number,
|
szint: number,
|
||||||
@@ -18,7 +20,8 @@ function LevelUp(props: {
|
|||||||
changeTulajdonsagNoveles: (t: Tulajdonsag2E) => void,
|
changeTulajdonsagNoveles: (t: Tulajdonsag2E) => void,
|
||||||
changeRolledHP: (rolledHP: number) => void,
|
changeRolledHP: (rolledHP: number) => void,
|
||||||
changeKalozKritikus: (krit: string) => void,
|
changeKalozKritikus: (krit: string) => void,
|
||||||
changeOsztaly: (osztaly: Osztaly2E) => void
|
changeOsztaly: (osztaly: Osztaly2E) => void,
|
||||||
|
changeExtraTolvajKepzettseg: (kepzettseg: KepzettsegId) => void,
|
||||||
}) {
|
}) {
|
||||||
const {
|
const {
|
||||||
szint,
|
szint,
|
||||||
@@ -27,14 +30,16 @@ function LevelUp(props: {
|
|||||||
changeTulajdonsagNoveles,
|
changeTulajdonsagNoveles,
|
||||||
changeRolledHP,
|
changeRolledHP,
|
||||||
changeKalozKritikus,
|
changeKalozKritikus,
|
||||||
changeOsztaly
|
changeOsztaly,
|
||||||
|
changeExtraTolvajKepzettseg
|
||||||
} = props
|
} = props
|
||||||
|
|
||||||
const classLevels = getClassLevels(karakter.szintlepesek)
|
const classLevels = getClassLevels(karakter.szintlepesek)
|
||||||
|
|
||||||
const harcosSzint = classLevels[Osztaly2E.Harcos]
|
const harcosSzint = classLevels[Osztaly2E.Harcos]
|
||||||
const kalozSzint = classLevels[Osztaly2E.Tengeresz]
|
const kalozSzint = classLevels[Osztaly2E.Tengeresz]
|
||||||
const krit = karakter.szintlepesek[szint-1].kalozKritikus
|
const tolvajSzint = classLevels[Osztaly2E.Tolvaj]
|
||||||
|
const szintlepes = karakter.szintlepesek[szint-1];
|
||||||
|
|
||||||
return <div>
|
return <div>
|
||||||
<div className='row mt-3'>
|
<div className='row mt-3'>
|
||||||
@@ -68,12 +73,25 @@ function LevelUp(props: {
|
|||||||
}
|
}
|
||||||
{osztaly === Osztaly2E.Tengeresz && kalozSzint % 3 === 0 &&
|
{osztaly === Osztaly2E.Tengeresz && kalozSzint % 3 === 0 &&
|
||||||
<KalozKritikus
|
<KalozKritikus
|
||||||
kritFegyverId={krit!}
|
kritFegyverId={szintlepes.kalozKritikus!}
|
||||||
existingKrits={karakter.szintlepesek.map(x => x.kalozKritikus)}
|
existingKrits={karakter.szintlepesek.map(x => x.kalozKritikus)}
|
||||||
changeKrit={changeKalozKritikus}
|
changeKrit={changeKalozKritikus}
|
||||||
szint={kalozSzint}
|
szint={kalozSzint}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
{osztaly === Osztaly2E.Tolvaj
|
||||||
|
&& (tolvajSzint === 5 || tolvajSzint === 9)
|
||||||
|
&& szintlepes.tolvajExtraKepzettseg != null &&
|
||||||
|
<div className='row m-2'>
|
||||||
|
<label className='col-md-2 col-sm-3 col-form-label'>Extra képzettség</label>
|
||||||
|
<KepzettsegSelector
|
||||||
|
selected={Kepzettsegek[szintlepes.tolvajExtraKepzettseg]}
|
||||||
|
kepzettsegek={[Kepzettsegek[szintlepes.tolvajExtraKepzettseg], ...GetAvailableKepzettsegek(karakter)]}
|
||||||
|
dataTestId={`tolvaj-extra-kepzettseg-${szint}`}
|
||||||
|
changeKepzettseg={changeExtraTolvajKepzettseg}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,6 +127,18 @@ export function LevelUps(props: {karakter: Karakter2E, changeKarakter: (inputs:
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const changeExtraTolvajKepzettseg = (szint: number) => {
|
||||||
|
return (k: KepzettsegId) => {
|
||||||
|
changeKarakter({
|
||||||
|
...karakter,
|
||||||
|
szintlepesek: arraySetN(karakter.szintlepesek, szint-1, {
|
||||||
|
...karakter.szintlepesek[szint-1],
|
||||||
|
tolvajExtraKepzettseg: k,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const levels = karakter.szintlepesek.map((_, i) => i+1);
|
const levels = karakter.szintlepesek.map((_, i) => i+1);
|
||||||
|
|
||||||
return <>
|
return <>
|
||||||
@@ -122,6 +152,7 @@ export function LevelUps(props: {karakter: Karakter2E, changeKarakter: (inputs:
|
|||||||
changeRolledHP={changeRolledHPAtSzint(szint)}
|
changeRolledHP={changeRolledHPAtSzint(szint)}
|
||||||
changeKalozKritikus={changeKalozKritikusAtSzint(szint)}
|
changeKalozKritikus={changeKalozKritikusAtSzint(szint)}
|
||||||
changeOsztaly={(o) => changeKarakter(ChangeOsztalyAtSzint(karakter, o, szint))}
|
changeOsztaly={(o) => changeKarakter(ChangeOsztalyAtSzint(karakter, o, szint))}
|
||||||
|
changeExtraTolvajKepzettseg={changeExtraTolvajKepzettseg(szint)}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -0,0 +1,123 @@
|
|||||||
|
import {GetAvailableKepzettsegek, GetNumberOfKepzettsegek, Kepzettsegek, KepzettsegLista} from "./kepzettsegek2E";
|
||||||
|
import {Faj2E} from "./faj2E";
|
||||||
|
import {DefaultKarakter} from "./karakter2E";
|
||||||
|
import {Osztaly2E} from "./osztaly2E";
|
||||||
|
import {Tulajdonsag2E} from "./tulajdonsag2E";
|
||||||
|
|
||||||
|
describe("Kepzettsegek 2E", () => {
|
||||||
|
describe("GetNumberOfKepzettsegek", () => {
|
||||||
|
test("Add extra kepzettseg for Ember", () => {
|
||||||
|
const actual = GetNumberOfKepzettsegek(18, Faj2E.Ember)
|
||||||
|
expect(actual).toEqual(7)
|
||||||
|
})
|
||||||
|
test("should be min for extra stupid", () => {
|
||||||
|
const actual = GetNumberOfKepzettsegek(3, Faj2E.Osember)
|
||||||
|
expect(actual).toEqual(1)
|
||||||
|
})
|
||||||
|
test("never less than 1", () => {
|
||||||
|
const actual = GetNumberOfKepzettsegek(-999, Faj2E.Osember)
|
||||||
|
expect(actual).toEqual(1)
|
||||||
|
})
|
||||||
|
test("never more than 11", () => {
|
||||||
|
const actual = GetNumberOfKepzettsegek(999, Faj2E.Elf)
|
||||||
|
expect(actual).toEqual(11)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe("GetAvailableKepzettsegek", () => {
|
||||||
|
test("excludes existing karakter kepzettsegek", () => {
|
||||||
|
const karakter = {
|
||||||
|
...DefaultKarakter,
|
||||||
|
kepzettsegek: KepzettsegLista.map(x => x.Id),
|
||||||
|
}
|
||||||
|
const actual = GetAvailableKepzettsegek(karakter)
|
||||||
|
expect(actual).toHaveLength(0)
|
||||||
|
})
|
||||||
|
test("includes Birodalmi kepzettsegek for a Birodalmi", () => {
|
||||||
|
const karakter = {
|
||||||
|
...DefaultKarakter,
|
||||||
|
faj: Faj2E.Birodalmi,
|
||||||
|
}
|
||||||
|
const actual = GetAvailableKepzettsegek(karakter)
|
||||||
|
expect(actual).toContain(Kepzettsegek.k_meregkeveres)
|
||||||
|
expect(actual).toContain(Kepzettsegek.k_alkimia)
|
||||||
|
expect(actual).toContain(Kepzettsegek.k_okkultizmus)
|
||||||
|
})
|
||||||
|
test.each([
|
||||||
|
[Osztaly2E.Varazslo],
|
||||||
|
[Osztaly2E.Illuzionista],
|
||||||
|
[Osztaly2E.Pap],
|
||||||
|
[Osztaly2E.Druida],
|
||||||
|
[Osztaly2E.Vandor],
|
||||||
|
])("includes arcane kepzettsegek for %s", (osztaly) => {
|
||||||
|
const karakter = {
|
||||||
|
...DefaultKarakter,
|
||||||
|
szintlepesek: [
|
||||||
|
{ osztaly, HProll: 4, },
|
||||||
|
]
|
||||||
|
}
|
||||||
|
const actual = GetAvailableKepzettsegek(karakter)
|
||||||
|
expect(actual).toContain(Kepzettsegek.k_csillagjoslas)
|
||||||
|
})
|
||||||
|
describe("when Tolvaj", () => {
|
||||||
|
test("includes unpicked Tolvaj kepzettsegek", () => {
|
||||||
|
const karakter = {
|
||||||
|
...DefaultKarakter,
|
||||||
|
szintlepesek: [
|
||||||
|
{ osztaly: Osztaly2E.Tolvaj, HProll: 6, }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
const actual = GetAvailableKepzettsegek(karakter)
|
||||||
|
expect(actual).toContain(Kepzettsegek.k_meregkeveres)
|
||||||
|
})
|
||||||
|
test.each([
|
||||||
|
[Kepzettsegek.k_meregkeveres],
|
||||||
|
[Kepzettsegek.k_alcazas],
|
||||||
|
[Kepzettsegek.k_csapdak],
|
||||||
|
[Kepzettsegek.k_szabadulomuveszet],
|
||||||
|
[Kepzettsegek.k_hamisitas],
|
||||||
|
])("excludes already picked Tolvaj kepzettsegek", (kepzettseg) => {
|
||||||
|
const karakter = {
|
||||||
|
...DefaultKarakter,
|
||||||
|
szintlepesek: [
|
||||||
|
{ osztaly: Osztaly2E.Tolvaj, HProll: 6, }
|
||||||
|
],
|
||||||
|
tolvajKepzettsegek: [kepzettseg.Id]
|
||||||
|
}
|
||||||
|
const actual = GetAvailableKepzettsegek(karakter)
|
||||||
|
expect(actual).not.toContain(kepzettseg)
|
||||||
|
})
|
||||||
|
test("excludes extra high level Tolvaj kepzettsegek", () => {
|
||||||
|
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
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
const actual = GetAvailableKepzettsegek(karakter)
|
||||||
|
expect(actual).not.toContain(Kepzettsegek.k_meregkeveres)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
test("multiclass characters get access to kepzettsegek from all classes", () => {
|
||||||
|
const karakter = {
|
||||||
|
...DefaultKarakter,
|
||||||
|
szintlepesek: [
|
||||||
|
{ osztaly: Osztaly2E.Illuzionista, HProll: 4, },
|
||||||
|
{ osztaly: Osztaly2E.Tolvaj, HProll: 4, },
|
||||||
|
]
|
||||||
|
}
|
||||||
|
const actual = GetAvailableKepzettsegek(karakter)
|
||||||
|
expect(actual).toContain(Kepzettsegek.k_csillagjoslas)
|
||||||
|
expect(actual).toContain(Kepzettsegek.k_meregkeveres)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import {Osztaly2E} from "./osztaly2E";
|
import {Osztaly2E} from "./osztaly2E";
|
||||||
import {Faj2E, TulajdonsagokFajjal} from "./faj2E";
|
import {Faj2E} from "./faj2E";
|
||||||
import {Karakter2E} from "./karakter2E";
|
import {Karakter2E} from "./karakter2E";
|
||||||
import {Modifier, Tulajdonsag2E} from "./tulajdonsag2E";
|
import {Modifier, Tulajdonsag2E, TulajdonsagokTotal} from "./tulajdonsag2E";
|
||||||
|
|
||||||
export type KepzettsegId = 'k_alkimia' | 'k_alcazas' | 'k_allatidomitas' | 'k_csapdak' | 'k_csillagjoslas' | 'k_egyensulyozas' | 'k_eloadas' | 'k_ertekbecsles' | 'k_gyogyitas' | 'k_hajozas' | 'k_hallgatozas' | 'k_hamisitas' | 'k_herbalizmus' | 'k_historia' | 'k_jelek_olvasasa' | 'k_lovaglas' | 'k_maszas' | 'k_megfigyeles' | 'k_meregkeveres' | 'k_mesterseg' | 'k_nyomkereses' | 'k_okkultizmus' | 'k_osonas' | 'k_szabadulomuveszet' | 'k_ugras' | 'k_uszas' | 'k_vadonjaras' | 'k_zarnyitas' | 'k_zsebmetszes'
|
export type KepzettsegId = 'k_alkimia' | 'k_alcazas' | 'k_allatidomitas' | 'k_csapdak' | 'k_csillagjoslas' | 'k_egyensulyozas' | 'k_eloadas' | 'k_ertekbecsles' | 'k_gyogyitas' | 'k_hajozas' | 'k_hallgatozas' | 'k_hamisitas' | 'k_herbalizmus' | 'k_historia' | 'k_jelek_olvasasa' | 'k_lovaglas' | 'k_maszas' | 'k_megfigyeles' | 'k_meregkeveres' | 'k_mesterseg' | 'k_nyomkereses' | 'k_okkultizmus' | 'k_osonas' | 'k_szabadulomuveszet' | 'k_ugras' | 'k_uszas' | 'k_vadonjaras' | 'k_zarnyitas' | 'k_zsebmetszes'
|
||||||
|
|
||||||
@@ -209,11 +209,7 @@ export const Kepzettsegek: Record<KepzettsegId, Kepzettseg> =
|
|||||||
(acc: Record<KepzettsegId, Kepzettseg>, k) => { acc[k.Id] = k; return acc; },
|
(acc: Record<KepzettsegId, Kepzettseg>, k) => { acc[k.Id] = k; return acc; },
|
||||||
{} as Record<KepzettsegId, Kepzettseg>);
|
{} as Record<KepzettsegId, Kepzettseg>);
|
||||||
|
|
||||||
export function AvailableKezpettsegList(...osztalyok: Osztaly2E[]): Kepzettseg[] {
|
function availableKezpettsegListFajjal(faj: Faj2E, ...osztalyok: Osztaly2E[]): Kepzettseg[] {
|
||||||
return KepzettsegLista.filter(k => k.Osztalyok == null || k.Osztalyok.some(o => osztalyok.includes(o)))
|
|
||||||
}
|
|
||||||
|
|
||||||
export function AvailableKezpettsegListFajjal(faj: Faj2E, ...osztalyok: Osztaly2E[]): Kepzettseg[] {
|
|
||||||
const birodalmiKepzettsegek : KepzettsegId[] = ["k_alkimia", "k_meregkeveres", "k_okkultizmus"]
|
const birodalmiKepzettsegek : KepzettsegId[] = ["k_alkimia", "k_meregkeveres", "k_okkultizmus"]
|
||||||
return KepzettsegLista.filter(k =>
|
return KepzettsegLista.filter(k =>
|
||||||
k.Osztalyok == null || k.Osztalyok.some(o => osztalyok.includes(o))
|
k.Osztalyok == null || k.Osztalyok.some(o => osztalyok.includes(o))
|
||||||
@@ -222,7 +218,7 @@ export function AvailableKezpettsegListFajjal(faj: Faj2E, ...osztalyok: Osztaly2
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function GetNumberOfKepzettsegek(t_int: number, faj: Faj2E, max: number = 11) {
|
export function GetNumberOfKepzettsegek(t_int: number, faj: Faj2E, max: number = 11) {
|
||||||
//max = 3 + 1 + 3 + 5 = 12 // 3 base, 1 human, 3 from max ability modifier, 5 from Thief at 9th level
|
//max = 3 + 1 + 3 + 5 = 12 // 3 base, 1 human, 3 from max ability modifier, 4 from Thief +1 at 9th level
|
||||||
let numberOfKepzettseg = 3 + Modifier(t_int) + (faj === Faj2E.Ember ? 1 : 0)
|
let numberOfKepzettseg = 3 + Modifier(t_int) + (faj === Faj2E.Ember ? 1 : 0)
|
||||||
|
|
||||||
if (numberOfKepzettseg < 1) {
|
if (numberOfKepzettseg < 1) {
|
||||||
@@ -236,6 +232,21 @@ export function GetNumberOfKepzettsegek(t_int: number, faj: Faj2E, max: number =
|
|||||||
return numberOfKepzettseg;
|
return numberOfKepzettseg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function GetAvailableKepzettsegek(karakter: Pick<Karakter2E, 'szintlepesek' | 'faj' | 'kepzettsegek' | 'tolvajKepzettsegek'>): Kepzettseg[] {
|
||||||
|
const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly))
|
||||||
|
const availableKepzettsegek = availableKezpettsegListFajjal(karakter.faj, ...osztalyok)
|
||||||
|
.filter(k => !karakter.kepzettsegek.includes(k.Id))
|
||||||
|
|
||||||
|
if (!osztalyok.has(Osztaly2E.Tolvaj)) {
|
||||||
|
return availableKepzettsegek;
|
||||||
|
}
|
||||||
|
|
||||||
|
return availableKepzettsegek.filter(k =>
|
||||||
|
!karakter.tolvajKepzettsegek?.includes(k.Id)
|
||||||
|
&& !karakter.szintlepesek.some(sz =>
|
||||||
|
sz.tolvajExtraKepzettseg === k.Id && sz.osztaly === Osztaly2E.Tolvaj))
|
||||||
|
}
|
||||||
|
|
||||||
export function SetDefaultTolvajKepzettsegek(karakter: Pick<Karakter2E, 'szintlepesek' | 'tolvajKepzettsegek'>, changeTolvajKepzettsegek: (tolvajKepzettsegek?: KepzettsegId[]) => void) {
|
export function SetDefaultTolvajKepzettsegek(karakter: Pick<Karakter2E, 'szintlepesek' | 'tolvajKepzettsegek'>, changeTolvajKepzettsegek: (tolvajKepzettsegek?: KepzettsegId[]) => void) {
|
||||||
const hasTolvajSzint = karakter.szintlepesek.some(szint => szint.osztaly === Osztaly2E.Tolvaj)
|
const hasTolvajSzint = karakter.szintlepesek.some(szint => szint.osztaly === Osztaly2E.Tolvaj)
|
||||||
if (!hasTolvajSzint && karakter.tolvajKepzettsegek != null) {
|
if (!hasTolvajSzint && karakter.tolvajKepzettsegek != null) {
|
||||||
@@ -247,79 +258,47 @@ export function SetDefaultTolvajKepzettsegek(karakter: Pick<Karakter2E, 'szintle
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function GetKepzettsegAtN(karakter: Pick<Karakter2E, 'szintlepesek' | 'faj' | 'kepzettsegek' | 'tolvajKepzettsegek'>, n: number): Kepzettseg | undefined {
|
export function GetKepzettsegListaN(karakter: Pick<Karakter2E, 'szintlepesek' | 'faj' | 'kepzettsegek' | 'tolvajKepzettsegek'>) {
|
||||||
const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly))
|
return (n: number): Kepzettseg[] => {
|
||||||
let availableKepzettsegList = AvailableKezpettsegListFajjal(karakter.faj, ...osztalyok)
|
if (karakter.kepzettsegek.length > n){
|
||||||
const kepzettsegekWithoutN = [...karakter.kepzettsegek.slice(0, n), ...karakter.kepzettsegek.slice(n + 1)]
|
return [Kepzettsegek[karakter.kepzettsegek[n]], ...GetAvailableKepzettsegek(karakter)]
|
||||||
return availableKepzettsegList.find(x => !kepzettsegekWithoutN.includes(x.Id) && !karakter.tolvajKepzettsegek?.includes(x.Id))
|
}
|
||||||
|
else {
|
||||||
|
return GetAvailableKepzettsegek(karakter);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function GetKepzettsegListaN(karakter: Pick<Karakter2E, 'szintlepesek' | 'faj' | 'kepzettsegek' | 'tolvajKepzettsegek'>) {
|
export function GetTolvajKepzettsegListaN(karakter: Pick<Karakter2E, 'szintlepesek' | 'faj' | 'kepzettsegek' | 'tolvajKepzettsegek'>) {
|
||||||
const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly))
|
|
||||||
let availableKepzettsegList = AvailableKezpettsegListFajjal(karakter.faj, ...osztalyok)
|
|
||||||
return (n: number): Kepzettseg[] => {
|
return (n: number): Kepzettseg[] => {
|
||||||
let available = [...availableKepzettsegList]
|
if (karakter.tolvajKepzettsegek != null && karakter.tolvajKepzettsegek.length > n){
|
||||||
// if (n === 0) {
|
return [Kepzettsegek[karakter.tolvajKepzettsegek[n]], ...GetAvailableKepzettsegek(karakter)]
|
||||||
// if (karakter.faj === Faj2E.Eszaki) {
|
}
|
||||||
// return [Kepzettsegek.k_hajozas]
|
else {
|
||||||
// }
|
return GetAvailableKepzettsegek(karakter);
|
||||||
// if (karakter.faj === Faj2E.Nomad) {
|
}
|
||||||
// return [Kepzettsegek.k_lovaglas]
|
|
||||||
// }
|
|
||||||
// // TODO birodalmi tolvaj, tolvajképzettségek!
|
|
||||||
// if (karakter.faj === Faj2E.Birodalmi) {
|
|
||||||
// return [Kepzettsegek.k_alkimia, Kepzettsegek.k_meregkeveres, Kepzettsegek.k_okkultizmus]
|
|
||||||
// }
|
|
||||||
// if (karakter.faj === Faj2E.Torpe) {
|
|
||||||
// return [Kepzettsegek.k_ertekbecsles]
|
|
||||||
// }
|
|
||||||
// if (karakter.faj === Faj2E.Elf || karakter.faj === Faj2E.Felelf) {
|
|
||||||
// return [Kepzettsegek.k_vadonjaras]
|
|
||||||
// }
|
|
||||||
// if (osztalyok.has(Osztaly2E.Druida) || osztalyok.has(Osztaly2E.Vandor)) {
|
|
||||||
// return [Kepzettsegek.k_vadonjaras]
|
|
||||||
// }
|
|
||||||
// if (osztalyok.has(Osztaly2E.Dalnok)) {
|
|
||||||
// return [Kepzettsegek.k_eloadas]
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if (n === 1) {
|
|
||||||
// if ((osztalyok.has(Osztaly2E.Vandor) || osztalyok.has(Osztaly2E.Druida))
|
|
||||||
// && karakter.kepzettsegek[0] !== Kepzettsegek.k_vadonjaras.Id) {
|
|
||||||
// return [Kepzettsegek.k_vadonjaras]
|
|
||||||
// }
|
|
||||||
// if (osztalyok.has(Osztaly2E.Dalnok)
|
|
||||||
// && karakter.kepzettsegek[0] !== Kepzettsegek.k_eloadas.Id) {
|
|
||||||
// return [Kepzettsegek.k_eloadas]
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if (n === 2) { // maybe write a better abstraction?
|
|
||||||
// if (osztalyok.has(Osztaly2E.Dalnok)
|
|
||||||
// && karakter.kepzettsegek[0] !== Kepzettsegek.k_eloadas.Id
|
|
||||||
// && karakter.kepzettsegek[1] !== Kepzettsegek.k_eloadas.Id) {
|
|
||||||
// return [Kepzettsegek.k_eloadas]
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
const kepzettsegekWithoutN = [...karakter.kepzettsegek.slice(0, n), ...karakter.kepzettsegek.slice(n + 1)]
|
|
||||||
return available.filter(x => !kepzettsegekWithoutN.includes(x.Id) && !karakter.tolvajKepzettsegek?.includes(x.Id))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function AdjustKepzettsegek(karakter: Pick<Karakter2E, 'faj' | 'tulajdonsagok' | 'szintlepesek' | 'kepzettsegek' | 'tolvajKepzettsegek'>): KepzettsegId[] {
|
export function AdjustKepzettsegek(karakter: Pick<Karakter2E, 'faj' | 'tulajdonsagok' | 'szintlepesek' | 'kepzettsegek' | 'tolvajKepzettsegek'>): KepzettsegId[] {
|
||||||
const tulajdonsagokFajjal = TulajdonsagokFajjal(karakter.tulajdonsagok, karakter.faj)
|
const tul = TulajdonsagokTotal(karakter)
|
||||||
const numberOfKepzettsegek = GetNumberOfKepzettsegek(tulajdonsagokFajjal.t_int, karakter.faj)
|
const numberOfKepzettsegek = GetNumberOfKepzettsegek(tul.t_int, karakter.faj)
|
||||||
const diff = numberOfKepzettsegek - karakter.kepzettsegek.length
|
const diff = numberOfKepzettsegek - karakter.kepzettsegek.length
|
||||||
if (diff > 0) {
|
if (diff > 0) {
|
||||||
const kepzettsegek = [...karakter.kepzettsegek]
|
const kepzettsegek = [...karakter.kepzettsegek]
|
||||||
for (let i = 0; i < diff; i++) {
|
for (let i = 0; i < diff; i++) {
|
||||||
const next = GetKepzettsegAtN({
|
const next = GetAvailableKepzettsegek({
|
||||||
...karakter,
|
...karakter,
|
||||||
kepzettsegek,
|
kepzettsegek,
|
||||||
}, kepzettsegek.length + 1)!.Id;
|
})[0].Id;
|
||||||
kepzettsegek.push(next)
|
kepzettsegek.push(next)
|
||||||
}
|
}
|
||||||
return kepzettsegek;
|
return kepzettsegek;
|
||||||
} else {
|
}
|
||||||
|
else if (diff === 0) {
|
||||||
|
return karakter.kepzettsegek
|
||||||
|
}
|
||||||
|
else {
|
||||||
return karakter.kepzettsegek.slice(0, numberOfKepzettsegek);
|
return karakter.kepzettsegek.slice(0, numberOfKepzettsegek);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,7 @@ import {ElsodlegesMento, MasodlagosMento, MentokTotal, MultiClassMentokAlap} fro
|
|||||||
import {Osztaly2E} from "./osztaly2E";
|
import {Osztaly2E} from "./osztaly2E";
|
||||||
import {Szintlepes} from "./szintlepes";
|
import {Szintlepes} from "./szintlepes";
|
||||||
|
|
||||||
describe("mentok", () => {
|
describe("mentok 2E", () => {
|
||||||
test.each([
|
test.each([
|
||||||
[1, 2],
|
[1, 2],
|
||||||
[2, 3],
|
[2, 3],
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import {Tulajdonsag2E, TulajdonsagIDs, TulajdonsagokTotal} from "./tulajdonsag2E";
|
import {Tulajdonsag2E, TulajdonsagIDs, TulajdonsagokTotal} from "./tulajdonsag2E";
|
||||||
import {KepzettsegId} from "./kepzettsegek2E";
|
import {GetAvailableKepzettsegek, KepzettsegId} from "./kepzettsegek2E";
|
||||||
import {Osztaly2E} from "./osztaly2E";
|
import {Osztaly2E} from "./osztaly2E";
|
||||||
import {Karakter2E} from "./karakter2E";
|
import {Karakter2E} from "./karakter2E";
|
||||||
import {BaseHP} from "./masodlagos_ertekek";
|
import {BaseHP} from "./masodlagos_ertekek";
|
||||||
@@ -23,15 +23,15 @@ export function PickableSpecializationFilter(existingSpecilizations: (string | u
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function LevelUp(karakter: Karakter2E, changeKarakter: (input: Karakter2E) => void) {
|
export function LevelUp(karakter: Karakter2E, changeKarakter: (input: Karakter2E) => void) {
|
||||||
const osztaly = karakter.szintlepesek[0].osztaly
|
const autoPickedOsztaly = karakter.szintlepesek[karakter.szintlepesek.length - 1].osztaly
|
||||||
const tulajdonsagokTotal = TulajdonsagokTotal(karakter)
|
const tulajdonsagokTotal = TulajdonsagokTotal(karakter)
|
||||||
const szint = karakter.szint + 1
|
const szint = karakter.szint + 1
|
||||||
const dice = BaseHP(osztaly)
|
const dice = BaseHP(autoPickedOsztaly)
|
||||||
const roll = dAny(dice)
|
const roll = dAny(dice)
|
||||||
console.log(`Level ${szint} HP roll on d${dice} is: ${roll}`)
|
console.log(`Level ${szint} HP roll on d${dice} is: ${roll}`)
|
||||||
|
|
||||||
const szintlepes: Szintlepes = {
|
const szintlepes: Szintlepes = {
|
||||||
osztaly: osztaly,
|
osztaly: autoPickedOsztaly,
|
||||||
HProll: roll
|
HProll: roll
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,16 +43,19 @@ export function LevelUp(karakter: Karakter2E, changeKarakter: (input: Karakter2E
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(osztaly === Osztaly2E.Harcos) {
|
|
||||||
const harcosSzint = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Harcos).length + 1
|
if (autoPickedOsztaly === Osztaly2E.Harcos){
|
||||||
|
const harcosSzint = 1 + karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Harcos).length
|
||||||
if (harcosSzint % 2 === 1) {
|
if (harcosSzint % 2 === 1) {
|
||||||
const harcosSpecializaciok = karakter.szintlepesek.map(x => x.harcosFegyver)
|
const harcosSpecializaciok = karakter.szintlepesek.map(x => x.harcosFegyver)
|
||||||
let specializationFilter = PickableSpecializationFilter(harcosSpecializaciok, harcosSzint)
|
let specializationFilter = PickableSpecializationFilter(harcosSpecializaciok, harcosSzint)
|
||||||
szintlepes.harcosFegyver = AllowedFegyver(Osztaly2E.Harcos).filter(specializationFilter)[0].Id
|
szintlepes.harcosFegyver = AllowedFegyver(Osztaly2E.Harcos).filter(specializationFilter)[0].Id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(osztaly === Osztaly2E.Tengeresz) {
|
|
||||||
const kalozSzint = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Tengeresz).length + 1
|
if(autoPickedOsztaly === Osztaly2E.Tengeresz)
|
||||||
|
{
|
||||||
|
const kalozSzint = 1 + karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Tengeresz).length
|
||||||
if (kalozSzint % 3 === 0) {
|
if (kalozSzint % 3 === 0) {
|
||||||
let kalozKritikus = karakter.szintlepesek.map(x => x.kalozKritikus)
|
let kalozKritikus = karakter.szintlepesek.map(x => x.kalozKritikus)
|
||||||
let specializationFilter = PickableSpecializationFilter(kalozKritikus, kalozSzint)
|
let specializationFilter = PickableSpecializationFilter(kalozKritikus, kalozSzint)
|
||||||
@@ -60,6 +63,14 @@ 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)
|
||||||
|
szintlepes.tolvajExtraKepzettseg = availableKepzettsegek[0].Id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
changeKarakter({...karakter, szint, szintlepesek: [...karakter.szintlepesek, szintlepes]})
|
changeKarakter({...karakter, szint, szintlepesek: [...karakter.szintlepesek, szintlepes]})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user