Skip to content

Commit

Permalink
[2e] add fegyverek & pancel
Browse files Browse the repository at this point in the history
  • Loading branch information
morbalint committed Jan 19, 2024
1 parent c0459ae commit 85314bf
Show file tree
Hide file tree
Showing 6 changed files with 245 additions and 134 deletions.
144 changes: 144 additions & 0 deletions Kemkas.Web/frontend/src/second-edition/components/Felszereles.tsx
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Loading

0 comments on commit 85314bf

Please sign in to comment.