add harcos fegyver specializacio

This commit is contained in:
2023-10-05 21:04:42 +02:00
parent 18ab856ed9
commit dbd77a9fcf
9 changed files with 134 additions and 53 deletions
+1 -2
View File
@@ -5,10 +5,9 @@
- PDF pretty: Tamadas bonuszok +10/+5
## Level up
- Faji szint korlatok
- Harcos fegyver specializáció választás szintlépéskor (free text)
- Kalóz kritikus fegyver választás szintlépéskor (free text)
- Tolvaj 9.ik szinttől tiltott képzettségek
- multiclass characters
## PDF
- specialis kepessegek 2ik oldalra nyomtatasa
+1 -4
View File
@@ -28,7 +28,7 @@ function UjMento(props : {tipus: MentoTipus, ujMentok: Mentok, regiMentok: Mento
}
function BasicNewLevel(props: {
karakter: KarakterInputs
karakter: Pick<KarakterInputs, 'osztaly' | 'tulajdonsagok' | 'hpRolls'>
szint: number
changeRolledHP: (hp: number) => void,
}) {
@@ -45,9 +45,6 @@ function BasicNewLevel(props: {
const isTBincreased = TBdiff.length > 0 && TBdiff.some(x => x > 0)
return <>
<div className='row'>
<h5 className='col align-self-center'>{szint}. Szint</h5>
</div>
<div className='row'>
<div className='col-lg-6'>
<div className='row m-2'>
@@ -0,0 +1,17 @@
import React from "react";
function HarcosFegyverSpecializacio(props: {specialization: string, existingSpecializations: string[], changeSpecialization: (specialization: string) => void }) {
const {specialization, existingSpecializations, changeSpecialization} = props
const hasError = existingSpecializations.filter(x => x === specialization).length > 1
return <>
<div className='row m-2'>
<label className='col-md-2 col-sm-3 col-form-label' >Fegyver specializáció</label>
<input className='col form-control'
value={specialization}
onChange={(e) => changeSpecialization(e.target.value)}/>
{hasError && <span className='form-field-error'>Már választottad ezt a specializaciót!</span>}
</div>
</>
}
export default HarcosFegyverSpecializacio
+3 -5
View File
@@ -35,10 +35,8 @@ function InternalKepzettsegekSelector(props: {
}
return <>
<div className='row'>
<div className='col-lg-2 col-md-12'>
<label className='col-form-label text-body-emphasis'>{title}</label>
</div>
<div className='row m-2'>
<label className='col-lg-2 col-md-12 col-form-label'>{title}</label>
<div className='col'>
{klist.map((idx) =>
<KepzettsegSelector
@@ -64,7 +62,7 @@ function KarakterKepzettsegek (props: {
}) {
const { kepzettsegek, numberOfKepzettsegek, getKepzettsegListaN, changeKepzettsegek, tolvajKepzettsegek, changeTolvajKepzettsegek} = props
// TODO: Eszakinak es Kaloznak hajozas, Birodalminak Alikmia, vagy Meregkeveres, Etuniainak Lovaglas
// TODO: Birodalmi tolvajnal az Alikmia, vagy Meregkeveres kezelese
const getTolvajKepzettsegListaN = (n: number) : Kepzettseg[] => {
const tolvajKepzettsegekWithoutN = [...tolvajKepzettsegek.slice(0, n), ...tolvajKepzettsegek.slice(n+1)]
+68
View File
@@ -0,0 +1,68 @@
import React from "react";
import {KarakterInputs} from "../domain-models/karakter";
import BasicNewLevel from "./BasicNewLevel";
import TulajdonsagNoveles from "./TulajdonsagNoveles";
import {Tulajdonsag, TulajdonsagokTotal} from "../domain-models/tulajdonsag";
import {arraySetN} from "../util";
import {Osztaly} from "../domain-models/osztaly";
import HarcosFegyverSpecializacio from "./HarcosFegyverSpecializacio";
function LevelUp(props: {szint: number, karakter: KarakterInputs, changeTulajdonsagNoveles: (t: Tulajdonsag) => void, changeRolledHP: (rolledHP: number) => void, changeHarcosSpec: (spec: string) => void}) {
const {szint, karakter, changeTulajdonsagNoveles, changeRolledHP, changeHarcosSpec} = props
const specializationIndex = Math.floor((szint-1) / 2)
console.log('Specialization index: ' + specializationIndex.toString())
const specialization = karakter.harcosSpecializaciok[specializationIndex]
console.log(specialization)
return <div key={`level-up-${szint}`}>
<div className='row mt-3'>
<h5 className='col align-self-center'>{szint}. Szint</h5>
</div>
{szint % 4 === 0 && <TulajdonsagNoveles
tulajdonsagok={karakter.tulajdonsagok}
szint={szint}
tulajdonsagNovelesek={karakter.tulajdonsagNovelesek}
changeTulajdonsagNoveles={changeTulajdonsagNoveles}
/>}
<BasicNewLevel
szint={szint}
karakter={karakter}
changeRolledHP={changeRolledHP}
/>
{karakter.osztaly === Osztaly.Harcos && szint % 2 === 1 &&
<HarcosFegyverSpecializacio specialization={specialization} existingSpecializations={karakter.harcosSpecializaciok} changeSpecialization={changeHarcosSpec} />}
</div>
}
export function LevelUps(props: {karakter: KarakterInputs, changeKarakter: (inputs: KarakterInputs) => void}){
const {karakter, changeKarakter} = props;
const tulajdonsagokAtSzint = (szint: number) => TulajdonsagokTotal({...karakter, tulajdonsagNovelesek: karakter.tulajdonsagNovelesek.slice(0, Math.floor(szint / 4))})
const changeRolledHPAtSzint = (szint: number) => (newHProll: number) => {
changeKarakter({...karakter, hpRolls: arraySetN(karakter.hpRolls, szint-2, newHProll)})
console.log(karakter)
}
const changeTulajdonsagNovelesAtSzint = (szint: number) => (t: Tulajdonsag) => { changeKarakter({...karakter, tulajdonsagNovelesek: arraySetN(karakter.tulajdonsagNovelesek, Math.floor((szint / 4)-1), t)}) }
const changeHarcosSpecializacioAtSzint = (szint: number) => (spec: string) => {
changeKarakter({...karakter, harcosSpecializaciok: arraySetN(karakter.harcosSpecializaciok, Math.floor((szint-1) / 2), spec)})
}
return <>
{karakter.hpRolls.map((_, i) => i+2).map(szint => <>
<LevelUp
key={`level-up-${szint}`}
szint={szint}
karakter={{...karakter, tulajdonsagok: tulajdonsagokAtSzint(szint)}}
changeTulajdonsagNoveles={changeTulajdonsagNovelesAtSzint(szint)}
changeRolledHP={changeRolledHPAtSzint(szint)}
changeHarcosSpec={changeHarcosSpecializacioAtSzint(szint)}
/>
</>
)}
</>
}
export default LevelUps
+9 -2
View File
@@ -1,5 +1,12 @@
import React from "react";
import {KarakterTulajdonsagok, Tulajdonsag, TulajdonsagIDs, TulajdonsagLabel} from "../domain-models/tulajdonsag";
import {
KarakterTulajdonsagok,
Modifier,
Tulajdonsag,
TulajdonsagIDs,
TulajdonsagLabel
} from "../domain-models/tulajdonsag";
import {SignedNumberToText} from "./Helpers";
function TulajdonsagNoveles(props: {tulajdonsagok: KarakterTulajdonsagok, szint: number, tulajdonsagNovelesek: Tulajdonsag[], changeTulajdonsagNoveles: (tulajdonsag: Tulajdonsag) => void}) {
const {tulajdonsagok, szint, tulajdonsagNovelesek, changeTulajdonsagNoveles} = props
@@ -21,7 +28,7 @@ function TulajdonsagNoveles(props: {tulajdonsagok: KarakterTulajdonsagok, szint:
<div className='col-lg-6'>
<div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label'>Új {TulajdonsagLabel(tulajdonsagNoveles)}{' '}</label>
<span className='col col-form-label'>{tulajdonsagok[tulajdonsagNoveles]}</span>
<span className='col col-form-label'>{tulajdonsagok[tulajdonsagNoveles]} ({SignedNumberToText(Modifier(tulajdonsagok[tulajdonsagNoveles]))})</span>
</div>
</div>
</div>
+5 -1
View File
@@ -18,6 +18,8 @@ export interface KarakterInputs {
szint: number
hpRolls: number[],
tulajdonsagNovelesek: Tulajdonsag[],
harcosSpecializaciok: string[],
kalozKritikus: string[],
}
export const KarakterDefaults: KarakterInputs = {
@@ -30,5 +32,7 @@ export const KarakterDefaults: KarakterInputs = {
kepzettsegek: [],
szint: 1,
hpRolls: [],
tulajdonsagNovelesek: []
tulajdonsagNovelesek: [],
harcosSpecializaciok: ['szablya'],
kalozKritikus: [],
}
+11 -2
View File
@@ -3,6 +3,7 @@ import {dAny} from "./kockak";
import {TulajdonsagIDs, TulajdonsagokTotal} from "./tulajdonsag";
import {KarakterInputs} from "./karakter";
import {GetFajDetails} from "./faj";
import {Osztaly} from "./osztaly";
export function LevelUp(karakter: KarakterInputs, changeKarakter: (input: KarakterInputs) => void) {
@@ -21,7 +22,11 @@ export function LevelUp(karakter: KarakterInputs, changeKarakter: (input: Karakt
}
}
}
changeKarakter({...karakter, szint, hpRolls, tulajdonsagNovelesek})
let harcosSpecializaciok = karakter.harcosSpecializaciok
if(karakter.osztaly === Osztaly.Harcos && szint % 2 === 1) {
harcosSpecializaciok = [...harcosSpecializaciok, "szablya"]
}
changeKarakter({...karakter, szint, hpRolls, tulajdonsagNovelesek, harcosSpecializaciok})
}
export function LevelDown(karakter: KarakterInputs, changeKarakter: (input: KarakterInputs) => void) {
@@ -31,7 +36,11 @@ export function LevelDown(karakter: KarakterInputs, changeKarakter: (input: Kara
}
const szint = karakter.szint - 1
const hpRolls = karakter.hpRolls.slice(0, -1)
changeKarakter({...karakter, szint, hpRolls, tulajdonsagNovelesek})
let harcosSpecializaciok = karakter.harcosSpecializaciok
if (karakter.osztaly === Osztaly.Harcos && szint % 2 === 0) {
harcosSpecializaciok = harcosSpecializaciok.slice(0, -1)
}
changeKarakter({...karakter, szint, hpRolls, tulajdonsagNovelesek, harcosSpecializaciok})
}
export function CanLevelUp(karakter: Pick<KarakterInputs, 'szint' | 'faj' | 'osztaly'>): boolean {
+19 -37
View File
@@ -6,35 +6,31 @@ import FajSelector from "../components/FajSelector";
import Tulajdonsagok from "../components/Tulajdonsagok";
import OsztalySelector from "../components/OsztalySelector";
import KarakterKepzettsegek from "../components/KarakterKepzettsegek";
import {
KarakterTulajdonsagok,
Tulajdonsag,
TulajdonsagokFajjal,
TulajdonsagokTotal
} from "../domain-models/tulajdonsag";
import {KarakterTulajdonsagok, TulajdonsagokFajjal} from "../domain-models/tulajdonsag";
import MasodlagosErtekek from "../components/MasodlagosErtekek";
import {
AvailableKezpettsegList, GetKepzettsegListaN,
GetNumberOfKepzettsegek, KepzettsegId, SetDefaultKepzettsegek,
AvailableKezpettsegList,
GetKepzettsegListaN,
GetNumberOfKepzettsegek,
KepzettsegId,
SetDefaultKepzettsegek,
SetDefaultTolvajKepzettsegek,
} from "../domain-models/kepzettsegek";
import {CreatePDF} from "../pdf/character.pdf";
import {KarakterDefaults} from "../domain-models/karakter";
import BasicNewLevel from "../components/BasicNewLevel";
import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek";
import {KarakterInputToPdfView} from "../pdf/karakter_pdf_view";
import {arraySetN} from "../util";
import TulajdonsagNoveles from "../components/TulajdonsagNoveles";
import JellemSelector from "../components/JellemSelector";
import {LevelUp, LevelDown, CanLevelUp} from "../domain-models/level";
import {CanLevelUp, LevelDown, LevelUp} from "../domain-models/level";
import {Card} from "react-bootstrap";
import LevelUps from "../components/LevelUps";
import HarcosFegyverSpecializacio from "../components/HarcosFegyverSpecializacio";
function CreateCharacterPage() {
let [karakter, changeKarakter] = useState(KarakterDefaults)
const tulajdonsagokFajjal = TulajdonsagokFajjal(karakter.tulajdonsagok, karakter.faj)
const tulajdonsagokTotal = TulajdonsagokTotal(karakter)
const changeKepzettseg = (k: KepzettsegId[]) => changeKarakter({...karakter, kepzettsegek: k})
const changeTolvajKepzettseg = (tk?: KepzettsegId[]) => changeKarakter({...karakter, tolvajKepzettsegek: tk})
@@ -42,13 +38,6 @@ function CreateCharacterPage() {
SetDefaultKepzettsegek({...karakter, tulajdonsagok: tulajdonsagokFajjal}, changeKepzettseg)
const availableKepzettsegList = AvailableKezpettsegList(karakter.osztaly)
const changeHProllAtSzint = (szint: number) => (newHProll: number) => {
changeKarakter({...karakter, hpRolls: arraySetN(karakter.hpRolls, szint-2, newHProll)})
console.log(karakter)
}
const levelUp = () => LevelUp(karakter, changeKarakter)
const levelDown = () => LevelDown(karakter, changeKarakter)
@@ -108,8 +97,16 @@ function CreateCharacterPage() {
<OsztalySelector
currentFaj={karakter.faj}
currentOsztaly={karakter.osztaly}
changeOsztaly={(o: Osztaly) => changeKarakter({...karakter, osztaly: o})}
changeOsztaly={(o: Osztaly) => changeKarakter({...karakter, osztaly: o, harcosSpecializaciok: o === Osztaly.Harcos ? ['szablya'] : []})}
/>
{karakter.osztaly === Osztaly.Harcos &&
<div className='mb-6'>
<HarcosFegyverSpecializacio
specialization={karakter.harcosSpecializaciok[0]}
existingSpecializations={karakter.harcosSpecializaciok}
changeSpecialization={(spec: string) => changeKarakter({...karakter, harcosSpecializaciok: [spec, ...karakter.harcosSpecializaciok.slice(1)]})}
/>
</div>}
<KarakterKepzettsegek
getKepzettsegListaN={GetKepzettsegListaN(karakter)}
numberOfKepzettsegek={GetNumberOfKepzettsegek(tulajdonsagokFajjal.t_int, karakter.faj, availableKepzettsegList.length)}
@@ -122,22 +119,7 @@ function CreateCharacterPage() {
<hr />
<MasodlagosErtekek {...CalculateMasodlagosErtekek({...karakter, tulajdonsagok: tulajdonsagokFajjal, szint: 1, hpRolls: []})} />
{karakter.hpRolls.map((_, i) => i+2).map(szint => <>
<BasicNewLevel
key={`level-${szint}`}
szint={szint}
karakter={karakter}
changeRolledHP={changeHProllAtSzint(szint)}
/>
{szint % 4 === 0 && <TulajdonsagNoveles
key={`tulajdonsag-noveles-${szint}`}
tulajdonsagok={tulajdonsagokTotal}
szint={szint}
tulajdonsagNovelesek={karakter.tulajdonsagNovelesek}
changeTulajdonsagNoveles={(t: Tulajdonsag) => { changeKarakter({...karakter, tulajdonsagNovelesek: arraySetN(karakter.tulajdonsagNovelesek, Math.floor((szint / 4)-1), t)}) }}
/>}
</>
)}
<LevelUps key={'level-ups'} karakter={karakter} changeKarakter={changeKarakter} />
<div className='d-grid gap-2 m-5'>
{canLevelUp && <button className='btn btn-dark btn-lg' type='button' onClick={levelUp}>Szintlépés! </button> }