mirror of
https://github.com/morbalint/kemkas.git
synced 2026-07-17 19:03:46 +00:00
2e feat basic PDF render
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -46,7 +46,6 @@ export async function CreatePDF(karakter: KarakterPdfView) {
|
||||
|
||||
const fontBytes = await fetch('/Merienda-Regular.ttf').then(res => res.arrayBuffer())
|
||||
const pdfFont = await pdfDoc.embedFont(fontBytes)
|
||||
// const pdfFont = await pdfDoc.embedFont(StandardFonts.TimesNewRoman)
|
||||
const fontSizeBase = 12
|
||||
|
||||
const page = pdfDoc.getPage(0)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import React from "react";
|
||||
import {Fegyver} from "../domain-models/felszereles";
|
||||
|
||||
export function FegyverLabel(fegyver: Fegyver): string {
|
||||
export function FegyverFlags(fegyver: Fegyver): string {
|
||||
const flags = [] as string[]
|
||||
if (fegyver.Megterheltseg) {
|
||||
flags.push("M")
|
||||
@@ -47,17 +47,15 @@ export function FegyverLabel(fegyver: Fegyver): string {
|
||||
if (fegyver.Rohamtoro) {
|
||||
flags.push("RT")
|
||||
}
|
||||
// Replaced by new group "dobhato"
|
||||
// if (fegyver.EroBonusz) {
|
||||
// flags.push("ER")
|
||||
// }
|
||||
if (fegyver.Megjegyzes != null && fegyver.Megjegyzes.length > 0) {
|
||||
flags.push(fegyver.Megjegyzes)
|
||||
}
|
||||
const serializedFlags = flags.reduce((p,c) => `${p}${c} `, '');
|
||||
return flags.join(' ');
|
||||
}
|
||||
|
||||
export function FegyverLabel(fegyver: Fegyver): string {
|
||||
const serializedFlags = FegyverFlags(fegyver) + (fegyver.Megjegyzes != null ? " " + fegyver.Megjegyzes : "");
|
||||
const sizeLabel = fegyver.Size < 1 && fegyver.Size > 0 ? ` [1/${Math.round(1 / fegyver.Size)}]` : (fegyver.Size > 1 ? ` [${fegyver.Size}]` : '');
|
||||
return `${fegyver.Name}${sizeLabel} ${serializedFlags.length > 0 ? "| " + serializedFlags : ''}| ${
|
||||
fegyver.DamageMultiplier > 1 ? `${fegyver.DamageMultiplier}*` : ''}${fegyver.NumberOfDamageDice}d${fegyver.DamageDice}${fegyver.DamageBonus > 0 ? ` +${fegyver.DamageBonus}` : ''} ${
|
||||
return `${fegyver.Name}${sizeLabel} | ${serializedFlags.length > 0 ? serializedFlags + " |" : ''}${
|
||||
fegyver.DamageMultiplier > 1 ? `${fegyver.DamageMultiplier}*` : ''}${
|
||||
fegyver.NumberOfDamageDice}d${fegyver.DamageDice}${fegyver.DamageBonus > 0 ? ` +${fegyver.DamageBonus}` : ''} ${
|
||||
fegyver.CritRangeStart < 20 ? `${fegyver.CritRangeStart}-20` : ''}x${fegyver.CritMultiplier}${
|
||||
fegyver.Price > 0 ? ` | ár: ${fegyver.Price} at ` : ''}${
|
||||
fegyver.Range > 10 ? ` | táv: ${fegyver.Range}` : ''}`
|
||||
|
||||
@@ -2,7 +2,7 @@ import React from "react";
|
||||
|
||||
import {Faj2E, FajLabel} from "../domain-models/faj2E";
|
||||
import {Modifier} from "../domain-models/tulajdonsag2E";
|
||||
import {SignedNumberToText} from "../../shared/helpers";
|
||||
import {SignedNumberToText} from "../../shared/components/Helpers";
|
||||
|
||||
|
||||
function fajiModositoText(faj: Faj2E, szamolas: (f: Faj2E) => number) : string {
|
||||
|
||||
@@ -120,7 +120,7 @@ function setOsztalyForSzintLepes(szintlepesek: Szintlepes[], osztaly: Osztaly2E,
|
||||
export function ChangeLvl1Osztaly(karakter: Karakter2E, osztaly: Osztaly2E): Karakter2E {
|
||||
return {
|
||||
...karakter,
|
||||
szintlepesek: [{...karakter.szintlepesek[0], osztaly}, ...karakter.szintlepesek.slice(1)]
|
||||
szintlepesek: [{...karakter.szintlepesek[0], HProll: BaseHP(osztaly) , osztaly}, ...karakter.szintlepesek.slice(1)]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -53,6 +53,24 @@ export function HP(karakter: Pick<Karakter2E, 'tulajdonsagok' | 'szintlepesek'>)
|
||||
.reduce((sum, val) => sum + val, 0)
|
||||
}
|
||||
|
||||
export function VOegyeb(karakter: Pick<Karakter2E, 'faj'| 'szintlepesek'>): number {
|
||||
const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly))
|
||||
let vo = 0;
|
||||
if (osztalyok.has(Osztaly2E.Tengeresz)) {
|
||||
const kalozSzintek = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Tengeresz).length
|
||||
vo += Math.floor(kalozSzintek / 3)
|
||||
}
|
||||
if (osztalyok.has(Osztaly2E.Amazon)) {
|
||||
|
||||
const amazonSzintek = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Amazon).length
|
||||
vo += Math.floor(amazonSzintek / 2)
|
||||
}
|
||||
if (karakter.faj === Faj2E.Felszerzet || karakter.faj === Faj2E.Gnom){
|
||||
vo += 1
|
||||
}
|
||||
return vo;
|
||||
}
|
||||
|
||||
export function VO(karakter: Pick<Karakter2E, 'tulajdonsagok' | 'faj' | 'szintlepesek' | 'szint' | 'felszereles'>): number {
|
||||
const osztalyok = new Set(karakter.szintlepesek.map(x => x.osztaly))
|
||||
const pancel = GetPancel(karakter.felszereles.pancelID)
|
||||
@@ -63,20 +81,12 @@ export function VO(karakter: Pick<Karakter2E, 'tulajdonsagok' | 'faj' | 'szintle
|
||||
if (pancel) {
|
||||
abilityVO = Math.min(MaxAbilityVO(pancel.Type), abilityVO)
|
||||
}
|
||||
if (osztalyok.has(Osztaly2E.Tengeresz)) {
|
||||
const kalozSzintek = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Tengeresz).length
|
||||
vo += Math.floor(kalozSzintek / 3)
|
||||
}
|
||||
if (osztalyok.has(Osztaly2E.Amazon)) {
|
||||
if (osztalyok.has(Osztaly2E.Amazon)){
|
||||
if (karakter.tulajdonsagok.t_kar > karakter.tulajdonsagok.t_ugy) {
|
||||
abilityVO = Modifier(karakter.tulajdonsagok.t_kar)
|
||||
}
|
||||
const amazonSzintek = karakter.szintlepesek.filter(x => x.osztaly === Osztaly2E.Amazon).length
|
||||
vo += Math.floor(amazonSzintek / 2)
|
||||
}
|
||||
if (karakter.faj === Faj2E.Felszerzet || karakter.faj === Faj2E.Gnom){
|
||||
vo += 1
|
||||
}
|
||||
vo += VOegyeb(karakter)
|
||||
vo += abilityVO
|
||||
|
||||
return vo
|
||||
|
||||
@@ -9,9 +9,12 @@ import {AllowedFegyver} from "./allowed-fegyver";
|
||||
export interface Szintlepes {
|
||||
osztaly: Osztaly2E;
|
||||
HProll: number;
|
||||
tolvajExtraKepzettseg?: KepzettsegId; // only at level 5 and 9
|
||||
harcosFegyver?: string; // every 3rd level
|
||||
kalozKritikus?: string; // every odd level
|
||||
// only at level 5 and 9
|
||||
tolvajExtraKepzettseg?: KepzettsegId;
|
||||
// every odd level
|
||||
harcosFegyver?: string;
|
||||
// every 3rd level
|
||||
kalozKritikus?: string;
|
||||
tulajdonsagNoveles?: Tulajdonsag2E;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import React, {useContext, useState} from 'react'
|
||||
import {useLoaderData, useNavigate, useParams} from "react-router-dom";
|
||||
import {Button, InputGroup, Modal, OverlayTrigger, Toast, ToastContainer, Tooltip} from "react-bootstrap";
|
||||
import {Button, InputGroup, Modal, OverlayTrigger, Toast, ToastContainer} from "react-bootstrap";
|
||||
import {ChangeLvl1Osztaly, DefaultKarakter, Karakter2E} from "../domain-models/karakter2E";
|
||||
import {KarakterTulajdonsagok} from "../domain-models/tulajdonsag2E";
|
||||
import FajSelector2E from "../components/FajSelector2E";
|
||||
@@ -32,6 +32,8 @@ import {
|
||||
} from "../api/character.api";
|
||||
import {Faro} from "@grafana/faro-web-sdk";
|
||||
import Form from "react-bootstrap/Form";
|
||||
import {CreatePDF} from "../pdf/character.pdf";
|
||||
import {KarakterInputToPdfView} from "../pdf/karakter_pdf_view";
|
||||
|
||||
function CreateCharacter2E(props: {
|
||||
faro?: Faro
|
||||
@@ -272,18 +274,16 @@ function CreateCharacter2E(props: {
|
||||
</div>
|
||||
</div>
|
||||
<div className="col-6">
|
||||
<OverlayTrigger
|
||||
placement='top'
|
||||
overlay={<Tooltip id="pdf-btn-tooltip">Hamarosan!</Tooltip>}
|
||||
delay={0}
|
||||
defaultShow={false}
|
||||
flip={false}
|
||||
trigger={"hover"}
|
||||
>
|
||||
<div className='d-grid gap-2 m-5'>
|
||||
<button className='btn btn-secondary btn-lg' disabled={true} type='button'>PDF</button>
|
||||
</div>
|
||||
</OverlayTrigger>
|
||||
<div className='d-grid gap-2 m-5'>
|
||||
<button className='btn btn-danger btn-lg' type='button' onClick={async () => {
|
||||
faro?.api.pushEvent('character_created', {
|
||||
osztaly: karakter.szintlepesek[0].osztaly,
|
||||
szint: karakter.szint.toString(),
|
||||
faj: karakter.faj.toString(),
|
||||
})
|
||||
await CreatePDF(KarakterInputToPdfView(karakter))
|
||||
}}>PDF</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
import {KarakterPdfView} from "./karakter_pdf_view";
|
||||
import {PDFDocument} from "pdf-lib";
|
||||
import fontkit from "@pdf-lib/fontkit";
|
||||
import download from "downloadjs";
|
||||
import {SignedNumberToText} from "../../shared/components/Helpers";
|
||||
|
||||
export async function CreatePDF(karakter: KarakterPdfView) {
|
||||
const existingPdfBytes = await fetch('/kem2karakterlap_form.pdf').then(res => res.arrayBuffer())
|
||||
const pdfDoc = await PDFDocument.load(existingPdfBytes)
|
||||
pdfDoc.registerFontkit(fontkit)
|
||||
|
||||
const fontBytes = await fetch('/Milonga-Regular.ttf').then(res => res.arrayBuffer())
|
||||
const pdfFont = await pdfDoc.embedFont(fontBytes)
|
||||
|
||||
const form = pdfDoc.getForm()
|
||||
|
||||
const osztalyok = karakter.Osztaly.length > 1 ? karakter.Osztaly.map(x => `${x.osztaly} (${x.szint})`).join(", ") : karakter.Osztaly[0].osztaly
|
||||
form.getTextField("nev_faj_osztaly").setText(`${karakter.Nev}, ${karakter.Faj} ${osztalyok}`)
|
||||
|
||||
form.getTextField("szint").setText((karakter.SzintTotal.length > 1 ? " " : " ") + karakter.SzintTotal)
|
||||
form.getTextField("jellem").setText(karakter.Jellem)
|
||||
form.getTextField("istenseg").setText(karakter.Isten)
|
||||
|
||||
form.getTextField("vo").setText(karakter.VO.toString())
|
||||
form.getTextField("pancel").setText(" " + karakter.PancelVO)
|
||||
form.getTextField("pajzs").setText(" " + karakter.PajzsVO)
|
||||
form.getTextField("egyeb_vo").setText(" " + karakter.EgyebVO)
|
||||
|
||||
form.getTextField("tul_ero").setText(` ${karakter.Tulajdonsagok.t_ero}`)
|
||||
form.getTextField("tul_ero_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_ero))
|
||||
form.getTextField("tul_ugy").setText(` ${karakter.Tulajdonsagok.t_ugy}`)
|
||||
form.getTextField("tul_ugy_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_ugy))
|
||||
form.getTextField("tul_egs").setText(` ${karakter.Tulajdonsagok.t_egs}`)
|
||||
form.getTextField("tul_egs_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_egs))
|
||||
form.getTextField("tul_int").setText(` ${karakter.Tulajdonsagok.t_int}`)
|
||||
form.getTextField("tul_int_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_int))
|
||||
form.getTextField("tul_bol").setText(` ${karakter.Tulajdonsagok.t_bol}`)
|
||||
form.getTextField("tul_bol_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_bol))
|
||||
form.getTextField("tul_kar").setText(` ${karakter.Tulajdonsagok.t_kar}`)
|
||||
form.getTextField("tul_kar_mod").setText(SignedNumberToText(karakter.TulajdonsagModositok.t_kar))
|
||||
|
||||
form.getTextField("hp_rolls").setText(karakter.HPszintenkent.join(", "))
|
||||
form.getTextField("hp_aktualis").setText(karakter.HP.toString())
|
||||
|
||||
form.getTextField("kitartas_alap").setText(" " + karakter.MentokAlap.kitartas.toString())
|
||||
form.getTextField("kitartas_mod").setText(" " + SignedNumberToText(karakter.MentoModositok.kitartas))
|
||||
form.getTextField("kitartas_sum").setText(" " + karakter.MentokModositokkal.kitartas.toString())
|
||||
|
||||
form.getTextField("reflex_alap").setText(" " + karakter.MentokAlap.reflex.toString())
|
||||
form.getTextField("reflex_mod").setText(" " + SignedNumberToText(karakter.MentoModositok.reflex))
|
||||
form.getTextField("reflex_sum").setText(" " + karakter.MentokModositokkal.reflex.toString())
|
||||
|
||||
form.getTextField("akaratero_alap").setText(" " + karakter.MentokAlap.akaratero.toString())
|
||||
form.getTextField("akaratero_mod").setText(" " + SignedNumberToText(karakter.MentoModositok.akaratero))
|
||||
form.getTextField("akaratero_sum").setText(" " + karakter.MentokModositokkal.akaratero.toString())
|
||||
|
||||
form.getTextField("kezdemenyezes").setText(" " + SignedNumberToText(karakter.Kezdemenyezes))
|
||||
|
||||
form.getTextField("tamadas_bonusz_alap").setText(karakter.TamadasBonuszAlap.join("/"))
|
||||
form.getTextField("tamadas_bonusz_ero").setText(" " + SignedNumberToText(karakter.TulajdonsagModositok.t_ero))
|
||||
form.getTextField("tamadas_bonusz_kozelharc").setText(karakter.KozelharciTB.join("/"))
|
||||
form.getTextField("tamadas_bonusz_ugy").setText(" " + SignedNumberToText(karakter.TulajdonsagModositok.t_ugy))
|
||||
form.getTextField("tamadas_bonusz_tavolsagi").setText(karakter.CelzoTB.join("/"))
|
||||
|
||||
for (let i = 0; i < karakter.Kepzettsegek.length; i++) {
|
||||
const kepzettseg = karakter.Kepzettsegek[i]
|
||||
form.getTextField(`kepzettseg_${i}_nev`).setText(kepzettseg.nev)
|
||||
form.getTextField(`kepzettseg_${i}_alap`).setText(kepzettseg.alap)
|
||||
form.getTextField(`kepzettseg_${i}_bonusz`).setText(kepzettseg.bonusz)
|
||||
form.getTextField(`kepzettseg_${i}_osszes`).setText(kepzettseg.osszes)
|
||||
}
|
||||
for (let i = 0; i < karakter.Fegyverek.length; i++) {
|
||||
form.getTextField(`fegyver_${i+1}`).setText(karakter.Fegyverek[i])
|
||||
}
|
||||
|
||||
for (let i = 0; i < karakter.FelszerelesViselt.length && i < 8; i++) {
|
||||
form.getTextField(`viselt_${i}`).setText(karakter.FelszerelesViselt[i])
|
||||
}
|
||||
for (let i = 0; i < karakter.FelszerelesCipelt.length && i < 8; i++) {
|
||||
form.getTextField(`cipelt_${i}`).setText(karakter.FelszerelesCipelt[i])
|
||||
}
|
||||
for (let i = 0; i < karakter.FelszerelesAprosagok.length && i < 8; i++) {
|
||||
form.getTextField(`aprosagok_${i}`).setText(karakter.FelszerelesAprosagok[i])
|
||||
}
|
||||
|
||||
form.updateFieldAppearances(pdfFont)
|
||||
|
||||
const pdfBytes = await pdfDoc.save();
|
||||
download(pdfBytes, `${karakter.Nev}_${karakter.SzintTotal}.pdf`, "application/pdf");
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
import {Modifier, TulajdonsagokTotal} from "../domain-models/tulajdonsag2E";
|
||||
import {Mentok, MentoModositok, MultiClassMentokAlap} from "../domain-models/mentok";
|
||||
import {CalculateMasodlagosErtekek, VOegyeb} from "../domain-models/masodlagos_ertekek";
|
||||
import {FajLabel} from "../domain-models/faj2E";
|
||||
import {Osztaly2E, OsztalyLabel} from "../domain-models/osztaly2E";
|
||||
import {CelzoTB, KozelharciTB, MultiClassTamadasBonusz} from "../domain-models/tamadas_bonusz";
|
||||
import {Karakter2E} from "../domain-models/karakter2E";
|
||||
import {GetJellem} from "../domain-models/jellem";
|
||||
import {GetFegyver, GetPajzs, GetPancel} from '../domain-models/felszereles'
|
||||
import {
|
||||
KarakterTulajdonsagok,
|
||||
TulajdonsagModosito
|
||||
} from "../domain-models/tulajdonsag2E";
|
||||
import {SignedNumberToText} from "../../shared/components/Helpers";
|
||||
import {Kepzettseg, Kepzettsegek} from "../domain-models/kepzettsegek2E";
|
||||
import {getClassLevels} from "../domain-models/szintlepes";
|
||||
import {FegyverFlags} from "../components/FegyverSelector";
|
||||
|
||||
interface KepzettsegPdfView {
|
||||
nev: string,
|
||||
alap: string,
|
||||
bonusz: string,
|
||||
osszes: string
|
||||
}
|
||||
|
||||
export interface KarakterPdfView {
|
||||
Nev: string
|
||||
Isten: string
|
||||
Jellem: string
|
||||
Faj: string
|
||||
Osztaly: {osztaly: string, szint: number}[]
|
||||
Tulajdonsagok: KarakterTulajdonsagok,
|
||||
TulajdonsagModositok: KarakterTulajdonsagok,
|
||||
SzintTotal: string
|
||||
HP: number
|
||||
HPszintenkent: number[]
|
||||
VO: number
|
||||
PancelVO: string
|
||||
PajzsVO: string
|
||||
EgyebVO: string
|
||||
Kezdemenyezes: number
|
||||
TamadasBonuszAlap: number[]
|
||||
KozelharciTB: number[]
|
||||
CelzoTB: number[]
|
||||
MentokAlap: Mentok
|
||||
MentoModositok: Mentok
|
||||
MentokModositokkal: Mentok,
|
||||
Kepzettsegek: KepzettsegPdfView[],
|
||||
Fegyverek: string[],
|
||||
FelszerelesViselt: string[],
|
||||
FelszerelesCipelt: string[],
|
||||
FelszerelesAprosagok: string[],
|
||||
}
|
||||
|
||||
export function KarakterInputToPdfView(karakter: Karakter2E): KarakterPdfView {
|
||||
const tulajdonsagok = TulajdonsagokTotal(karakter)
|
||||
karakter = {...karakter, tulajdonsagok}
|
||||
const tulajdonsagModositok = TulajdonsagModosito(tulajdonsagok)
|
||||
const masodlagosErtekek = CalculateMasodlagosErtekek(karakter)
|
||||
const pancel = GetPancel(karakter.felszereles.pancelID)
|
||||
const pajzs = GetPajzs(karakter.felszereles.pajzsID)
|
||||
const kezdemenyezes = tulajdonsagModositok.t_ugy + (karakter.szintlepesek.some(x => x.osztaly === Osztaly2E.Tolvaj) ? 4 : 0)
|
||||
|
||||
const mentok = MultiClassMentokAlap(karakter.szintlepesek)
|
||||
const mentoModositok = MentoModositok(tulajdonsagModositok)
|
||||
|
||||
const osztalyok = new Array(...(new Set(karakter.szintlepesek.map(x => x.osztaly))))
|
||||
const osztaly = osztalyok.map(x => ({
|
||||
osztaly: OsztalyLabel(x),
|
||||
szint: karakter.szintlepesek.filter(sz => sz.osztaly === x).length
|
||||
}))
|
||||
|
||||
const classLevels = getClassLevels(karakter.szintlepesek)
|
||||
|
||||
let felszereles = [] as string[]
|
||||
if(pancel != null){
|
||||
felszereles = felszereles.concat(FelszerelesToPdfView(pancel))
|
||||
}
|
||||
if(pajzs != null){
|
||||
felszereles = felszereles.concat(FelszerelesToPdfView(pajzs))
|
||||
}
|
||||
|
||||
felszereles = felszereles.concat(karakter.felszereles.fegyverIDk.map(x => {
|
||||
const fegyver = GetFegyver(x)
|
||||
if (fegyver == null) {
|
||||
console.error("unknown fegyver: " + x)
|
||||
return []
|
||||
}
|
||||
return FelszerelesToPdfView(fegyver)
|
||||
}).reduce((acc, item) => acc.concat(item), [] as string[]))
|
||||
|
||||
return {
|
||||
Faj: FajLabel(karakter.faj).toLowerCase(),
|
||||
Isten: karakter.isten || "",
|
||||
Jellem: GetJellem(karakter.jellem).Label,
|
||||
Nev: karakter.nev,
|
||||
Tulajdonsagok: karakter.tulajdonsagok,
|
||||
Osztaly: osztaly,
|
||||
SzintTotal: karakter.szint.toString(),
|
||||
TulajdonsagModositok: tulajdonsagModositok,
|
||||
|
||||
HP: masodlagosErtekek.HP,
|
||||
HPszintenkent: karakter.szintlepesek.map(x => x.HProll),
|
||||
|
||||
Kezdemenyezes: kezdemenyezes,
|
||||
|
||||
TamadasBonuszAlap: MultiClassTamadasBonusz(karakter.szintlepesek),
|
||||
KozelharciTB: KozelharciTB(karakter),
|
||||
CelzoTB: CelzoTB(karakter),
|
||||
|
||||
MentoModositok: mentoModositok,
|
||||
MentokAlap: mentok,
|
||||
MentokModositokkal: masodlagosErtekek.Mentok,
|
||||
|
||||
VO: masodlagosErtekek.VO,
|
||||
PajzsVO: SignedNumberToText(pajzs?.VO),
|
||||
PancelVO: SignedNumberToText(pancel?.VO),
|
||||
EgyebVO: SignedNumberToText(VOegyeb(karakter)),
|
||||
|
||||
Kepzettsegek:
|
||||
karakter.kepzettsegek.map(k =>
|
||||
mapKepzettsegToPdfView(Kepzettsegek[k], tulajdonsagok, karakter.szint))
|
||||
.concat(karakter.tolvajKepzettsegek?.map(k =>
|
||||
mapKepzettsegToPdfView(Kepzettsegek[k], tulajdonsagok, classLevels[Osztaly2E.Tolvaj])) || []),
|
||||
|
||||
Fegyverek: karakter.felszereles.fegyverIDk.slice(0, 4).map(fid => {
|
||||
const fegyver = GetFegyver(fid)
|
||||
if (fegyver == null) {
|
||||
console.error("unknown fegyver: " + fid)
|
||||
return ""
|
||||
}
|
||||
const serializedFlags = FegyverFlags(fegyver);
|
||||
const critStart = fegyver.CritRangeStart - karakter.szintlepesek.filter(x => x.kalozKritikus === fegyver.Id).length
|
||||
const damageBonus = fegyver.DamageBonus +
|
||||
(fegyver.KetkezesBonusz ? 1 : 0) +
|
||||
(fegyver.Type !== "lofegyver" || fegyver.EroBonusz ? tulajdonsagModositok.t_ero : 0) +
|
||||
(karakter.szintlepesek.filter(x => x.harcosFegyver === fegyver.Id).length * 2)
|
||||
return `${fegyver.Name} ${serializedFlags.length > 0 ? serializedFlags + " " : ''} ${
|
||||
fegyver.DamageMultiplier > 1 ? `${fegyver.DamageMultiplier}*` : ''}${
|
||||
fegyver.NumberOfDamageDice}d${fegyver.DamageDice}${damageBonus !== 0 ? `${
|
||||
SignedNumberToText(damageBonus)}` : ''} ${
|
||||
critStart < 20 ? `${critStart}-20` : '20'}x${fegyver.CritMultiplier}`
|
||||
}),
|
||||
FelszerelesViselt: felszereles,
|
||||
FelszerelesCipelt: [],
|
||||
FelszerelesAprosagok: []
|
||||
}
|
||||
}
|
||||
|
||||
interface FelszerelesPdf {
|
||||
Name: string,
|
||||
Size: number,
|
||||
}
|
||||
|
||||
function FelszerelesToPdfView(item: FelszerelesPdf): string[] {
|
||||
const ans = [item.Name]
|
||||
for (let i = 1; i < item.Size; i ++) {
|
||||
ans.push("+")
|
||||
}
|
||||
return ans
|
||||
}
|
||||
|
||||
function mapKepzettsegToPdfView(kepzettseg: Kepzettseg, tulajdonsagok: KarakterTulajdonsagok, szint: number): KepzettsegPdfView {
|
||||
const tulajdonsagErtek = kepzettseg.Tulajdonsag.reduce((maxTulajdonsagErtek, currentTulajdonsag) =>
|
||||
tulajdonsagok[currentTulajdonsag] > maxTulajdonsagErtek
|
||||
? tulajdonsagok[currentTulajdonsag]
|
||||
: maxTulajdonsagErtek,
|
||||
tulajdonsagok[kepzettseg.Tulajdonsag[0]])
|
||||
|
||||
return {
|
||||
nev: kepzettseg.Name,
|
||||
alap: szint.toString(),
|
||||
bonusz: SignedNumberToText(Modifier(tulajdonsagErtek)),
|
||||
osszes: (szint + Modifier(tulajdonsagErtek)).toString(),
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,3 @@
|
||||
export function SignedNumberToText(val: number) : string {
|
||||
return val === 0 ? " 0" : (val > 0 ? '+'+val : val.toString())
|
||||
export function SignedNumberToText(val?: number) : string {
|
||||
return (val === null || val === undefined) ? "" : (val === 0 ? " 0" : (val > 0 ? '+'+val : val.toString()))
|
||||
}
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
export function SignedNumberToText(val: number) : string {
|
||||
return val === 0 ? " 0" : (val > 0 ? '+'+val : val.toString())
|
||||
}
|
||||
Reference in New Issue
Block a user