From d8d70fc6886c4a2a3c57a218a55800f936f4d11c Mon Sep 17 00:00:00 2001 From: Balint Morasz Date: Sat, 9 Sep 2023 12:42:23 +0200 Subject: [PATCH] add kepzettsegek to the PDF --- .gitignore | 7 +- package.json | 1 + public/Merienda-Regular.ttf | Bin 0 -> 86580 bytes src/domain-models/karakter.ts | 18 ++- src/domain-models/kepzettsegek.ts | 2 +- src/pages/CreateCharacter.tsx | 13 ++- src/pdf/character.pdf.ts | 177 ++++++++++++++++++------------ yarn.lock | 7 ++ 8 files changed, 151 insertions(+), 74 deletions(-) create mode 100644 public/Merienda-Regular.ttf diff --git a/.gitignore b/.gitignore index 3458b55..46a8fab 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,9 @@ npm-debug.log* yarn-debug.log* yarn-error.log* -*.css.map \ No newline at end of file +*.css.map + +# local temp files +/tmp +/temp +/local \ No newline at end of file diff --git a/package.json b/package.json index 1dc4f51..4f50123 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.1.0", "private": true, "dependencies": { + "@pdf-lib/fontkit": "^1.1.1", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", diff --git a/public/Merienda-Regular.ttf b/public/Merienda-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8e7bc13a22b29f5f4b1da5575c826a7f7e16698a GIT binary patch literal 86580 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 !3qA}!Tz~Z<;2Xh7~olO`OSAO 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 literal 0 HcmV?d00001 diff --git a/src/domain-models/karakter.ts b/src/domain-models/karakter.ts index 223426e..201923d 100644 --- a/src/domain-models/karakter.ts +++ b/src/domain-models/karakter.ts @@ -2,12 +2,14 @@ import {Faj} from "./faj"; import {Osztaly} from "./osztaly"; import {KarakterTulajdonsagok, Modifier} from "./tulajdonsag"; import {CalculateMasodlagosErtekek, KarakterMasodlagosErtekek} from "./masodlagos_ertekek"; +import {Kepzettseg} from "./kepzettsegek"; export interface Karakter { Name: string Faj: Faj Osztaly: Osztaly Tulajdonsagok: KarakterTulajdonsagok, + Szint: number MasodlagosErtekek: KarakterMasodlagosErtekek HP: () => number VO: () => number @@ -18,6 +20,8 @@ export interface Karakter { KitartasMentoAlap: () => number ReflexMentoAlap: () => number AkarateroMentoAlap: () => number + Kepzettsegek: Kepzettseg[] + TolvajKepzettsegek: Kepzettseg[] } export class KarakterClass implements Karakter { @@ -26,14 +30,26 @@ export class KarakterClass implements Karakter { public Faj : Faj public Osztaly : Osztaly public Tulajdonsagok : KarakterTulajdonsagok + public Szint : number = 1 public MasodlagosErtekek : KarakterMasodlagosErtekek + public Kepzettsegek: Kepzettseg[] + public TolvajKepzettsegek: Kepzettseg[] - constructor(name: string, faj: Faj, osztaly: Osztaly, tulajdonsagok: KarakterTulajdonsagok) { + constructor( + name: string, + faj: Faj, + osztaly: Osztaly, + tulajdonsagok: KarakterTulajdonsagok, + kepzettsegek: Kepzettseg[], + tolvajKepzettsegek: Kepzettseg[] = [] + ) { this.Name = name this.Faj = faj this.Osztaly = osztaly this.Tulajdonsagok = tulajdonsagok this.MasodlagosErtekek = CalculateMasodlagosErtekek(osztaly, tulajdonsagok) + this.Kepzettsegek = kepzettsegek + this.TolvajKepzettsegek = tolvajKepzettsegek } public HP = () => this.MasodlagosErtekek.HP diff --git a/src/domain-models/kepzettsegek.ts b/src/domain-models/kepzettsegek.ts index 6d34aca..8c246cb 100644 --- a/src/domain-models/kepzettsegek.ts +++ b/src/domain-models/kepzettsegek.ts @@ -34,7 +34,7 @@ export const KepzettsegLista: Kepzettseg[] = [ }, { Id: 'k_csapdak', - Name: 'Csapdák állítása/eltávolítása', + Name: 'Csapdák állítása', Description: 'A karakter a rendelkezésre álló idő és alapanyagok függvényében készíthet szimpla vagy komplex csapdákat. Ha egy csapda eltávolítására tett próba sikertelen, az bizonyos eséllyel kisülhet és veszélybe sodorhatja az óvatlan próbálkozót.', Tulajdonsag: [Tulajdonsag.Ugyesseg], Osztalyok: [Osztaly.Tolvaj], diff --git a/src/pages/CreateCharacter.tsx b/src/pages/CreateCharacter.tsx index 5ef8e34..2c68559 100644 --- a/src/pages/CreateCharacter.tsx +++ b/src/pages/CreateCharacter.tsx @@ -8,7 +8,7 @@ import OsztalySelector from "../components/OsztalySelector"; import KarakterKepzettsegek from "../components/KarakterKepzettsegek"; import {KarakterTulajdonsagok, Modifier} from "../domain-models/tulajdonsag"; import MasodlagosErtekek from "../components/MasodlagosErtekek"; -import {AvailableKezpettsegList, KepzettsegId, TolvajKepzettsegList} from "../domain-models/kepzettsegek"; +import {AvailableKezpettsegList, Kepzettsegek, KepzettsegId, TolvajKepzettsegList} from "../domain-models/kepzettsegek"; import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek"; import {CreatePDF} from "../pdf/character.pdf"; import {KarakterClass} from "../domain-models/karakter"; @@ -56,6 +56,15 @@ function CreateCharacterPage() { changeTolvajKepzettsegek(tolvajKepzettsegek) } + const karakter = () => new KarakterClass( + name, + faj, + osztaly, + tulajdonsagok, + kepzettsegek.map(k => Kepzettsegek[k]), + osztaly === Osztaly.Tolvaj ? tolvajKepzettsegek.map(k => Kepzettsegek[k]) : [] + ) + return (
@@ -105,7 +114,7 @@ function CreateCharacterPage() {
- +
diff --git a/src/pdf/character.pdf.ts b/src/pdf/character.pdf.ts index fb3607a..2f40078 100644 --- a/src/pdf/character.pdf.ts +++ b/src/pdf/character.pdf.ts @@ -1,240 +1,279 @@ import {Karakter} from "../domain-models/karakter"; -import {PDFDocument, rgb, StandardFonts} from "pdf-lib"; +import {PDFDocument, rgb} from "pdf-lib"; +import fontkit from '@pdf-lib/fontkit' import {OsztalyLabel} from "../domain-models/osztaly"; import {FajLabel} from "../domain-models/faj"; import {SignedNumberToText} from "../components/Helpers"; import {Modifier} from "../domain-models/tulajdonsag"; import download from "downloadjs"; +import {Kepzettseg} from "../domain-models/kepzettsegek"; export async function CreatePDF(karakter: Karakter) { const existingPdfBytes = await fetch('/km_karakterlap_hysteria_1.2.pdf').then(res => res.arrayBuffer()) const pdfDoc = await PDFDocument.load(existingPdfBytes) + pdfDoc.registerFontkit(fontkit) - const timesRomanFont = await pdfDoc.embedFont(StandardFonts.Helvetica) + 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) - const fontSize = 12 + page.drawText(karakter.Name, { x: 60, y: 710, - size: fontSize, - font: timesRomanFont, + size: fontSizeBase, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(OsztalyLabel(karakter.Osztaly), { x: 60, y: 672, - size: fontSize, - font: timesRomanFont, + size: fontSizeBase, + font: pdfFont, color: rgb(0, 0, 0), }) - page.drawText('1', { + page.drawText(karakter.Szint.toString(), { x: 264, y: 682, - size: fontSize * 3, - font: timesRomanFont, + size: fontSizeBase * 3, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(FajLabel(karakter.Faj), { x: 304, y: 710, - size: fontSize, - font: timesRomanFont, + size: fontSizeBase, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(karakter.Tulajdonsagok.t_ero.toString(), { x: 130, y: 613, - size: fontSize * 2, - font: timesRomanFont, + size: fontSizeBase * 2, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(SignedNumberToText(Modifier(karakter.Tulajdonsagok.t_ero)), { x: 176, y: 613, - size: fontSize * 2, - font: timesRomanFont, + size: fontSizeBase * 2, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(karakter.Tulajdonsagok.t_ugy.toString(), { x: 130, y: 580, - size: fontSize * 2, - font: timesRomanFont, + size: fontSizeBase * 2, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(SignedNumberToText(Modifier(karakter.Tulajdonsagok.t_ugy)), { x: 176, y: 580, - size: fontSize * 2, - font: timesRomanFont, + size: fontSizeBase * 2, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(karakter.Tulajdonsagok.t_egs.toString(), { x: 130, y: 547, - size: fontSize * 2, - font: timesRomanFont, + size: fontSizeBase * 2, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(SignedNumberToText(Modifier(karakter.Tulajdonsagok.t_egs)), { x: 176, y: 547, - size: fontSize * 2, - font: timesRomanFont, + size: fontSizeBase * 2, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(karakter.Tulajdonsagok.t_int.toString(), { x: 130, y: 515, - size: fontSize * 2, - font: timesRomanFont, + size: fontSizeBase * 2, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(SignedNumberToText(Modifier(karakter.Tulajdonsagok.t_int)), { x: 176, y: 515, - size: fontSize * 2, - font: timesRomanFont, + size: fontSizeBase * 2, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(karakter.Tulajdonsagok.t_bol.toString(), { x: 130, y: 482, - size: fontSize * 2, - font: timesRomanFont, + size: fontSizeBase * 2, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(SignedNumberToText(Modifier(karakter.Tulajdonsagok.t_bol)), { x: 176, y: 482, - size: fontSize * 2, - font: timesRomanFont, + size: fontSizeBase * 2, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(karakter.Tulajdonsagok.t_kar.toString(), { x: 130, y: 449, - size: fontSize * 2, - font: timesRomanFont, + size: fontSizeBase * 2, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(SignedNumberToText(Modifier(karakter.Tulajdonsagok.t_kar)), { x: 176, y: 449, - size: fontSize * 2, - font: timesRomanFont, + size: fontSizeBase * 2, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(karakter.Mozgas().toString(), { x: 162, y: 416, - size: fontSize * 2, - font: timesRomanFont, + size: fontSizeBase * 2, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(SignedNumberToText(karakter.Kezdemenyezes()), { x: 505, y: 416, - size: fontSize * 2, - font: timesRomanFont, + size: fontSizeBase * 2, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(karakter.HP().toString(), { x: 318, y: 517, - size: fontSize * 1.5, - font: timesRomanFont, + size: fontSizeBase * 1.5, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(karakter.VO().toString(), { x: 368, y: 495, - size: fontSize * 3, - font: timesRomanFont, - color: rgb(0, 0, 0), + size: fontSizeBase * 3, + font: pdfFont, + color: rgb(0.5, 0.5, 0.5), }) - page.drawText(SignedNumberToText(karakter.KozelharciTB()), { + const kozelharciTB = SignedNumberToText(karakter.KozelharciTB()) + page.drawText(kozelharciTB, { x: 258, y: 382, - size: fontSize * 2, - font: timesRomanFont, + size: kozelharciTB.length > 2 ? (fontSizeBase * 1.5) : fontSizeBase * 2, + font: pdfFont, color: rgb(0, 0, 0), }) - page.drawText(SignedNumberToText(karakter.CelzoTB()), { + const celzoTB = SignedNumberToText(karakter.CelzoTB()) + page.drawText(celzoTB, { x: 347, y: 382, - size: fontSize * 2, - font: timesRomanFont, + size: celzoTB.length > 2 ? (fontSizeBase * 1.5) : fontSizeBase * 2, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(SignedNumberToText(karakter.KitartasMentoAlap()), { x: 435, y: 613, - size: fontSize, - font: timesRomanFont, + size: fontSizeBase, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(SignedNumberToText(karakter.ReflexMentoAlap()), { x: 435, y: 580, - size: fontSize, - font: timesRomanFont, + size: fontSizeBase, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(SignedNumberToText(karakter.AkarateroMentoAlap()), { x: 435, y: 547, - size: fontSize, - font: timesRomanFont, + size: fontSizeBase, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(SignedNumberToText(Modifier(karakter.Tulajdonsagok.t_egs)), { x: 475, y: 613, - size: fontSize, - font: timesRomanFont, + size: fontSizeBase, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(SignedNumberToText(Modifier(karakter.Tulajdonsagok.t_ugy)), { x: 475, y: 580, - size: fontSize, - font: timesRomanFont, + size: fontSizeBase, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(SignedNumberToText(Modifier(karakter.Tulajdonsagok.t_bol)), { x: 475, y: 547, - size: fontSize, - font: timesRomanFont, + size: fontSizeBase, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(SignedNumberToText(karakter.KitartasMentoAlap() + Modifier(karakter.Tulajdonsagok.t_egs)), { x: 515, y: 613, - size: fontSize, - font: timesRomanFont, + size: fontSizeBase, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(SignedNumberToText(karakter.ReflexMentoAlap() + Modifier(karakter.Tulajdonsagok.t_ugy)), { x: 515, y: 580, - size: fontSize, - font: timesRomanFont, + size: fontSizeBase, + font: pdfFont, color: rgb(0, 0, 0), }) page.drawText(SignedNumberToText(karakter.AkarateroMentoAlap() + Modifier(karakter.Tulajdonsagok.t_bol)), { x: 515, y: 547, - size: fontSize, - font: timesRomanFont, + size: fontSizeBase, + font: pdfFont, color: rgb(0, 0, 0), }) + function DrawKepzettsegek(kepzettsegek: Kepzettseg[], startFrom: number) { + for (let i = 0; i < kepzettsegek.length; i++) { + let kepzettseg = kepzettsegek[i] + page.drawText(kepzettseg.Name, { + x: 60, + y: startFrom - (i * 18), + size: fontSizeBase, + font: pdfFont, + color: rgb(0, 0, 0), + }) + const tulajdonsagErtek = kepzettseg.Tulajdonsag.reduce((maxTulajdonsagErtek, currentTulajdonsag) => + (karakter.Tulajdonsagok[currentTulajdonsag] > maxTulajdonsagErtek) + ? karakter.Tulajdonsagok[kepzettseg.Tulajdonsag[i]] + : maxTulajdonsagErtek, + karakter.Tulajdonsagok[kepzettseg.Tulajdonsag[0]]) + + const kepzettsegModifier = SignedNumberToText(Modifier(tulajdonsagErtek) + karakter.Szint) + page.drawText(kepzettsegModifier, { + x: kepzettsegModifier.length > 2 ? 172 : 175, + y: startFrom - (i * 18), + size: fontSizeBase, + font: pdfFont, + color: rgb(0, 0, 0), + }) + } + } + + DrawKepzettsegek(karakter.Kepzettsegek, 337); + const nextKepzettsegFrom = 337 - (karakter.Kepzettsegek.length * 18) + DrawKepzettsegek(karakter.TolvajKepzettsegek, nextKepzettsegFrom) + const pdfBytes = await pdfDoc.save(); download(pdfBytes, karakter.Name + ".pdf", "application/pdf"); } diff --git a/yarn.lock b/yarn.lock index 9d1e498..4485738 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1675,6 +1675,13 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@pdf-lib/fontkit@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@pdf-lib/fontkit/-/fontkit-1.1.1.tgz#f18473892b65e3253eb73f4569785abd2c03b1e0" + integrity sha512-KjMd7grNapIWS/Dm0gvfHEilSyAmeLvrEGVcqLGi0VYebuqqzTbgF29efCx7tvx+IEbG3zQciRSWl3GkUSvjZg== + dependencies: + pako "^1.0.6" + "@pdf-lib/standard-fonts@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz#8ba691c4421f71662ed07c9a0294b44528af2d7f"