fix PDF weapon damage
This commit is contained in:
@@ -8,6 +8,7 @@ import {DrawMentok} from "./mentok.pdf";
|
|||||||
import {DrawMagic} from "./magic.pdf";
|
import {DrawMagic} from "./magic.pdf";
|
||||||
import {DrawMasodlagosErtekek} from './masodlagos_ertekek.pdf'
|
import {DrawMasodlagosErtekek} from './masodlagos_ertekek.pdf'
|
||||||
import {DrawOsztalySpecialsPage} from './osztaly_specials.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) {
|
function drawBaseInfo(karakter: KarakterPdfView, draw: (text: string, x : number ,y: number, scale: number) => void) {
|
||||||
draw(karakter.Name, 60, 710, 1)
|
draw(karakter.Name, 60, 710, 1)
|
||||||
@@ -74,6 +75,8 @@ export async function CreatePDF(karakter: KarakterPdfView) {
|
|||||||
|
|
||||||
DrawFelszereles(drawText, karakter.Felszereles)
|
DrawFelszereles(drawText, karakter.Felszereles)
|
||||||
|
|
||||||
|
DrawFegyverek(karakter, pdfFont, fontSizeBase, page)
|
||||||
|
|
||||||
DrawMagic(page, fontSizeBase, pdfFont, karakter.NapiMemorizalhatoVarazslatok, karakter.VarazslatMentokNF)
|
DrawMagic(page, fontSizeBase, pdfFont, karakter.NapiMemorizalhatoVarazslatok, karakter.VarazslatMentokNF)
|
||||||
|
|
||||||
const secondPage = pdfDoc.addPage()
|
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 {
|
import {KarakterTulajdonsagok, Modifier, TulajdonsagModosito, TulajdonsagokTotal} from "../domain-models/tulajdonsag";
|
||||||
KarakterTulajdonsagok, Modifier,
|
|
||||||
TulajdonsagModosito,
|
|
||||||
TulajdonsagokTotal
|
|
||||||
} from "../domain-models/tulajdonsag";
|
|
||||||
import {Mentok, MentokAlap, MentoModositok} from "../domain-models/mentok";
|
import {Mentok, MentokAlap, MentoModositok} from "../domain-models/mentok";
|
||||||
import {Kepzettseg, Kepzettsegek} from "../domain-models/kepzettsegek";
|
import {Kepzettseg, Kepzettsegek} from "../domain-models/kepzettsegek";
|
||||||
import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek";
|
import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek";
|
||||||
import {Faj, FajLabel} from "../domain-models/faj";
|
import {Faj, FajLabel} from "../domain-models/faj";
|
||||||
import {
|
import {Osztaly, OsztalyLabel, OsztalySkillsTordelt, Skill} from "../domain-models/osztaly";
|
||||||
Osztaly,
|
|
||||||
OsztalyLabel, OsztalySkillsTordelt,
|
|
||||||
Skill
|
|
||||||
} from "../domain-models/osztaly";
|
|
||||||
import {CelzoTB, KozelharciTB} from "../domain-models/tamadas_bonusz";
|
import {CelzoTB, KozelharciTB} from "../domain-models/tamadas_bonusz";
|
||||||
import {KarakterInputs} from "../domain-models/karakter";
|
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 {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 {
|
export interface KepzettsegPdfView {
|
||||||
KepzettsegName: string
|
KepzettsegName: string
|
||||||
KepzettsegModifier: number
|
KepzettsegModifier: number
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface FegyverPdfView {
|
||||||
|
Name: string
|
||||||
|
TamadoBonusz: number
|
||||||
|
Damage: string
|
||||||
|
Crit: string
|
||||||
|
Range: string
|
||||||
|
}
|
||||||
|
|
||||||
export interface KarakterPdfView {
|
export interface KarakterPdfView {
|
||||||
Name: string
|
Name: string
|
||||||
Nem: string
|
Nem: string
|
||||||
@@ -51,7 +52,7 @@ export interface KarakterPdfView {
|
|||||||
Felszereles: string[]
|
Felszereles: string[]
|
||||||
PancelVO: number
|
PancelVO: number
|
||||||
PajzsVO: number
|
PajzsVO: number
|
||||||
Fegyverek: Fegyver[]
|
Fegyverek: FegyverPdfView[]
|
||||||
}
|
}
|
||||||
|
|
||||||
export function KarakterInputToPdfView(karakter: KarakterInputs): KarakterPdfView {
|
export function KarakterInputToPdfView(karakter: KarakterInputs): KarakterPdfView {
|
||||||
@@ -104,7 +105,7 @@ export function KarakterInputToPdfView(karakter: KarakterInputs): KarakterPdfVie
|
|||||||
Felszereles: felszereles,
|
Felszereles: felszereles,
|
||||||
PajzsVO: pajzs?.VO ?? 0,
|
PajzsVO: pajzs?.VO ?? 0,
|
||||||
PancelVO: pancel?.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,
|
KepzettsegName: kepzettseg.Name,
|
||||||
KepzettsegModifier: modifier,
|
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 {KarakterPdfView} from "./karakter_pdf_view";
|
||||||
import {SignedNumberToText} from "../components/Helpers";
|
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(
|
export function DrawMasodlagosErtekek(
|
||||||
page: PDFPage,
|
page: PDFPage,
|
||||||
karakter: KarakterPdfView,
|
karakter: KarakterPdfView,
|
||||||
@@ -134,14 +85,4 @@ export function DrawMasodlagosErtekek(
|
|||||||
size: celzoFontSize,
|
size: celzoFontSize,
|
||||||
font: pdfFont,
|
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