add masodlagos ertekek at level 1 for 2E create character

This commit is contained in:
2024-01-14 10:59:47 +01:00
committed by Bálint Mórász
parent d56d7c9899
commit e9c4452908
19 changed files with 325 additions and 12 deletions
@@ -0,0 +1,61 @@
import React from "react";
import {OverlayTrigger, Tooltip} from "react-bootstrap";
import {SignedNumberToText} from "../../shared/components/Helpers";
import {MasodlagosErtekekView} from "../domain-models/masodlagos_ertekek";
function MasodlagosErtekek(props: MasodlagosErtekekView) {
const { HP, VO, CelzoTB, Mentok, KozelharciTB } = props
const tooltip = (
<Tooltip id="tooltip">
<strong>Hentelési Potenciál</strong>
</Tooltip>
);
return <>
<div className='row'>
<h5 className='col align-self-center'>Másodlagos értékek</h5>
</div>
<div className='row'>
<div className='col-lg-6'>
<div className='row m-2'>
<label className='col-sm-6 col-8 col-form-label'>Életerő{' '}
<OverlayTrigger placement='top' overlay={tooltip} delay={0} defaultShow={false} flip={false}>
<span>(HP)</span>
</OverlayTrigger>
</label>
<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'>{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'>{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'>{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>
</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>
</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>
</div>
</div>
</div>
</>
}
export default MasodlagosErtekek
@@ -17,6 +17,8 @@ export interface Karakter2E {
kalozKritikus: string[],
kepzettsegek: KepzettsegId[]
tolvajKepzettsegek?: KepzettsegId[]
szint: number,
hpRolls: number[]
}
export const DefaultKarakter: Karakter2E = {
name: 'Névtelen Kalandozó',
@@ -29,4 +31,6 @@ export const DefaultKarakter: Karakter2E = {
kalozKritikus: [],
kepzettsegek: [],
tolvajKepzettsegek: [],
szint: 1,
hpRolls: []
}
@@ -0,0 +1,91 @@
import {Mentok, MentokTotal} from "./mentok";
import {Osztaly2E} from "./osztaly2E";
import {Karakter2E} from "./karakter2E";
import {CelzoTB, KozelharciTB} from "./tamadas_bonusz";
import {Faj2E} from "./faj2E";
// import { GetPajzs, GetPancel, MaxAbilityVO } from "./felszereles";
import {Modifier} from "./tulajdonsag2E";
export interface MasodlagosErtekekView {
HP: number
VO: number
KozelharciTB: number[]
CelzoTB: number[]
Mentok: Mentok
}
export type KarakterpickForMasodlagosErtekek = Pick<Karakter2E, 'osztaly' | 'hpRolls' | 'tulajdonsagok' | 'szint' | 'faj'>
export function BaseHP(osztaly: Osztaly2E) {
let base = 4;
switch (osztaly){
case Osztaly2E.Barbar:
base = 12
break;
case Osztaly2E.Amazon:
case Osztaly2E.Ijasz:
case Osztaly2E.Tengeresz:
case Osztaly2E.Harcos:
case Osztaly2E.Vandor:
base = 10;
break
case Osztaly2E.Pap:
case Osztaly2E.Druida:
base = 8;
break;
case Osztaly2E.Tolvaj:
case Osztaly2E.Dalnok:
base = 6;
break;
case Osztaly2E.Varazslo:
case Osztaly2E.Illuzionista:
base = 4;
break;
}
return base
}
export function HP(karakter: Pick<Karakter2E, '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<Karakter2E, 'tulajdonsagok' | 'faj' | 'osztaly' | 'szint'>): number {
// const pancel = GetPancel(karakter.felszereles.pancelID)
// const pancelVO = pancel?.VO ?? 0
// const pajzsVO = GetPajzs(karakter.felszereles.pajzsID)?.VO ?? 0
// let vo = 10 + pajzsVO + pancelVO
let vo = 10
let abilityVO = Modifier(karakter.tulajdonsagok.t_ugy)
if (karakter.osztaly === Osztaly2E.Tengeresz) {
vo += Math.floor(karakter.szint / 3)
}
if (karakter.osztaly === Osztaly2E.Amazon) {
if (karakter.tulajdonsagok.t_kar > karakter.tulajdonsagok.t_ugy) {
abilityVO = Modifier(karakter.tulajdonsagok.t_kar)
}
vo += Math.floor(karakter.szint / 2)
}
if (karakter.faj === Faj2E.Felszerzet || karakter.faj === Faj2E.Gnom){
vo += 1
}
// if (pancel) {
// abilityVO = Math.min(MaxAbilityVO(pancel.Type), abilityVO)
// }
vo += abilityVO
return vo
}
export function CalculateMasodlagosErtekek(karakter: KarakterpickForMasodlagosErtekek): MasodlagosErtekekView {
return {
HP: HP(karakter),
VO: VO(karakter),
CelzoTB: CelzoTB(karakter),
KozelharciTB: KozelharciTB(karakter),
Mentok: MentokTotal(karakter)
}
}
@@ -0,0 +1,84 @@
import {Osztaly2E} from "./osztaly2E";
import {Karakter2E} from "./karakter2E";
import {KarakterTulajdonsagok, TulajdonsagModosito} from "./tulajdonsag2E";
export interface Mentok {
kitartas: number
reflex: number
akaratero: number
}
export type MentoTipus = keyof Mentok
export function MentoTipusLabel(tipus: MentoTipus): string {
switch (tipus) {
case "akaratero":
return "Akaraterő";
case "kitartas":
return "Kitartás";
case "reflex":
return "Reflex";
}
}
export function ElsodlegesMento(szint: number): number {
return 2 + Math.floor(szint / 2);
}
export function MasodlagosMento(szint: number): number {
return Math.floor(szint / 3)
}
export function ElsodlegesMentok(osztaly: Osztaly2E) : MentoTipus[] {
let t: MentoTipus[] = []
switch (osztaly){
case Osztaly2E.Barbar:
case Osztaly2E.Amazon:
case Osztaly2E.Ijasz:
case Osztaly2E.Tengeresz:
case Osztaly2E.Harcos:
case Osztaly2E.Vandor:
t = ['kitartas'];
break;
case Osztaly2E.Druida:
case Osztaly2E.Pap:
t = ['kitartas', 'akaratero'];
break;
case Osztaly2E.Tolvaj:
case Osztaly2E.Dalnok:
t = ['reflex'];
break;
case Osztaly2E.Varazslo:
case Osztaly2E.Illuzionista:
t = ['akaratero']
break;
}
return t;
}
export function MentokAlap(osztaly: Osztaly2E, szint: number = 1) {
const elsodlegesek = ElsodlegesMentok(osztaly)
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),
}
}
export function MentoModositok(tulajdonsagModositok: KarakterTulajdonsagok) {
return {
kitartas: tulajdonsagModositok.t_egs,
reflex: tulajdonsagModositok.t_ugy,
akaratero: tulajdonsagModositok.t_bol,
}
}
export function MentokTotal(karakter: Pick<Karakter2E, 'osztaly' | 'szint' | 'tulajdonsagok'>) {
const alap = MentokAlap(karakter.osztaly, karakter.szint)
const modositok = MentoModositok(TulajdonsagModosito(karakter.tulajdonsagok))
return {
kitartas: alap.kitartas + modositok.kitartas,
reflex: alap.reflex + modositok.reflex,
akaratero: alap.akaratero + modositok.akaratero,
}
}
@@ -0,0 +1,46 @@
import {Osztaly2E} from "./osztaly2E";
import {Karakter2E} from "./karakter2E";
import {Modifier} from "./tulajdonsag2E";
/// Finally second edition doesn't mess with the extra attack of high level clerics rouges and wizards!
function ExtraAttack(attack: number): number[] {
if (attack < 6) {
return [attack]
}
return [Math.min(attack, 10), ...ExtraAttack(attack - 5)]
}
export function TamadasBonusz(osztaly: Osztaly2E, szint: number = 1) : number[] {
let base = 0
switch (osztaly){
case Osztaly2E.Barbar:
case Osztaly2E.Amazon:
case Osztaly2E.Ijasz:
case Osztaly2E.Tengeresz:
case Osztaly2E.Harcos:
case Osztaly2E.Vandor:
base = szint;
break;
case Osztaly2E.Pap:
case Osztaly2E.Tolvaj:
case Osztaly2E.Dalnok:
case Osztaly2E.Druida:
base = Math.floor(szint * 2 / 3);
break;
case Osztaly2E.Varazslo:
case Osztaly2E.Illuzionista:
base = Math.floor(szint / 2);
break;
}
return ExtraAttack(base)
}
export function KozelharciTB(karakter : Pick<Karakter2E, 'szint' | 'tulajdonsagok' | 'osztaly'>): number[] {
const base = TamadasBonusz(karakter.osztaly, karakter.szint);
let modifier = Modifier(karakter.tulajdonsagok.t_ero)
return base.map(v => v + modifier)
}
export function CelzoTB(karakter : Pick<Karakter2E, 'szint' | 'tulajdonsagok' | 'osztaly'>): number[] {
let base = TamadasBonusz(karakter.osztaly, karakter.szint)
return base.map(v => v + Modifier(karakter.tulajdonsagok.t_ugy))
}
@@ -16,6 +16,8 @@ import {
import KarakterKepzettsegek from "../components/KarakterKepzettsegek2E";
import {TulajdonsagokFajjal} from "../domain-models/faj2E";
import JellemSelector from "../components/JellemSelector";
import MasodlagosErtekek from "../components/MasodlagosErtekek";
import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek";
function CreateCharacter2E(props: {}) {
@@ -109,6 +111,14 @@ function CreateCharacter2E(props: {}) {
changeTolvajKepzettsegek={changeTolvajKepzettseg}
/>
<hr />
{/* 1. szinten */}
<MasodlagosErtekek {...CalculateMasodlagosErtekek({
...karakter,
tulajdonsagok: tulajdonsagokFajjal,
szint: 1,
hpRolls: []
})} />
<hr />
</form>
</div>
<hr/>