fix PDF weapon damage

This commit is contained in:
2023-10-25 03:05:22 +02:00
parent b278841e5c
commit f35088a95c
4 changed files with 96 additions and 73 deletions
+3
View File
@@ -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()
+51
View File
@@ -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,
})
}
}
+42 -14
View File
@@ -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,
}
}
}
-59
View File
@@ -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
}