-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
245 additions
and
134 deletions.
There are no files selected for viewing
144 changes: 144 additions & 0 deletions
144
Kemkas.Web/frontend/src/second-edition/components/Felszereles.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
29 changes: 29 additions & 0 deletions
29
Kemkas.Web/frontend/src/second-edition/domain-models/allowed-fegyver.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} |
50 changes: 50 additions & 0 deletions
50
Kemkas.Web/frontend/src/second-edition/domain-models/allowed-pancel-types.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} |
Oops, something went wrong.