diff --git a/Kemkas.Web/frontend/src/second-edition/components/BasicNewLevel.tsx b/Kemkas.Web/frontend/src/second-edition/components/BasicNewLevel.tsx index 1d87cea..23208c7 100644 --- a/Kemkas.Web/frontend/src/second-edition/components/BasicNewLevel.tsx +++ b/Kemkas.Web/frontend/src/second-edition/components/BasicNewLevel.tsx @@ -3,7 +3,8 @@ import {Karakter2E} from "../domain-models/karakter2E"; import {SignedNumberToText} from "../../shared/components/Helpers"; import {Mentok, MentoTipus, MentoTipusLabel, MentokTotal} from "../domain-models/mentok"; import {BaseHP, HP} from "../domain-models/masodlagos_ertekek"; -import {TamadasBonusz} from "../domain-models/tamadas_bonusz"; +import {MultiClassTamadasBonusz} from "../domain-models/tamadas_bonusz"; +import {Osztaly2E} from "../domain-models/osztaly2E"; function MentoNovekedes(props : {tipus: MentoTipus, ujMentok: Mentok, regiMentok: Mentok}) { const {tipus, ujMentok, regiMentok} = props @@ -28,16 +29,17 @@ function UjMento(props : {tipus: MentoTipus, ujMentok: Mentok, regiMentok: Mento } function BasicNewLevel(props: { - karakter: Pick + karakter: Pick szint: number + osztaly: Osztaly2E changeRolledHP: (hp: number) => void, }) { - const {karakter, szint, changeRolledHP} = props - const regiMentok = MentokTotal({...karakter, szint: szint - 1}) - const ujMentok = MentokTotal({...karakter, szint: szint}) + const {karakter, szint, osztaly, changeRolledHP} = props + const regiMentok = MentokTotal({...karakter, szintlepesek: karakter.szintlepesek.slice(0, szint - 1)}) + const ujMentok = MentokTotal({...karakter, szintlepesek: karakter.szintlepesek.slice(0, szint)}) - const regiTB = TamadasBonusz(karakter.osztaly, szint-1) - const ujTB = TamadasBonusz(karakter.osztaly, szint) + const regiTB = MultiClassTamadasBonusz(karakter.szintlepesek.slice(0, szint-1)) + const ujTB = MultiClassTamadasBonusz(karakter.szintlepesek.slice(0, szint)) if (regiTB.length < ujTB.length) { regiTB.push(0) } @@ -48,7 +50,7 @@ function BasicNewLevel(props: {
- +
- {HP({...karakter, szintlepesek: karakter.szintlepesek.slice(0, szint-1)})} + {HP({...karakter, szintlepesek: karakter.szintlepesek.slice(0, szint)})}
{isTBincreased &&
diff --git a/Kemkas.Web/frontend/src/second-edition/components/LevelUps.tsx b/Kemkas.Web/frontend/src/second-edition/components/LevelUps.tsx index 20b04ec..364017a 100644 --- a/Kemkas.Web/frontend/src/second-edition/components/LevelUps.tsx +++ b/Kemkas.Web/frontend/src/second-edition/components/LevelUps.tsx @@ -1,5 +1,5 @@ import React from "react"; -import {Karakter2E} from "../domain-models/karakter2E"; +import {ChangeOsztalyAtSzint, Karakter2E} from "../domain-models/karakter2E"; import BasicNewLevel from "./BasicNewLevel"; import TulajdonsagNoveles from "./TulajdonsagNoveles"; import {Tulajdonsag2E, TulajdonsagokTotal} from "../domain-models/tulajdonsag2E"; @@ -7,24 +7,31 @@ import {arraySetN} from "../../util"; import {Osztaly2E} from "../domain-models/osztaly2E"; import KalozKritikus from "./KalozKritikus"; import HarcosFegyverSpecializacio from "./HarcosFegyverSpec"; +import {BasicOsztalySelector2E} from "./OsztalySelector2E"; function LevelUp(props: { szint: number, + osztaly: Osztaly2E, karakter: Karakter2E, changeTulajdonsagNoveles: (t: Tulajdonsag2E) => void, changeRolledHP: (rolledHP: number) => void, changeHarcosSpec: (spec: string) => void, changeKalozKritikus: (krit: string) => void, + changeOsztaly: (osztaly: Osztaly2E) => void }) { const { szint, + osztaly, karakter, changeTulajdonsagNoveles, changeRolledHP, changeHarcosSpec, changeKalozKritikus, + changeOsztaly } = props + const harcosSzint = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Harcos).length + const kalozSzint = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Tengeresz).length const specialization = karakter.szintlepesek[szint-1].harcosFegyver const krit = karakter.szintlepesek[szint-1].kalozKritikus @@ -32,6 +39,7 @@ function LevelUp(props: {
{szint}. Szint
+ {szint % 4 === 0 && - {karakter.osztaly === Osztaly2E.Harcos && szint % 2 === 1 && + {osztaly === Osztaly2E.Harcos && harcosSzint % 2 === 1 && x.harcosFegyver)} changeSpecialization={changeHarcosSpec} - szint={szint} + szint={harcosSzint} /> } - {karakter.osztaly === Osztaly2E.Tengeresz && szint % 3 === 0 && !!krit && + {osztaly === Osztaly2E.Tengeresz && kalozSzint % 3 === 0 && !!krit && x.kalozKritikus)} changeKrit={changeKalozKritikus} - szint={szint} + szint={kalozSzint} /> }
@@ -65,10 +74,10 @@ function LevelUp(props: { export function LevelUps(props: {karakter: Karakter2E, changeKarakter: (inputs: Karakter2E) => void}){ const {karakter, changeKarakter} = props; - const tulajdonsagokAtSzint = (szint: number) => TulajdonsagokTotal({...karakter, szintlepesek: karakter.szintlepesek.slice(0, szint - 1)}) + const tulajdonsagokAtSzint = (szint: number) => TulajdonsagokTotal({...karakter, szintlepesek: karakter.szintlepesek.slice(0, szint)}) const changeRolledHPAtSzint = (szint: number) => (newHProll: number) => { - changeKarakter({...karakter, szintlepesek: arraySetN(karakter.szintlepesek, szint-2, {...karakter.szintlepesek[szint-2], HProll: newHProll})}) + changeKarakter({...karakter, szintlepesek: arraySetN(karakter.szintlepesek, szint-1, {...karakter.szintlepesek[szint-1], HProll: newHProll})}) console.log(karakter) } const changeTulajdonsagNovelesAtSzint = (szint: number) => { @@ -113,11 +122,13 @@ export function LevelUps(props: {karakter: Karakter2E, changeKarakter: (inputs: changeKarakter(ChangeOsztalyAtSzint(karakter, o, szint))} /> )} diff --git a/Kemkas.Web/frontend/src/second-edition/components/OsztalySelector2E.tsx b/Kemkas.Web/frontend/src/second-edition/components/OsztalySelector2E.tsx index f8dad76..f8f6cb5 100644 --- a/Kemkas.Web/frontend/src/second-edition/components/OsztalySelector2E.tsx +++ b/Kemkas.Web/frontend/src/second-edition/components/OsztalySelector2E.tsx @@ -8,21 +8,16 @@ import { } from "../domain-models/osztaly2E"; import {Faj2E, SzintKorlatokFajokra} from "../domain-models/faj2E"; -function OsztalySelector2E(props: { - currentFaj: Faj2E, - currentOsztaly: Osztaly2E, - changeOsztaly: (newOsztaly: Osztaly2E) => void -}) { - const {currentFaj, currentOsztaly, changeOsztaly} = props; - +export function BasicOsztalySelector2E(props: {faj: Faj2E, osztaly: Osztaly2E, changeOsztaly: (osztaly: Osztaly2E) => void}) { + const {faj, osztaly, changeOsztaly} = props; return <>
-
+ +} + +function OsztalySelector2E(props: { + currentFaj: Faj2E, + currentOsztaly: Osztaly2E, + changeOsztaly: (newOsztaly: Osztaly2E) => void +}) { + const {currentFaj, currentOsztaly, changeOsztaly} = props; + + return <> +
diff --git a/Kemkas.Web/frontend/src/second-edition/domain-models/karakter2E.ts b/Kemkas.Web/frontend/src/second-edition/domain-models/karakter2E.ts index 37a43db..6d15173 100644 --- a/Kemkas.Web/frontend/src/second-edition/domain-models/karakter2E.ts +++ b/Kemkas.Web/frontend/src/second-edition/domain-models/karakter2E.ts @@ -17,7 +17,6 @@ export interface Karakter2E { jellem: JellemID, tulajdonsagok: KarakterTulajdonsagok faj: Faj2E - osztaly: Osztaly2E kepzettsegek: KepzettsegId[] tolvajKepzettsegek?: KepzettsegId[] szint: number, @@ -31,7 +30,6 @@ export const DefaultKarakter: Karakter2E = { jellem: 'S', tulajdonsagok: TulajdonsagDefaults, faj: Faj2E.Ember, - osztaly: Osztaly2E.Tengeresz, kepzettsegek: [], tolvajKepzettsegek: [], szint: 1, @@ -42,34 +40,93 @@ export const DefaultKarakter: Karakter2E = { }] } -function setOsztalyForSzintLepes(szintlepes: Szintlepes, osztaly: Osztaly2E, szint: number): Szintlepes { - const base : Szintlepes = { - ...szintlepes, +function setOsztalyForSzintLepes(szintlepesek: Szintlepes[], osztaly: Osztaly2E, szint: number): Szintlepes[] { + const prev = szintlepesek.slice(0, szint-1) + const current : Szintlepes = { + ...szintlepesek[szint-1], osztaly, harcosFegyver: undefined, kalozKritikus: undefined } + const tail = szintlepesek.slice(szint).map(x => {return {...x}}) + + let harcosSzint = prev.filter(x => x.osztaly === Osztaly2E.Harcos).length + // TODO: only pick specializations from valid levels + const harcosSpecializaciok = szintlepesek + .map(x => x.harcosFegyver) + .filter(x => x != null) + const harcosSpecAtSzint = (hSzint: number): (string | undefined) => { + if (hSzint % 2 === 1) { + const specIndex = (hSzint+1)/2 -1 + if (harcosSpecializaciok.length > specIndex ) { + return harcosSpecializaciok[specIndex] + } else { + return AllowedFegyver(Osztaly2E.Harcos)[specIndex].Id + } + } + else { + return undefined + } + } + if (osztaly === Osztaly2E.Harcos) { + harcosSzint += 1 + current.harcosFegyver = harcosSpecAtSzint(harcosSzint) + } + for (let i = 0; i < tail.length; i++) { + if (tail[i].osztaly === Osztaly2E.Harcos) { + harcosSzint++ + tail[i].harcosFegyver = harcosSpecAtSzint(harcosSzint) + } + } + + let kalozSzint = prev.filter(x => x.osztaly === Osztaly2E.Tengeresz).length + const existingKalozKrits = szintlepesek + .map(x => x.kalozKritikus) + .filter(x => x != null) + const kalozKritAtSzint = (kSzint: number): (string | undefined) => { + if (kSzint % 3 === 0) { + const specIndex = kSzint/3 -1 + if (existingKalozKrits.length > specIndex ) { + return existingKalozKrits[specIndex] + } else { + return AllowedFegyver(Osztaly2E.Tengeresz)[specIndex].Id + } + } + else { + return undefined + } + } + if (osztaly === Osztaly2E.Tengeresz) { + kalozSzint++ + current.kalozKritikus = kalozKritAtSzint(szint) + } + for (let i = 0; i < tail.length; i++) { + if (tail[i].osztaly === Osztaly2E.Tengeresz) { + kalozSzint++ + tail[i].kalozKritikus = kalozKritAtSzint(kalozSzint) + } + } - if (osztaly === Osztaly2E.Harcos && szint % 2 === 1) { - base.harcosFegyver = AllowedFegyver(Osztaly2E.Harcos)[szint].Id - } - if (osztaly === Osztaly2E.Tengeresz && szint % 3 === 0) { - base.kalozKritikus = AllowedFegyver(Osztaly2E.Tengeresz)[szint].Id - } const HD = BaseHP(osztaly) if (szint === 1) { - base.HProll = HD + current.HProll = HD } else { - base.HProll = dAny(HD) - console.log(`Level ${szint} HP roll on d${HD} is: ${base.HProll} due to class change`) + current.HProll = dAny(HD) + console.log(`Level ${szint} HP roll on d${HD} is: ${current.HProll} due to class change`) } - return base + return [...prev, current, ...tail] } export function ChangeLvl1Osztaly(karakter: Karakter2E, osztaly: Osztaly2E): Karakter2E { return { ...karakter, - osztaly, - szintlepesek: karakter.szintlepesek.map((l, idx) => setOsztalyForSzintLepes(l, osztaly, idx +1)) + szintlepesek: [{...karakter.szintlepesek[0], osztaly}, ...karakter.szintlepesek.slice(1)] + } +} + +export function ChangeOsztalyAtSzint(karakter: Karakter2E, osztaly: Osztaly2E, szint: number): Karakter2E { + return { + ...karakter, + szintlepesek: setOsztalyForSzintLepes(karakter.szintlepesek, osztaly, szint) } } diff --git a/Kemkas.Web/frontend/src/second-edition/domain-models/kepzettsegek2E.ts b/Kemkas.Web/frontend/src/second-edition/domain-models/kepzettsegek2E.ts index 0aa97b8..9c023d2 100644 --- a/Kemkas.Web/frontend/src/second-edition/domain-models/kepzettsegek2E.ts +++ b/Kemkas.Web/frontend/src/second-edition/domain-models/kepzettsegek2E.ts @@ -209,12 +209,12 @@ export const Kepzettsegek: Record = (acc: Record, k) => { acc[k.Id] = k; return acc; }, {} as Record); -export function AvailableKezpettsegList(osztaly: Osztaly2E): Kepzettseg[] { - return KepzettsegLista.filter(k => k.Osztalyok == null || k.Osztalyok.includes(osztaly)) +export function AvailableKezpettsegList(...osztalyok: Osztaly2E[]): Kepzettseg[] { + return KepzettsegLista.filter(k => k.Osztalyok == null || k.Osztalyok.some(o => osztalyok.includes(o))) } export function GetNumberOfKepzettsegek(t_int: number, faj: Faj2E, max: number = 11) { - //max = 3 + 1 + 3 + 4 // 3 base, 1 human, 3 from max ability modifier, 4 from Thief + //max = 3 + 1 + 3 + 5 = 12 // 3 base, 1 human, 3 from max ability modifier, 5 from Thief at 9th level let numberOfKepzettseg = 3 + Modifier(t_int) + (faj === Faj2E.Ember ? 1 : 0) if (numberOfKepzettseg < 1) { @@ -228,18 +228,20 @@ export function GetNumberOfKepzettsegek(t_int: number, faj: Faj2E, max: number = return numberOfKepzettseg; } -export function SetDefaultTolvajKepzettsegek(karakter: Pick, changeTolvajKepzettsegek: (tolvajKepzettsegek?: KepzettsegId[]) => void) { - if (karakter.osztaly !== Osztaly2E.Tolvaj && karakter.tolvajKepzettsegek != null) { +export function SetDefaultTolvajKepzettsegek(karakter: Pick, changeTolvajKepzettsegek: (tolvajKepzettsegek?: KepzettsegId[]) => void) { + const hasTolvajSzint = karakter.szintlepesek.some(szint => szint.osztaly === Osztaly2E.Tolvaj) + if (!hasTolvajSzint && karakter.tolvajKepzettsegek != null) { changeTolvajKepzettsegek(undefined) } - if (karakter.osztaly === Osztaly2E.Tolvaj && (karakter.tolvajKepzettsegek == null || karakter.tolvajKepzettsegek.length === 0)) { + if (hasTolvajSzint && (karakter.tolvajKepzettsegek == null || karakter.tolvajKepzettsegek.length === 0)) { const tolvajKepzettsegek = TolvajKepzettsegList.slice(0, 4).map(x => x.Id) changeTolvajKepzettsegek(tolvajKepzettsegek) } } -export function GetKepzettsegListaN(karakter: Pick) { - const availableKepzettsegList = AvailableKezpettsegList(karakter.osztaly) +export function GetKepzettsegListaN(karakter: Pick) { + const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly)) + const availableKepzettsegList = AvailableKezpettsegList(...osztalyok) return (n: number): Kepzettseg[] => { let available = [...availableKepzettsegList] if (n === 0) { @@ -249,7 +251,8 @@ export function GetKepzettsegListaN(karakter: Pick !kepzettsegekWithoutN.includes(x.Id) && !karakter.tolvajKepzettsegek?.includes(x.Id)) } } -export function SetDefaultKepzettsegek(karakter: Pick, changeKepzettsegek: (k: KepzettsegId[]) => void) { - const availableKepzettsegList = AvailableKezpettsegList(karakter.osztaly) +export function SetDefaultKepzettsegek(karakter: Pick, changeKepzettsegek: (k: KepzettsegId[]) => void) { + const osztalyok = karakter.szintlepesek.map(x => x.osztaly) + const availableKepzettsegList = AvailableKezpettsegList(...osztalyok) const numberOfKepzettsegek = GetNumberOfKepzettsegek(karakter.tulajdonsagok.t_int, karakter.faj, availableKepzettsegList.length) let kepzettsegek = [...karakter.kepzettsegek] diff --git a/Kemkas.Web/frontend/src/second-edition/domain-models/masodlagos_ertekek.ts b/Kemkas.Web/frontend/src/second-edition/domain-models/masodlagos_ertekek.ts index cba9275..53f0f1c 100644 --- a/Kemkas.Web/frontend/src/second-edition/domain-models/masodlagos_ertekek.ts +++ b/Kemkas.Web/frontend/src/second-edition/domain-models/masodlagos_ertekek.ts @@ -14,7 +14,7 @@ export interface MasodlagosErtekekView { Mentok: Mentok } -export type KarakterpickForMasodlagosErtekek = Pick +export type KarakterpickForMasodlagosErtekek = Pick export function BaseHP(osztaly: Osztaly2E) { let base = 4; @@ -45,7 +45,7 @@ export function BaseHP(osztaly: Osztaly2E) { return base } -export function HP(karakter: Pick): number { +export function HP(karakter: Pick): number { const egeszsegModifier = Modifier(karakter.tulajdonsagok.t_egs) return karakter.szintlepesek // https://lfg.hu/forum/topic/15079-kard-es-magia/page/219/#comment-2218333 @@ -53,7 +53,8 @@ export function HP(karakter: Pick sum + val, 0) } -export function VO(karakter: Pick): number { +export function VO(karakter: Pick): number { + const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly)) const pancel = GetPancel(karakter.felszereles.pancelID) const pancelVO = pancel?.VO ?? 0 const pajzsVO = GetPajzs(karakter.felszereles.pajzsID)?.VO ?? 0 @@ -62,14 +63,16 @@ export function VO(karakter: Pick x.osztaly === Osztaly2E.Tengeresz).length + vo += Math.floor(kalozSzintek / 3) } - if (karakter.osztaly === Osztaly2E.Amazon) { + if (osztalyok.has(Osztaly2E.Amazon)) { if (karakter.tulajdonsagok.t_kar > karakter.tulajdonsagok.t_ugy) { abilityVO = Modifier(karakter.tulajdonsagok.t_kar) } - vo += Math.floor(karakter.szint / 2) + const amazonSzintek = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Amazon).length + vo += Math.floor(amazonSzintek / 2) } if (karakter.faj === Faj2E.Felszerzet || karakter.faj === Faj2E.Gnom){ vo += 1 diff --git a/Kemkas.Web/frontend/src/second-edition/domain-models/mentok.ts b/Kemkas.Web/frontend/src/second-edition/domain-models/mentok.ts index 4bc0d5a..0f52306 100644 --- a/Kemkas.Web/frontend/src/second-edition/domain-models/mentok.ts +++ b/Kemkas.Web/frontend/src/second-edition/domain-models/mentok.ts @@ -1,6 +1,7 @@ import {Osztaly2E} from "./osztaly2E"; import {Karakter2E} from "./karakter2E"; import {KarakterTulajdonsagok, TulajdonsagModosito} from "./tulajdonsag2E"; +import {Szintlepes} from "./szintlepes"; export interface Mentok { kitartas: number @@ -73,8 +74,26 @@ export function MentoModositok(tulajdonsagModositok: KarakterTulajdonsagok) { } } -export function MentokTotal(karakter: Pick) { - const alap = MentokAlap(karakter.osztaly, karakter.szint) +export function MultiClassMentokAlap(szintlepesek: Szintlepes[]) : Mentok { + const osztalyok = new Set(szintlepesek.map(x => x.osztaly)) + let mentok = { + kitartas: 0, + reflex: 0, + akaratero: 0 + } + for (const osztaly of osztalyok) { + const szint = szintlepesek.filter(x => x.osztaly === osztaly).length + const uj_mentok = MentokAlap(osztaly, szint) + mentok.akaratero += uj_mentok.akaratero + mentok.reflex += uj_mentok.reflex + mentok.kitartas += uj_mentok.kitartas + } + + return mentok +} + +export function MentokTotal(karakter: Pick) { + const alap = MultiClassMentokAlap(karakter.szintlepesek) const modositok = MentoModositok(TulajdonsagModosito(karakter.tulajdonsagok)) return { kitartas: alap.kitartas + modositok.kitartas, diff --git a/Kemkas.Web/frontend/src/second-edition/domain-models/szintlepes.ts b/Kemkas.Web/frontend/src/second-edition/domain-models/szintlepes.ts index 37bccc7..5688de9 100644 --- a/Kemkas.Web/frontend/src/second-edition/domain-models/szintlepes.ts +++ b/Kemkas.Web/frontend/src/second-edition/domain-models/szintlepes.ts @@ -20,14 +20,15 @@ export function PickableSpecializationFilter(existingSpecilizations: (string | u } export function LevelUp(karakter: Karakter2E, changeKarakter: (input: Karakter2E) => void) { + const osztaly = karakter.szintlepesek[0].osztaly const tulajdonsagokTotal = TulajdonsagokTotal(karakter) const szint = karakter.szint + 1 - const dice = BaseHP(karakter.osztaly) + const dice = BaseHP(osztaly) const roll = dAny(dice) console.log(`Level ${szint} HP roll on d${dice} is: ${roll}`) const szintlepes: Szintlepes = { - osztaly: karakter.osztaly, + osztaly: osztaly, HProll: roll } @@ -39,14 +40,24 @@ export function LevelUp(karakter: Karakter2E, changeKarakter: (input: Karakter2E } } } - if(karakter.osztaly === Osztaly2E.Harcos && szint % 2 === 1) { - const harcosSpecializaciok = karakter.szintlepesek.map(x => x.harcosFegyver) - szintlepes.harcosFegyver = AllowedFegyver(Osztaly2E.Harcos).filter(PickableSpecializationFilter(harcosSpecializaciok, karakter.szint))[0].Id + if(osztaly === Osztaly2E.Harcos) { + const harcosSzint = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Harcos).length + 1 + if (harcosSzint % 2 === 1) { + const harcosSpecializaciok = karakter.szintlepesek.map(x => x.harcosFegyver) + let specializationFilter = PickableSpecializationFilter(harcosSpecializaciok, harcosSzint) + szintlepes.harcosFegyver = AllowedFegyver(Osztaly2E.Harcos).filter(specializationFilter)[0].Id + } } - if(karakter.osztaly === Osztaly2E.Tengeresz && szint % 3 === 0) { - let kalozKritikus = karakter.szintlepesek.map(x => x.kalozKritikus) - szintlepes.kalozKritikus = AllowedFegyver(Osztaly2E.Tengeresz).filter(PickableSpecializationFilter(kalozKritikus, szint))[0].Id + if(osztaly === Osztaly2E.Tengeresz) { + const kalozSzint = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Tengeresz).length + 1 + if (kalozSzint % 3 === 0) { + let kalozKritikus = karakter.szintlepesek.map(x => x.kalozKritikus) + let specializationFilter = PickableSpecializationFilter(kalozKritikus, kalozSzint) + szintlepes.kalozKritikus = AllowedFegyver(Osztaly2E.Tengeresz).filter(specializationFilter)[0].Id + } } + console.log(`picked harcos specializacio ${szintlepes.harcosFegyver}`) + console.log(`picked kaloz krit ${szintlepes.kalozKritikus}`) changeKarakter({...karakter, szint, szintlepesek: [...karakter.szintlepesek, szintlepes]}) } diff --git a/Kemkas.Web/frontend/src/second-edition/domain-models/tamadas_bonusz.ts b/Kemkas.Web/frontend/src/second-edition/domain-models/tamadas_bonusz.ts index 9257ad9..d536f62 100644 --- a/Kemkas.Web/frontend/src/second-edition/domain-models/tamadas_bonusz.ts +++ b/Kemkas.Web/frontend/src/second-edition/domain-models/tamadas_bonusz.ts @@ -1,6 +1,7 @@ import {Osztaly2E} from "./osztaly2E"; import {Karakter2E} from "./karakter2E"; import {Modifier} from "./tulajdonsag2E"; +import {Szintlepes} from "./szintlepes"; /// Finally second edition doesn't mess with the extra attack of high level clerics rouges and wizards! function ExtraAttack(attack: number): number[] { @@ -10,6 +11,31 @@ function ExtraAttack(attack: number): number[] { return [Math.min(attack, 10), ...ExtraAttack(attack - 5)] } +export function TamadasBonuszBase(osztaly: Osztaly2E, szint: number = 1) : number { + let base = 0 + switch (osztaly){ + case Osztaly2E.Barbar: + case Osztaly2E.Amazon: + case Osztaly2E.Ijasz: + case Osztaly2E.Tengeresz: + case Osztaly2E.Harcos: + case Osztaly2E.Vandor: + base = szint; + break; + case Osztaly2E.Pap: + case Osztaly2E.Tolvaj: + case Osztaly2E.Dalnok: + case Osztaly2E.Druida: + base = Math.floor(szint * 2 / 3); + break; + case Osztaly2E.Varazslo: + case Osztaly2E.Illuzionista: + base = Math.floor(szint / 2); + break; + } + return base +} + export function TamadasBonusz(osztaly: Osztaly2E, szint: number = 1) : number[] { let base = 0 switch (osztaly){ @@ -35,12 +61,23 @@ export function TamadasBonusz(osztaly: Osztaly2E, szint: number = 1) : number[] return ExtraAttack(base) } -export function KozelharciTB(karakter : Pick): number[] { - const base = TamadasBonusz(karakter.osztaly, karakter.szint); + +export function MultiClassTamadasBonusz(szintlepesek: Szintlepes[]) : number[]{ + const osztalyok = new Set(szintlepesek.map(x => x.osztaly)) + let TBB = 0 + for (const osztaly of osztalyok) { + const szint = szintlepesek.filter(x => x.osztaly === osztaly).length + TBB += TamadasBonuszBase(osztaly, szint) + } + return ExtraAttack(TBB) +} + +export function KozelharciTB(karakter : Pick): number[] { + const base = MultiClassTamadasBonusz(karakter.szintlepesek); let modifier = Modifier(karakter.tulajdonsagok.t_ero) return base.map(v => v + modifier) } -export function CelzoTB(karakter : Pick): number[] { - let base = TamadasBonusz(karakter.osztaly, karakter.szint) +export function CelzoTB(karakter : Pick): number[] { + let base = MultiClassTamadasBonusz(karakter.szintlepesek) return base.map(v => v + Modifier(karakter.tulajdonsagok.t_ugy)) } \ No newline at end of file diff --git a/Kemkas.Web/frontend/src/second-edition/pages/CreateCharacter2E.tsx b/Kemkas.Web/frontend/src/second-edition/pages/CreateCharacter2E.tsx index 109eadf..182d6ae 100644 --- a/Kemkas.Web/frontend/src/second-edition/pages/CreateCharacter2E.tsx +++ b/Kemkas.Web/frontend/src/second-edition/pages/CreateCharacter2E.tsx @@ -103,7 +103,7 @@ function CreateCharacter2E(props: {}) {
setKarakter(ChangeLvl1Osztaly(karakter, o))} /> {karakter.szintlepesek[0].osztaly === Osztaly2E.Harcos && diff --git a/TODO.md b/TODO.md index 1478e39..fdf279e 100644 --- a/TODO.md +++ b/TODO.md @@ -13,12 +13,21 @@ ## Features - multiclass characters + - 2e -ben félig működik + - druidáknál tiltani kell + - PDF-ben varazshasznalok + - tolvaj 9ik szintű képessége ## Epics - Backend - Varazslatok - Felszerelés -- KéM 2.0-ra felkészülés + - 1e-ben fel van már véve az adat. Gergő neki veselkedik. + - 2e-ben teljesen hiányzik +- KéM 2e + - frontend oldalon úgy, ahogy megvan + - PDF hiányzik + - backend hiányzik - Klikkelésre dobás