major refactorings

This commit is contained in:
2023-09-23 21:56:12 +02:00
parent d356c745d2
commit 0db54459fb
13 changed files with 267 additions and 370 deletions
+3 -15
View File
@@ -71,27 +71,15 @@ function KarakterKepzettsegek (props: {
changeTolvajKepzettsegek: (newKepzettsegek: KepzettsegId[]) => void
}) {
const { numberOfKepzettsegek, availableKepzettsegList, changeKepzettsegek, tolvajKepzettsegek, changeTolvajKepzettsegek} = props
let kepzettsegek = props.kepzettsegek
let kepzettsegek = [ ...props.kepzettsegek]
// 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))
}
if (kepzettsegek.length < numberOfKepzettsegek) {
for (let i = kepzettsegek.length; i < numberOfKepzettsegek; i++) {
const kepzettsegLista = getKepzettsegListaN(i)
if (kepzettsegLista.length > 0) {
kepzettsegek.push(kepzettsegLista[0].Id)
}
}
changeKepzettsegek(kepzettsegek)
}
if (kepzettsegek.length > numberOfKepzettsegek){
kepzettsegek = kepzettsegek.slice(0, numberOfKepzettsegek)
changeKepzettsegek(kepzettsegek)
}
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))
+11 -10
View File
@@ -1,7 +1,9 @@
import React from "react";
import {KarakterClass, KarakterInputs} from "../domain-models/karakter";
import {KarakterInputs} from "../domain-models/karakter";
import {SignedNumberToText} from "./Helpers";
import {Mentok, MentoTipus, MentoTipusLabel} from "../domain-models/mentok";
import {Mentok, MentoTipus, MentoTipusLabel, MentokTotal} from "../domain-models/mentok";
import {BaseHP, HP} from "../domain-models/masodlagos_ertekek";
import {TamadasBonusz} from "../domain-models/tamadas_bonusz";
function MentoNovekedes(props : {tipus: MentoTipus, ujMentok: Mentok, regiMentok: Mentok}) {
const {tipus, ujMentok, regiMentok} = props
@@ -30,10 +32,9 @@ function Level2(props: {
rolledHP: number
changeRolledHP: (hp: number) => void,
}) {
const {karakter, rolledHP, changeRolledHP} = props
const karakterClass = new KarakterClass(karakter)
const regiMentok = karakterClass.MentokTulajdonsaggal(karakter.szint - 1)
const ujMentok = karakterClass.MentokTulajdonsaggal(karakter.szint)
const {karakter, changeRolledHP} = props
const regiMentok = MentokTotal({...karakter, szint: karakter.szint - 1})
const ujMentok = MentokTotal(karakter)
return <>
<div className='row'>
@@ -42,13 +43,13 @@ function Level2(props: {
<div className='row'>
<div className='col-lg-6'>
<div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label'>Plusz dobott HP (d{karakterClass.baseHP()}){' '}</label>
<label className='col-sm-6 col-8 col-form-label'>Plusz dobott HP (d{BaseHP(karakter.osztaly)}){' '}</label>
<div className='col-sm-2 col'>
<input
className='form-control'
maxLength={2}
type='number'
value={rolledHP}
value={karakter.HProlls[0]}
min={1}
max={12}
onChange={e => changeRolledHP(Number(e.target.value))} />
@@ -65,11 +66,11 @@ function Level2(props: {
<div className='col-lg-6'>
<div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label'>Új HP{' '}</label>
<span className='col col-form-label'>{karakterClass.HP()}</span>
<span className='col col-form-label'>{HP(karakter)}</span>
</div>
<div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label'>Új Támadás bónusz{' '}</label>
<span className='col col-form-label'>{karakterClass.TamadasBonusz().map(SignedNumberToText).join("/")}</span>
<span className='col col-form-label'>{TamadasBonusz(karakter.osztaly, karakter.szint).map(SignedNumberToText).join("/")}</span>
</div>
<UjMento tipus={'kitartas'} ujMentok={ujMentok} regiMentok={regiMentok} />
<UjMento tipus={'reflex'} ujMentok={ujMentok} regiMentok={regiMentok} />
+11 -12
View File
@@ -1,19 +1,18 @@
import React from "react";
import {OverlayTrigger, Tooltip} from "react-bootstrap";
import {SignedNumberToText} from "./Helpers";
import {Karakter} from "../domain-models/karakter";
import {MasodlagosErtekekView} from "../domain-models/masodlagos_ertekek";
function MasodlagosErtekek(props: MasodlagosErtekekView) {
function MasodlagosErtekek(props: {karakter: Karakter}) {
const { karakter } = props
const { HP, VO, CelzoTB, Mentok, KozelharciTB } = props
const tooltip = (
<Tooltip id="tooltip">
<strong>Hentelési Potenciál</strong>
</Tooltip>
);
const mentok = karakter.MentokTulajdonsaggal(1)
//const mentok = karakter.MentokTulajdonsaggal(1)
return <>
<div className='row'>
@@ -27,33 +26,33 @@ function MasodlagosErtekek(props: {karakter: Karakter}) {
<span>(HP)</span>
</OverlayTrigger>
</label>
<p className='col col-form-label'>{karakter.HP()}</p>
<p className='col col-form-label'>{HP}</p>
</div>
<div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label' >Védekezési Osztály (VO)</label>
<p className='col col-form-label'>{karakter.VO()}</p>
<p className='col col-form-label'>{VO}</p>
</div>
<div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label' >Közelharci támadás</label>
<p className='col col-form-label'>{SignedNumberToText(karakter.KozelharciTB(1)[0])}</p>
<p className='col col-form-label'>{KozelharciTB.map(SignedNumberToText).join(" / ")}</p>
</div>
<div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label' >Célzó támadás</label>
<p className='col col-form-label'>{SignedNumberToText(karakter.CelzoTB(1)[0])}</p>
<p className='col col-form-label'>{CelzoTB.map(SignedNumberToText).join(" / ")}</p>
</div>
</div>
<div className='col-lg-6'>
<div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label' >Kitartás mentő</label>
<p className='col col-form-label'>{SignedNumberToText(mentok.kitartas)}</p>
<p className='col col-form-label'>{SignedNumberToText(Mentok.kitartas)}</p>
</div>
<div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label' >Reflex mentő</label>
<p className='col col-form-label'>{SignedNumberToText(mentok.reflex)}</p>
<p className='col col-form-label'>{SignedNumberToText(Mentok.reflex)}</p>
</div>
<div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label' >Akaraterő mentő </label>
<p className='col col-form-label'>{SignedNumberToText(mentok.akaratero)}</p>
<p className='col col-form-label'>{SignedNumberToText(Mentok.akaratero)}</p>
</div>
</div>
</div>
+1 -1
View File
@@ -19,7 +19,7 @@ function Tulajdonsagok(props: {
<h5 className='col-lg-2 col-sm-4 align-self-center'>Tulajdonságok</h5>
<div className='col-sm-2 m-2'>
<button className='btn btn-dark' type='button'
onClick={() => RollAllAbilities(changeTulajdonsagok)}>Dobás
onClick={() => changeTulajdonsagok(RollAllAbilities())}>Dobás
</button>
</div>
</div>
+2 -2
View File
@@ -81,12 +81,12 @@ export function FajSpecials(faj : Faj) : string[] {
case Faj.Elf: return [
"+1 Ügy, -1 Egs",
"Immunisak az altató mágiára, +2 mentődobás bűbáj ellen",
"Automatikusan képzettek az íjak és a hoszszúkard használatában akkor is, ha osztályuk ezt nem adná meg nekik",
"Automatikusan képzettek az íjak és a hosszúkard használatában akkor is, ha osztályuk ezt nem adná meg nekik",
"Nem támaszthatók föl közönséges mágiával",
"Szintkorlátok: Harcos 9, Pap 7, Tolvaj 6, Varázsló 9",
];
case Faj.Felelf: return [
"Automatikusan képzettek az íjak és a hoszszúkard használatában",
"Automatikusan képzettek az íjak és a hosszúkard használatában",
"Szintkorlátok: Harcos 9, Pap 5, Tolvaj 9, Varázsló 9",
];
case Faj.Felork: return [
+11 -271
View File
@@ -1,55 +1,7 @@
import {Faj} from "./faj";
import {Osztaly} from "./osztaly";
import {KarakterTulajdonsagok, Modifier, TulajdonsagModosito} from "./tulajdonsag";
import {Kepzettseg, Kepzettsegek, KepzettsegId} from "./kepzettsegek";
import TamadasBonuszTabla from './tamadas_bonus_tabla.json';
import {ElsodlegesMento, MasodlagosMento, Mentok, MentokAlap, MentoModositok, MentoTipus} from "./mentok";
import {CelzoTB, KozelharciTB} from "./tamadas_bonusz";
export interface Karakter {
Name: string
Nem: string
Kor: number
Isten: string
Faj: Faj
Osztaly: Osztaly
Tulajdonsagok: KarakterTulajdonsagok,
Szint: number
HP: () => number
VO: () => number
Mozgas: () => number
Kezdemenyezes: () => number
KozelharciTB: (szint?: number) => number[]
CelzoTB: (szint?: number) => number[]
ElsodlegesMentok: () => MentoTipus[]
MentokAlap: (szint?: number) => Mentok
MentokTulajdonsaggal: (szint?: number) => Mentok
Kepzettsegek: Kepzettseg[]
TolvajKepzettsegek: Kepzettseg[]
}
export interface KarakterPdfView {
Name: string
Nem: string
Kor: number
Isten: string
Faj: Faj
Osztaly: Osztaly
Tulajdonsagok: KarakterTulajdonsagok,
TulajdonsagModositok: KarakterTulajdonsagok,
Szint: number
HP: number
VO: number
Mozgas: number
Kezdemenyezes: number
KozelharciTB: number[]
CelzoTB: number[]
MentokAlap: Mentok
MentoModositok: Mentok
MentokModositokkal: Mentok
Kepzettsegek: Kepzettseg[]
TolvajKepzettsegek: Kepzettseg[]
}
import {KarakterTulajdonsagok, TulajdonsagDefaults} from "./tulajdonsag";
import {KepzettsegId} from "./kepzettsegek";
export interface KarakterInputs {
name: string,
@@ -65,226 +17,14 @@ export interface KarakterInputs {
HProlls: number[],
}
function BaseHP(osztaly: Osztaly) {
let base = 4;
switch (osztaly){
case Osztaly.Barbar:
base = 12
break;
case Osztaly.Amazon:
case Osztaly.Ijasz:
case Osztaly.Kaloz:
case Osztaly.Harcos:
base = 10;
break
case Osztaly.Pap:
base = 8;
break;
case Osztaly.Tolvaj:
base = 6;
break;
case Osztaly.Varazslo:
case Osztaly.Illuzionista:
base = 4;
break;
}
return base
export const KarakterDefaults: KarakterInputs = {
name: "Névtelen Kalandozó",
faj: Faj.Ember,
kor: 20,
tulajdonsagok: TulajdonsagDefaults,
osztaly: Osztaly.Harcos,
kepzettsegek: [],
szint: 1,
HProlls: [],
}
export function HP(osztaly: Osztaly, egeszsegModifier: number, hpRolls: number[]): number {
return BaseHP(osztaly) + egeszsegModifier + hpRolls
// https://lfg.hu/forum/topic/15079-kard-es-magia/page/219/#comment-2218333
.map(hp => Math.max(1, hp + egeszsegModifier))
.reduce((sum, val) => sum + val, 0)
}
export function KarakterInputToPdfView(input: KarakterInputs): KarakterPdfView {
const tulajdonsagModositok = TulajdonsagModosito(input.tulajdonsagok)
const hp = HP(input.osztaly, tulajdonsagModositok.t_egs, input.HProlls)
const vo = 10 + tulajdonsagModositok.t_ugy // TODO: kaloz, amazon!
const mozgas = input.faj === Faj.Torpe ? 20 : 30
const kezdemenyezes = tulajdonsagModositok.t_ugy + (input.osztaly === Osztaly.Tolvaj ? 4 : 0)
const mentok = MentokAlap(input.osztaly, input.szint)
const mentoModositok = MentoModositok(tulajdonsagModositok)
return {
Faj: input.faj,
Isten: input.isten || "",
Kor: input.kor,
Name: input.name,
Nem: input.nem || "",
Tulajdonsagok: input.tulajdonsagok,
Osztaly: input.osztaly,
Szint: input.szint,
Kepzettsegek: input.kepzettsegek.map(id => Kepzettsegek[id]),
TolvajKepzettsegek: input.tolvajKepzettsegek?.map(id => Kepzettsegek[id]) || [],
TulajdonsagModositok: tulajdonsagModositok,
HP: hp,
VO: vo,
Mozgas: mozgas,
Kezdemenyezes: kezdemenyezes,
KozelharciTB: KozelharciTB(input),
CelzoTB: CelzoTB(input),
MentoModositok: mentoModositok,
MentokAlap: mentok,
MentokModositokkal: {
kitartas: mentok.kitartas + mentoModositok.kitartas,
akaratero: mentok.akaratero + mentoModositok.akaratero,
reflex: mentok.reflex + mentoModositok.reflex,
}
}
}
/// deprecated
export class KarakterClass implements Karakter {
public Name : string
public Nem : string
public Kor : number
public Isten : string
public Faj : Faj
public Osztaly : Osztaly
public Tulajdonsagok : KarakterTulajdonsagok
public Szint : number = 1
public Kepzettsegek: Kepzettseg[]
public TolvajKepzettsegek: Kepzettseg[]
private HProlls: number[]
constructor(inputs: KarakterInputs) {
this.Name = inputs.name
this.Nem = inputs.nem || ""
this.Kor = inputs.kor
this.Isten = inputs.isten || ""
this.Faj = inputs.faj
this.Osztaly = inputs.osztaly
this.Tulajdonsagok = inputs.tulajdonsagok
this.Kepzettsegek = inputs.kepzettsegek.map(k => Kepzettsegek[k])
this.TolvajKepzettsegek = (inputs.tolvajKepzettsegek || []).map(k => Kepzettsegek[k])
this.Szint = Math.min(Math.max(1,inputs.szint), 20)
this.HProlls = inputs.HProlls
}
public HP = () => this.baseHP() + Modifier(this.Tulajdonsagok.t_egs) + this.HProlls
// https://lfg.hu/forum/topic/15079-kard-es-magia/page/219/#comment-2218333
.map(hp => Math.max(1, hp + Modifier(this.Tulajdonsagok.t_egs)))
.reduce((sum, val) => sum + val, 0)
public VO = () => 10 + Modifier(this.Tulajdonsagok.t_ugy)
public Mozgas = () => this.Faj === Faj.Torpe ? 20 : 30
public Kezdemenyezes() : number {
return Modifier(this.Tulajdonsagok.t_ugy) + (this.Osztaly === Osztaly.Tolvaj ? 4 : 0)
}
public TamadasBonusz(szint: number = this.Szint) : number[] {
let base = []
switch (this.Osztaly){
case Osztaly.Barbar:
case Osztaly.Amazon:
case Osztaly.Ijasz:
case Osztaly.Kaloz:
case Osztaly.Harcos:
base = TamadasBonuszTabla['elsodleges'];
break;
case Osztaly.Pap:
case Osztaly.Tolvaj:
base = TamadasBonuszTabla['ketharmados'];
break;
case Osztaly.Varazslo:
case Osztaly.Illuzionista:
base = TamadasBonuszTabla['feles'];
break;
}
return base[szint-1]
}
public KozelharciTB(szint: number = this.Szint): number[] {
const base = this.TamadasBonusz(szint);
let modifier = Modifier(this.Tulajdonsagok.t_ero)
if (this.Osztaly === Osztaly.Kaloz && this.Tulajdonsagok.t_ugy > this.Tulajdonsagok.t_ero) {
modifier = Modifier(this.Tulajdonsagok.t_ugy)
}
return base.map(v => v + modifier)
}
public CelzoTB(szint: number = this.Szint): number[] {
let base = this.TamadasBonusz(szint)
if (this.Osztaly === Osztaly.Ijasz) {
base = [base[0], ...base]
}
return base.map(v => v + Modifier(this.Tulajdonsagok.t_ugy))
}
public ElsodlegesMentok() : MentoTipus[] {
let t: MentoTipus[] = []
switch (this.Osztaly){
case Osztaly.Barbar:
case Osztaly.Amazon:
case Osztaly.Ijasz:
case Osztaly.Kaloz:
case Osztaly.Harcos:
t = ['kitartas'];
break;
case Osztaly.Pap:
t = ['kitartas', 'akaratero'];
break;
case Osztaly.Tolvaj:
t = ['reflex'];
break;
case Osztaly.Varazslo:
case Osztaly.Illuzionista:
t = ['akaratero']
break;
}
return t
}
public MentokAlap(szint: number = this.Szint) {
const elsodlegesek = this.ElsodlegesMentok()
return {
kitartas: elsodlegesek.includes('kitartas') ? ElsodlegesMento(szint) : MasodlagosMento(szint),
reflex: elsodlegesek.includes('reflex') ? ElsodlegesMento(szint) : MasodlagosMento(szint),
akaratero: elsodlegesek.includes('akaratero') ? ElsodlegesMento(szint) : MasodlagosMento(szint),
}
}
public MentokTulajdonsaggal(szint: number = this.Szint) {
const mentok = this.MentokAlap(szint)
return {
kitartas: mentok.kitartas + Modifier(this.Tulajdonsagok.t_egs),
reflex: mentok.reflex + Modifier(this.Tulajdonsagok.t_ugy),
akaratero: mentok.akaratero + Modifier(this.Tulajdonsagok.t_bol),
}
}
public baseHP() {
let base = 4;
switch (this.Osztaly){
case Osztaly.Barbar:
base = 12
break;
case Osztaly.Amazon:
case Osztaly.Ijasz:
case Osztaly.Kaloz:
case Osztaly.Harcos:
base = 10;
break
case Osztaly.Pap:
base = 8;
break;
case Osztaly.Tolvaj:
base = 6;
break;
case Osztaly.Varazslo:
case Osztaly.Illuzionista:
base = 4;
break;
}
return base
}
}
+52 -1
View File
@@ -1,5 +1,9 @@
import {Tulajdonsag} from "./tulajdonsag";
import {Modifier, Tulajdonsag} from "./tulajdonsag";
import {Osztaly} from "./osztaly";
import {Faj} from "./faj";
import {KarakterInputs} from "./karakter";
import karakterKepzettsegek from "../components/KarakterKepzettsegek";
import tulajdonsagok from "../components/Tulajdonsagok";
export type KepzettsegId = 'k_alkimia' | 'k_alcazas' | 'k_allatidomitas' | 'k_csapdak' | 'k_csillagjoslas' | 'k_egyensulyozas' | 'k_eloadas' | 'k_ertekbecsles' | 'k_gyogyitas' | 'k_hajozas' | 'k_hallgatozas' | 'k_hamisitas' | 'k_jelek_olvasasa' | 'k_koncentracio' | 'k_lovaglas' | 'k_maszas' | 'k_megfigyeles' | 'k_meregkeveres' | 'k_mesterseg' | 'k_nyomkereses' | 'k_osonas' | 'k_rejtozes' | 'k_szabadulomuveszet' | 'k_tudas' | 'k_ugras' | 'k_uszas' | 'k_varazslatismeret' | 'k_zarnyitas' | 'k_zsebmetszes'
@@ -210,4 +214,51 @@ export const Kepzettsegek: Record<KepzettsegId, Kepzettseg> =
export function AvailableKezpettsegList(osztaly: Osztaly): Kepzettseg[] {
return KepzettsegLista.filter(k => k.Osztalyok == null || k.Osztalyok.includes(osztaly))
}
export function GetNumberOfKepzettsegek(t_int: number, faj: Faj, max: number) {
let numberOfKepzettseg = 3 + Modifier(t_int) + (faj === Faj.Ember ? 1 : 0)
console.log('Raw Number of Kepzetsegek = ', numberOfKepzettseg)
if (numberOfKepzettseg < 1) {
numberOfKepzettseg = 1
}
if (numberOfKepzettseg > max) {
numberOfKepzettseg = max
}
console.log('Adjusted Number of Kepzetsegek = ', numberOfKepzettseg)
return numberOfKepzettseg;
}
export function SetDefaultTolvajKepzettsegek(karakter: Pick<KarakterInputs, 'osztaly' | 'tolvajKepzettsegek'>, changeTolvajKepzettsegek: (tolvajKepzettsegek?: KepzettsegId[]) => void) {
if (karakter.osztaly !== Osztaly.Tolvaj && karakter.tolvajKepzettsegek != null) {
changeTolvajKepzettsegek(undefined)
}
if (karakter.osztaly === Osztaly.Tolvaj && (karakter.tolvajKepzettsegek == null || karakter.tolvajKepzettsegek.length === 0)) {
const tolvajKepzettsegek = TolvajKepzettsegList.slice(0, 4).map(x => x.Id)
changeTolvajKepzettsegek(tolvajKepzettsegek)
}
}
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))
}
if (kepzettsegek.length < numberOfKepzettsegek) {
for (let i = kepzettsegek.length; i < numberOfKepzettsegek; i++) {
const kepzettsegLista = getKepzettsegListaN(i)
if (kepzettsegLista.length > 0) {
kepzettsegek.push(kepzettsegLista[0].Id)
}
}
changeKepzettsegek(kepzettsegek)
}
if (kepzettsegek.length > numberOfKepzettsegek){
kepzettsegek = kepzettsegek.slice(0, numberOfKepzettsegek)
changeKepzettsegek(kepzettsegek)
}
}
+63
View File
@@ -0,0 +1,63 @@
import {Mentok, MentokTotal} from "./mentok";
import {Osztaly} from "./osztaly";
import {KarakterInputs} from "./karakter";
import {Modifier} from "./tulajdonsag";
import {CelzoTB, KozelharciTB} from "./tamadas_bonusz";
export interface MasodlagosErtekekView {
HP: number
VO: number
KozelharciTB: number[]
CelzoTB: number[]
Mentok: Mentok
}
export type KarakterpickForMasodlagosErtekek = Pick<KarakterInputs, 'osztaly' | 'HProlls' | 'tulajdonsagok' | 'szint'>
export function BaseHP(osztaly: Osztaly) {
let base = 4;
switch (osztaly){
case Osztaly.Barbar:
base = 12
break;
case Osztaly.Amazon:
case Osztaly.Ijasz:
case Osztaly.Kaloz:
case Osztaly.Harcos:
base = 10;
break
case Osztaly.Pap:
base = 8;
break;
case Osztaly.Tolvaj:
base = 6;
break;
case Osztaly.Varazslo:
case Osztaly.Illuzionista:
base = 4;
break;
}
return base
}
export function HP(karakter: Pick<KarakterInputs, 'osztaly' | 'tulajdonsagok' | 'HProlls'>): number {
const egeszsegModifier = Modifier(karakter.tulajdonsagok.t_egs)
return BaseHP(karakter.osztaly) + egeszsegModifier + karakter.HProlls
// https://lfg.hu/forum/topic/15079-kard-es-magia/page/219/#comment-2218333
.map(hp => Math.max(1, hp + egeszsegModifier))
.reduce((sum, val) => sum + val, 0)
}
export function VO(karakter: Pick<KarakterInputs, 'tulajdonsagok'>): number {
return 10 + Modifier(karakter.tulajdonsagok.t_ugy) // TODO: Kaloz, Amazon
}
export function CalculateMasodlagosErtekek(karakter: KarakterpickForMasodlagosErtekek): MasodlagosErtekekView {
return {
HP: HP(karakter),
VO: VO(karakter),
CelzoTB: CelzoTB(karakter),
KozelharciTB: KozelharciTB(karakter),
Mentok: MentokTotal(karakter)
}
}
+12 -1
View File
@@ -1,5 +1,6 @@
import {Osztaly} from "./osztaly";
import {KarakterTulajdonsagok} from "./tulajdonsag";
import {KarakterTulajdonsagok, TulajdonsagModosito} from "./tulajdonsag";
import {KarakterInputs} from "./karakter";
export interface Mentok {
kitartas: number
@@ -66,4 +67,14 @@ export function MentoModositok(tulajdonsagModositok: KarakterTulajdonsagok) {
reflex: tulajdonsagModositok.t_ugy,
akaratero: tulajdonsagModositok.t_bol,
}
}
export function MentokTotal(karakter: Pick<KarakterInputs, 'osztaly' | 'szint' | 'tulajdonsagok'>) {
const alap = MentokAlap(karakter.osztaly, karakter.szint)
const modositok = MentoModositok(TulajdonsagModosito(karakter.tulajdonsagok))
return {
kitartas: alap.kitartas + modositok.kitartas,
reflex: alap.kitartas + modositok.kitartas,
akaratero: alap.akaratero + modositok.akaratero,
}
}
+13 -4
View File
@@ -12,6 +12,15 @@ export enum Tulajdonsag {
export type KarakterTulajdonsagok = Record<Tulajdonsag, number>
export const TulajdonsagDefaults: KarakterTulajdonsagok = {
t_ero: 10,
t_ugy: 10,
t_egs: 10,
t_int: 10,
t_bol: 10,
t_kar: 10,
}
export function TulajdonsagLabel(tul: Tulajdonsag) : string {
switch (tul) {
case Tulajdonsag.Bolcsesseg: return 'Bölcsesség';
@@ -33,22 +42,22 @@ function rollAbility() {
min = roll;
}
sum += roll;
rolls = [...rolls, roll]
rolls.push(roll)
}
const result = sum - min;
console.log("Rolled: " + rolls + " got: " + result)
return result;
}
export function RollAllAbilities(setValue: (newValue: KarakterTulajdonsagok) => void) {
setValue({
export function RollAllAbilities() : KarakterTulajdonsagok {
return {
t_ero: rollAbility(),
t_ugy: rollAbility(),
t_egs: rollAbility(),
t_int: rollAbility(),
t_bol: rollAbility(),
t_kar: rollAbility(),
})
}
}
export const Modifier = (val : number) => Math.floor(val / 3) - 3
+21 -52
View File
@@ -6,68 +6,35 @@ import FajSelector from "../components/FajSelector";
import Tulajdonsagok from "../components/Tulajdonsagok";
import OsztalySelector from "../components/OsztalySelector";
import KarakterKepzettsegek from "../components/KarakterKepzettsegek";
import {KarakterTulajdonsagok, Modifier} from "../domain-models/tulajdonsag";
import {KarakterTulajdonsagok} from "../domain-models/tulajdonsag";
import MasodlagosErtekek from "../components/MasodlagosErtekek";
import {AvailableKezpettsegList, TolvajKepzettsegList} from "../domain-models/kepzettsegek";
import {
AvailableKezpettsegList,
GetNumberOfKepzettsegek, KepzettsegId, SetDefaultKepzettsegek,
SetDefaultTolvajKepzettsegek,
} from "../domain-models/kepzettsegek";
import {CreatePDF} from "../pdf/character.pdf";
import {KarakterClass, KarakterInputs, KarakterInputToPdfView} from "../domain-models/karakter";
import {KarakterDefaults} from "../domain-models/karakter";
import Level2 from "../components/Level2";
import {dAny} from "../domain-models/kockak";
const tulajdonsagDefaults: KarakterTulajdonsagok = {
t_ero: 10,
t_ugy: 10,
t_egs: 10,
t_int: 10,
t_bol: 10,
t_kar: 10,
}
const karakterDefaults: KarakterInputs = {
name: "Névtelen Kalandozó",
faj: Faj.Ember,
kor: 20,
tulajdonsagok: tulajdonsagDefaults,
osztaly: Osztaly.Harcos,
kepzettsegek: [],
szint: 1,
HProlls: [],
}
function getNumberOfKepzettsegek(t_int: number, faj: Faj, max: number) {
let numberOfKepzettseg = 3 + Modifier(t_int) + (faj === Faj.Ember ? 1 : 0)
console.log('Raw Number of Kepzetsegek = ', numberOfKepzettseg)
if (numberOfKepzettseg < 1) {
numberOfKepzettseg = 1
}
if (numberOfKepzettseg > max) {
numberOfKepzettseg = max
}
console.log('Adjusted Number of Kepzetsegek = ', numberOfKepzettseg)
return numberOfKepzettseg;
}
import {BaseHP, CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek";
import {KarakterInputToPdfView} from "../pdf/karakter_pdf_view";
function CreateCharacterPage() {
let [karakter, changeKarakter] = useState(karakterDefaults)
const karakterClass = new KarakterClass(karakter)
let [karakter, changeKarakter] = useState(KarakterDefaults)
SetDefaultTolvajKepzettsegek(karakter, (tk) => changeKarakter({...karakter, tolvajKepzettsegek: tk}))
SetDefaultKepzettsegek(karakter, (k: KepzettsegId[]) => changeKarakter({...karakter, kepzettsegek: k}))
const availableKepzettsegList = AvailableKezpettsegList(karakter.osztaly)
if (karakter.osztaly !== Osztaly.Tolvaj && karakter.tolvajKepzettsegek != null) {
changeKarakter({...karakter, tolvajKepzettsegek: undefined})
}
if (karakter.osztaly === Osztaly.Tolvaj && (karakter.tolvajKepzettsegek == null || karakter.tolvajKepzettsegek.length === 0)) {
const tolvajKepzettsegek = TolvajKepzettsegList.slice(0, 4).map(x => x.Id)
changeKarakter({...karakter, tolvajKepzettsegek: tolvajKepzettsegek})
}
function levelUp() {
const dice = karakterClass.baseHP()
const szint = karakter.szint + 1
const dice = BaseHP(karakter.osztaly)
const roll = dAny(dice)
console.log(`Level 2 HP roll on d${dice} is: ${roll}`)
changeKarakter({...karakter, szint: karakter.szint + 1, HProlls: [...karakter.HProlls, roll]})
console.log(`Level ${szint} HP roll on d${dice} is: ${roll}`)
changeKarakter({...karakter, szint: szint, HProlls: [...karakter.HProlls, roll]})
}
function levelDown() {
@@ -79,6 +46,8 @@ function CreateCharacterPage() {
console.log(karakter)
}
const masodlagosErtekek = CalculateMasodlagosErtekek({...karakter, szint: 1, HProlls: []})
return (
<div>
<div className='container-fluid p-5 bg-black text-white text-center'>
@@ -136,7 +105,7 @@ function CreateCharacterPage() {
/>
<KarakterKepzettsegek
availableKepzettsegList={availableKepzettsegList}
numberOfKepzettsegek={getNumberOfKepzettsegek(karakter.tulajdonsagok.t_int, karakter.faj, availableKepzettsegList.length)}
numberOfKepzettsegek={GetNumberOfKepzettsegek(karakter.tulajdonsagok.t_int, karakter.faj, availableKepzettsegList.length)}
kepzettsegek={karakter.kepzettsegek}
changeKepzettsegek={(ks) => changeKarakter({...karakter, kepzettsegek: ks}) }
tolvajKepzettsegek={karakter.tolvajKepzettsegek || []}
@@ -144,7 +113,7 @@ function CreateCharacterPage() {
/>
<hr />
<MasodlagosErtekek karakter={karakterClass} />
<MasodlagosErtekek {...masodlagosErtekek} />
{karakter.szint > 1 && <Level2 karakter={{...karakter}} rolledHP={karakter.HProlls[0]} changeRolledHP={chageLevel2HProll} /> }
+1 -1
View File
@@ -1,4 +1,4 @@
import {KarakterPdfView} from "../domain-models/karakter";
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";
+66
View File
@@ -0,0 +1,66 @@
import {KarakterTulajdonsagok, TulajdonsagModosito} from "../domain-models/tulajdonsag";
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 {CelzoTB, KozelharciTB} from "../domain-models/tamadas_bonusz";
import {KarakterInputs} from "../domain-models/karakter";
export interface KarakterPdfView {
Name: string
Nem: string
Kor: number
Isten: string
Faj: Faj
Osztaly: Osztaly
Tulajdonsagok: KarakterTulajdonsagok,
TulajdonsagModositok: KarakterTulajdonsagok,
Szint: number
HP: number
VO: number
Mozgas: number
Kezdemenyezes: number
KozelharciTB: number[]
CelzoTB: number[]
MentokAlap: Mentok
MentoModositok: Mentok
MentokModositokkal: Mentok
Kepzettsegek: Kepzettseg[]
TolvajKepzettsegek: Kepzettseg[]
}
export function KarakterInputToPdfView(karakter: KarakterInputs): KarakterPdfView {
const masodlagosErtekek = CalculateMasodlagosErtekek(karakter)
const tulajdonsagModositok = TulajdonsagModosito(karakter.tulajdonsagok)
const mozgas = karakter.faj === Faj.Torpe ? 20 : 30
const kezdemenyezes = tulajdonsagModositok.t_ugy + (karakter.osztaly === Osztaly.Tolvaj ? 4 : 0)
const mentok = MentokAlap(karakter.osztaly, karakter.szint)
const mentoModositok = MentoModositok(tulajdonsagModositok)
return {
Faj: karakter.faj,
Isten: karakter.isten || "",
Kor: karakter.kor,
Name: karakter.name,
Nem: karakter.nem || "",
Tulajdonsagok: karakter.tulajdonsagok,
Osztaly: karakter.osztaly,
Szint: karakter.szint,
Kepzettsegek: karakter.kepzettsegek.map(id => Kepzettsegek[id]),
TolvajKepzettsegek: karakter.tolvajKepzettsegek?.map(id => Kepzettsegek[id]) || [],
TulajdonsagModositok: tulajdonsagModositok,
HP: masodlagosErtekek.HP,
VO: masodlagosErtekek.VO,
Mozgas: mozgas,
Kezdemenyezes: kezdemenyezes,
KozelharciTB: KozelharciTB(karakter),
CelzoTB: CelzoTB(karakter),
MentoModositok: mentoModositok,
MentokAlap: mentok,
MentokModositokkal: masodlagosErtekek.Mentok
}
}