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: []
})} />
+
+
+