import React from "react"; import { AllFelszereles, Fegyver, FelszerelesDto, GetFegyver, GetFelszereles, GetPajzs, GetPancel, KarakterFelszereles, PancelTypeLabel, ViseltSize } from "../domain-models/felszereles"; import {Osztaly2E} from '../domain-models/osztaly2E' import {AllowedPajzsTypes, AllowedPancelTypes} from '../domain-models/allowed-pancel-types' import {arraySetN} from "../../util"; import {AllowedFegyverek} from "../domain-models/allowed-fegyver"; import FegyverSelector from "../display-components/FegyverSelector"; import {useDispatch, useSelector} from "react-redux"; import {AppDispatch, RootState} from "../../store"; import {characterSelector, setFelszereles} from "../domain-models/characterSlice"; import FelszerlesSelector from "../display-components/FelszerelesSelector"; export function Felszereles(){ const character = useSelector.withTypes()(characterSelector) const dispatch = useDispatch.withTypes()() const felszereles = character.felszereles const osztalyok = character.szintlepesek.map(x => x.osztaly) const changeFelszereles = (f: KarakterFelszereles) => dispatch(setFelszereles(f)) return } export function FelszerelesView(props: {felszereles: KarakterFelszereles, changeFelszereles: (felszereles: KarakterFelszereles) => void, osztalyok: Osztaly2E[]}) { const {felszereles, changeFelszereles, osztalyok} = props; const viseltSize = ViseltSize(felszereles) const allowedPancel = AllowedPancelTypes(osztalyok) .filter(x => felszereles.pancelID === x.Id || x.Size + viseltSize - (GetPancel(felszereles.pancelID)?.Size ?? 0) <= 8) const allowedPajzs = AllowedPajzsTypes(osztalyok) .filter(x => felszereles.pajzsID === x.Id || x.Size + viseltSize - (GetPajzs(felszereles.pajzsID)?.Size ?? 0) <= 8) const valasztottFegyverek = felszereles.fegyverIDk .map((id, idx) => ({ idx, fegyver: GetFegyver(id), })).filter((x) => x.fegyver != null).map(({idx, fegyver}) => ({idx, fegyver: fegyver as Fegyver})); const viseltFelszereles= felszereles.viseltFelszerelesIDk.map((id, idx) => ({ idx, targy: GetFelszereles(id), })).filter(x => x.targy != null); const aprosagFelszereles= felszereles.aprosagFelszerelesIDk.map((id, idx) => ({ idx, targy: GetFelszereles(id), })).filter(x => x.targy != null); const osztalyAllowedFegyverek = AllowedFegyverek(osztalyok) const allowedFegyverek = (selected?: Fegyver) => ([ ...osztalyAllowedFegyverek.filter(x => x.Size + viseltSize - (selected?.Size ?? 0) <= 8), ...valasztottFegyverek.filter(({idx,fegyver}) => !osztalyAllowedFegyverek.map(f => f.Id).includes(fegyver.Id)) .map(({fegyver}) => fegyver)]) const changeFegyver = (idx: number, newID: string) => { const found = GetFegyver(newID) if (!found) { console.log('Nem létező fegyver ID: ', newID) return } changeFelszereles({...felszereles, fegyverIDk: arraySetN(felszereles.fegyverIDk, idx, newID)}) } const changePancel = (event: React.ChangeEvent) => { changeFelszereles({...felszereles, pancelID: event.target.value === 'nincs' ? undefined : event.target.value}) } const changePajzs = (event: React.ChangeEvent) => { changeFelszereles({...felszereles, pajzsID: event.target.value === 'nincs' ? undefined : event.target.value}) } const removeFegyver = (idx: number) => () => changeFelszereles({ ...felszereles, fegyverIDk: [...felszereles.fegyverIDk.slice(0, idx), ...felszereles.fegyverIDk.slice(idx + 1)] }) const addFegyver = () => changeFelszereles({...felszereles, fegyverIDk: [...felszereles.fegyverIDk, 'okol']}) const allowedViselt = (selected?: FelszerelesDto) => AllFelszereles.filter(x => (x.size > 0 && viseltSize + x.size - (selected?.size ?? 0) <= 8)) const addViseltFelszereles = () => changeFelszereles({ ...felszereles, viseltFelszerelesIDk: [...felszereles.viseltFelszerelesIDk, 'szog'] }) const changeViselt = (idx: number) => (newID: string) => { const found = GetFelszereles(newID) if (!found) { console.log('Nem létező tárgy ID: ', newID) return } changeFelszereles({...felszereles, viseltFelszerelesIDk: arraySetN(felszereles.viseltFelszerelesIDk, idx, newID)}) } const removeViseltFelszereles = (idx: number) => () => changeFelszereles({ ...felszereles, viseltFelszerelesIDk: [...felszereles.viseltFelszerelesIDk.slice(0, idx), ...felszereles.viseltFelszerelesIDk.slice(idx + 1)] }) const addAprosag = () => changeFelszereles({ ...felszereles, aprosagFelszerelesIDk: [...felszereles.aprosagFelszerelesIDk, 'tarsoly'] }) const changeAprosag = (idx: number) => (newID: string) => { const found = GetFelszereles(newID) if (!found) { console.log('Nem létező tárgy ID: ', newID) return } changeFelszereles({...felszereles, aprosagFelszerelesIDk: arraySetN(felszereles.aprosagFelszerelesIDk, idx, newID)}) } const removeAprosag = (idx: number) => () => changeFelszereles({ ...felszereles, aprosagFelszerelesIDk: [...felszereles.aprosagFelszerelesIDk.slice(0, idx), ...felszereles.aprosagFelszerelesIDk.slice(idx + 1)] }) const cipeltCapacity = viseltFelszereles.reduce((acc, item) => acc + (item.targy?.type === 'container' ? item.targy.capacity : 0), 0) const addCipelt = () => changeFelszereles({ ...felszereles, cipeltFelszerelesIDk: [...felszereles.cipeltFelszerelesIDk, 'szog'] }) const cipeltFelszereles= felszereles.cipeltFelszerelesIDk.map((id, idx) => ({ idx, targy: GetFelszereles(id), })).filter(x => x.targy != null); const changeCipelt = (idx: number) => (newID: string) => { const found = GetFelszereles(newID) if (!found) { console.log('Nem létező tárgy ID: ', newID) return } changeFelszereles({...felszereles, cipeltFelszerelesIDk: arraySetN(felszereles.cipeltFelszerelesIDk, idx, newID)}) } const removeCipelt = (idx: number) => () => changeFelszereles({ ...felszereles, cipeltFelszerelesIDk: [...felszereles.cipeltFelszerelesIDk.slice(0, idx), ...felszereles.cipeltFelszerelesIDk.slice(idx + 1)] }) return <>
Felszerelés
Harci felszerelés
{valasztottFegyverek.map(({idx, fegyver}) => (
changeFegyver(idx, fegyverId)} dataTestId={`felszereles-fegyver-${idx}`} />
))} {viseltSize < 8 && ()}
Viselt felszerelés
{viseltFelszereles.map(({idx, targy}) => (
))} {viseltSize < 8 && ()} {cipeltCapacity > 0 && <>
Cipelt felszerelés
{cipeltFelszereles.map(({idx, targy}) => (
x.size > 0)} onChange={changeCipelt(idx)} selectedId={targy!.id} dataTestId={`felszereles-viselt-selector-${idx}`} />
))} {felszereles.cipeltFelszerelesIDk.length < cipeltCapacity && ()}}
Apróságok
{aprosagFelszereles.map(({idx, targy}) => (
x.size === 0)} onChange={changeAprosag(idx)} selectedId={targy!.id} dataTestId={`felszereles-viselt-selector-${idx}`} />
))} {felszereles.aprosagFelszerelesIDk.length < 8 && ()} } export default Felszereles