From 85314bf80addba81a79075b763c280d68f2b77c7 Mon Sep 17 00:00:00 2001 From: morbalint Date: Fri, 19 Jan 2024 09:43:44 +0100 Subject: [PATCH] [2e] add fegyverek & pancel --- .../second-edition/components/Felszereles.tsx | 144 ++++++++++++++++++ .../domain-models/allowed-fegyver.ts | 29 ++++ .../domain-models/allowed-pancel-types.ts | 50 ++++++ .../second-edition/domain-models/fegyver.json | 144 ++---------------- .../domain-models/felszereles.ts | 4 +- .../pages/CreateCharacter2E.tsx | 8 + 6 files changed, 245 insertions(+), 134 deletions(-) create mode 100644 Kemkas.Web/frontend/src/second-edition/components/Felszereles.tsx create mode 100644 Kemkas.Web/frontend/src/second-edition/domain-models/allowed-fegyver.ts create mode 100644 Kemkas.Web/frontend/src/second-edition/domain-models/allowed-pancel-types.ts diff --git a/Kemkas.Web/frontend/src/second-edition/components/Felszereles.tsx b/Kemkas.Web/frontend/src/second-edition/components/Felszereles.tsx new file mode 100644 index 0000000..d7f1447 --- /dev/null +++ b/Kemkas.Web/frontend/src/second-edition/components/Felszereles.tsx @@ -0,0 +1,144 @@ +import React from "react"; +import {Fegyver, KarakterFelszereles, PancelTypeLabel} from "../domain-models/felszereles"; +import {Osztaly2E} from '../domain-models/osztaly2E' +import {AllowedPajzsTypes, AllowedPancelTypes} from '../domain-models/allowed-pancel-types' +import fegyverek from '../domain-models/fegyver.json' +import {arraySetN} from "../../util"; +import {AllowedFegyver} from "../domain-models/allowed-fegyver"; + +export function FegyverLabel(fegyver: Fegyver): string { + const flags = [] as string[] + if (fegyver.Harcos) { + flags.push("H") + } + if (fegyver.Masfelkezes) { + flags.push("1½K") + } + if (fegyver.Ketkezes) { + if (fegyver.Type === "kozelharci") { + flags.push("2K") + } else { + if (fegyver.KetkezesBonusz) { + flags.push("2KB") + } else { + flags.push("2KN") + } + } + } + if (fegyver.HarciManover) { + flags.push("+2 HM") + } + if (fegyver.Alakzat){ + flags.push("AL") + } + if (fegyver.Hosszu) { + flags.push("HO") + } + if (fegyver.Kabito) { + flags.push("KO") + } + if (fegyver.LovasRoham) { + flags.push("LR") + } + if (fegyver.PancelToro) { + flags.push("PT") + } + if (fegyver.PajzsZuzo) { + flags.push("PZ") + } + if (fegyver.Rohamtoro) { + flags.push("RT") + } + // 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} `, ''); + 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}` : ''} ${ + fegyver.CritRangeStart < 20 ? `${fegyver.CritRangeStart}-20` : ''}x${fegyver.CritMultiplier}${ + fegyver.Price > 0 ? ` | ár: ${fegyver.Price} at ` : ''}${ + fegyver.Range > 10 ? ` | táv: ${fegyver.Range}` : ''}` +} + +function Felszereles(props: {felszereles: KarakterFelszereles, changeFelszereles: (felszereles: KarakterFelszereles) => void, osztaly: Osztaly2E}) { + const { felszereles, changeFelszereles, osztaly } = props; + const allowedPancel = AllowedPancelTypes([osztaly]) + const allowedPajzs = AllowedPajzsTypes([osztaly]) + const valasztottFegyverek = felszereles.fegyverIDk + .map((id, idx) => ({idx, fegyver: fegyverek.data.find(f => f.Id === id)})).filter((x) => x.fegyver != null).map(({idx, fegyver}) => ({idx, fegyver: fegyver as Fegyver})) + + const osztalyAllowedFegyverek = AllowedFegyver(osztaly) + const allowedFegyverek = [...osztalyAllowedFegyverek, ...valasztottFegyverek.filter(({idx, fegyver}) => !osztalyAllowedFegyverek.map(f => f.Id).includes(fegyver.Id)).map(({fegyver}) => fegyver)] + const changeFegyver = (idx: number, newID: string) => { + const found = fegyverek.data.find(x => x.Id === newID) + if (!found) { + console.log('Nem létező fegyver ID: ', newID) + return + } + changeFelszereles({...felszereles, fegyverIDk: arraySetN(felszereles.fegyverIDk, idx, newID)}) + } + + return <> +
+
Felszerelés
+
+
+ + +
+
+ + +
+ {valasztottFegyverek.map(({idx, fegyver}) => ( +
+ + + +
+ ))} + + +} + +export default Felszereles \ No newline at end of file diff --git a/Kemkas.Web/frontend/src/second-edition/domain-models/allowed-fegyver.ts b/Kemkas.Web/frontend/src/second-edition/domain-models/allowed-fegyver.ts new file mode 100644 index 0000000..592dd77 --- /dev/null +++ b/Kemkas.Web/frontend/src/second-edition/domain-models/allowed-fegyver.ts @@ -0,0 +1,29 @@ +import {Fegyver} from "./felszereles"; +import fegyverDB from "./fegyver.json"; +import {Osztaly2E} from "./osztaly2E"; + +export function AllowedFegyver(o: Osztaly2E): Fegyver[] { + const fegyverek = fegyverDB.data.map(x => x as Fegyver) + const varazslo = fegyverek.filter(f => ['okol', 'bot', 'bot_vasalt' , 'bunko', 'tor', 'parittya', 'dobotu'].includes(f.Id)) + const tolvaj = fegyverek.filter(f => !f.Ketkezes || !f.Masfelkezes || ['ij_rovid', 'szamszerij_konnyu', 'szamszerij_nehez' ].includes(f.Id)) + const dalnok = fegyverek.filter(f => !f.Ketkezes || !f.Masfelkezes || ['okol', 'ij_rovid', 'szamszerij_konnyu' ].includes(f.Id)) + const druida = fegyverek.filter(f => ['okol', 'bot', 'bunko', 'tor', 'dobotu', 'kard_szablya', 'sarlo', 'landzsa', 'parittya'].includes(f.Id)) + const nemHarcos = fegyverek.filter(f => !f.Harcos) + const harcos = fegyverek.filter(f => !f.CsakNemHarcos) + switch (o) { + case Osztaly2E.Harcos: + case Osztaly2E.Amazon: + case Osztaly2E.Barbar: + case Osztaly2E.Ijasz: + case Osztaly2E.Tengeresz: + case Osztaly2E.Vandor: + return harcos; + // Note: Isteni fegyver barmi lehet istentol foggoen + case Osztaly2E.Pap: return nemHarcos; + case Osztaly2E.Tolvaj: return tolvaj; + case Osztaly2E.Illuzionista: + case Osztaly2E.Varazslo: return varazslo; + case Osztaly2E.Dalnok: return dalnok; + case Osztaly2E.Druida: return druida; + } +} diff --git a/Kemkas.Web/frontend/src/second-edition/domain-models/allowed-pancel-types.ts b/Kemkas.Web/frontend/src/second-edition/domain-models/allowed-pancel-types.ts new file mode 100644 index 0000000..51b2550 --- /dev/null +++ b/Kemkas.Web/frontend/src/second-edition/domain-models/allowed-pancel-types.ts @@ -0,0 +1,50 @@ +import {Pajzs, Pancel} from "./felszereles"; +import {Osztaly2E} from "./osztaly2E"; +import pancelDB from "./pancel.json"; +import pajzsDB from "./pajzs.json" + +export function AllowedPajzsTypes(osztalyok: Osztaly2E[]): Pajzs[] { + return [...new Set(osztalyok.flatMap(osztalyAllowedPajzs))] +} + +function osztalyAllowedPajzs(o: Osztaly2E): Pajzs[] { + const pajzsok = pajzsDB.pajzs.map(x => x as Pajzs) + + switch (o) { + case Osztaly2E.Harcos: return pajzsok; + case Osztaly2E.Amazon: return pajzsok; + case Osztaly2E.Barbar: return pajzsok; + case Osztaly2E.Tengeresz: return pajzsok; + case Osztaly2E.Ijasz: return pajzsok; + case Osztaly2E.Tolvaj: return []; + case Osztaly2E.Pap: return pajzsok; + case Osztaly2E.Illuzionista: return []; + case Osztaly2E.Varazslo: return []; + case Osztaly2E.Dalnok: return pajzsok; + case Osztaly2E.Druida: return pajzsok.filter(f => f.Id === "pajzs_fa"); + case Osztaly2E.Vandor: return pajzsok; + } +} + +export function AllowedPancelTypes(osztalyok: Osztaly2E[]): Pancel[] { + return [...new Set(osztalyok.flatMap(osztalyAllowedPancel))] +} + +function osztalyAllowedPancel(o: Osztaly2E): Pancel[] { + const pancelok = pancelDB.pancel.map(x => x as Pancel) + const konnyu = pancelok.filter(x => x.Type === "konnyu") + switch (o) { + case Osztaly2E.Harcos: return pancelok; + case Osztaly2E.Amazon: return konnyu; + case Osztaly2E.Barbar: return pancelok; + case Osztaly2E.Ijasz: return konnyu; + case Osztaly2E.Tengeresz: return konnyu; + case Osztaly2E.Pap: return pancelok; + case Osztaly2E.Illuzionista: return []; + case Osztaly2E.Varazslo: return []; + case Osztaly2E.Tolvaj: return konnyu; + case Osztaly2E.Dalnok: return konnyu; + case Osztaly2E.Druida: return pancelok.filter(f => ['csuha', 'bor', 'kivert_bor', 'prem'].includes(f.Id)); + case Osztaly2E.Vandor: return konnyu; + } +} \ No newline at end of file diff --git a/Kemkas.Web/frontend/src/second-edition/domain-models/fegyver.json b/Kemkas.Web/frontend/src/second-edition/domain-models/fegyver.json index e9666d2..69ef4fe 100644 --- a/Kemkas.Web/frontend/src/second-edition/domain-models/fegyver.json +++ b/Kemkas.Web/frontend/src/second-edition/domain-models/fegyver.json @@ -272,7 +272,7 @@ { "Id": "fejsze", "Name": "Fejsze", - "Type": "kozelharci", + "Type": "dobhato", "Harcos": false, "CsakNemHarcos": false, "Masfelkezes": false, @@ -286,9 +286,9 @@ "PancelToro": false, "PajzsZuzo": false, "Rohamtoro": false, - "EroBonusz": false, + "EroBonusz": true, "Megterheltseg": false, - "Megjegyzes": "dobható, hatótávolsága rövid (30’)", + "Megjegyzes": "", "Price": 6, "DamageMultiplier": 1, "DamageDice": 6, @@ -723,7 +723,7 @@ { "Id": "landzsa", "Name": "Lándzsa", - "Type": "kozelharci", + "Type": "dobhato", "Harcos": false, "CsakNemHarcos": false, "Masfelkezes": true, @@ -739,7 +739,7 @@ "Rohamtoro": true, "EroBonusz": false, "Megterheltseg": false, - "Megjegyzes": "dobható [R]", + "Megjegyzes": "", "Price": 5, "DamageMultiplier": 1, "DamageDice": 8, @@ -783,7 +783,7 @@ { "Id": "szigony", "Name": "Szigony, háromágú", - "Type": "kozelharci", + "Type": "dobhato", "Harcos": false, "CsakNemHarcos": false, "Masfelkezes": true, @@ -797,9 +797,9 @@ "PancelToro": false, "PajzsZuzo": false, "Rohamtoro": true, - "EroBonusz": false, + "EroBonusz": true, "Megterheltseg": false, - "Megjegyzes": "dobható [R]", + "Megjegyzes": "", "Price": 10, "DamageMultiplier": 1, "DamageDice": 8, @@ -807,13 +807,13 @@ "DamageBonus": 0, "CritRangeStart": 20, "CritMultiplier": 2, - "Range": 10, + "Range": 30, "Size": 1 }, { "Id": "tor", "Name": "Tőr", - "Type": "kozelharci", + "Type": "dobhato", "Harcos": false, "CsakNemHarcos": false, "Masfelkezes": false, @@ -827,7 +827,7 @@ "PancelToro": false, "PajzsZuzo": false, "Rohamtoro": false, - "EroBonusz": false, + "EroBonusz": true, "Megterheltseg": false, "Megjegyzes": "", "Price": 4, @@ -960,36 +960,6 @@ "Range": 50, "Size": 0.25 }, - { - "Id": "fejsze_dobo", - "Name": "Fejsze", - "Type": "lofegyver", - "Harcos": false, - "CsakNemHarcos": false, - "Masfelkezes": false, - "Ketkezes": false, - "KetkezesBonusz": false, - "HarciManover": false, - "Alakzat": false, - "Hosszu": false, - "Kabito": false, - "LovasRoham": false, - "PancelToro": false, - "PajzsZuzo": true, - "Rohamtoro": false, - "EroBonusz": true, - "Megterheltseg": false, - "Megjegyzes": "", - "Price": 6, - "DamageMultiplier": 1, - "DamageDice": 6, - "NumberOfDamageDice": 1, - "DamageBonus": 0, - "CritRangeStart": 20, - "CritMultiplier": 3, - "Range": 30, - "Size": 1 - }, { "Id": "dobotu", "Name": "Dobótű", @@ -1110,36 +1080,6 @@ "Range": 100, "Size": 1 }, - { - "Id": "landzsa_dobo", - "Name": "Lándzsa", - "Type": "lofegyver", - "Harcos": false, - "CsakNemHarcos": false, - "Masfelkezes": false, - "Ketkezes": true, - "KetkezesBonusz": true, - "HarciManover": false, - "Alakzat": false, - "Hosszu": false, - "Kabito": false, - "LovasRoham": false, - "PancelToro": false, - "PajzsZuzo": false, - "Rohamtoro": false, - "EroBonusz": true, - "Megterheltseg": false, - "Megjegyzes": "", - "Price": 5, - "DamageMultiplier": 1, - "DamageDice": 8, - "NumberOfDamageDice": 1, - "DamageBonus": 0, - "CritRangeStart": 20, - "CritMultiplier": 3, - "Range": 30, - "Size": 2 - }, { "Id": "olaj", "Name": "Olaj", @@ -1235,7 +1175,7 @@ "Name": "Parittya", "Type": "lofegyver", "Harcos": true, - "CsakNemHarcos": true, + "CsakNemHarcos": false, "Masfelkezes": false, "Ketkezes": false, "KetkezesBonusz": false, @@ -1349,66 +1289,6 @@ "CritMultiplier": 2, "Range": 30, "Size": 1 - }, - { - "Id": "szigony_haromagu", - "Name": "Szigony, háromágú", - "Type": "lofegyver", - "Harcos": false, - "CsakNemHarcos": false, - "Masfelkezes": false, - "Ketkezes": true, - "KetkezesBonusz": true, - "HarciManover": false, - "Alakzat": false, - "Hosszu": false, - "Kabito": false, - "LovasRoham": false, - "PancelToro": true, - "PajzsZuzo": false, - "Rohamtoro": false, - "EroBonusz": true, - "Megterheltseg": false, - "Megjegyzes": "", - "Price": 10, - "DamageMultiplier": 1, - "DamageDice": 8, - "NumberOfDamageDice": 1, - "DamageBonus": 0, - "CritRangeStart": 20, - "CritMultiplier": 2, - "Range": 30, - "Size": 1 - }, - { - "Id": "tor_dobo", - "Name": "Tőr", - "Type": "lofegyver", - "Harcos": false, - "CsakNemHarcos": false, - "Masfelkezes": false, - "Ketkezes": false, - "KetkezesBonusz": false, - "HarciManover": false, - "Alakzat": false, - "Hosszu": false, - "Kabito": false, - "LovasRoham": false, - "PancelToro": true, - "PajzsZuzo": false, - "Rohamtoro": false, - "EroBonusz": true, - "Megterheltseg": false, - "Megjegyzes": "", - "Price": 4, - "DamageMultiplier": 1, - "DamageDice": 4, - "NumberOfDamageDice": 1, - "DamageBonus": 0, - "CritRangeStart": 18, - "CritMultiplier": 3, - "Range": 30, - "Size": 1 } ] } \ No newline at end of file diff --git a/Kemkas.Web/frontend/src/second-edition/domain-models/felszereles.ts b/Kemkas.Web/frontend/src/second-edition/domain-models/felszereles.ts index 12a3cde..39620a9 100644 --- a/Kemkas.Web/frontend/src/second-edition/domain-models/felszereles.ts +++ b/Kemkas.Web/frontend/src/second-edition/domain-models/felszereles.ts @@ -27,7 +27,7 @@ export interface Pajzs { export interface Fegyver { Id: string, Name: string, - Type: 'kozelharci' | 'lofegyver', + Type: 'kozelharci' | 'dobhato' | 'lofegyver', Harcos: boolean, CsakNemHarcos: boolean, Masfelkezes: boolean, @@ -48,7 +48,7 @@ export interface Fegyver { DamageMultiplier: number, DamageDice: number, NumberOfDamageDice: number, - DamageBonusz: number, + DamageBonus: number, CritRangeStart: number, CritMultiplier: number, Range: number, diff --git a/Kemkas.Web/frontend/src/second-edition/pages/CreateCharacter2E.tsx b/Kemkas.Web/frontend/src/second-edition/pages/CreateCharacter2E.tsx index edcc1e3..cda86ac 100644 --- a/Kemkas.Web/frontend/src/second-edition/pages/CreateCharacter2E.tsx +++ b/Kemkas.Web/frontend/src/second-edition/pages/CreateCharacter2E.tsx @@ -18,6 +18,8 @@ import {TulajdonsagokFajjal} from "../domain-models/faj2E"; import JellemSelector from "../components/JellemSelector"; import MasodlagosErtekek from "../components/MasodlagosErtekek"; import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek"; +import Felszereles from "../components/Felszereles"; +import {KarakterFelszereles} from "../domain-models/felszereles"; function CreateCharacter2E(props: {}) { @@ -30,6 +32,8 @@ function CreateCharacter2E(props: {}) { SetDefaultTolvajKepzettsegek(karakter, changeTolvajKepzettseg) SetDefaultKepzettsegek({...karakter, tulajdonsagok: tulajdonsagokFajjal}, changeKepzettseg) + const changeFelszereles = (f: KarakterFelszereles) => setKarakter({...karakter, felszereles: f}) + let [showSaved, setShowSaved] = useState(false); const hideSaved = () => setShowSaved(false); @@ -119,6 +123,10 @@ function CreateCharacter2E(props: {}) { hpRolls: [] })} />
+ + +