From f35088a95ce0ac22daf8ee86472b7868f4073e47 Mon Sep 17 00:00:00 2001 From: Balint Morasz Date: Wed, 25 Oct 2023 03:05:22 +0200 Subject: [PATCH] fix PDF weapon damage --- src/pdf/character.pdf.ts | 3 ++ src/pdf/fegyverek.pdf.ts | 51 ++++++++++++++++++++++++++ src/pdf/karakter_pdf_view.ts | 56 +++++++++++++++++++++-------- src/pdf/masodlagos_ertekek.pdf.ts | 59 ------------------------------- 4 files changed, 96 insertions(+), 73 deletions(-) create mode 100644 src/pdf/fegyverek.pdf.ts diff --git a/src/pdf/character.pdf.ts b/src/pdf/character.pdf.ts index 1857b73..4a3b196 100644 --- a/src/pdf/character.pdf.ts +++ b/src/pdf/character.pdf.ts @@ -8,6 +8,7 @@ import {DrawMentok} from "./mentok.pdf"; import {DrawMagic} from "./magic.pdf"; import {DrawMasodlagosErtekek} from './masodlagos_ertekek.pdf' import {DrawOsztalySpecialsPage} from './osztaly_specials.pdf' +import {DrawFegyverek} from "./fegyverek.pdf"; function drawBaseInfo(karakter: KarakterPdfView, draw: (text: string, x : number ,y: number, scale: number) => void) { draw(karakter.Name, 60, 710, 1) @@ -74,6 +75,8 @@ export async function CreatePDF(karakter: KarakterPdfView) { DrawFelszereles(drawText, karakter.Felszereles) + DrawFegyverek(karakter, pdfFont, fontSizeBase, page) + DrawMagic(page, fontSizeBase, pdfFont, karakter.NapiMemorizalhatoVarazslatok, karakter.VarazslatMentokNF) const secondPage = pdfDoc.addPage() diff --git a/src/pdf/fegyverek.pdf.ts b/src/pdf/fegyverek.pdf.ts new file mode 100644 index 0000000..76655d0 --- /dev/null +++ b/src/pdf/fegyverek.pdf.ts @@ -0,0 +1,51 @@ +import {KarakterPdfView} from "./karakter_pdf_view"; +import {PDFFont, PDFPage} from "pdf-lib"; +import {SignedNumberToText} from "../components/Helpers"; + +function fitTextInWidth(font: PDFFont, text: string, startingSize: number, maxWidth: number): number { + let size = startingSize + while(font.widthOfTextAtSize(text, size) > maxWidth) { + size-- + } + return size +} + +export function DrawFegyverek(karakter: KarakterPdfView, pdfFont: PDFFont, fontSizeBase: number, page: PDFPage) { + const startFrom = 337 + for (let i = 0; i < karakter.Fegyverek.length && i < 3; i++) { + const fegyver = karakter.Fegyverek[i]; + const size = fitTextInWidth(pdfFont, fegyver.Name, fontSizeBase, 60) + page.drawText(fegyver.Name, { + x: 200, + y: startFrom - (i * 18) + ((18 - pdfFont.heightAtSize(size)) / 3), + size: size, + font: pdfFont, + }) + page.drawText(SignedNumberToText(fegyver.TamadoBonusz), { + x: 265, + y: startFrom - (i * 18), + size: fontSizeBase, + font: pdfFont, + }) + const damageSize = fitTextInWidth(pdfFont, fegyver.Damage, fontSizeBase, 24) + page.drawText(fegyver.Damage, { + x: 291, + y: startFrom - (i * 18) + ((18 - pdfFont.heightAtSize(damageSize)) / 3), + size: damageSize, + font: pdfFont, + }) + const critSize = fitTextInWidth(pdfFont, fegyver.Crit, fontSizeBase, 35) + page.drawText(fegyver.Crit, { + x: 318, + y: startFrom - (i * 18) + ((18 - pdfFont.heightAtSize(critSize)) / 3), + size: critSize, + font: pdfFont, + }) + page.drawText(fegyver.Range, { + x: 360, + y: startFrom - (i * 18), + size: fontSizeBase, + font: pdfFont, + }) + } +} diff --git a/src/pdf/karakter_pdf_view.ts b/src/pdf/karakter_pdf_view.ts index f933f07..ccc303a 100644 --- a/src/pdf/karakter_pdf_view.ts +++ b/src/pdf/karakter_pdf_view.ts @@ -1,28 +1,29 @@ -import { - KarakterTulajdonsagok, Modifier, - TulajdonsagModosito, - TulajdonsagokTotal -} from "../domain-models/tulajdonsag"; +import {KarakterTulajdonsagok, Modifier, TulajdonsagModosito, TulajdonsagokTotal} from "../domain-models/tulajdonsag"; import {Mentok, MentokAlap, MentoModositok} from "../domain-models/mentok"; import {Kepzettseg, Kepzettsegek} from "../domain-models/kepzettsegek"; import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek"; import {Faj, FajLabel} from "../domain-models/faj"; -import { - Osztaly, - OsztalyLabel, OsztalySkillsTordelt, - Skill -} from "../domain-models/osztaly"; +import {Osztaly, OsztalyLabel, OsztalySkillsTordelt, Skill} from "../domain-models/osztaly"; import {CelzoTB, KozelharciTB} from "../domain-models/tamadas_bonusz"; import {KarakterInputs} from "../domain-models/karakter"; -import {NapiVarazslatok, CalculateVarazslatMentokNF} from "../domain-models/memorizalt_varazslatok"; +import {CalculateVarazslatMentokNF, NapiVarazslatok} from "../domain-models/memorizalt_varazslatok"; import {GetJellem} from "../domain-models/jellem"; -import {GetPancel, GetPajzs, Fegyver, GetFegyverek} from '../domain-models/felszereles' +import {Fegyver, GetFegyverek, GetPajzs, GetPancel} from '../domain-models/felszereles' +import {SignedNumberToText} from "../components/Helpers"; export interface KepzettsegPdfView { KepzettsegName: string KepzettsegModifier: number } +export interface FegyverPdfView { + Name: string + TamadoBonusz: number + Damage: string + Crit: string + Range: string +} + export interface KarakterPdfView { Name: string Nem: string @@ -51,7 +52,7 @@ export interface KarakterPdfView { Felszereles: string[] PancelVO: number PajzsVO: number - Fegyverek: Fegyver[] + Fegyverek: FegyverPdfView[] } export function KarakterInputToPdfView(karakter: KarakterInputs): KarakterPdfView { @@ -104,7 +105,7 @@ export function KarakterInputToPdfView(karakter: KarakterInputs): KarakterPdfVie Felszereles: felszereles, PajzsVO: pajzs?.VO ?? 0, PancelVO: pancel?.VO ?? 0, - Fegyverek: fegyverek, + Fegyverek: fegyverek.map(mapFegyverToPdfView(karakter)), } } @@ -120,4 +121,31 @@ function mapKepzettsegToPdfView(kepzettseg: Kepzettseg, tulajdonsagok: KarakterT KepzettsegName: kepzettseg.Name, KepzettsegModifier: modifier, } +} + +function mapFegyverToPdfView(karakter: KarakterInputs) { + return (fegyver: Fegyver): FegyverPdfView => { + const simplifiedName = fegyver.Name.includes('és') ? fegyver.Name.split(' ')[0] : fegyver.Name + const tb = fegyver.Type === 'kozelharci' ? KozelharciTB(karakter)[0] : CelzoTB(karakter)[0] + const tulajdonsagModositok = TulajdonsagModosito(TulajdonsagokTotal(karakter)) + let damageModifier = fegyver.Type === 'kozelharci' || (fegyver.Id === 'visszacsapo_ij' && tulajdonsagModositok.t_ero > 0) ? tulajdonsagModositok.t_ero : 0 + damageModifier += karakter.harcosSpecializaciok.filter(x => x === fegyver.Id).length * 2 + if (fegyver.Id === 'visszacsapo_ij' && tulajdonsagModositok.t_ero > 0) { // "hozzaadhato", so only add if positive + damageModifier += tulajdonsagModositok.t_ero + } + if (fegyver.Ketkezes) { + damageModifier += Math.floor(tulajdonsagModositok.t_ero / 2) + } + const damage = `${fegyver.NumberOfDamageDice > 1 ? fegyver.NumberOfDamageDice.toString() : ''}d${fegyver.DamageDice}${damageModifier !== 0 ? SignedNumberToText(damageModifier) : ''}` + const critStart = fegyver.CritRangeStart - karakter.kalozKritikus.filter(x => x === fegyver.Id).length + const crit = `${critStart < 20 ? `${critStart}-20` : '20'} x${fegyver.CritMultiplier}` + const range = fegyver.Range === 0 ? '-' : fegyver.Range.toString() + return { + Name: simplifiedName, + TamadoBonusz: tb, + Damage: damage, + Crit: crit, + Range: range, + } + } } \ No newline at end of file diff --git a/src/pdf/masodlagos_ertekek.pdf.ts b/src/pdf/masodlagos_ertekek.pdf.ts index e1e90f8..2b0000f 100644 --- a/src/pdf/masodlagos_ertekek.pdf.ts +++ b/src/pdf/masodlagos_ertekek.pdf.ts @@ -2,55 +2,6 @@ import {PDFFont, PDFPage} from "pdf-lib"; import {KarakterPdfView} from "./karakter_pdf_view"; import {SignedNumberToText} from "../components/Helpers"; -function drawFegyverek(karakter: KarakterPdfView, pdfFont: PDFFont, fontSizeBase: number, page: PDFPage) { - const startFrom = 337 - for (let i = 0; i < karakter.Fegyverek.length && i < 3; i++) { - const fegyver = karakter.Fegyverek[i]; - const simplifiedName = fegyver.Name.includes('és') ? fegyver.Name.split(' ')[0] : fegyver.Name - const size = fitTextInWidth(pdfFont, simplifiedName, fontSizeBase, 60) - page.drawText(simplifiedName, { - x: 200, - y: startFrom - (i * 18) + ((18 - pdfFont.heightAtSize(size)) / 3), - size: size, - font: pdfFont, - }) - const tb = SignedNumberToText(fegyver.Type === 'kozelharci' ? karakter.KozelharciTB[0] : karakter.CelzoTB[0]) - page.drawText(tb, { - x: 265, - y: startFrom - (i * 18), - size: fontSizeBase, - font: pdfFont, - }) - const damage = `${fegyver.NumberOfDamageDice > 1 ? fegyver.NumberOfDamageDice.toString() : ''}d${fegyver.DamageDice}${fegyver.Type === 'kozelharci' && karakter.TulajdonsagModositok.t_ero > 0 ? ` + ${karakter.TulajdonsagModositok.t_ero}` : ''}` - const damageSize = fitTextInWidth(pdfFont, damage, fontSizeBase, 24) - if (damageSize !== fontSizeBase) { - console.log('font size: ', damageSize) - console.log('width of text: ', pdfFont.widthOfTextAtSize(damage, damageSize)) - } - page.drawText(damage, { - x: 291, - y: startFrom - (i * 18) + ((18 - pdfFont.heightAtSize(damageSize)) / 3), - size: damageSize, - font: pdfFont, - }) - const crit = `${fegyver.CritRangeStart < 20 ? `${fegyver.CritRangeStart}-20` : '20'} x${fegyver.CritMultiplier}` - const critSize = fitTextInWidth(pdfFont, crit, fontSizeBase, 35) - page.drawText(crit, { - x: 318, - y: startFrom - (i * 18) + ((18 - pdfFont.heightAtSize(critSize)) / 3), - size: critSize, - font: pdfFont, - }) - const range = fegyver.Range === 0 ? '-' : fegyver.Range.toString() - page.drawText(range, { - x: 360, - y: startFrom - (i * 18), - size: fontSizeBase, - font: pdfFont, - }) - } -} - export function DrawMasodlagosErtekek( page: PDFPage, karakter: KarakterPdfView, @@ -134,14 +85,4 @@ export function DrawMasodlagosErtekek( size: celzoFontSize, font: pdfFont, }) - - drawFegyverek(karakter, pdfFont, fontSizeBase, page); -} - -function fitTextInWidth(font: PDFFont, text: string, startingSize: number, maxWidth: number): number { - let size = startingSize - while(font.widthOfTextAtSize(text, size) > maxWidth) { - size-- - } - return size }