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
## Fixes
- Kötelező képezettségek
- Jellem
- Kötelező képezettségek - Birodalmi tolvaj
## 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
+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
+2 -7
View File
@@ -55,22 +55,17 @@ function InternalKepzettsegekSelector(props: {
}
function KarakterKepzettsegek (props: {
availableKepzettsegList: Kepzettseg[],
numberOfKepzettsegek: number
kepzettsegek: KepzettsegId[],
changeKepzettsegek: (newKepzettsegek: KepzettsegId[]) => void
tolvajKepzettsegek: KepzettsegId[],
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
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 tolvajKepzettsegekWithoutN = [...tolvajKepzettsegek.slice(0, n), ...tolvajKepzettsegek.slice(n+1)]
return TolvajKepzettsegList.filter(x => !kepzettsegek.includes(x.Id) && !tolvajKepzettsegekWithoutN.includes(x.Id))
+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 {KarakterTulajdonsagok, Tulajdonsag, TulajdonsagDefaults} from "./tulajdonsag";
import {KepzettsegId} from "./kepzettsegek";
import {JellemID} from "./jellem";
export interface KarakterInputs {
name: string,
nem?: string,
kor: number,
jellem: JellemID,
isten?: string,
faj: Faj,
osztaly: Osztaly,
@@ -22,6 +24,7 @@ export const KarakterDefaults: KarakterInputs = {
name: "Névtelen Kalandozó",
faj: Faj.Ember,
kor: 20,
jellem: 'S',
tulajdonsagok: TulajdonsagDefaults,
osztaly: Osztaly.Harcos,
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) {
const availableKepzettsegList = AvailableKezpettsegList(karakter.osztaly)
const numberOfKepzettsegek = GetNumberOfKepzettsegek(karakter.tulajdonsagok.t_int, karakter.faj, availableKepzettsegList.length)
let kepzettsegek = karakter.kepzettsegek
const getKepzettsegListaN = (n: number) => {
const kepzettsegekWithoutN = [...kepzettsegek.slice(0, n), ...kepzettsegek.slice(n+1)]
return availableKepzettsegList.filter(x => !kepzettsegekWithoutN.includes(x.Id) && !karakter.tolvajKepzettsegek?.includes(x.Id))
let kepzettsegek = [...karakter.kepzettsegek]
let mustChangeKepzettsegek = false
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) {
for (let i = kepzettsegek.length; i < numberOfKepzettsegek; i++) {
const kepzettsegLista = getKepzettsegListaN(i)
const kepzettsegLista = GetKepzettsegListaN({...karakter, kepzettsegek})(i)
if (kepzettsegLista.length > 0) {
kepzettsegek.push(kepzettsegLista[0].Id)
}
}
changeKepzettsegek(kepzettsegek)
mustChangeKepzettsegek = true
}
if (kepzettsegek.length > numberOfKepzettsegek){
kepzettsegek = kepzettsegek.slice(0, numberOfKepzettsegek)
mustChangeKepzettsegek = true
}
if (mustChangeKepzettsegek){
changeKepzettsegek(kepzettsegek)
}
}
+4 -2
View File
@@ -15,7 +15,7 @@ import {
} from "../domain-models/tulajdonsag";
import MasodlagosErtekek from "../components/MasodlagosErtekek";
import {
AvailableKezpettsegList,
AvailableKezpettsegList, GetKepzettsegListaN,
GetNumberOfKepzettsegek, KepzettsegId, SetDefaultKepzettsegek,
SetDefaultTolvajKepzettsegek,
} from "../domain-models/kepzettsegek";
@@ -27,6 +27,7 @@ import {BaseHP, CalculateMasodlagosErtekek} from "../domain-models/masodlagos_er
import {KarakterInputToPdfView} from "../pdf/karakter_pdf_view";
import {arraySetN} from "../util";
import TulajdonsagNoveles from "../components/TulajdonsagNoveles";
import JellemSelector from "../components/JellemSelector";
function CreateCharacterPage() {
@@ -104,6 +105,7 @@ function CreateCharacterPage() {
type={"number"}
onChange={(e) => changeKarakter({...karakter, kor: Number(e.target.value)})}/>
</div>
<JellemSelector selected={karakter.jellem} changeJellem={(val) => changeKarakter({...karakter, jellem: val})} />
<div className='row m-2'>
<label className='col-md-2 col-sm-3 col-form-label' >Választott istenség</label>
<input className='col form-control'
@@ -130,7 +132,7 @@ function CreateCharacterPage() {
changeOsztaly={(o: Osztaly) => changeKarakter({...karakter, osztaly: o})}
/>
<KarakterKepzettsegek
availableKepzettsegList={availableKepzettsegList}
getKepzettsegListaN={GetKepzettsegListaN(karakter)}
numberOfKepzettsegek={GetNumberOfKepzettsegek(tulajdonsagokFajjal.t_int, karakter.faj, availableKepzettsegList.length)}
kepzettsegek={karakter.kepzettsegek}
changeKepzettsegek={changeKepzettseg}
+8 -21
View File
@@ -1,8 +1,6 @@
import {KarakterPdfView} from "./karakter_pdf_view";
import {PDFDocument, PDFFont, PDFPage, rgb} from "pdf-lib";
import fontkit from '@pdf-lib/fontkit'
import {OsztalyLabel} from "../domain-models/osztaly";
import {FajLabel} from "../domain-models/faj";
import {SignedNumberToText} from "../components/Helpers";
import {KarakterTulajdonsagok, Modifier} from "../domain-models/tulajdonsag";
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.Kor.toString(), 454, 690, 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(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++) {
let kepzettseg = kepzettsegek[i]
page.drawText(kepzettseg.Name, {
x: 60,
y: startFrom - (i * 18),
size: fontSizeBase,
font: pdfFont,
color: rgb(0, 0, 0),
})
draw(kepzettseg.Name, 60, startFrom - (i * 18))
const tulajdonsagErtek = kepzettseg.Tulajdonsag.reduce((maxTulajdonsagErtek, currentTulajdonsag) =>
(tulajdonsagok[currentTulajdonsag] > maxTulajdonsagErtek)
? tulajdonsagok[kepzettseg.Tulajdonsag[i]]
@@ -190,13 +183,7 @@ function DrawKepzettsegek(page: PDFPage, fontSizeBase: number, pdfFont: PDFFont,
tulajdonsagok[kepzettseg.Tulajdonsag[0]])
const kepzettsegModifier = SignedNumberToText(Modifier(tulajdonsagErtek) + szint)
page.drawText(kepzettsegModifier, {
x: kepzettsegModifier.length > 2 ? 172 : 175,
y: startFrom - (i * 18),
size: fontSizeBase,
font: pdfFont,
color: rgb(0, 0, 0),
})
draw(kepzettsegModifier, kepzettsegModifier.length > 2 ? 172 : 175, startFrom - (i * 18))
}
}
@@ -303,9 +290,9 @@ export async function CreatePDF(karakter: KarakterPdfView) {
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)
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)
+9 -6
View File
@@ -6,19 +6,21 @@ import {
import {Mentok, MentokAlap, MentoModositok} from "../domain-models/mentok";
import {Kepzettseg, Kepzettsegek} from "../domain-models/kepzettsegek";
import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek";
import {Faj} from "../domain-models/faj";
import {Osztaly} from "../domain-models/osztaly";
import {Faj, FajLabel} from "../domain-models/faj";
import {Osztaly, OsztalyLabel} from "../domain-models/osztaly";
import {CelzoTB, KozelharciTB} from "../domain-models/tamadas_bonusz";
import {KarakterInputs} from "../domain-models/karakter";
import {NapiVarazslatok, CalculateVarazslatMentokNF} from "../domain-models/memorizalt_varazslatok";
import {GetJellem} from "../domain-models/jellem";
export interface KarakterPdfView {
Name: string
Nem: string
Kor: number
Isten: string
Faj: Faj
Osztaly: Osztaly
Jellem: string
Faj: string
Osztaly: string
Tulajdonsagok: KarakterTulajdonsagok,
TulajdonsagModositok: KarakterTulajdonsagok,
Szint: number
@@ -52,13 +54,14 @@ export function KarakterInputToPdfView(karakter: KarakterInputs): KarakterPdfVie
const VarazslatMentokNF = CalculateVarazslatMentokNF(karakter)
return {
Faj: karakter.faj,
Faj: FajLabel(karakter.faj),
Isten: karakter.isten || "",
Jellem: GetJellem(karakter.jellem).Label,
Kor: karakter.kor,
Name: karakter.name,
Nem: karakter.nem || "",
Tulajdonsagok: karakter.tulajdonsagok,
Osztaly: karakter.osztaly,
Osztaly: OsztalyLabel(karakter.osztaly),
Szint: karakter.szint,
Kepzettsegek: karakter.kepzettsegek.map(id => Kepzettsegek[id]),
TolvajKepzettsegek: karakter.tolvajKepzettsegek?.map(id => Kepzettsegek[id]) || [],