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 0000000..8e7bc13 Binary files /dev/null and b/public/Merienda-Regular.ttf differ 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"