WIP basic level up 2nd round

This commit is contained in:
2023-09-14 21:28:51 +02:00
parent 412152d343
commit eb077928cf
8 changed files with 179 additions and 40 deletions
+1 -1
View File
@@ -6,7 +6,7 @@ function FajSelector(props: { faj: Faj, changeFaj: (val: Faj) => void }) {
return <> return <>
<div className='row m-2'> <div className='row m-2'>
<label className='col-md-2 col-sm-3 col-form-label'>Faj</label> <label className='col-md-2 col-sm-3 col-form-label'>Faj</label>
<select className='col form-select' defaultValue={Faj.Ember} value={faj} onChange={e => changeFaj(e.target.value as Faj)}> <select className='col form-select' value={faj} onChange={e => changeFaj(e.target.value as Faj)}>
<option key={Faj.Ember} value={Faj.Ember}>{FajLabel(Faj.Ember)}</option> <option key={Faj.Ember} value={Faj.Ember}>{FajLabel(Faj.Ember)}</option>
<optgroup label='más emberi népek'> <optgroup label='más emberi népek'>
<option key={Faj.Amazon} value={Faj.Amazon}>{FajLabel(Faj.Amazon)}</option> <option key={Faj.Amazon} value={Faj.Amazon}>{FajLabel(Faj.Amazon)}</option>
+33 -13
View File
@@ -1,37 +1,57 @@
import React from "react"; import React from "react";
import {Osztaly} from "../domain-models/osztaly"; import {KarakterClass, KarakterInputs} from "../domain-models/karakter";
import {SignedNumberToText} from "./Helpers"; import {SignedNumberToText} from "./Helpers";
import {Modifier} from "../domain-models/tulajdonsag";
function Level2(props: { function Level2(props: {
osztaly: Osztaly karakter: KarakterInputs
rolledHP: number rolledHP: number
t_egs: number changeRolledHP: (hp: number) => void,
}) { }) {
const {osztaly, rolledHP, t_egs} = props const {karakter, rolledHP, changeRolledHP} = props
const karakterClass = new KarakterClass(karakter)
return <> return <>
<div className='row'> <div className='row'>
<h5 className='col align-self-center'>2. Szint</h5> <h5 className='col align-self-center'>2. Szint</h5>
</div> </div>
<div className='row'> <div className='row'>
<div className='col-lg-4'> <div className='col-lg-6'>
<div className='row m-2'> <div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label'>Extra Életerő{' '}</label> <label className='col-sm-6 col-8 col-form-label'>Plusz dobott HP{' '}</label>
<span className='col col-form-label'>{SignedNumberToText(rolledHP + Modifier(t_egs))}</span> <div className='col-sm-2 col'>
<input
className='form-control'
maxLength={2}
type='number'
value={rolledHP}
min={1}
max={12}
onChange={e => changeRolledHP(Number(e.target.value))} />
</div>
</div> </div>
</div>
<div className='col-lg-4'>
<div className='row m-2'> <div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label'>Támadás bónusz{' '}</label> <label className='col-sm-6 col-8 col-form-label'>Támadás bónusz növekedés{' '}</label>
<span className='col col-form-label'>+1</span> <span className='col col-form-label'>+1</span>
</div> </div>
</div>
<div className='col-lg-4'>
<div className='row m-2'> <div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label'>Elsődleges mentő{' '}</label> <label className='col-sm-6 col-8 col-form-label'>Elsődleges mentő{' '}</label>
<span className='col col-form-label'>+1</span> <span className='col col-form-label'>+1</span>
</div> </div>
</div> </div>
<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>
</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>
</div>
<div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label'>Új Mentő{' '}</label>
<span className='col col-form-label'>{SignedNumberToText(karakterClass.KitartasMentoAlap())}</span>
</div>
</div>
</div> </div>
</> </>
} }
+1 -1
View File
@@ -14,7 +14,7 @@ function OsztalySelector(props: {currentFaj: Faj, currentOsztaly: Osztaly, chang
return <> return <>
<div className='row m-2'> <div className='row m-2'>
<label className='col-md-2 col-sm-3 col-form-label'>Osztály</label> <label className='col-md-2 col-sm-3 col-form-label'>Osztály</label>
<select className="col form-select" defaultValue={Osztaly.Harcos} value={currentOsztaly} onChange={(e) => changeOsztaly(e.target.value as Osztaly)} > <select className="col form-select" value={currentOsztaly} onChange={(e) => changeOsztaly(e.target.value as Osztaly)} >
<optgroup label='Harcos'> <optgroup label='Harcos'>
<option value={Osztaly.Harcos}>{OsztalyLabel(Osztaly.Harcos)}</option> <option value={Osztaly.Harcos}>{OsztalyLabel(Osztaly.Harcos)}</option>
{currentFaj === Faj.Amazon && ( {currentFaj === Faj.Amazon && (
+1 -1
View File
@@ -31,7 +31,7 @@ function TulajdonsagInput(props: {
return (<div className='row m-2'> return (<div className='row m-2'>
<label className='col-lg-1 col-sm-2 col-form-label'>{tulajdonsag}</label> <label className='col-lg-1 col-sm-2 col-form-label'>{tulajdonsag}</label>
<div className='col-lg-1 col-sm-2 m-2'> <div className='col-lg-1 col-sm-2 m-2'>
<input className='form-control' maxLength={2} defaultValue={10} type='number' value={currentValue} onChange={e => changeValue(Number(e.target.value))} /> <input className='form-control' maxLength={2} type='number' value={currentValue} onChange={e => changeValue(Number(e.target.value))} />
</div> </div>
<span className='col-sm-2 m-2'> <span className='col-sm-2 m-2'>
{fajiModositoText(currentFaj, fajiModosito)} {fajiModositoText(currentFaj, fajiModosito)}
+55 -13
View File
@@ -3,6 +3,7 @@ import {Osztaly} from "./osztaly";
import {KarakterTulajdonsagok, Modifier} from "./tulajdonsag"; import {KarakterTulajdonsagok, Modifier} from "./tulajdonsag";
import {CalculateMasodlagosErtekek, KarakterMasodlagosErtekek} from "./masodlagos_ertekek"; import {CalculateMasodlagosErtekek, KarakterMasodlagosErtekek} from "./masodlagos_ertekek";
import {Kepzettseg, Kepzettsegek, KepzettsegId} from "./kepzettsegek"; import {Kepzettseg, Kepzettsegek, KepzettsegId} from "./kepzettsegek";
import TamadasBonuszTabla from './tamadas_bonus_tabla.json';
export interface Karakter { export interface Karakter {
Name: string Name: string
@@ -17,8 +18,8 @@ export interface Karakter {
VO: () => number VO: () => number
Mozgas: () => number Mozgas: () => number
Kezdemenyezes: () => number Kezdemenyezes: () => number
KozelharciTB: () => number KozelharciTB: () => number[]
CelzoTB: () => number CelzoTB: () => number[]
KitartasMentoAlap: () => number KitartasMentoAlap: () => number
ReflexMentoAlap: () => number ReflexMentoAlap: () => number
AkarateroMentoAlap: () => number AkarateroMentoAlap: () => number
@@ -54,6 +55,7 @@ export class KarakterClass implements Karakter {
public TolvajKepzettsegek: Kepzettseg[] public TolvajKepzettsegek: Kepzettseg[]
private MasodlagosErtekek : KarakterMasodlagosErtekek private MasodlagosErtekek : KarakterMasodlagosErtekek
private HProlls: number[]
constructor(inputs: KarakterInputs) { constructor(inputs: KarakterInputs) {
this.Name = inputs.name this.Name = inputs.name
@@ -66,10 +68,14 @@ export class KarakterClass implements Karakter {
this.MasodlagosErtekek = CalculateMasodlagosErtekek(inputs.osztaly, inputs.tulajdonsagok) this.MasodlagosErtekek = CalculateMasodlagosErtekek(inputs.osztaly, inputs.tulajdonsagok)
this.Kepzettsegek = inputs.kepzettsegek.map(k => Kepzettsegek[k]) this.Kepzettsegek = inputs.kepzettsegek.map(k => Kepzettsegek[k])
this.TolvajKepzettsegek = (inputs.tolvajKepzettsegek || []).map(k => Kepzettsegek[k]) this.TolvajKepzettsegek = (inputs.tolvajKepzettsegek || []).map(k => Kepzettsegek[k])
this.Szint = inputs.szint this.Szint = Math.min(Math.max(1,inputs.szint), 20)
this.HProlls = inputs.HProlls
} }
public HP = () => this.MasodlagosErtekek.HP 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 = () => this.MasodlagosErtekek.VO public VO = () => this.MasodlagosErtekek.VO
@@ -79,32 +85,42 @@ export class KarakterClass implements Karakter {
return Modifier(this.Tulajdonsagok.t_ugy) + (this.Osztaly === Osztaly.Tolvaj ? 4 : 0) return Modifier(this.Tulajdonsagok.t_ugy) + (this.Osztaly === Osztaly.Tolvaj ? 4 : 0)
} }
public TamadasBonusz() : number { public TamadasBonusz() : number[] {
let base = []
switch (this.Osztaly){ switch (this.Osztaly){
case Osztaly.Barbar: case Osztaly.Barbar:
case Osztaly.Amazon: case Osztaly.Amazon:
case Osztaly.Ijasz: case Osztaly.Ijasz:
case Osztaly.Kaloz: case Osztaly.Kaloz:
case Osztaly.Harcos: case Osztaly.Harcos:
return 2; base = TamadasBonuszTabla['elsodleges'];
break;
case Osztaly.Pap: case Osztaly.Pap:
case Osztaly.Tolvaj: case Osztaly.Tolvaj:
return 0; base = TamadasBonuszTabla['ketharmados'];
break;
case Osztaly.Varazslo: case Osztaly.Varazslo:
case Osztaly.Illuzionista: case Osztaly.Illuzionista:
return 0; base = TamadasBonuszTabla['feles'];
break;
} }
return base[this.Szint-1]
} }
public KozelharciTB(): number { public KozelharciTB(): number[] {
const base = this.TamadasBonusz(); const base = this.TamadasBonusz();
let modifier = Modifier(this.Tulajdonsagok.t_ero)
if (this.Osztaly === Osztaly.Kaloz && this.Tulajdonsagok.t_ugy > this.Tulajdonsagok.t_ero) { if (this.Osztaly === Osztaly.Kaloz && this.Tulajdonsagok.t_ugy > this.Tulajdonsagok.t_ero) {
return base + Modifier(this.Tulajdonsagok.t_ugy) modifier = Modifier(this.Tulajdonsagok.t_ugy)
} }
return base + Modifier(this.Tulajdonsagok.t_ero) return base.map(v => v + modifier)
} }
public CelzoTB(): number { public CelzoTB(): number[] {
return this.TamadasBonusz() + Modifier(this.Tulajdonsagok.t_ugy) let base = this.TamadasBonusz()
if (this.Osztaly === Osztaly.Ijasz) {
base = [base[0], ...base]
}
return base.map(v => v + Modifier(this.Tulajdonsagok.t_ugy))
} }
public KitartasMentoAlap() : number { public KitartasMentoAlap() : number {
@@ -154,4 +170,30 @@ export class KarakterClass implements Karakter {
return 0; return 0;
} }
} }
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
}
} }
@@ -0,0 +1,68 @@
{
"elsodleges": [
[1],
[2],
[3],
[4],
[5],
[6,1],
[7,2],
[8,3],
[9,4],
[10,5],
[10,6,1],
[10,7,2],
[10,8,3],
[10,9,4],
[10,10,5],
[10,10,6],
[10,10,7],
[10,10,8],
[10,10,9],
[10,10,10]
],
"ketharmados": [
[0],
[1],
[2],
[2],
[3],
[4],
[4],
[5],
[6,1],
[6,1],
[7,2],
[8,3],
[8,3],
[9,4],
[10,5],
[10,5],
[10,6],
[10,7],
[10,7],
[10,8]
],
"feles": [
[0],
[1],
[1],
[2],
[2],
[3],
[3],
[4],
[4],
[5],
[5],
[6],
[6],
[7],
[7],
[8],
[8],
[9],
[9],
[10]
]
}
+12 -3
View File
@@ -13,6 +13,7 @@ import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek";
import {CreatePDF} from "../pdf/character.pdf"; import {CreatePDF} from "../pdf/character.pdf";
import {KarakterClass, KarakterInputs} from "../domain-models/karakter"; import {KarakterClass, KarakterInputs} from "../domain-models/karakter";
import Level2 from "../components/Level2"; import Level2 from "../components/Level2";
import {getRandomInt} from "../domain-models/kockak";
const tulajdonsagDefaults: KarakterTulajdonsagok = { const tulajdonsagDefaults: KarakterTulajdonsagok = {
t_ero: 10, t_ero: 10,
@@ -63,11 +64,19 @@ function CreateCharacterPage() {
} }
function levelUp() { function levelUp() {
changeKarakter({...karakter, szint: karakter.szint + 1, HProlls: [...karakter.HProlls, 1]}) const dice = new KarakterClass(karakter).baseHP()
const roll = getRandomInt(dice)
console.log(`Level 2 HP roll on d${dice} is: ${roll}`)
changeKarakter({...karakter, szint: karakter.szint + 1, HProlls: [...karakter.HProlls, roll]})
} }
function levelDown() { function levelDown() {
changeKarakter({...karakter, szint: karakter.szint - 1, HProlls: karakter.HProlls.slice(0, karakter.HProlls.length - 1)}) changeKarakter({...karakter, szint: karakter.szint - 1, HProlls: karakter.HProlls.slice(0, -1)})
}
function chageLevel2HProll(newHProll: number) {
changeKarakter({...karakter, HProlls: [newHProll, ...karakter.HProlls.slice(1)]})
console.log(karakter)
} }
return ( return (
@@ -137,7 +146,7 @@ function CreateCharacterPage() {
<hr /> <hr />
<MasodlagosErtekek ertekek={CalculateMasodlagosErtekek(karakter.osztaly, karakter.tulajdonsagok)} /> <MasodlagosErtekek ertekek={CalculateMasodlagosErtekek(karakter.osztaly, karakter.tulajdonsagok)} />
{karakter.szint > 1 && <Level2 osztaly={karakter.osztaly} rolledHP={karakter.HProlls[0]} t_egs={karakter.tulajdonsagok.t_egs} /> } {karakter.szint > 1 && <Level2 karakter={{...karakter}} rolledHP={karakter.HProlls[0]} changeRolledHP={chageLevel2HProll} /> }
<div className='d-grid gap-2 m-5'> <div className='d-grid gap-2 m-5'>
{karakter.szint < 2 && <button className='btn btn-dark btn-lg' type='button' onClick={levelUp}>Szintlépés! </button> } {karakter.szint < 2 && <button className='btn btn-dark btn-lg' type='button' onClick={levelUp}>Szintlépés! </button> }
+8 -8
View File
@@ -253,19 +253,19 @@ export async function CreatePDF(karakter: Karakter) {
font: pdfFont, font: pdfFont,
color: rgb(0.75, 0.75, 0.75), color: rgb(0.75, 0.75, 0.75),
}) })
const kozelharciTB = SignedNumberToText(karakter.KozelharciTB()) const kozelharciTB = karakter.KozelharciTB().map(SignedNumberToText).join("/")
page.drawText(kozelharciTB, { page.drawText(kozelharciTB, {
x: 258, x: 254,
y: 382, y: kozelharciTB.length > 2 ? 386 : 382,
size: kozelharciTB.length > 2 ? (fontSizeBase * 1.5) : fontSizeBase * 2, size: kozelharciTB.length > 2 ? fontSizeBase : fontSizeBase * 2,
font: pdfFont, font: pdfFont,
color: rgb(0, 0, 0), color: rgb(0, 0, 0),
}) })
const celzoTB = SignedNumberToText(karakter.CelzoTB()) const celzoTB = karakter.CelzoTB().map(SignedNumberToText).join("/")
page.drawText(celzoTB, { page.drawText(celzoTB, {
x: 347, x: 344,
y: 382, y: celzoTB.length > 2 ? 386 : 382,
size: celzoTB.length > 2 ? (fontSizeBase * 1.5) : fontSizeBase * 2, size: celzoTB.length > 5 ? fontSizeBase * 0.5 : celzoTB.length > 2 ? fontSizeBase : fontSizeBase * 2,
font: pdfFont, font: pdfFont,
color: rgb(0, 0, 0), color: rgb(0, 0, 0),
}) })