Add jellem

This commit is contained in:
2023-09-29 21:23:34 +02:00
parent 3e7614b813
commit f7aa205989
9 changed files with 156 additions and 45 deletions
+2 -2
View File
@@ -1,10 +1,10 @@
# TODO # TODO
## Fixes ## Fixes
- Kötelező képezettségek - Kötelező képezettségek - Birodalmi tolvaj
- Jellem
## Level up ## Level up
- Faji szint korlatok
- Harcos fegyver specializáció választás szintlépéskor (free text) - Harcos fegyver specializáció választás szintlépéskor (free text)
- Kalóz kritikus fegyver 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 - Tolvaj 9.ik szinttől tiltott képzettségek
+27
View File
@@ -0,0 +1,27 @@
import React from "react";
import {AllJellemIDs, GetJellem, JellemID} from "../domain-models/jellem";
function JellemSelector(props: {selected: JellemID, changeJellem: (val: JellemID) => void}) {
const { selected, changeJellem } = props
const jellem = GetJellem(selected)
return <>
<div className='row m-2'>
<label className='col-md-2 col-sm-3 col-form-label'>Jellem</label>
<select className='col form-select' value={selected} onChange={e => changeJellem(e.target.value as JellemID)}>
{AllJellemIDs.map((id) => (
<option key={id} value={id}>{GetJellem(id).Label}</option>
))}
</select>
</div>
<div className='row m-2'>
<label className='col-md-2 col-sm-3 form-label'></label>
<div className='col'>
<p className='row pt-2'>
{jellem.Description}
</p>
</div>
</div>
</>
}
export default JellemSelector
+3 -8
View File
@@ -55,27 +55,22 @@ function InternalKepzettsegekSelector(props: {
} }
function KarakterKepzettsegek (props: { function KarakterKepzettsegek (props: {
availableKepzettsegList: Kepzettseg[],
numberOfKepzettsegek: number numberOfKepzettsegek: number
kepzettsegek: KepzettsegId[], kepzettsegek: KepzettsegId[],
changeKepzettsegek: (newKepzettsegek: KepzettsegId[]) => void changeKepzettsegek: (newKepzettsegek: KepzettsegId[]) => void
tolvajKepzettsegek: KepzettsegId[], tolvajKepzettsegek: KepzettsegId[],
changeTolvajKepzettsegek: (newKepzettsegek: KepzettsegId[]) => void changeTolvajKepzettsegek: (newKepzettsegek: KepzettsegId[]) => void
getKepzettsegListaN: (n: number) => Kepzettseg[]
}) { }) {
const { kepzettsegek, numberOfKepzettsegek, availableKepzettsegList, changeKepzettsegek, tolvajKepzettsegek, changeTolvajKepzettsegek} = props const { kepzettsegek, numberOfKepzettsegek, getKepzettsegListaN, changeKepzettsegek, tolvajKepzettsegek, changeTolvajKepzettsegek} = props
// TODO: Eszakinak es Kaloznak hajozas, Birodalminak Alikmia, vagy Meregkeveres, Etuniainak Lovaglas // TODO: Eszakinak es Kaloznak hajozas, Birodalminak Alikmia, vagy Meregkeveres, Etuniainak Lovaglas
const getKepzettsegListaN = (n: number) => {
const kepzettsegekWithoutN = [...kepzettsegek.slice(0, n), ...kepzettsegek.slice(n+1)]
return availableKepzettsegList.filter(x => !kepzettsegekWithoutN.includes(x.Id) && !tolvajKepzettsegek.includes(x.Id))
}
const getTolvajKepzettsegListaN = (n: number) : Kepzettseg[] => { const getTolvajKepzettsegListaN = (n: number) : Kepzettseg[] => {
const tolvajKepzettsegekWithoutN = [...tolvajKepzettsegek.slice(0, n), ...tolvajKepzettsegek.slice(n+1)] const tolvajKepzettsegekWithoutN = [...tolvajKepzettsegek.slice(0, n), ...tolvajKepzettsegek.slice(n+1)]
return TolvajKepzettsegList.filter(x => !kepzettsegek.includes(x.Id) && !tolvajKepzettsegekWithoutN.includes(x.Id)) return TolvajKepzettsegList.filter(x => !kepzettsegek.includes(x.Id) && !tolvajKepzettsegekWithoutN.includes(x.Id))
} }
return <> return <>
<InternalKepzettsegekSelector <InternalKepzettsegekSelector
title="Képzettségek" title="Képzettségek"
+59
View File
@@ -0,0 +1,59 @@
export type JellemID = 'TJ' | 'SJ' | 'KJ' | 'TS' | 'S' | 'KS' | 'TG' | 'SG' | 'KG'
export const AllJellemIDs: JellemID[] = ['TJ', 'SJ', 'KJ', 'TS', 'S', 'KS', 'TG', 'SG', 'KG']
export interface Jellem {
ID: JellemID
Label: string
Description: string
}
export function GetJellem(id: JellemID): Jellem {
switch (id) {
case "TJ": return {
ID: "TJ",
Label: "Törvényes Jó",
Description: "A törvényes jó karakterek betartják és fontosnak tartják az igazságos törvényeket, valamint a kiérdemelt tekintély tiszteletét. Viselkedésükben lehetőleg egyenesek, és nem okoznak szükségtelen károkat másnak; továbbá segítenek a kevésbé szerencséseken.",
}
case "SJ": return {
ID: "SJ",
Label: "Semleges Jó",
Description: "A semleges jó karakterek általában jóindulatúak, de nem jellemző rájuk sem a törvényes jók szigora, sem a kaotikus jók kiszámíthatatlansága.",
}
case "KJ": return {
ID: "KJ",
Label: "Kaotikus Jó",
Description: "A kaotikus jó karakterek nagy súlyt fektetnek az egyéni szabadságra és a jótéteményekre akkor is, ha ezek a nézetek és tettek ellentétesek a társadalmi szokásokkal és írott törvényekkel.",
}
case "TS": return {
ID: "TS",
Label: "Törvényes Semleges",
Description: "A törvényes semleges karakterek szigorúan betartják a törvényeket és adott szavukat, de ez a törvénytisztelet nem altruizmusból, hanem elsősorban önzésből, közömbösségből vagy a törvények öncélú tiszteletéből fakad.",
}
case "S": return {
ID: "S",
Label: "Semleges",
Description: "A semleges karakterek vagy nem törődnek a fontos erkölcsi kérdésekkel azaz nem kötelezik el magukat egyes ügyek mellett vagy éppen ellenkezőleg, aktívan a különféle nézetek közötti egyensúlyra és harmóniára törekednek. Az átlagemberek többsége ehhez a jellemhez tartozik.",
}
case "KS": return {
ID: "KS",
Label: "Kaotikus Semleges",
Description: "A kaotikus semleges karakterek kiszámíthatatlanok, saját boldogulásukra törekednek akár mások ellenében is. A kalandozók igen jelentős része kaotikus semleges jellemű"
}
case "TG": return {
ID: "TG",
Label: "Törvényes Gonosz",
Description: "A törvényes gonosz karakterek lételeme a törvényadta lehetőségek kihasználása mások kisemmizésére és önmaguk gyarapítására. Nem csoda, hogy számos zsarnok és kiskirály e jellem képviselője.",
}
case "SG": return {
ID: "SG",
Label: "Semleges Gonosz",
Description: "A semleges gonosz karakterek döntően aljasak és rosszindulatúak, s céljaikat hol a törvények kijátszásával, hol a rájuk való hivatkozással érik el."
}
case "KG": return {
ID: "KG",
Label: "Kaotikus Gonosz",
Description: "A kaotikus gonosz karakterek kíméletlenül, mindenen és mindenkin átgázolva hajszolják a hatalmat vagy a vagyont, s ennek érdekében bármilyen gaztettre képesek."
}
}
}
+3
View File
@@ -2,11 +2,13 @@ import {Faj} from "./faj";
import {Osztaly} from "./osztaly"; import {Osztaly} from "./osztaly";
import {KarakterTulajdonsagok, Tulajdonsag, TulajdonsagDefaults} from "./tulajdonsag"; import {KarakterTulajdonsagok, Tulajdonsag, TulajdonsagDefaults} from "./tulajdonsag";
import {KepzettsegId} from "./kepzettsegek"; import {KepzettsegId} from "./kepzettsegek";
import {JellemID} from "./jellem";
export interface KarakterInputs { export interface KarakterInputs {
name: string, name: string,
nem?: string, nem?: string,
kor: number, kor: number,
jellem: JellemID,
isten?: string, isten?: string,
faj: Faj, faj: Faj,
osztaly: Osztaly, osztaly: Osztaly,
@@ -22,6 +24,7 @@ export const KarakterDefaults: KarakterInputs = {
name: "Névtelen Kalandozó", name: "Névtelen Kalandozó",
faj: Faj.Ember, faj: Faj.Ember,
kor: 20, kor: 20,
jellem: 'S',
tulajdonsagok: TulajdonsagDefaults, tulajdonsagok: TulajdonsagDefaults,
osztaly: Osztaly.Harcos, osztaly: Osztaly.Harcos,
kepzettsegek: [], kepzettsegek: [],
+41 -6
View File
@@ -238,25 +238,60 @@ export function SetDefaultTolvajKepzettsegek(karakter: Pick<KarakterInputs, 'osz
} }
} }
export function GetKepzettsegListaN(karakter: Pick<KarakterInputs, 'osztaly' | 'faj' | 'kepzettsegek' | 'tolvajKepzettsegek'>) {
const availableKepzettsegList = AvailableKezpettsegList(karakter.osztaly)
return (n: number): Kepzettseg[] => {
let available = [...availableKepzettsegList]
if (n === 0) {
if (karakter.faj === Faj.Eszaki) {
return [Kepzettsegek.k_hajozas]
}
if (karakter.faj === Faj.Etuniai) {
return [Kepzettsegek.k_lovaglas]
}
if (karakter.faj === Faj.Birodalmi && karakter.osztaly !== Osztaly.Tolvaj) {
available = [Kepzettsegek.k_meregkeveres, Kepzettsegek.k_alkimia]
}
}
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 SetDefaultKepzettsegek(karakter: Pick<KarakterInputs, 'osztaly' | 'faj' | 'tulajdonsagok' | 'kepzettsegek' | 'tolvajKepzettsegek'>, changeKepzettsegek: (k: KepzettsegId[]) => void) { export function SetDefaultKepzettsegek(karakter: Pick<KarakterInputs, 'osztaly' | 'faj' | 'tulajdonsagok' | 'kepzettsegek' | 'tolvajKepzettsegek'>, changeKepzettsegek: (k: KepzettsegId[]) => void) {
const availableKepzettsegList = AvailableKezpettsegList(karakter.osztaly) const availableKepzettsegList = AvailableKezpettsegList(karakter.osztaly)
const numberOfKepzettsegek = GetNumberOfKepzettsegek(karakter.tulajdonsagok.t_int, karakter.faj, availableKepzettsegList.length) const numberOfKepzettsegek = GetNumberOfKepzettsegek(karakter.tulajdonsagok.t_int, karakter.faj, availableKepzettsegList.length)
let kepzettsegek = karakter.kepzettsegek let kepzettsegek = [...karakter.kepzettsegek]
const getKepzettsegListaN = (n: number) => {
const kepzettsegekWithoutN = [...kepzettsegek.slice(0, n), ...kepzettsegek.slice(n+1)] let mustChangeKepzettsegek = false
return availableKepzettsegList.filter(x => !kepzettsegekWithoutN.includes(x.Id) && !karakter.tolvajKepzettsegek?.includes(x.Id))
const restrictedKepzettsegek = GetKepzettsegListaN(karakter)(0)
if (kepzettsegek.length === 0) {
if (restrictedKepzettsegek.length > 0) {
kepzettsegek.push(restrictedKepzettsegek[0].Id)
mustChangeKepzettsegek = true
}
} else {
if (!restrictedKepzettsegek.includes(Kepzettsegek[kepzettsegek[0]])) {
kepzettsegek[0] = restrictedKepzettsegek[0].Id
mustChangeKepzettsegek = true
}
} }
if (kepzettsegek.length < numberOfKepzettsegek) { if (kepzettsegek.length < numberOfKepzettsegek) {
for (let i = kepzettsegek.length; i < numberOfKepzettsegek; i++) { for (let i = kepzettsegek.length; i < numberOfKepzettsegek; i++) {
const kepzettsegLista = getKepzettsegListaN(i) const kepzettsegLista = GetKepzettsegListaN({...karakter, kepzettsegek})(i)
if (kepzettsegLista.length > 0) { if (kepzettsegLista.length > 0) {
kepzettsegek.push(kepzettsegLista[0].Id) kepzettsegek.push(kepzettsegLista[0].Id)
} }
} }
changeKepzettsegek(kepzettsegek) mustChangeKepzettsegek = true
} }
if (kepzettsegek.length > numberOfKepzettsegek){ if (kepzettsegek.length > numberOfKepzettsegek){
kepzettsegek = kepzettsegek.slice(0, numberOfKepzettsegek) kepzettsegek = kepzettsegek.slice(0, numberOfKepzettsegek)
mustChangeKepzettsegek = true
}
if (mustChangeKepzettsegek){
changeKepzettsegek(kepzettsegek) changeKepzettsegek(kepzettsegek)
} }
} }
+4 -2
View File
@@ -15,7 +15,7 @@ import {
} from "../domain-models/tulajdonsag"; } from "../domain-models/tulajdonsag";
import MasodlagosErtekek from "../components/MasodlagosErtekek"; import MasodlagosErtekek from "../components/MasodlagosErtekek";
import { import {
AvailableKezpettsegList, AvailableKezpettsegList, GetKepzettsegListaN,
GetNumberOfKepzettsegek, KepzettsegId, SetDefaultKepzettsegek, GetNumberOfKepzettsegek, KepzettsegId, SetDefaultKepzettsegek,
SetDefaultTolvajKepzettsegek, SetDefaultTolvajKepzettsegek,
} from "../domain-models/kepzettsegek"; } from "../domain-models/kepzettsegek";
@@ -27,6 +27,7 @@ import {BaseHP, CalculateMasodlagosErtekek} from "../domain-models/masodlagos_er
import {KarakterInputToPdfView} from "../pdf/karakter_pdf_view"; import {KarakterInputToPdfView} from "../pdf/karakter_pdf_view";
import {arraySetN} from "../util"; import {arraySetN} from "../util";
import TulajdonsagNoveles from "../components/TulajdonsagNoveles"; import TulajdonsagNoveles from "../components/TulajdonsagNoveles";
import JellemSelector from "../components/JellemSelector";
function CreateCharacterPage() { function CreateCharacterPage() {
@@ -104,6 +105,7 @@ function CreateCharacterPage() {
type={"number"} type={"number"}
onChange={(e) => changeKarakter({...karakter, kor: Number(e.target.value)})}/> onChange={(e) => changeKarakter({...karakter, kor: Number(e.target.value)})}/>
</div> </div>
<JellemSelector selected={karakter.jellem} changeJellem={(val) => changeKarakter({...karakter, jellem: val})} />
<div className='row m-2'> <div className='row m-2'>
<label className='col-md-2 col-sm-3 col-form-label' >Választott istenség</label> <label className='col-md-2 col-sm-3 col-form-label' >Választott istenség</label>
<input className='col form-control' <input className='col form-control'
@@ -130,7 +132,7 @@ function CreateCharacterPage() {
changeOsztaly={(o: Osztaly) => changeKarakter({...karakter, osztaly: o})} changeOsztaly={(o: Osztaly) => changeKarakter({...karakter, osztaly: o})}
/> />
<KarakterKepzettsegek <KarakterKepzettsegek
availableKepzettsegList={availableKepzettsegList} getKepzettsegListaN={GetKepzettsegListaN(karakter)}
numberOfKepzettsegek={GetNumberOfKepzettsegek(tulajdonsagokFajjal.t_int, karakter.faj, availableKepzettsegList.length)} numberOfKepzettsegek={GetNumberOfKepzettsegek(tulajdonsagokFajjal.t_int, karakter.faj, availableKepzettsegList.length)}
kepzettsegek={karakter.kepzettsegek} kepzettsegek={karakter.kepzettsegek}
changeKepzettsegek={changeKepzettseg} changeKepzettsegek={changeKepzettseg}
+8 -21
View File
@@ -1,8 +1,6 @@
import {KarakterPdfView} from "./karakter_pdf_view"; import {KarakterPdfView} from "./karakter_pdf_view";
import {PDFDocument, PDFFont, PDFPage, rgb} from "pdf-lib"; import {PDFDocument, PDFFont, PDFPage, rgb} from "pdf-lib";
import fontkit from '@pdf-lib/fontkit' import fontkit from '@pdf-lib/fontkit'
import {OsztalyLabel} from "../domain-models/osztaly";
import {FajLabel} from "../domain-models/faj";
import {SignedNumberToText} from "../components/Helpers"; import {SignedNumberToText} from "../components/Helpers";
import {KarakterTulajdonsagok, Modifier} from "../domain-models/tulajdonsag"; import {KarakterTulajdonsagok, Modifier} from "../domain-models/tulajdonsag";
import download from "downloadjs"; import download from "downloadjs";
@@ -168,21 +166,16 @@ function drawBaseInfo(karakter: KarakterPdfView, draw: (text: string, x : number
draw(karakter.Nem, 454, 710, 1) draw(karakter.Nem, 454, 710, 1)
draw(karakter.Kor.toString(), 454, 690, 1) draw(karakter.Kor.toString(), 454, 690, 1)
draw(karakter.Isten, 454, 670, 1) draw(karakter.Isten, 454, 670, 1)
draw(OsztalyLabel(karakter.Osztaly), 60, 672, 1) draw(karakter.Osztaly, 60, 672, 1)
draw(karakter.Szint.toString(), 264, 682, 3) draw(karakter.Szint.toString(), 264, 682, 3)
draw(FajLabel(karakter.Faj), 304, 710, 1) draw(karakter.Faj, 302, 710, 1)
draw(karakter.Jellem, 302, 672, karakter.Jellem.length > 17 ? 11/12 : 1)
} }
function DrawKepzettsegek(page: PDFPage, fontSizeBase: number, pdfFont: PDFFont, kepzettsegek: Kepzettseg[], tulajdonsagok: KarakterTulajdonsagok, szint: number, startFrom: number) { function DrawKepzettsegek(draw: (text: string, x: number, y: number) => void, kepzettsegek: Kepzettseg[], tulajdonsagok: KarakterTulajdonsagok, szint: number, startFrom: number) {
for (let i = 0; i < kepzettsegek.length; i++) { for (let i = 0; i < kepzettsegek.length; i++) {
let kepzettseg = kepzettsegek[i] let kepzettseg = kepzettsegek[i]
page.drawText(kepzettseg.Name, { draw(kepzettseg.Name, 60, startFrom - (i * 18))
x: 60,
y: startFrom - (i * 18),
size: fontSizeBase,
font: pdfFont,
color: rgb(0, 0, 0),
})
const tulajdonsagErtek = kepzettseg.Tulajdonsag.reduce((maxTulajdonsagErtek, currentTulajdonsag) => const tulajdonsagErtek = kepzettseg.Tulajdonsag.reduce((maxTulajdonsagErtek, currentTulajdonsag) =>
(tulajdonsagok[currentTulajdonsag] > maxTulajdonsagErtek) (tulajdonsagok[currentTulajdonsag] > maxTulajdonsagErtek)
? tulajdonsagok[kepzettseg.Tulajdonsag[i]] ? tulajdonsagok[kepzettseg.Tulajdonsag[i]]
@@ -190,13 +183,7 @@ function DrawKepzettsegek(page: PDFPage, fontSizeBase: number, pdfFont: PDFFont,
tulajdonsagok[kepzettseg.Tulajdonsag[0]]) tulajdonsagok[kepzettseg.Tulajdonsag[0]])
const kepzettsegModifier = SignedNumberToText(Modifier(tulajdonsagErtek) + szint) const kepzettsegModifier = SignedNumberToText(Modifier(tulajdonsagErtek) + szint)
page.drawText(kepzettsegModifier, { draw(kepzettsegModifier, kepzettsegModifier.length > 2 ? 172 : 175, startFrom - (i * 18))
x: kepzettsegModifier.length > 2 ? 172 : 175,
y: startFrom - (i * 18),
size: fontSizeBase,
font: pdfFont,
color: rgb(0, 0, 0),
})
} }
} }
@@ -303,9 +290,9 @@ export async function CreatePDF(karakter: KarakterPdfView) {
drawMentok(page, karakter, fontSizeBase, pdfFont); drawMentok(page, karakter, fontSizeBase, pdfFont);
DrawKepzettsegek(page, fontSizeBase, pdfFont, karakter.Kepzettsegek, karakter.Tulajdonsagok, karakter.Szint, 337); DrawKepzettsegek(drawText, karakter.Kepzettsegek, karakter.Tulajdonsagok, karakter.Szint, 337);
const nextKepzettsegFrom = 337 - (karakter.Kepzettsegek.length * 18) const nextKepzettsegFrom = 337 - (karakter.Kepzettsegek.length * 18)
DrawKepzettsegek(page, fontSizeBase, pdfFont, karakter.TolvajKepzettsegek, karakter.Tulajdonsagok, karakter.Szint, nextKepzettsegFrom) DrawKepzettsegek(drawText, karakter.TolvajKepzettsegek, karakter.Tulajdonsagok, karakter.Szint, nextKepzettsegFrom)
DrawMagic(page, fontSizeBase, pdfFont, karakter.NapiMemorizalhatoVarazslatok, karakter.VarazslatMentokNF) DrawMagic(page, fontSizeBase, pdfFont, karakter.NapiMemorizalhatoVarazslatok, karakter.VarazslatMentokNF)
+9 -6
View File
@@ -6,19 +6,21 @@ import {
import {Mentok, MentokAlap, MentoModositok} from "../domain-models/mentok"; import {Mentok, MentokAlap, MentoModositok} from "../domain-models/mentok";
import {Kepzettseg, Kepzettsegek} from "../domain-models/kepzettsegek"; import {Kepzettseg, Kepzettsegek} from "../domain-models/kepzettsegek";
import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek"; import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek";
import {Faj} from "../domain-models/faj"; import {Faj, FajLabel} from "../domain-models/faj";
import {Osztaly} from "../domain-models/osztaly"; import {Osztaly, OsztalyLabel} from "../domain-models/osztaly";
import {CelzoTB, KozelharciTB} from "../domain-models/tamadas_bonusz"; import {CelzoTB, KozelharciTB} from "../domain-models/tamadas_bonusz";
import {KarakterInputs} from "../domain-models/karakter"; import {KarakterInputs} from "../domain-models/karakter";
import {NapiVarazslatok, CalculateVarazslatMentokNF} from "../domain-models/memorizalt_varazslatok"; import {NapiVarazslatok, CalculateVarazslatMentokNF} from "../domain-models/memorizalt_varazslatok";
import {GetJellem} from "../domain-models/jellem";
export interface KarakterPdfView { export interface KarakterPdfView {
Name: string Name: string
Nem: string Nem: string
Kor: number Kor: number
Isten: string Isten: string
Faj: Faj Jellem: string
Osztaly: Osztaly Faj: string
Osztaly: string
Tulajdonsagok: KarakterTulajdonsagok, Tulajdonsagok: KarakterTulajdonsagok,
TulajdonsagModositok: KarakterTulajdonsagok, TulajdonsagModositok: KarakterTulajdonsagok,
Szint: number Szint: number
@@ -52,13 +54,14 @@ export function KarakterInputToPdfView(karakter: KarakterInputs): KarakterPdfVie
const VarazslatMentokNF = CalculateVarazslatMentokNF(karakter) const VarazslatMentokNF = CalculateVarazslatMentokNF(karakter)
return { return {
Faj: karakter.faj, Faj: FajLabel(karakter.faj),
Isten: karakter.isten || "", Isten: karakter.isten || "",
Jellem: GetJellem(karakter.jellem).Label,
Kor: karakter.kor, Kor: karakter.kor,
Name: karakter.name, Name: karakter.name,
Nem: karakter.nem || "", Nem: karakter.nem || "",
Tulajdonsagok: karakter.tulajdonsagok, Tulajdonsagok: karakter.tulajdonsagok,
Osztaly: karakter.osztaly, Osztaly: OsztalyLabel(karakter.osztaly),
Szint: karakter.szint, Szint: karakter.szint,
Kepzettsegek: karakter.kepzettsegek.map(id => Kepzettsegek[id]), Kepzettsegek: karakter.kepzettsegek.map(id => Kepzettsegek[id]),
TolvajKepzettsegek: karakter.tolvajKepzettsegek?.map(id => Kepzettsegek[id]) || [], TolvajKepzettsegek: karakter.tolvajKepzettsegek?.map(id => Kepzettsegek[id]) || [],