diff --git a/Kemkas.Web/appsettings.Development.json b/Kemkas.Web/appsettings.Development.json index 82b00bb..47cedb2 100644 --- a/Kemkas.Web/appsettings.Development.json +++ b/Kemkas.Web/appsettings.Development.json @@ -14,5 +14,23 @@ }, "ConnectionStrings": { "DefaultConnection": "Host=127.0.0.1;Port=5432;User Id=kemkas;Password=kemkas-dev42" + }, + "Email": { + "DomainName": "mail.kemkas.hu", + "ApiKey": "fake" + }, + "Authentication": { + "Google": { + "ClientId": "fake", + "ClientSecret": "fake" + }, + "Facebook": { + "ClientId": "fake", + "ClientSecret": "fake" + }, + "Discord": { + "ClientId": "fake", + "ClientSecret": "fake" + } } } diff --git a/Kemkas.Web/frontend/src/first-edition/components/BasicNewLevel.tsx b/Kemkas.Web/frontend/src/first-edition/components/BasicNewLevel.tsx index 9032b43..95774d1 100644 --- a/Kemkas.Web/frontend/src/first-edition/components/BasicNewLevel.tsx +++ b/Kemkas.Web/frontend/src/first-edition/components/BasicNewLevel.tsx @@ -1,6 +1,6 @@ import React from "react"; import {KarakterInputs} from "../domain-models/karakter"; -import {SignedNumberToText} from "./Helpers"; +import {SignedNumberToText} from "../../shared/components/Helpers"; import {Mentok, MentoTipus, MentoTipusLabel, MentokTotal} from "../domain-models/mentok"; import {BaseHP, HP} from "../domain-models/masodlagos_ertekek"; import {TamadasBonusz} from "../domain-models/tamadas_bonusz"; diff --git a/Kemkas.Web/frontend/src/first-edition/components/MasodlagosErtekek.tsx b/Kemkas.Web/frontend/src/first-edition/components/MasodlagosErtekek.tsx index bd9b066..cd0566a 100644 --- a/Kemkas.Web/frontend/src/first-edition/components/MasodlagosErtekek.tsx +++ b/Kemkas.Web/frontend/src/first-edition/components/MasodlagosErtekek.tsx @@ -1,6 +1,6 @@ import React from "react"; import {OverlayTrigger, Tooltip} from "react-bootstrap"; -import {SignedNumberToText} from "./Helpers"; +import {SignedNumberToText} from "../../shared/components/Helpers"; import {MasodlagosErtekekView} from "../domain-models/masodlagos_ertekek"; function MasodlagosErtekek(props: MasodlagosErtekekView) { diff --git a/Kemkas.Web/frontend/src/first-edition/components/TulajdonsagInput.tsx b/Kemkas.Web/frontend/src/first-edition/components/TulajdonsagInput.tsx index 4806ada..fde9158 100644 --- a/Kemkas.Web/frontend/src/first-edition/components/TulajdonsagInput.tsx +++ b/Kemkas.Web/frontend/src/first-edition/components/TulajdonsagInput.tsx @@ -2,7 +2,7 @@ import React from "react"; import {Faj, FajLabel} from "../domain-models/faj"; import {Modifier} from "../domain-models/tulajdonsag"; -import {SignedNumberToText} from "./Helpers"; +import {SignedNumberToText} from "../../shared/components/Helpers"; function fajiModositoText(faj: Faj, szamolas: (f: Faj) => number) : string { diff --git a/Kemkas.Web/frontend/src/first-edition/components/TulajdonsagNoveles.tsx b/Kemkas.Web/frontend/src/first-edition/components/TulajdonsagNoveles.tsx index 101a1dc..6e7f6f3 100644 --- a/Kemkas.Web/frontend/src/first-edition/components/TulajdonsagNoveles.tsx +++ b/Kemkas.Web/frontend/src/first-edition/components/TulajdonsagNoveles.tsx @@ -6,7 +6,7 @@ import { TulajdonsagIDs, TulajdonsagLabel } from "../domain-models/tulajdonsag"; -import {SignedNumberToText} from "./Helpers"; +import {SignedNumberToText} from "../../shared/components/Helpers"; function TulajdonsagNoveles(props: {tulajdonsagok: KarakterTulajdonsagok, szint: number, tulajdonsagNovelesek: Tulajdonsag[], changeTulajdonsagNoveles: (tulajdonsag: Tulajdonsag) => void}) { const {tulajdonsagok, szint, tulajdonsagNovelesek, changeTulajdonsagNoveles} = props diff --git a/Kemkas.Web/frontend/src/first-edition/pdf/character.pdf.ts b/Kemkas.Web/frontend/src/first-edition/pdf/character.pdf.ts index 50123d4..f571c8e 100644 --- a/Kemkas.Web/frontend/src/first-edition/pdf/character.pdf.ts +++ b/Kemkas.Web/frontend/src/first-edition/pdf/character.pdf.ts @@ -1,7 +1,7 @@ import {KarakterPdfView, KepzettsegPdfView} from "./karakter_pdf_view"; import {PDFDocument, rgb} from "pdf-lib"; import fontkit from '@pdf-lib/fontkit' -import {SignedNumberToText} from "../components/Helpers"; +import {SignedNumberToText} from "../../shared/components/Helpers"; import download from "downloadjs"; import {DrawTulajdonsagok} from "./tulajdonsagok.pdf"; import {DrawMentok} from "./mentok.pdf"; diff --git a/Kemkas.Web/frontend/src/first-edition/pdf/fegyverek.pdf.ts b/Kemkas.Web/frontend/src/first-edition/pdf/fegyverek.pdf.ts index 76655d0..a674bf1 100644 --- a/Kemkas.Web/frontend/src/first-edition/pdf/fegyverek.pdf.ts +++ b/Kemkas.Web/frontend/src/first-edition/pdf/fegyverek.pdf.ts @@ -1,6 +1,6 @@ import {KarakterPdfView} from "./karakter_pdf_view"; import {PDFFont, PDFPage} from "pdf-lib"; -import {SignedNumberToText} from "../components/Helpers"; +import {SignedNumberToText} from "../../shared/components/Helpers"; function fitTextInWidth(font: PDFFont, text: string, startingSize: number, maxWidth: number): number { let size = startingSize diff --git a/Kemkas.Web/frontend/src/first-edition/pdf/karakter_pdf_view.ts b/Kemkas.Web/frontend/src/first-edition/pdf/karakter_pdf_view.ts index 116cab5..06d866d 100644 --- a/Kemkas.Web/frontend/src/first-edition/pdf/karakter_pdf_view.ts +++ b/Kemkas.Web/frontend/src/first-edition/pdf/karakter_pdf_view.ts @@ -9,7 +9,7 @@ import {KarakterInputs} from "../domain-models/karakter"; import {CalculateVarazslatMentokNF, NapiVarazslatok} from "../domain-models/memorizalt_varazslatok"; import {GetJellem} from "../domain-models/jellem"; import {Fegyver, GetFegyverek, GetPajzs, GetPancel} from '../domain-models/felszereles' -import {SignedNumberToText} from "../components/Helpers"; +import {SignedNumberToText} from "../../shared/components/Helpers"; import {OsztalySkillsTordelt} from "./osztaly_skills"; import { KarakterTulajdonsagok, diff --git a/Kemkas.Web/frontend/src/first-edition/pdf/masodlagos_ertekek.pdf.ts b/Kemkas.Web/frontend/src/first-edition/pdf/masodlagos_ertekek.pdf.ts index 2b0000f..3366187 100644 --- a/Kemkas.Web/frontend/src/first-edition/pdf/masodlagos_ertekek.pdf.ts +++ b/Kemkas.Web/frontend/src/first-edition/pdf/masodlagos_ertekek.pdf.ts @@ -1,6 +1,6 @@ import {PDFFont, PDFPage} from "pdf-lib"; import {KarakterPdfView} from "./karakter_pdf_view"; -import {SignedNumberToText} from "../components/Helpers"; +import {SignedNumberToText} from "../../shared/components/Helpers"; export function DrawMasodlagosErtekek( page: PDFPage, diff --git a/Kemkas.Web/frontend/src/first-edition/pdf/mentok.pdf.ts b/Kemkas.Web/frontend/src/first-edition/pdf/mentok.pdf.ts index c3bf73b..9ede2a2 100644 --- a/Kemkas.Web/frontend/src/first-edition/pdf/mentok.pdf.ts +++ b/Kemkas.Web/frontend/src/first-edition/pdf/mentok.pdf.ts @@ -1,6 +1,6 @@ import {PDFFont, PDFPage, rgb} from "pdf-lib"; import {KarakterPdfView} from "./karakter_pdf_view"; -import {SignedNumberToText} from "../components/Helpers"; +import {SignedNumberToText} from "../../shared/components/Helpers"; import {Modifier} from "../domain-models/tulajdonsag"; export function DrawMentok(page: PDFPage, karakter: KarakterPdfView, fontSizeBase: number, pdfFont: PDFFont) { diff --git a/Kemkas.Web/frontend/src/first-edition/pdf/tulajdonsagok.pdf.ts b/Kemkas.Web/frontend/src/first-edition/pdf/tulajdonsagok.pdf.ts index b108544..cf2a09e 100644 --- a/Kemkas.Web/frontend/src/first-edition/pdf/tulajdonsagok.pdf.ts +++ b/Kemkas.Web/frontend/src/first-edition/pdf/tulajdonsagok.pdf.ts @@ -1,5 +1,5 @@ import {PDFFont, PDFPage, rgb} from "pdf-lib"; -import {SignedNumberToText} from "../components/Helpers"; +import {SignedNumberToText} from "../../shared/components/Helpers"; import {KarakterTulajdonsagok, Modifier} from "../domain-models/tulajdonsag"; export function DrawTulajdonsagok(page: PDFPage, tulajdonsagok: KarakterTulajdonsagok, fontSizeBase: number, pdfFont: PDFFont) { diff --git a/Kemkas.Web/frontend/src/second-edition/components/MasodlagosErtekek.tsx b/Kemkas.Web/frontend/src/second-edition/components/MasodlagosErtekek.tsx new file mode 100644 index 0000000..db0edd3 --- /dev/null +++ b/Kemkas.Web/frontend/src/second-edition/components/MasodlagosErtekek.tsx @@ -0,0 +1,61 @@ +import React from "react"; +import {OverlayTrigger, Tooltip} from "react-bootstrap"; +import {SignedNumberToText} from "../../shared/components/Helpers"; +import {MasodlagosErtekekView} from "../domain-models/masodlagos_ertekek"; + +function MasodlagosErtekek(props: MasodlagosErtekekView) { + + const { HP, VO, CelzoTB, Mentok, KozelharciTB } = props + + const tooltip = ( + + Hentelési Potenciál + + ); + + return <> +
+
Másodlagos értékek
+
+
+
+
+ +

{HP}

+
+
+ +

{VO}

+
+
+ +

{KozelharciTB.map(SignedNumberToText).join(" / ")}

+
+
+ +

{CelzoTB.map(SignedNumberToText).join(" / ")}

+
+
+
+
+ +

{SignedNumberToText(Mentok.kitartas)}

+
+
+ +

{SignedNumberToText(Mentok.reflex)}

+
+
+ +

{SignedNumberToText(Mentok.akaratero)}

+
+
+
+ +} + +export default MasodlagosErtekek \ No newline at end of file diff --git a/Kemkas.Web/frontend/src/second-edition/domain-models/karakter2E.ts b/Kemkas.Web/frontend/src/second-edition/domain-models/karakter2E.ts index 1871b3f..9b1923b 100644 --- a/Kemkas.Web/frontend/src/second-edition/domain-models/karakter2E.ts +++ b/Kemkas.Web/frontend/src/second-edition/domain-models/karakter2E.ts @@ -17,6 +17,8 @@ export interface Karakter2E { kalozKritikus: string[], kepzettsegek: KepzettsegId[] tolvajKepzettsegek?: KepzettsegId[] + szint: number, + hpRolls: number[] } export const DefaultKarakter: Karakter2E = { name: 'Névtelen Kalandozó', @@ -29,4 +31,6 @@ export const DefaultKarakter: Karakter2E = { kalozKritikus: [], kepzettsegek: [], tolvajKepzettsegek: [], + szint: 1, + hpRolls: [] } \ No newline at end of file diff --git a/Kemkas.Web/frontend/src/second-edition/domain-models/masodlagos_ertekek.ts b/Kemkas.Web/frontend/src/second-edition/domain-models/masodlagos_ertekek.ts new file mode 100644 index 0000000..d305d76 --- /dev/null +++ b/Kemkas.Web/frontend/src/second-edition/domain-models/masodlagos_ertekek.ts @@ -0,0 +1,91 @@ +import {Mentok, MentokTotal} from "./mentok"; +import {Osztaly2E} from "./osztaly2E"; +import {Karakter2E} from "./karakter2E"; +import {CelzoTB, KozelharciTB} from "./tamadas_bonusz"; +import {Faj2E} from "./faj2E"; +// import { GetPajzs, GetPancel, MaxAbilityVO } from "./felszereles"; +import {Modifier} from "./tulajdonsag2E"; + +export interface MasodlagosErtekekView { + HP: number + VO: number + KozelharciTB: number[] + CelzoTB: number[] + Mentok: Mentok +} + +export type KarakterpickForMasodlagosErtekek = Pick + +export function BaseHP(osztaly: Osztaly2E) { + let base = 4; + switch (osztaly){ + case Osztaly2E.Barbar: + base = 12 + break; + case Osztaly2E.Amazon: + case Osztaly2E.Ijasz: + case Osztaly2E.Tengeresz: + case Osztaly2E.Harcos: + case Osztaly2E.Vandor: + base = 10; + break + case Osztaly2E.Pap: + case Osztaly2E.Druida: + base = 8; + break; + case Osztaly2E.Tolvaj: + case Osztaly2E.Dalnok: + base = 6; + break; + case Osztaly2E.Varazslo: + case Osztaly2E.Illuzionista: + base = 4; + break; + } + return base +} + +export function HP(karakter: Pick): number { + const egeszsegModifier = Modifier(karakter.tulajdonsagok.t_egs) + return BaseHP(karakter.osztaly) + egeszsegModifier + karakter.hpRolls + // https://lfg.hu/forum/topic/15079-kard-es-magia/page/219/#comment-2218333 + .map(hp => Math.max(1, hp + egeszsegModifier)) + .reduce((sum, val) => sum + val, 0) +} + +export function VO(karakter: Pick): number { + // const pancel = GetPancel(karakter.felszereles.pancelID) + // const pancelVO = pancel?.VO ?? 0 + // const pajzsVO = GetPajzs(karakter.felszereles.pajzsID)?.VO ?? 0 + // let vo = 10 + pajzsVO + pancelVO + let vo = 10 + let abilityVO = Modifier(karakter.tulajdonsagok.t_ugy) + if (karakter.osztaly === Osztaly2E.Tengeresz) { + vo += Math.floor(karakter.szint / 3) + } + if (karakter.osztaly === Osztaly2E.Amazon) { + if (karakter.tulajdonsagok.t_kar > karakter.tulajdonsagok.t_ugy) { + abilityVO = Modifier(karakter.tulajdonsagok.t_kar) + } + vo += Math.floor(karakter.szint / 2) + } + if (karakter.faj === Faj2E.Felszerzet || karakter.faj === Faj2E.Gnom){ + vo += 1 + } + // if (pancel) { + // abilityVO = Math.min(MaxAbilityVO(pancel.Type), abilityVO) + // } + vo += abilityVO + + return vo +} + +export function CalculateMasodlagosErtekek(karakter: KarakterpickForMasodlagosErtekek): MasodlagosErtekekView { + return { + HP: HP(karakter), + VO: VO(karakter), + CelzoTB: CelzoTB(karakter), + KozelharciTB: KozelharciTB(karakter), + Mentok: MentokTotal(karakter) + } +} \ No newline at end of file diff --git a/Kemkas.Web/frontend/src/second-edition/domain-models/mentok.ts b/Kemkas.Web/frontend/src/second-edition/domain-models/mentok.ts new file mode 100644 index 0000000..4bc0d5a --- /dev/null +++ b/Kemkas.Web/frontend/src/second-edition/domain-models/mentok.ts @@ -0,0 +1,84 @@ +import {Osztaly2E} from "./osztaly2E"; +import {Karakter2E} from "./karakter2E"; +import {KarakterTulajdonsagok, TulajdonsagModosito} from "./tulajdonsag2E"; + +export interface Mentok { + kitartas: number + reflex: number + akaratero: number +} +export type MentoTipus = keyof Mentok + +export function MentoTipusLabel(tipus: MentoTipus): string { + switch (tipus) { + case "akaratero": + return "Akaraterő"; + case "kitartas": + return "Kitartás"; + case "reflex": + return "Reflex"; + } +} + +export function ElsodlegesMento(szint: number): number { + return 2 + Math.floor(szint / 2); +} + +export function MasodlagosMento(szint: number): number { + return Math.floor(szint / 3) +} + +export function ElsodlegesMentok(osztaly: Osztaly2E) : MentoTipus[] { + let t: MentoTipus[] = [] + switch (osztaly){ + case Osztaly2E.Barbar: + case Osztaly2E.Amazon: + case Osztaly2E.Ijasz: + case Osztaly2E.Tengeresz: + case Osztaly2E.Harcos: + case Osztaly2E.Vandor: + t = ['kitartas']; + break; + case Osztaly2E.Druida: + case Osztaly2E.Pap: + t = ['kitartas', 'akaratero']; + break; + case Osztaly2E.Tolvaj: + case Osztaly2E.Dalnok: + t = ['reflex']; + break; + case Osztaly2E.Varazslo: + case Osztaly2E.Illuzionista: + t = ['akaratero'] + break; + + } + return t; +} + +export function MentokAlap(osztaly: Osztaly2E, szint: number = 1) { + const elsodlegesek = ElsodlegesMentok(osztaly) + return { + kitartas: elsodlegesek.includes('kitartas') ? ElsodlegesMento(szint) : MasodlagosMento(szint), + reflex: elsodlegesek.includes('reflex') ? ElsodlegesMento(szint) : MasodlagosMento(szint), + akaratero: elsodlegesek.includes('akaratero') ? ElsodlegesMento(szint) : MasodlagosMento(szint), + } +} + +export function MentoModositok(tulajdonsagModositok: KarakterTulajdonsagok) { + return { + kitartas: tulajdonsagModositok.t_egs, + reflex: tulajdonsagModositok.t_ugy, + akaratero: tulajdonsagModositok.t_bol, + } +} + +export function MentokTotal(karakter: Pick) { + const alap = MentokAlap(karakter.osztaly, karakter.szint) + const modositok = MentoModositok(TulajdonsagModosito(karakter.tulajdonsagok)) + return { + kitartas: alap.kitartas + modositok.kitartas, + reflex: alap.reflex + modositok.reflex, + akaratero: alap.akaratero + modositok.akaratero, + } +} \ No newline at end of file diff --git a/Kemkas.Web/frontend/src/second-edition/domain-models/tamadas_bonusz.ts b/Kemkas.Web/frontend/src/second-edition/domain-models/tamadas_bonusz.ts new file mode 100644 index 0000000..9257ad9 --- /dev/null +++ b/Kemkas.Web/frontend/src/second-edition/domain-models/tamadas_bonusz.ts @@ -0,0 +1,46 @@ +import {Osztaly2E} from "./osztaly2E"; +import {Karakter2E} from "./karakter2E"; +import {Modifier} from "./tulajdonsag2E"; + +/// Finally second edition doesn't mess with the extra attack of high level clerics rouges and wizards! +function ExtraAttack(attack: number): number[] { + if (attack < 6) { + return [attack] + } + return [Math.min(attack, 10), ...ExtraAttack(attack - 5)] +} + +export function TamadasBonusz(osztaly: Osztaly2E, szint: number = 1) : number[] { + let base = 0 + switch (osztaly){ + case Osztaly2E.Barbar: + case Osztaly2E.Amazon: + case Osztaly2E.Ijasz: + case Osztaly2E.Tengeresz: + case Osztaly2E.Harcos: + case Osztaly2E.Vandor: + base = szint; + break; + case Osztaly2E.Pap: + case Osztaly2E.Tolvaj: + case Osztaly2E.Dalnok: + case Osztaly2E.Druida: + base = Math.floor(szint * 2 / 3); + break; + case Osztaly2E.Varazslo: + case Osztaly2E.Illuzionista: + base = Math.floor(szint / 2); + break; + } + return ExtraAttack(base) +} + +export function KozelharciTB(karakter : Pick): number[] { + const base = TamadasBonusz(karakter.osztaly, karakter.szint); + let modifier = Modifier(karakter.tulajdonsagok.t_ero) + return base.map(v => v + modifier) +} +export function CelzoTB(karakter : Pick): number[] { + let base = TamadasBonusz(karakter.osztaly, karakter.szint) + return base.map(v => v + Modifier(karakter.tulajdonsagok.t_ugy)) +} \ No newline at end of file diff --git a/Kemkas.Web/frontend/src/second-edition/pages/CreateCharacter2E.tsx b/Kemkas.Web/frontend/src/second-edition/pages/CreateCharacter2E.tsx index b8bc218..edcc1e3 100644 --- a/Kemkas.Web/frontend/src/second-edition/pages/CreateCharacter2E.tsx +++ b/Kemkas.Web/frontend/src/second-edition/pages/CreateCharacter2E.tsx @@ -16,6 +16,8 @@ import { import KarakterKepzettsegek from "../components/KarakterKepzettsegek2E"; import {TulajdonsagokFajjal} from "../domain-models/faj2E"; import JellemSelector from "../components/JellemSelector"; +import MasodlagosErtekek from "../components/MasodlagosErtekek"; +import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek"; function CreateCharacter2E(props: {}) { @@ -109,6 +111,14 @@ function CreateCharacter2E(props: {}) { changeTolvajKepzettsegek={changeTolvajKepzettseg} />
+ {/* 1. szinten */} + +

diff --git a/Kemkas.Web/frontend/src/shared/Header.tsx b/Kemkas.Web/frontend/src/shared/Header.tsx index cc0c580..2c098ef 100644 --- a/Kemkas.Web/frontend/src/shared/Header.tsx +++ b/Kemkas.Web/frontend/src/shared/Header.tsx @@ -17,7 +17,7 @@ function Header(props: {}) { Kemkas - Karaktereim + {fetchedUser.data != null && Karaktereim}