WIP: fegyverek

This commit is contained in:
2023-10-17 00:25:01 +02:00
parent a9a8e9e15a
commit 95d777f038
4 changed files with 532 additions and 8 deletions
+33 -2
View File
@@ -1,12 +1,28 @@
import React from "react";
import { KarakterFelszereles, PancelTypeLabel } from "../domain-models/felszereles";
import { Osztaly, OsztalyAllowedPancelTypes } from '../domain-models/osztaly'
import {Fegyver, KarakterFelszereles, PancelTypeLabel} from "../domain-models/felszereles";
import {Osztaly, OsztalyAllowedFegyver, OsztalyAllowedPancelTypes} from '../domain-models/osztaly'
import pancelok from '../domain-models/pancel.json'
import pajzsok from '../domain-models/pajzs.json'
import fegyverek from '../domain-models/fegyver.json'
import {arraySetN} from "../util";
function Felszereles(props: {felszereles: KarakterFelszereles, changeFelszereles: (felszereles: KarakterFelszereles) => void, osztaly: Osztaly}) {
const { felszereles, changeFelszereles, osztaly } = props;
const allowedPancelTypes = OsztalyAllowedPancelTypes(osztaly)
const valasztottFegyverek = felszereles.fegyverIDk
.map((id, idx) => ({idx, fegyver: fegyverek.fegyverek.find(f => f.ID === id)})).filter((x) => x.fegyver != null).map(({idx, fegyver}) => ({idx, fegyver: fegyver as Fegyver}))
const osztalyAllowedFegyverek = OsztalyAllowedFegyver(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.fegyverek.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 m-2'>
<label className='col-md-2 col-sm-3 col-form-label'>Viselt páncél</label>
@@ -28,6 +44,21 @@ function Felszereles(props: {felszereles: KarakterFelszereles, changeFelszereles
{allowedPancelTypes.length > 0 && (pajzsok['pajzs'].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}>{`${f.Name}`}</option>)}
</optgroup>
<optgroup label="Távolsági">
{allowedFegyverek.filter(f => f.Type === 'lofegyver').map(f => <option key={f.ID} value={f.ID}>{`${f.Name}`}</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, 'okol']})}>Fegyver hozzáadása</button>
</>
}
+467
View File
@@ -0,0 +1,467 @@
{
"fegyverek": [
{
"ID": "alabard",
"Name": "Alabárd és más szálfegyverek",
"Type": "kozelharci",
"Ketkezes": true,
"Egzotikus": false,
"Rohamfelfogo": true,
"Price": 10,
"DamageDice": 10,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 3,
"Range": 0
},
{
"ID": "bot",
"Name": "Bot",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 0,
"DamageDice": 6,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 2,
"Range": 0
},
{
"ID": "bunko",
"Name": "Bunkó",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 0,
"DamageDice": 6,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 2,
"Range": 0
},
{
"ID": "buzogany",
"Name": "Buzogány és láncos buzogány",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 8,
"DamageDice": 8,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 2,
"Range": 0
},
{
"ID": "csatabard",
"Name": "Csatabárd",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 10,
"DamageDice": 8,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 3,
"Range": 0
},
{
"ID": "csatabard_2",
"Name": "Kétkezes csatabárd",
"Type": "kozelharci",
"Ketkezes": true,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 20,
"DamageDice": 12,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 3,
"Range": 0
},
{
"ID": "csakany",
"Name": "Csákány",
"Type": "kozelharci",
"Ketkezes": true,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 5,
"DamageDice": 6,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 4,
"Range": 0
},
{
"ID": "darda",
"Name": "Dárda",
"Type": "kozelharci",
"Ketkezes": true,
"Egzotikus": false,
"Rohamfelfogo": true,
"Price": 10,
"DamageDice": 8,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 3,
"Range": 0
},
{
"ID": "fejsze",
"Name": "Fejsze",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 6,
"DamageDice": 6,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 3,
"Range": 10
},
{
"ID": "torpe_fejsze",
"Name": "Törpe fejsze",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": true,
"Rohamfelfogo": false,
"Price": 30,
"DamageDice": 10,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 3,
"Range": 0
},
{
"ID": "handzsar",
"Name": "Handzsár",
"Type": "kozelharci",
"Ketkezes": true,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 50,
"DamageDice": 4,
"NumberOfDamageDice": 2,
"CritRangeStart": 18,
"CritMultiplier": 2,
"Range": 0
},
{
"ID": "harci_kalapacs",
"Name": "Harci kalapács",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 12,
"DamageDice": 8,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 3,
"Range": 0
},
{
"ID": "harci_kalapacs_2",
"Name": "Kétkezes harci kalapács",
"Type": "kozelharci",
"Ketkezes": true,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 25,
"DamageDice": 10,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 3,
"Range": 0
},
{
"ID": "fattyu_kard",
"Name": "Fattyú kard",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": true,
"Rohamfelfogo": false,
"Price": 35,
"DamageDice": 10,
"NumberOfDamageDice": 1,
"CritRangeStart": 19,
"CritMultiplier": 2,
"Range": 0
},
{
"ID": "rovid_kard",
"Name": "Rövid kard",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 10,
"DamageDice": 6,
"NumberOfDamageDice": 1,
"CritRangeStart": 19,
"CritMultiplier": 2,
"Range": 0
},
{
"ID": "hosszu_kard",
"Name": "Hosszú kard",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 15,
"DamageDice": 8,
"NumberOfDamageDice": 1,
"CritRangeStart": 19,
"CritMultiplier": 2,
"Range": 0
},
{
"ID": "kard_2",
"Name": "Kétkezes kard",
"Type": "kozelharci",
"Ketkezes": true,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 50,
"DamageDice": 6,
"NumberOfDamageDice": 2,
"CritRangeStart": 19,
"CritMultiplier": 2,
"Range": 0
},
{
"ID": "kasza",
"Name": "Kasza",
"Type": "kozelharci",
"Ketkezes": true,
"Egzotikus": true,
"Rohamfelfogo": false,
"Price": 18,
"DamageDice": 4,
"NumberOfDamageDice": 2,
"CritRangeStart": 20,
"CritMultiplier": 4,
"Range": 0
},
{
"ID": "landzsa",
"Name": "Lándzsa",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 5,
"DamageDice": 8,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 2,
"Range": 20
},
{
"ID": "sarlo",
"Name": "Sarló",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 3,
"DamageDice": 6,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 2,
"Range": 0
},
{
"ID": "szablya",
"Name": "Szablya",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 15,
"DamageDice": 6,
"NumberOfDamageDice": 1,
"CritRangeStart": 18,
"CritMultiplier": 2,
"Range": 0
},
{
"ID": "szigony",
"Name": "Háromágú szigony",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 10,
"DamageDice": 8,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 2,
"Range": 10
},
{
"ID": "tor",
"Name": "Tőr",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 2,
"DamageDice": 4,
"NumberOfDamageDice": 1,
"CritRangeStart": 19,
"CritMultiplier": 2,
"Range": 10
},
{
"ID": "ostor",
"Name": "Ostor",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": true,
"Rohamfelfogo": false,
"Price": 1,
"DamageDice": 3,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 2,
"Range": 0
},
{
"ID": "okol",
"Name": "Ököl",
"Type": "kozelharci",
"Ketkezes": false,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 0,
"DamageDice": 4,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 2,
"Range": 0
},
{
"ID": "dobodarda",
"Name": "Dobódárda",
"Type": "lofegyver",
"Ketkezes": false,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 0.1,
"DamageDice": 6,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 2,
"Range": 30
},
{
"ID": "dobotu",
"Name": "Dobótű",
"Type": "lofegyver",
"Ketkezes": false,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 0.5,
"DamageDice": 4,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 2,
"Range": 20
},
{
"ID": "rovid_ij",
"Name": "Rövid íj",
"Type": "lofegyver",
"Ketkezes": true,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 30,
"DamageDice": 6,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 3,
"Range": 60
},
{
"ID": "hosszu_ij",
"Name": "Hosszú íj",
"Type": "lofegyver",
"Ketkezes": true,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 75,
"DamageDice": 8,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 3,
"Range": 70
},
{
"ID": "visszacsapo_ij",
"Name": "Visszacsapó íj",
"Type": "lofegyver",
"Ketkezes": true,
"Egzotikus": true,
"Rohamfelfogo": false,
"Price": 100,
"DamageDice": 8,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 3,
"Range": 110
},
{
"ID": "parittya",
"Name": "Parittya",
"Type": "lofegyver",
"Ketkezes": true,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 0,
"DamageDice": 4,
"NumberOfDamageDice": 1,
"CritRangeStart": 20,
"CritMultiplier": 2,
"Range": 50
},
{
"ID": "konnyu_szamszerij",
"Name": "Könnyű számszeríj",
"Type": "lofegyver",
"Ketkezes": true,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 35,
"DamageDice": 8,
"NumberOfDamageDice": 1,
"CritRangeStart": 19,
"CritMultiplier": 2,
"Range": 80
},
{
"ID": "nehez_szamszerij",
"Name": "Nehéz számszeríj",
"Type": "lofegyver",
"Ketkezes": true,
"Egzotikus": false,
"Rohamfelfogo": false,
"Price": 50,
"DamageDice": 10,
"NumberOfDamageDice": 1,
"CritRangeStart": 19,
"CritMultiplier": 2,
"Range": 120
}
]
}
+11 -5
View File
@@ -24,24 +24,30 @@ export interface Pajzs {
export interface Fegyver {
ID: string,
Name: string,
Range: 'kozelharci' | 'tavolsagi'
Type: 'kozelharci' | 'lofegyver'
Ketkezes: boolean,
Egzotikus: boolean,
Rohamtoro: boolean,
Rohamfelfogo: boolean,
Price: number,
DamageDice: number,
NumberOfDamageDice: number,
CritRangeStart: number,
CritMultiplier: number,
Range: number
}
export interface KarakterFelszereles {
pancelID?: string
pajzsID?: string
FegyverIDk: string[]
fegyverIDk: string[]
}
export const DefaultFelszereles: KarakterFelszereles = {
FegyverIDk: [],
fegyverIDk: [],
}
export function PancelTypeLabel(type: PancelType): string {
let result = ''
let result: string
switch(type) {
case 'konnyu':
result = 'Könnyű'
+21 -1
View File
@@ -1,4 +1,5 @@
import { GetPancel, KarakterFelszereles, PancelType } from "./felszereles";
import {Fegyver, GetPancel, KarakterFelszereles, PancelType} from "./felszereles";
import fegyverDB from './fegyver.json'
export enum Osztaly {
Harcos = 'o_harcos',
@@ -26,6 +27,25 @@ export function OsztalyAllowedPancelTypes(o: Osztaly): PancelType[] {
}
}
export function OsztalyAllowedFegyver(o: Osztaly): Fegyver[] {
const fegyverek = fegyverDB.fegyverek.map(x => x as Fegyver)
const nemEgzotikus = fegyverek.filter(f => !f.Egzotikus)
const varazslo = fegyverek.filter(f => ['okol', 'bot', 'bunko', 'tor', 'parittya', 'dobotu'].includes(f.ID))
const tolvaj = fegyverek.filter(f => ['okol', 'tor', 'parittya', 'rovid_ij', 'dobotu', 'konnyu_szamszerij', 'nehez_szamszerij', 'szablya', 'hosszu_kard', 'rovid_kard' ].includes(f.ID))
switch (o) {
case Osztaly.Amazon:
case Osztaly.Harcos:
case Osztaly.Barbar:
case Osztaly.Kaloz: return nemEgzotikus;
case Osztaly.Ijasz: return [...nemEgzotikus, fegyverDB.fegyverek.find(f => f.ID === 'visszacsapo_ij') as Fegyver]
// Note: Isteni fegyver barmi lehet istentol foggoen
case Osztaly.Pap: return fegyverek;
case Osztaly.Tolvaj: return tolvaj;
case Osztaly.Illuzionista:
case Osztaly.Varazslo: return varazslo;
}
}
export function SetFelszerelesForChangedOsztaly(o: Osztaly, felszereles: KarakterFelszereles, changeFelszereles: (f: KarakterFelszereles) => void) {
const allowedPancelTypes = OsztalyAllowedPancelTypes(o)
const pancel = GetPancel(felszereles.pancelID)