WIP basic level up 2nd round
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
+32
-12
@@ -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>
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 && (
|
||||||
|
|||||||
@@ -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)}
|
||||||
|
|||||||
@@ -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]
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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> }
|
||||||
|
|||||||
@@ -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),
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user