mirror of
https://github.com/morbalint/kemkas.git
synced 2026-07-17 19:03:46 +00:00
major refactorings
This commit is contained in:
@@ -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
@@ -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} />
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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,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";
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user