refactoring in progress checkpoint reached

goal: remove class by breaking it up into smaller functions
This commit is contained in:
2023-09-23 15:29:41 +02:00
parent 2f4cde091b
commit 960a5a7d92
10 changed files with 220 additions and 33 deletions
-1
View File
@@ -7,7 +7,6 @@
<inspection_tool class="DocumentWriteJS" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="FunctionWithMultipleLoopsJS" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="FunctionWithMultipleReturnPointsJS" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="GrazieInspection" enabled="false" level="GRAMMAR_ERROR" enabled_by_default="false" />
<inspection_tool class="InnerHTMLJS" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="JSHint" enabled="true" level="ERROR" enabled_by_default="true" />
+1 -1
View File
@@ -42,7 +42,7 @@ 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{' '}</label>
<label className='col-sm-6 col-8 col-form-label'>Plusz dobott HP (d{karakterClass.baseHP()}){' '}</label>
<div className='col-sm-2 col'>
<input
className='form-control'
-1
View File
@@ -110,5 +110,4 @@ export function FajSpecials(faj : Faj) : string[] {
"Szintkorlátok: Harcos 9, Pap 9, Tolvaj 6, Varázsló 4",
];
}
return [];
}
+101 -2
View File
@@ -1,9 +1,10 @@
import {Faj} from "./faj";
import {Osztaly} from "./osztaly";
import {KarakterTulajdonsagok, Modifier} from "./tulajdonsag";
import {KarakterTulajdonsagok, Modifier, TulajdonsagModosito} from "./tulajdonsag";
import {Kepzettseg, Kepzettsegek, KepzettsegId} from "./kepzettsegek";
import TamadasBonuszTabla from './tamadas_bonus_tabla.json';
import {ElsodlegesMento, MasodlagosMento, Mentok, MentoTipus} from "./mentok";
import {ElsodlegesMento, MasodlagosMento, Mentok, MentokAlap, MentoModositok, MentoTipus} from "./mentok";
import {CelzoTB, KozelharciTB} from "./tamadas_bonusz";
export interface Karakter {
Name: string
@@ -27,6 +28,29 @@ export interface Karakter {
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[]
}
export interface KarakterInputs {
name: string,
nem?: string,
@@ -41,6 +65,81 @@ 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 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
+3 -3
View File
@@ -1,8 +1,8 @@
export function getRandomInt(max: number) {
return Math.floor(Math.random() * max) + 1;
export function dAny(sides: number) {
return Math.floor(Math.random() * sides) + 1;
}
export function d6() {
return getRandomInt(6)
return dAny(6)
}
+47 -8
View File
@@ -1,3 +1,6 @@
import {Osztaly} from "./osztaly";
import {KarakterTulajdonsagok} from "./tulajdonsag";
export interface Mentok {
kitartas: number
reflex: number
@@ -6,19 +9,14 @@ export interface Mentok {
export type MentoTipus = keyof Mentok
export function MentoTipusLabel(tipus: MentoTipus): string {
let label: string | null = null
switch (tipus) {
case "akaratero":
label = "Akaraterő";
break;
return "Akaraterő";
case "kitartas":
label = "Kitartás";
break;
return "Kitartás";
case "reflex":
label = "Reflex";
break;
return "Reflex";
}
return label
}
export function ElsodlegesMento(szint: number): number {
@@ -28,3 +26,44 @@ export function ElsodlegesMento(szint: number): number {
export function MasodlagosMento(szint: number): number {
return Math.floor(szint / 3)
}
export function ElsodlegesMentok(osztaly: Osztaly) : MentoTipus[] {
let t: MentoTipus[] = []
switch (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
}
export function MentokAlap(osztaly: Osztaly, 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,
}
}
+42
View File
@@ -0,0 +1,42 @@
import {Osztaly} from "./osztaly";
import TamadasBonuszTabla from "./tamadas_bonus_tabla.json";
import {Modifier} from "./tulajdonsag";
import {KarakterInputs} from "./karakter";
export function TamadasBonusz(osztaly: Osztaly, szint: number = 1) : number[] {
let base = []
switch (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]
}
export function KozelharciTB(karakter : Pick<KarakterInputs, 'szint' | 'tulajdonsagok' | 'osztaly'>): number[] {
const base = TamadasBonusz(karakter.osztaly, karakter.szint);
let modifier = Modifier(karakter.tulajdonsagok.t_ero)
if (karakter.osztaly === Osztaly.Kaloz && karakter.tulajdonsagok.t_ugy > karakter.tulajdonsagok.t_ero) {
modifier = Modifier(karakter.tulajdonsagok.t_ugy)
}
return base.map(v => v + modifier)
}
export function CelzoTB(karakter : Pick<KarakterInputs, 'szint' | 'tulajdonsagok' | 'osztaly'>): number[] {
let base = TamadasBonusz(karakter.osztaly, karakter.szint)
if (karakter.osztaly === Osztaly.Ijasz) {
base = [base[0], ...base]
}
return base.map(v => v + Modifier(karakter.tulajdonsagok.t_ugy))
}
+10 -1
View File
@@ -53,7 +53,16 @@ export function RollAllAbilities(setValue: (newValue: KarakterTulajdonsagok) =>
export const Modifier = (val : number) => Math.floor(val / 3) - 3
/* eslint-disable */ /* tslint:disable */
export function TulajdonsagModosito(tulajdonsagok: KarakterTulajdonsagok): KarakterTulajdonsagok {
let response: KarakterTulajdonsagok = { ...tulajdonsagok }
const keys = Object.keys(tulajdonsagok) as (keyof KarakterTulajdonsagok)[]
for (const key of keys) {
response[key] = Modifier(tulajdonsagok[key])
}
return response
}
// noinspection OverlyComplexFunctionJS,FunctionTooLongJS
function tulajdonsagModositokPerFaj(tul: Tulajdonsag, faj: Faj) : number {
switch (faj) {
case Faj.Birodalmi: switch (tul) {
+4 -4
View File
@@ -10,9 +10,9 @@ import {KarakterTulajdonsagok, Modifier} from "../domain-models/tulajdonsag";
import MasodlagosErtekek from "../components/MasodlagosErtekek";
import {AvailableKezpettsegList, TolvajKepzettsegList} from "../domain-models/kepzettsegek";
import {CreatePDF} from "../pdf/character.pdf";
import {KarakterClass, KarakterInputs} from "../domain-models/karakter";
import {KarakterClass, KarakterInputs, KarakterInputToPdfView} from "../domain-models/karakter";
import Level2 from "../components/Level2";
import {getRandomInt} from "../domain-models/kockak";
import {dAny} from "../domain-models/kockak";
const tulajdonsagDefaults: KarakterTulajdonsagok = {
t_ero: 10,
@@ -65,7 +65,7 @@ function CreateCharacterPage() {
function levelUp() {
const dice = karakterClass.baseHP()
const roll = getRandomInt(dice)
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]})
}
@@ -154,7 +154,7 @@ function CreateCharacterPage() {
</div>
<div className='d-grid gap-2 m-5'>
<button className='btn btn-danger btn-lg' type='button' onClick={async () => await CreatePDF(karakterClass)}>Létrehozás</button>
<button className='btn btn-danger btn-lg' type='button' onClick={async () => await CreatePDF(KarakterInputToPdfView(karakter))}>Létrehozás</button>
</div>
</form>
</div>
+12 -12
View File
@@ -1,4 +1,4 @@
import {Karakter} from "../domain-models/karakter";
import {KarakterPdfView} from "../domain-models/karakter";
import {PDFDocument, PDFFont, PDFPage, rgb} from "pdf-lib";
import fontkit from '@pdf-lib/fontkit'
import {OsztalyLabel} from "../domain-models/osztaly";
@@ -95,8 +95,8 @@ function drawTulajdonsagok(page: PDFPage, tulajdonsagok: KarakterTulajdonsagok,
})
}
function drawMentok(page: PDFPage, karakter: Karakter, fontSizeBase: number, pdfFont: PDFFont) {
const mentokAlap = karakter.MentokAlap()
function drawMentok(page: PDFPage, karakter: KarakterPdfView, fontSizeBase: number, pdfFont: PDFFont) {
const mentokAlap = karakter.MentokAlap
page.drawText(SignedNumberToText(mentokAlap.kitartas), {
x: 435,
y: 613,
@@ -139,7 +139,7 @@ function drawMentok(page: PDFPage, karakter: Karakter, fontSizeBase: number, pdf
font: pdfFont,
color: rgb(0, 0, 0),
})
const mentok = karakter.MentokTulajdonsaggal()
const mentok = karakter.MentokModositokkal
page.drawText(SignedNumberToText(mentok.kitartas), {
x: 515,
y: 613,
@@ -163,7 +163,7 @@ function drawMentok(page: PDFPage, karakter: Karakter, fontSizeBase: number, pdf
})
}
function drawBaseInfo(karakter: Karakter, draw: (text: string, x : number ,y: number, scale: number) => void) {
function drawBaseInfo(karakter: KarakterPdfView, draw: (text: string, x : number ,y: number, scale: number) => void) {
draw(karakter.Name, 60, 710, 1)
draw(karakter.Nem, 454, 710, 1)
draw(karakter.Kor.toString(), 454, 690, 1)
@@ -200,7 +200,7 @@ function DrawKepzettsegek(page: PDFPage, fontSizeBase: number, pdfFont: PDFFont,
}
}
export async function CreatePDF(karakter: Karakter) {
export async function CreatePDF(karakter: KarakterPdfView) {
const existingPdfBytes = await fetch('/km_karakterlap_hysteria_1.2.pdf').then(res => res.arrayBuffer())
const pdfDoc = await PDFDocument.load(existingPdfBytes)
@@ -227,35 +227,35 @@ export async function CreatePDF(karakter: Karakter) {
drawTulajdonsagok(page, karakter.Tulajdonsagok, fontSizeBase, pdfFont);
page.drawText(karakter.Mozgas().toString(), {
page.drawText(karakter.Mozgas.toString(), {
x: 162,
y: 416,
size: fontSizeBase * 2,
font: pdfFont,
color: rgb(0, 0, 0),
})
page.drawText(SignedNumberToText(karakter.Kezdemenyezes()), {
page.drawText(SignedNumberToText(karakter.Kezdemenyezes), {
x: 505,
y: 416,
size: fontSizeBase * 2,
font: pdfFont,
color: rgb(0, 0, 0),
})
page.drawText(karakter.HP().toString(), {
page.drawText(karakter.HP.toString(), {
x: 318,
y: 517,
size: fontSizeBase * 1.5,
font: pdfFont,
color: rgb(0, 0, 0),
})
page.drawText(karakter.VO().toString(), {
page.drawText(karakter.VO.toString(), {
x: 368,
y: 495,
size: fontSizeBase * 3,
font: pdfFont,
color: rgb(0.75, 0.75, 0.75),
})
const kozelharciTB = karakter.KozelharciTB().map(SignedNumberToText).join("/")
const kozelharciTB = karakter.KozelharciTB.map(SignedNumberToText).join("/")
page.drawText(kozelharciTB, {
x: 254,
y: kozelharciTB.length > 2 ? 386 : 382,
@@ -263,7 +263,7 @@ export async function CreatePDF(karakter: Karakter) {
font: pdfFont,
color: rgb(0, 0, 0),
})
const celzoTB = karakter.CelzoTB().map(SignedNumberToText).join("/")
const celzoTB = karakter.CelzoTB.map(SignedNumberToText).join("/")
page.drawText(celzoTB, {
x: 344,
y: celzoTB.length > 2 ? 386 : 382,