mirror of
https://github.com/morbalint/kemkas.git
synced 2026-07-17 19:03:46 +00:00
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 <>
|
||||
<div className='row m-2'>
|
||||
<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>
|
||||
<optgroup label='más emberi népek'>
|
||||
<option key={Faj.Amazon} value={Faj.Amazon}>{FajLabel(Faj.Amazon)}</option>
|
||||
|
||||
+32
-12
@@ -1,37 +1,57 @@
|
||||
import React from "react";
|
||||
import {Osztaly} from "../domain-models/osztaly";
|
||||
import {KarakterClass, KarakterInputs} from "../domain-models/karakter";
|
||||
import {SignedNumberToText} from "./Helpers";
|
||||
import {Modifier} from "../domain-models/tulajdonsag";
|
||||
|
||||
function Level2(props: {
|
||||
osztaly: Osztaly
|
||||
karakter: KarakterInputs
|
||||
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 <>
|
||||
<div className='row'>
|
||||
<h5 className='col align-self-center'>2. Szint</h5>
|
||||
</div>
|
||||
<div className='row'>
|
||||
<div className='col-lg-4'>
|
||||
<div className='col-lg-6'>
|
||||
<div className='row m-2'>
|
||||
<label className='col-sm-6 col-8 col-form-label'>Extra Életerő{' '}</label>
|
||||
<span className='col col-form-label'>{SignedNumberToText(rolledHP + Modifier(t_egs))}</span>
|
||||
<label className='col-sm-6 col-8 col-form-label'>Plusz dobott HP{' '}</label>
|
||||
<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 className='col-lg-4'>
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
<div className='col-lg-4'>
|
||||
<div className='row m-2'>
|
||||
<label className='col-sm-6 col-8 col-form-label'>Elsődleges mentő{' '}</label>
|
||||
<span className='col col-form-label'>+1</span>
|
||||
</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>
|
||||
</>
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ function OsztalySelector(props: {currentFaj: Faj, currentOsztaly: Osztaly, chang
|
||||
return <>
|
||||
<div className='row m-2'>
|
||||
<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'>
|
||||
<option value={Osztaly.Harcos}>{OsztalyLabel(Osztaly.Harcos)}</option>
|
||||
{currentFaj === Faj.Amazon && (
|
||||
|
||||
@@ -31,7 +31,7 @@ function TulajdonsagInput(props: {
|
||||
return (<div className='row m-2'>
|
||||
<label className='col-lg-1 col-sm-2 col-form-label'>{tulajdonsag}</label>
|
||||
<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>
|
||||
<span className='col-sm-2 m-2'>
|
||||
{fajiModositoText(currentFaj, fajiModosito)}
|
||||
|
||||
@@ -3,6 +3,7 @@ import {Osztaly} from "./osztaly";
|
||||
import {KarakterTulajdonsagok, Modifier} from "./tulajdonsag";
|
||||
import {CalculateMasodlagosErtekek, KarakterMasodlagosErtekek} from "./masodlagos_ertekek";
|
||||
import {Kepzettseg, Kepzettsegek, KepzettsegId} from "./kepzettsegek";
|
||||
import TamadasBonuszTabla from './tamadas_bonus_tabla.json';
|
||||
|
||||
export interface Karakter {
|
||||
Name: string
|
||||
@@ -17,8 +18,8 @@ export interface Karakter {
|
||||
VO: () => number
|
||||
Mozgas: () => number
|
||||
Kezdemenyezes: () => number
|
||||
KozelharciTB: () => number
|
||||
CelzoTB: () => number
|
||||
KozelharciTB: () => number[]
|
||||
CelzoTB: () => number[]
|
||||
KitartasMentoAlap: () => number
|
||||
ReflexMentoAlap: () => number
|
||||
AkarateroMentoAlap: () => number
|
||||
@@ -54,6 +55,7 @@ export class KarakterClass implements Karakter {
|
||||
public TolvajKepzettsegek: Kepzettseg[]
|
||||
|
||||
private MasodlagosErtekek : KarakterMasodlagosErtekek
|
||||
private HProlls: number[]
|
||||
|
||||
constructor(inputs: KarakterInputs) {
|
||||
this.Name = inputs.name
|
||||
@@ -66,10 +68,14 @@ export class KarakterClass implements Karakter {
|
||||
this.MasodlagosErtekek = CalculateMasodlagosErtekek(inputs.osztaly, inputs.tulajdonsagok)
|
||||
this.Kepzettsegek = inputs.kepzettsegek.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
|
||||
|
||||
@@ -79,32 +85,42 @@ export class KarakterClass implements Karakter {
|
||||
return Modifier(this.Tulajdonsagok.t_ugy) + (this.Osztaly === Osztaly.Tolvaj ? 4 : 0)
|
||||
}
|
||||
|
||||
public TamadasBonusz() : number {
|
||||
public TamadasBonusz() : number[] {
|
||||
let base = []
|
||||
switch (this.Osztaly){
|
||||
case Osztaly.Barbar:
|
||||
case Osztaly.Amazon:
|
||||
case Osztaly.Ijasz:
|
||||
case Osztaly.Kaloz:
|
||||
case Osztaly.Harcos:
|
||||
return 2;
|
||||
base = TamadasBonuszTabla['elsodleges'];
|
||||
break;
|
||||
case Osztaly.Pap:
|
||||
case Osztaly.Tolvaj:
|
||||
return 0;
|
||||
base = TamadasBonuszTabla['ketharmados'];
|
||||
break;
|
||||
case Osztaly.Varazslo:
|
||||
case Osztaly.Illuzionista:
|
||||
return 0;
|
||||
base = TamadasBonuszTabla['feles'];
|
||||
break;
|
||||
}
|
||||
return base[this.Szint-1]
|
||||
}
|
||||
|
||||
public KozelharciTB(): number {
|
||||
public KozelharciTB(): number[] {
|
||||
const base = this.TamadasBonusz();
|
||||
let modifier = Modifier(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 {
|
||||
return this.TamadasBonusz() + Modifier(this.Tulajdonsagok.t_ugy)
|
||||
public CelzoTB(): number[] {
|
||||
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 {
|
||||
@@ -154,4 +170,30 @@ export class KarakterClass implements Karakter {
|
||||
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 {KarakterClass, KarakterInputs} from "../domain-models/karakter";
|
||||
import Level2 from "../components/Level2";
|
||||
import {getRandomInt} from "../domain-models/kockak";
|
||||
|
||||
const tulajdonsagDefaults: KarakterTulajdonsagok = {
|
||||
t_ero: 10,
|
||||
@@ -63,11 +64,19 @@ function CreateCharacterPage() {
|
||||
}
|
||||
|
||||
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() {
|
||||
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 (
|
||||
@@ -137,7 +146,7 @@ function CreateCharacterPage() {
|
||||
<hr />
|
||||
<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'>
|
||||
{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,
|
||||
color: rgb(0.75, 0.75, 0.75),
|
||||
})
|
||||
const kozelharciTB = SignedNumberToText(karakter.KozelharciTB())
|
||||
const kozelharciTB = karakter.KozelharciTB().map(SignedNumberToText).join("/")
|
||||
page.drawText(kozelharciTB, {
|
||||
x: 258,
|
||||
y: 382,
|
||||
size: kozelharciTB.length > 2 ? (fontSizeBase * 1.5) : fontSizeBase * 2,
|
||||
x: 254,
|
||||
y: kozelharciTB.length > 2 ? 386 : 382,
|
||||
size: kozelharciTB.length > 2 ? fontSizeBase : fontSizeBase * 2,
|
||||
font: pdfFont,
|
||||
color: rgb(0, 0, 0),
|
||||
})
|
||||
const celzoTB = SignedNumberToText(karakter.CelzoTB())
|
||||
const celzoTB = karakter.CelzoTB().map(SignedNumberToText).join("/")
|
||||
page.drawText(celzoTB, {
|
||||
x: 347,
|
||||
y: 382,
|
||||
size: celzoTB.length > 2 ? (fontSizeBase * 1.5) : fontSizeBase * 2,
|
||||
x: 344,
|
||||
y: celzoTB.length > 2 ? 386 : 382,
|
||||
size: celzoTB.length > 5 ? fontSizeBase * 0.5 : celzoTB.length > 2 ? fontSizeBase : fontSizeBase * 2,
|
||||
font: pdfFont,
|
||||
color: rgb(0, 0, 0),
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user