fix PDF weapon damage
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -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)),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,3 +122,30 @@ function mapKepzettsegToPdfView(kepzettseg: Kepzettseg, tulajdonsagok: KarakterT
|
||||
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,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user