[2e] add fegyverek & pancel

This commit is contained in:
2024-01-19 09:43:44 +01:00
committed by Bálint Mórász
parent c0459aede2
commit 85314bf80a
6 changed files with 245 additions and 134 deletions
@@ -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 <>
<div className='row'>
<h5 className='col align-self-center'>Felszerelés</h5>
</div>
<div className='row m-2'>
<label className='col-md-2 col-sm-3 col-form-label'>Viselt páncél</label>
<select className='col form-select' value={felszereles.pancelID} onChange={e => changeFelszereles({...felszereles, pancelID: e.target.value === 'nincs' ? undefined : e.target.value})}>
<option key={'nincs'} value={'nincs'}>Nincs</option>
{
<optgroup label={PancelTypeLabel("konnyu")}>
{allowedPancel.filter(p => p.Type === "konnyu").map(p =>
<option key={p.Id} value={p.Id}>{`${p.Name}${p.Size > 1 ? ` [${p.Size}]` : ''} (+${p.VO} VO) - ${p.Price} at`}</option>)}
</optgroup>
}
{
allowedPancel.some(p => p.Type === "nehez") &&
<optgroup label={PancelTypeLabel("nehez")}>
{allowedPancel.filter(p => p.Type === "nehez").map(p =>
<option key={p.Id} value={p.Id}>{`${p.Name} (+${p.VO} VO) - ${p.Price} at`}</option>)}
</optgroup>
}
</select>
</div>
<div className='row m-2'>
<label className='col-md-2 col-sm-3 col-form-label'>Hordott pajzs</label>
<select className='col form-select' value={felszereles.pajzsID}
onChange={e => changeFelszereles({...felszereles, pajzsID: e.target.value === 'nincs' ? undefined : e.target.value})}>
<option key={'nincs'} value={'nincs'}>Nincs</option>
{allowedPajzs.map(p => <option key={p.Id} value={p.Id}>{`${p.Name} (+${p.VO} VO) - ${p.Price} at`}</option>)}
</select>
</div>
{valasztottFegyverek.map(({idx, fegyver}) => (
<div key={`fegyver-${idx}`} className='row m-2'>
<label className='col-md-2 col-sm-3 col-form-label'>Fegyver</label>
<select className='col form-select' value={fegyver.Id}
onChange={e => changeFegyver(idx, e.target.value)}>
<optgroup label="Közelharci">
{allowedFegyverek.filter(f => f.Type === 'kozelharci').map(f => <option
key={f.Id} value={f.Id}>{FegyverLabel(f)}</option>)}
</optgroup>
<optgroup label="Közelharci, dobható">
{allowedFegyverek.filter(f => f.Type === 'dobhato').map(f => <option
key={f.Id} value={f.Id}>{FegyverLabel(f)}</option>)}
</optgroup>
<optgroup label="Távolsági">
{allowedFegyverek.filter(f => f.Type === 'lofegyver').map(f => <option
key={f.Id} value={f.Id}>{FegyverLabel(f)}</option>)}
</optgroup>
</select>
<button className='col-md-2 col-sm-3 btn btn-outline-dark btn-lg ms-2' type='button'
onClick={() => changeFelszereles({
...felszereles,
fegyverIDk: [...felszereles.fegyverIDk.slice(0, idx), ...felszereles.fegyverIDk.slice(idx+1)]})}>Elvesz</button>
</div>
))}
<button className='btn btn-outline-dark btn btn-lg ms-2' type='button' onClick={() => changeFelszereles({...felszereles, fegyverIDk: [...felszereles.fegyverIDk, 'bot']})}>Fegyver hozzáadása</button>
</>
}
export default Felszereles
@@ -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;
}
}
@@ -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;
}
}
@@ -272,7 +272,7 @@
{ {
"Id": "fejsze", "Id": "fejsze",
"Name": "Fejsze", "Name": "Fejsze",
"Type": "kozelharci", "Type": "dobhato",
"Harcos": false, "Harcos": false,
"CsakNemHarcos": false, "CsakNemHarcos": false,
"Masfelkezes": false, "Masfelkezes": false,
@@ -286,9 +286,9 @@
"PancelToro": false, "PancelToro": false,
"PajzsZuzo": false, "PajzsZuzo": false,
"Rohamtoro": false, "Rohamtoro": false,
"EroBonusz": false, "EroBonusz": true,
"Megterheltseg": false, "Megterheltseg": false,
"Megjegyzes": "dobható, hatótávolsága rövid (30)", "Megjegyzes": "",
"Price": 6, "Price": 6,
"DamageMultiplier": 1, "DamageMultiplier": 1,
"DamageDice": 6, "DamageDice": 6,
@@ -723,7 +723,7 @@
{ {
"Id": "landzsa", "Id": "landzsa",
"Name": "Lándzsa", "Name": "Lándzsa",
"Type": "kozelharci", "Type": "dobhato",
"Harcos": false, "Harcos": false,
"CsakNemHarcos": false, "CsakNemHarcos": false,
"Masfelkezes": true, "Masfelkezes": true,
@@ -739,7 +739,7 @@
"Rohamtoro": true, "Rohamtoro": true,
"EroBonusz": false, "EroBonusz": false,
"Megterheltseg": false, "Megterheltseg": false,
"Megjegyzes": "dobható [R]", "Megjegyzes": "",
"Price": 5, "Price": 5,
"DamageMultiplier": 1, "DamageMultiplier": 1,
"DamageDice": 8, "DamageDice": 8,
@@ -783,7 +783,7 @@
{ {
"Id": "szigony", "Id": "szigony",
"Name": "Szigony, háromágú", "Name": "Szigony, háromágú",
"Type": "kozelharci", "Type": "dobhato",
"Harcos": false, "Harcos": false,
"CsakNemHarcos": false, "CsakNemHarcos": false,
"Masfelkezes": true, "Masfelkezes": true,
@@ -797,9 +797,9 @@
"PancelToro": false, "PancelToro": false,
"PajzsZuzo": false, "PajzsZuzo": false,
"Rohamtoro": true, "Rohamtoro": true,
"EroBonusz": false, "EroBonusz": true,
"Megterheltseg": false, "Megterheltseg": false,
"Megjegyzes": "dobható [R]", "Megjegyzes": "",
"Price": 10, "Price": 10,
"DamageMultiplier": 1, "DamageMultiplier": 1,
"DamageDice": 8, "DamageDice": 8,
@@ -807,13 +807,13 @@
"DamageBonus": 0, "DamageBonus": 0,
"CritRangeStart": 20, "CritRangeStart": 20,
"CritMultiplier": 2, "CritMultiplier": 2,
"Range": 10, "Range": 30,
"Size": 1 "Size": 1
}, },
{ {
"Id": "tor", "Id": "tor",
"Name": "Tőr", "Name": "Tőr",
"Type": "kozelharci", "Type": "dobhato",
"Harcos": false, "Harcos": false,
"CsakNemHarcos": false, "CsakNemHarcos": false,
"Masfelkezes": false, "Masfelkezes": false,
@@ -827,7 +827,7 @@
"PancelToro": false, "PancelToro": false,
"PajzsZuzo": false, "PajzsZuzo": false,
"Rohamtoro": false, "Rohamtoro": false,
"EroBonusz": false, "EroBonusz": true,
"Megterheltseg": false, "Megterheltseg": false,
"Megjegyzes": "", "Megjegyzes": "",
"Price": 4, "Price": 4,
@@ -960,36 +960,6 @@
"Range": 50, "Range": 50,
"Size": 0.25 "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", "Id": "dobotu",
"Name": "Dobótű", "Name": "Dobótű",
@@ -1110,36 +1080,6 @@
"Range": 100, "Range": 100,
"Size": 1 "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", "Id": "olaj",
"Name": "Olaj", "Name": "Olaj",
@@ -1235,7 +1175,7 @@
"Name": "Parittya", "Name": "Parittya",
"Type": "lofegyver", "Type": "lofegyver",
"Harcos": true, "Harcos": true,
"CsakNemHarcos": true, "CsakNemHarcos": false,
"Masfelkezes": false, "Masfelkezes": false,
"Ketkezes": false, "Ketkezes": false,
"KetkezesBonusz": false, "KetkezesBonusz": false,
@@ -1349,66 +1289,6 @@
"CritMultiplier": 2, "CritMultiplier": 2,
"Range": 30, "Range": 30,
"Size": 1 "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
} }
] ]
} }
@@ -27,7 +27,7 @@ export interface Pajzs {
export interface Fegyver { export interface Fegyver {
Id: string, Id: string,
Name: string, Name: string,
Type: 'kozelharci' | 'lofegyver', Type: 'kozelharci' | 'dobhato' | 'lofegyver',
Harcos: boolean, Harcos: boolean,
CsakNemHarcos: boolean, CsakNemHarcos: boolean,
Masfelkezes: boolean, Masfelkezes: boolean,
@@ -48,7 +48,7 @@ export interface Fegyver {
DamageMultiplier: number, DamageMultiplier: number,
DamageDice: number, DamageDice: number,
NumberOfDamageDice: number, NumberOfDamageDice: number,
DamageBonusz: number, DamageBonus: number,
CritRangeStart: number, CritRangeStart: number,
CritMultiplier: number, CritMultiplier: number,
Range: number, Range: number,
@@ -18,6 +18,8 @@ import {TulajdonsagokFajjal} from "../domain-models/faj2E";
import JellemSelector from "../components/JellemSelector"; import JellemSelector from "../components/JellemSelector";
import MasodlagosErtekek from "../components/MasodlagosErtekek"; import MasodlagosErtekek from "../components/MasodlagosErtekek";
import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek"; import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek";
import Felszereles from "../components/Felszereles";
import {KarakterFelszereles} from "../domain-models/felszereles";
function CreateCharacter2E(props: {}) { function CreateCharacter2E(props: {}) {
@@ -30,6 +32,8 @@ function CreateCharacter2E(props: {}) {
SetDefaultTolvajKepzettsegek(karakter, changeTolvajKepzettseg) SetDefaultTolvajKepzettsegek(karakter, changeTolvajKepzettseg)
SetDefaultKepzettsegek({...karakter, tulajdonsagok: tulajdonsagokFajjal}, changeKepzettseg) SetDefaultKepzettsegek({...karakter, tulajdonsagok: tulajdonsagokFajjal}, changeKepzettseg)
const changeFelszereles = (f: KarakterFelszereles) => setKarakter({...karakter, felszereles: f})
let [showSaved, setShowSaved] = useState(false); let [showSaved, setShowSaved] = useState(false);
const hideSaved = () => setShowSaved(false); const hideSaved = () => setShowSaved(false);
@@ -119,6 +123,10 @@ function CreateCharacter2E(props: {}) {
hpRolls: [] hpRolls: []
})} /> })} />
<hr /> <hr />
<Felszereles osztaly={karakter.osztaly} felszereles={karakter.felszereles}
changeFelszereles={changeFelszereles}/>
<hr/>
</form> </form>
</div> </div>
<hr/> <hr/>