From 4cb1da19a02ae360a4bba7adc118110d9a907969 Mon Sep 17 00:00:00 2001 From: Balint Morasz Date: Tue, 5 Sep 2023 22:16:05 +0200 Subject: [PATCH] the very basics of pdf generation --- package.json | 3 + public/index.html | 3 + public/km_karakterlap_hysteria_1.2.pdf | Bin 0 -> 39586 bytes src/components/KarakterKepzettsegek.tsx | 19 +++- src/components/MasodlagosErtekek.tsx | 119 ++--------------------- src/domain-models/karakter.ts | 12 +++ src/domain-models/masodlagos_ertekek.ts | 124 ++++++++++++++++++++++++ src/pages/CreateCharacter.tsx | 73 ++++++++++++-- yarn.lock | 41 +++++++- 9 files changed, 271 insertions(+), 123 deletions(-) create mode 100644 public/km_karakterlap_hysteria_1.2.pdf create mode 100644 src/domain-models/karakter.ts create mode 100644 src/domain-models/masodlagos_ertekek.ts diff --git a/package.json b/package.json index 7e438c5..1dc4f51 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,8 @@ "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", "bootstrap": "^5.3.0", + "downloadjs": "^1.4.7", + "pdf-lib": "^1.17.1", "react": "^18.2.0", "react-bootstrap": "^2.8.0", "react-dom": "^18.2.0", @@ -45,6 +47,7 @@ }, "devDependencies": { "@babel/plugin-proposal-private-property-in-object": "^7.21.11", + "@types/downloadjs": "^1.4.3", "less": "^4.2.0", "less-loader": "^11.1.3" } diff --git a/public/index.html b/public/index.html index 1df5935..c4a30b5 100644 --- a/public/index.html +++ b/public/index.html @@ -24,6 +24,9 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> + + + Kém Karakter App diff --git a/public/km_karakterlap_hysteria_1.2.pdf b/public/km_karakterlap_hysteria_1.2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1120e6b82ee45b8662d67ca47d838682c22e78d5 GIT binary patch literal 39586 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 literal 0 HcmV?d00001 diff --git a/src/components/KarakterKepzettsegek.tsx b/src/components/KarakterKepzettsegek.tsx index d9d0364..450710e 100644 --- a/src/components/KarakterKepzettsegek.tsx +++ b/src/components/KarakterKepzettsegek.tsx @@ -7,7 +7,20 @@ import { TolvajKepzettsegList, } from "../domain-models/kepzettsegek"; -function InternalKepzettsegekSelector(props: {title: string, numberOfKepzettseg: number, getKepzettsegListaN: (n: number) => Kepzettseg[], kepzettsegek: KepzettsegId[], changeKepzettsegek: (newKepzettsegek: KepzettsegId[]) => void}) { +function arraySetN(array: T[], n: number, elem: T): T[] { + if (array.length < n || n < 0) { + return array + } + return [...array.slice(0, n), elem, ...array.slice(n+1)] +} + +function InternalKepzettsegekSelector(props: { + title: string, + numberOfKepzettseg: number, + getKepzettsegListaN: (n: number) => Kepzettseg[], + kepzettsegek: KepzettsegId[], + changeKepzettsegek: (newKepzettsegek: KepzettsegId[]) => void +}) { const {title, numberOfKepzettseg, getKepzettsegListaN, kepzettsegek, changeKepzettsegek} = props const klist = Array.from(new Array(numberOfKepzettseg).keys()) @@ -22,7 +35,7 @@ function InternalKepzettsegekSelector(props: {title: string, numberOfKepzettseg: preCalculated.push({ kepzettsegek: getKepzettsegListaN(i), selected: Kepzettsegek[kepzettsegek[i]], - changeKepzettseg: (newKepzettseg: KepzettsegId) => { changeKepzettsegek([...kepzettsegek.slice(0, i), newKepzettseg, ...kepzettsegek.slice(i+1)]) } + changeKepzettseg: (newKepzettseg: KepzettsegId) => changeKepzettsegek(arraySetN(kepzettsegek, i, newKepzettseg)) }) } @@ -34,7 +47,7 @@ function InternalKepzettsegekSelector(props: {title: string, numberOfKepzettseg:
- {klist.filter(i => i < preCalculated.length && preCalculated[i].selected != null).map((idx) => + {klist.map((idx) => tulajdonsagok.t_ero) { - return base + Modifier(tulajdonsagok.t_ugy) - } - return base + Modifier(tulajdonsagok.t_ero) -} - -function KitartasMento(osztaly: Osztaly) : number { - switch (osztaly){ - case Osztaly.Barbar: - case Osztaly.Amazon: - case Osztaly.Ijasz: - case Osztaly.Kaloz: - case Osztaly.Harcos: - case Osztaly.Pap: - return 2; - case Osztaly.Tolvaj: - case Osztaly.Varazslo: - case Osztaly.Illuzionista: - return 0; - } -} - -function ReflexMento(osztaly: Osztaly) : number { - switch (osztaly){ - case Osztaly.Tolvaj: - return 2; - case Osztaly.Barbar: - case Osztaly.Amazon: - case Osztaly.Ijasz: - case Osztaly.Kaloz: - case Osztaly.Harcos: - case Osztaly.Pap: - case Osztaly.Varazslo: - case Osztaly.Illuzionista: - return 0; - } -} - -function AkarateroMento(osztaly: Osztaly) : number { - switch (osztaly){ - case Osztaly.Pap: - case Osztaly.Varazslo: - case Osztaly.Illuzionista: - return 2; - case Osztaly.Tolvaj: - case Osztaly.Barbar: - case Osztaly.Amazon: - case Osztaly.Ijasz: - case Osztaly.Kaloz: - case Osztaly.Harcos: - return 0; - } -} - -function MasodlagosErtekek(props: {osztaly: Osztaly, tulajdonsagok: KarakterTulajdonsagok}) { - - const { osztaly, tulajdonsagok } = props; + const { ertekek } = props const tooltip = ( @@ -125,33 +26,33 @@ function MasodlagosErtekek(props: {osztaly: Osztaly, tulajdonsagok: KarakterTula (HP) -

{HP(osztaly, tulajdonsagok.t_egs)}

+

{ertekek.HP}

-

{10+Modifier(tulajdonsagok.t_ugy)}

+

{ertekek.VO}

-

{SignedNumberToText(KozelharciTB(osztaly, tulajdonsagok))}

+

{SignedNumberToText(ertekek.KozelHarciTB)}

-

{SignedNumberToText(TamadasBonusz(osztaly) + Modifier(tulajdonsagok.t_ugy))}

+

{SignedNumberToText(ertekek.CelzoTB)}

-

{SignedNumberToText(KitartasMento(osztaly) + Modifier(tulajdonsagok.t_egs))}

+

{SignedNumberToText(ertekek.KitartasMento)}

-

{SignedNumberToText(ReflexMento(osztaly) + Modifier(tulajdonsagok.t_ugy))}

+

{SignedNumberToText(ertekek.ReflexMento)}

-

{SignedNumberToText(AkarateroMento(osztaly) + Modifier(tulajdonsagok.t_bol))}

+

{SignedNumberToText(ertekek.AkarateroMento)}

diff --git a/src/domain-models/karakter.ts b/src/domain-models/karakter.ts new file mode 100644 index 0000000..bb65393 --- /dev/null +++ b/src/domain-models/karakter.ts @@ -0,0 +1,12 @@ +import {Faj} from "./faj"; +import {Osztaly} from "./osztaly"; +import {KarakterTulajdonsagok} from "./tulajdonsag"; +import {KarakterMasodlagosErtekek} from "./masodlagos_ertekek"; + +export interface Karakter { + Name: string + Faj: Faj + Osztaly: Osztaly + Tulajdonsagok: KarakterTulajdonsagok, + MasodlagosErtekek: KarakterMasodlagosErtekek +} \ No newline at end of file diff --git a/src/domain-models/masodlagos_ertekek.ts b/src/domain-models/masodlagos_ertekek.ts new file mode 100644 index 0000000..ff49c93 --- /dev/null +++ b/src/domain-models/masodlagos_ertekek.ts @@ -0,0 +1,124 @@ +import {Osztaly} from "./osztaly"; +import {KarakterTulajdonsagok, Modifier} from "./tulajdonsag"; + +export interface KarakterMasodlagosErtekek { + HP: number + VO: number + CelzoTB: number + KozelHarciTB: number + KitartasMento: number + ReflexMento: number + AkarateroMento: number +} + +export function CalculateMasodlagosErtekek(osztaly: Osztaly, tulajdonsagok: KarakterTulajdonsagok) : KarakterMasodlagosErtekek { + return { + HP: HP(osztaly, tulajdonsagok.t_egs), + VO: 10 + Modifier(tulajdonsagok.t_ugy), + KozelHarciTB: KozelharciTB(osztaly, tulajdonsagok), + CelzoTB: TamadasBonusz(osztaly) + Modifier(tulajdonsagok.t_ugy), + + KitartasMento: KitartasMento(osztaly) + Modifier(tulajdonsagok.t_egs), + ReflexMento: ReflexMento(osztaly) + Modifier(tulajdonsagok.t_ugy), + AkarateroMento: AkarateroMento(osztaly) + Modifier(tulajdonsagok.t_bol), + } +} + +function HP(osztaly: Osztaly, egeszseg: number) { + let base = 4; + switch (osztaly){ + case Osztaly.Barbar: + base = 12 + break; + case Osztaly.Amazon: + case Osztaly.Ijasz: + case Osztaly.Kaloz: + case Osztaly.Harcos: + base = 10; + break + case Osztaly.Pap: + base = 8; + break; + case Osztaly.Tolvaj: + base = 6; + break; + case Osztaly.Varazslo: + case Osztaly.Illuzionista: + base = 4; + break; + } + return base + Modifier(egeszseg) +} + +function TamadasBonusz(osztaly: Osztaly) : number { + switch (osztaly){ + case Osztaly.Barbar: + case Osztaly.Amazon: + case Osztaly.Ijasz: + case Osztaly.Kaloz: + case Osztaly.Harcos: + return 2; + case Osztaly.Pap: + case Osztaly.Tolvaj: + return 0; + case Osztaly.Varazslo: + case Osztaly.Illuzionista: + return 0; + } +} + +function KozelharciTB(osztaly: Osztaly, tulajdonsagok: KarakterTulajdonsagok): number { + const base = TamadasBonusz(osztaly); + if (osztaly === Osztaly.Kaloz && tulajdonsagok.t_ugy > tulajdonsagok.t_ero) { + return base + Modifier(tulajdonsagok.t_ugy) + } + return base + Modifier(tulajdonsagok.t_ero) +} + +function KitartasMento(osztaly: Osztaly) : number { + switch (osztaly){ + case Osztaly.Barbar: + case Osztaly.Amazon: + case Osztaly.Ijasz: + case Osztaly.Kaloz: + case Osztaly.Harcos: + case Osztaly.Pap: + return 2; + case Osztaly.Tolvaj: + case Osztaly.Varazslo: + case Osztaly.Illuzionista: + return 0; + } +} + +function ReflexMento(osztaly: Osztaly) : number { + switch (osztaly){ + case Osztaly.Tolvaj: + return 2; + case Osztaly.Barbar: + case Osztaly.Amazon: + case Osztaly.Ijasz: + case Osztaly.Kaloz: + case Osztaly.Harcos: + case Osztaly.Pap: + case Osztaly.Varazslo: + case Osztaly.Illuzionista: + return 0; + } +} + +function AkarateroMento(osztaly: Osztaly) : number { + switch (osztaly){ + case Osztaly.Pap: + case Osztaly.Varazslo: + case Osztaly.Illuzionista: + return 2; + case Osztaly.Tolvaj: + case Osztaly.Barbar: + case Osztaly.Amazon: + case Osztaly.Ijasz: + case Osztaly.Kaloz: + case Osztaly.Harcos: + return 0; + } +} diff --git a/src/pages/CreateCharacter.tsx b/src/pages/CreateCharacter.tsx index 1298a97..fc7509c 100644 --- a/src/pages/CreateCharacter.tsx +++ b/src/pages/CreateCharacter.tsx @@ -1,7 +1,7 @@ import React, {useState} from 'react'; import './CreateCharacter.css' -import {Faj} from "../domain-models/faj"; -import {Osztaly} from "../domain-models/osztaly" +import {Faj, FajLabel} from "../domain-models/faj"; +import {Osztaly, OsztalyLabel} from "../domain-models/osztaly" import FajSelector from "../components/FajSelector"; import Tulajdonsagok from "../components/Tulajdonsagok"; import OsztalySelector from "../components/OsztalySelector"; @@ -9,6 +9,10 @@ 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 {PDFDocument, rgb, StandardFonts} from 'pdf-lib' +import download from 'downloadjs' +import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek"; +import {Karakter} from "../domain-models/karakter"; const tulajdonsagDefaults: KarakterTulajdonsagok = { t_ero: 10, @@ -33,22 +37,65 @@ function getNumberOfKepzettsegek(t_int: number, faj: Faj, max: number) { return numberOfKepzettseg; } +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) + + const timesRomanFont = await pdfDoc.embedFont(StandardFonts.Helvetica) + + const page = pdfDoc.getPage(0) + const fontSize = 12 + page.drawText(karakter.Name, { + x: 60, + y: 710, + size: fontSize, + font: timesRomanFont, + color: rgb(0, 0, 0), + }) + page.drawText(OsztalyLabel(karakter.Osztaly), { + x: 60, + y: 672, + size: fontSize, + font: timesRomanFont, + color: rgb(0, 0, 0), + }) + page.drawText('1', { + x: 264, + y: 682, + size: fontSize * 3, + font: timesRomanFont, + color: rgb(0, 0, 0), + }) + page.drawText(FajLabel(karakter.Faj), { + x: 304, + y: 710, + size: fontSize, + font: timesRomanFont, + color: rgb(0, 0, 0), + }) + + + const pdfBytes = await pdfDoc.save(); + download(pdfBytes, "karakter.pdf", "application/pdf"); +} + function CreateCharacterPage() { - let [name, changeName] = useState("Névtelen kanadozó") + let [name, changeName] = useState("Névtelen kalandozó") let [faj, changeFaj] = useState(Faj.Ember) let [tulajdonsagok, changeTulajdonsagok] = useState(tulajdonsagDefaults) - let [currentOsztaly, changeOsztaly] = useState(Osztaly.Harcos) + let [osztaly, changeOsztaly] = useState(Osztaly.Harcos) let [kepzettsegek, changeKepzettsegek] = useState([]) let [tolvajKepzettsegek, changeTolvajKepzettsegek] = useState([]) - const availableKepzettsegList = AvailableKezpettsegList(currentOsztaly) + const availableKepzettsegList = AvailableKezpettsegList(osztaly) - if (currentOsztaly !== Osztaly.Tolvaj && tolvajKepzettsegek.length > 0) { + if (osztaly !== Osztaly.Tolvaj && tolvajKepzettsegek.length > 0) { tolvajKepzettsegek = [] changeTolvajKepzettsegek([]) } - if (currentOsztaly === Osztaly.Tolvaj && tolvajKepzettsegek.length === 0) { + if (osztaly === Osztaly.Tolvaj && tolvajKepzettsegek.length === 0) { tolvajKepzettsegek = TolvajKepzettsegList.slice(0, 4).map(x => x.Id) changeTolvajKepzettsegek(tolvajKepzettsegek) } @@ -59,7 +106,13 @@ function CreateCharacterPage() {

Karakter létrehozása

-
console.log("Character created!")}> + { event.preventDefault(); await createPDF({ + Name: name, + Faj: faj, + MasodlagosErtekek: CalculateMasodlagosErtekek(osztaly, tulajdonsagok), + Osztaly: osztaly, + Tulajdonsagok: tulajdonsagok + })} }>
Származás
@@ -86,7 +139,7 @@ function CreateCharacterPage() {

- +
diff --git a/yarn.lock b/yarn.lock index 4c0166e..9d1e498 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1675,6 +1675,20 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@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" + integrity sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA== + dependencies: + pako "^1.0.6" + +"@pdf-lib/upng@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@pdf-lib/upng/-/upng-1.0.1.tgz#7dc9c636271aca007a9df4deaf2dd7e7960280cb" + integrity sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ== + dependencies: + pako "^1.0.10" + "@pmmmwh/react-refresh-webpack-plugin@^0.5.3": version "0.5.10" resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz#2eba163b8e7dbabb4ce3609ab5e32ab63dda3ef8" @@ -2038,6 +2052,11 @@ dependencies: "@types/node" "*" +"@types/downloadjs@^1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@types/downloadjs/-/downloadjs-1.4.3.tgz#01c0414a9756afa2bd438b1e2ec6c50de7df316d" + integrity sha512-MjJepFle/tLtT2/jmDNth6ZnwWzEhm40L+olE5HKR70ISUCfgT55eqreeHldAzFLY2HDUGsn8zgyto8KygN0CA== + "@types/eslint-scope@^3.7.3": version "3.7.4" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" @@ -4018,6 +4037,11 @@ dotenv@^10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +downloadjs@^1.4.7: + version "1.4.7" + resolved "https://registry.yarnpkg.com/downloadjs/-/downloadjs-1.4.7.tgz#f69f96f940e0d0553dac291139865a3cd0101e3c" + integrity sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q== + duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -6912,6 +6936,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +pako@^1.0.10, pako@^1.0.11, pako@^1.0.6: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -6995,6 +7024,16 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pdf-lib@^1.17.1: + version "1.17.1" + resolved "https://registry.yarnpkg.com/pdf-lib/-/pdf-lib-1.17.1.tgz#9e7dd21261a0c1fb17992580885b39e7d08f451f" + integrity sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw== + dependencies: + "@pdf-lib/standard-fonts" "^1.0.0" + "@pdf-lib/upng" "^1.0.1" + pako "^1.0.11" + tslib "^1.11.1" + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -8966,7 +9005,7 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1: +tslib@^1.11.1, tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==