Add jellem
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -55,27 +55,22 @@ 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))
|
||||
}
|
||||
|
||||
|
||||
return <>
|
||||
<InternalKepzettsegekSelector
|
||||
title="Képzettségek"
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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: [],
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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}
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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]) || [],
|
||||
|
||||
Reference in New Issue
Block a user