import React from "react"; import { AllFelszereles, Fegyver, FelszerelesDto, GetFegyver, GetFelszereles, GetPajzs, GetPancel, KarakterFelszereles, PancelTypeLabel, Teherbiras, 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, HarcosFegyverforgatok} 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 karakter = useSelector.withTypes()(characterSelector) const dispatch = useDispatch.withTypes()() const felszereles = karakter.felszereles const osztalyok = karakter.szintlepesek.map(x => x.osztaly) const changeFelszereles = (f: KarakterFelszereles) => dispatch(setFelszereles(f)) const teherbiras = Teherbiras(karakter); return } function ItemMaxCount(targy?: FelszerelesDto): number { const targySize = targy?.size ?? 1 return (targySize < 1 && targySize > 0) ? Math.round(1/targy!.size) : 1; } // TODO: Make all items use the same `size`. Lowercase data fields! function FegyverMaxCount(fegyver?: Fegyver): number { const fegyverSize = fegyver?.Size ?? 1 return (fegyverSize < 1 && fegyverSize > 0) ? Math.round(1/fegyver!.Size) : 1; } export function FelszerelesView(props: {felszereles: KarakterFelszereles, changeFelszereles: (felszereles: KarakterFelszereles) => void, osztalyok: Osztaly2E[], teherbiras: number}) { const {felszereles, changeFelszereles, osztalyok, teherbiras} = 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.fegyverek .map(({id, count}, idx) => { const fegyver = GetFegyver(id) const max = FegyverMaxCount(fegyver) return { idx, fegyver: GetFegyver(id), count, max }; }).filter((x) => x.fegyver != null).map(x => ({...x, fegyver: x.fegyver as Fegyver})); const viseltFelszereles= felszereles.viselt.map(({id, count}, idx) => { const targy = GetFelszereles(id) const max = ItemMaxCount(targy) return { idx, targy, count, max, }; }).filter(x => x.targy != null); const osztalyAllowedFegyverek = AllowedFegyverek(osztalyok) const allowedFegyverek = (selected?: Fegyver) => ([ ...osztalyAllowedFegyverek.filter(x => x.Size + viseltSize - (selected?.Size ?? 1 > 1 ? selected!.Size : 1) <= 8), ...valasztottFegyverek.filter(({idx,fegyver}) => !osztalyAllowedFegyverek.map(f => f.Id).includes(fegyver.Id)) .map(({fegyver}) => fegyver)]) 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 addFegyver = () => { const newFegyver = osztalyok.some(o => HarcosFegyverforgatok.has(o)) ? 'okol_harcos' : 'okol' changeFelszereles({...felszereles, fegyverek: [...felszereles.fegyverek, {id: newFegyver, count: 1}]}); } const changeFegyver = (idx: number, newID: string) => { const found = GetFegyver(newID) if (!found) { console.log('Nem létező fegyver ID: ', newID) return } changeFelszereles({...felszereles, fegyverek: arraySetN(felszereles.fegyverek, idx, {id: newID, count: 1})}) } const increaseFegyverCount = (idx: number) => () => { const old = felszereles.fegyverek[idx] if (old == null) { console.error('Index out of range! index: {0}, array: {1}', idx, felszereles.fegyverek) return } if(old.count >= FegyverMaxCount(GetFegyver(old.id))){ console.error("Can't increase item count more than max!", old) return; } changeFelszereles({...felszereles, fegyverek: arraySetN(felszereles.fegyverek, idx, {...old, count: old.count + 1})}) } const decreaseFegyverCount = (idx: number) => () => { const old = felszereles.fegyverek[idx] if (old == null) { console.error('Index out of range! index: {0}, array: {1}', idx, felszereles.fegyverek) return } if(old.count === 1){ changeFelszereles({ ...felszereles, fegyverek: [...felszereles.fegyverek.slice(0, idx), ...felszereles.viselt.slice(idx + 1)] }) } else{ changeFelszereles({...felszereles, fegyverek: arraySetN(felszereles.fegyverek, idx, {...old, count: old.count - 1})}) } } const removeFegyver = (idx: number) => () => changeFelszereles({ ...felszereles, fegyverek: [...felszereles.fegyverek.slice(0, idx), ...felszereles.fegyverek.slice(idx + 1)] }) const allowedViselt = (selected?: FelszerelesDto) => AllFelszereles.filter(x => { const selectedSize = (selected?.size ?? 1) > 1 ? selected!.size : 1 return (x.size > 0 && (viseltSize + x.size - selectedSize) <= 8); }) const addViselt = () => changeFelszereles({ ...felszereles, viselt: [...felszereles.viselt, {id: 'szog', count: 1}] }) const changeViselt = (idx: number) => (newID: string) => { const found = GetFelszereles(newID) if (!found) { console.log('Nem létező tárgy ID: ', newID) return } const old = felszereles.viselt[idx] if (old == null) { console.error('Index out of range! index: {0}, array: {1}', idx, felszereles.viselt) return } const item = {id: newID, count: 1} changeFelszereles({...felszereles, viselt: arraySetN(felszereles.viselt, idx, item)}) } const increaseViseltCount = (idx: number) => () => { const old = felszereles.viselt[idx] if (old == null) { console.error('Index out of range! index: {0}, array: {1}', idx, felszereles.viselt) return } if(old.count >= ItemMaxCount(GetFelszereles(old.id))){ console.error("Can't increase item count more than max!", old) return; } changeFelszereles({...felszereles, viselt: arraySetN(felszereles.viselt, idx, {...old, count: old.count + 1})}) } const decreaseViseltCount = (idx: number) => () => { const old = felszereles.viselt[idx] if (old == null) { console.error('Index out of range! index: {0}, array: {1}', idx, felszereles.viselt) return } if(old.count === 1){ changeFelszereles({ ...felszereles, viselt: [...felszereles.viselt.slice(0, idx), ...felszereles.viselt.slice(idx + 1)] }) } else{ changeFelszereles({...felszereles, viselt: arraySetN(felszereles.viselt, idx, {...old, count: old.count - 1})}) } } const removeViselt = (idx: number) => () => changeFelszereles({ ...felszereles, viselt: [...felszereles.viselt.slice(0, idx), ...felszereles.viselt.slice(idx + 1)] }) const aprosagFelszereles= felszereles.aprosagok.map(({id, count}, idx) => ({ idx, targy: GetFelszereles(id), count, })).filter(x => x.targy != null); const addAprosag = () => changeFelszereles({ ...felszereles, aprosagok: [...felszereles.aprosagok, {id: 'tarsoly', count: 1}] }) const changeAprosag = (idx: number) => (newID: string) => { const found = GetFelszereles(newID) if (!found) { console.error('Nem létező tárgy ID: ', newID) return } const old = felszereles.aprosagok[idx] if (old == null) { console.error('Index out of range! index: {0}, array: {1}', idx, felszereles.aprosagok) return } changeFelszereles({...felszereles, aprosagok: arraySetN(felszereles.aprosagok, idx, {...old, id: newID})}) } const increaseAprosagCount = (idx: number) => () => { const old = felszereles.aprosagok[idx] if (old == null) { console.error('Index out of range! index: {0}, array: {1}', idx, felszereles.aprosagok) return } changeFelszereles({...felszereles, aprosagok: arraySetN(felszereles.aprosagok, idx, {...old, count: old.count + 1})}) } const decreaseAprosagCount = (idx: number) => () => { const old = felszereles.aprosagok[idx] if (old == null) { console.error('Index out of range! index: {0}, array: {1}', idx, felszereles.aprosagok) return } if(old.count === 1){ changeFelszereles({ ...felszereles, aprosagok: [...felszereles.aprosagok.slice(0, idx), ...felszereles.aprosagok.slice(idx + 1)] }) } else{ changeFelszereles({...felszereles, aprosagok: arraySetN(felszereles.aprosagok, idx, {...old, count: old.count - 1})}) } } const cipeltCapacity = viseltFelszereles.reduce((acc, item) => acc + (item.targy?.type === 'container' ? item.targy.capacity : 0), 0) const addCipelt = () => changeFelszereles({ ...felszereles, cipelt: [...felszereles.cipelt, {id: 'szog', count: 1}] }) const cipeltFelszereles= felszereles.cipelt.map(({id, count}, idx) => { const targy = GetFelszereles(id) const max = ItemMaxCount(targy) return ({ idx, targy, count, max }); }).filter(x => x.targy != null); const cipeltSize = cipeltFelszereles.reduce((acc, item) => acc + Math.ceil(item.targy?.size ?? 1), 0) console.log('teherbiras: ', teherbiras) console.log('cipelt size: ', cipeltSize) console.log('viselt size: ', viseltSize) const allowedCipelt = (selected?: FelszerelesDto) => AllFelszereles.filter(x => x.size > 0 && Math.ceil(x.size) + cipeltSize - Math.ceil(selected?.size ?? 0) <= cipeltCapacity) const changeCipelt = (idx: number) => (newID: string) => { const found = GetFelszereles(newID) if (!found) { console.log('Nem létező tárgy ID: ', newID) return } const old = felszereles.cipelt[idx] if (old == null) { console.error('Index out of range! index: {0}, array: {1}', idx, felszereles.cipelt) return } const newItem = {id: newID, count: 1} changeFelszereles({...felszereles, cipelt: arraySetN(felszereles.cipelt, idx, newItem)}) } const increaseCipeltCount = (idx: number) => () => { const old = felszereles.cipelt[idx] if (old == null) { console.error('Index out of range! index: {0}, array: {1}', idx, felszereles.cipelt) return } if(old.count >= ItemMaxCount(GetFelszereles(old.id))){ console.error("Can't increase item count more than max!", old) return; } changeFelszereles({...felszereles, cipelt: arraySetN(felszereles.cipelt, idx, {...old, count: old.count + 1})}) } const decreaseCipeltCount = (idx: number) => () => { const old = felszereles.cipelt[idx] if (old == null) { console.error('Index out of range! index: {0}, array: {1}', idx, felszereles.cipelt) return } if(old.count === 1){ changeFelszereles({ ...felszereles, cipelt: [...felszereles.cipelt.slice(0, idx), ...felszereles.cipelt.slice(idx + 1)] }) } else{ changeFelszereles({...felszereles, cipelt: arraySetN(felszereles.cipelt, idx, {...old, count: old.count - 1})}) } } const removeCipelt = (idx: number) => () => changeFelszereles({ ...felszereles, cipelt: [...felszereles.cipelt.slice(0, idx), ...felszereles.cipelt.slice(idx + 1)] }) return <>
Felszerelés
Harci felszerelés
{valasztottFegyverek.map(({idx, fegyver, count, max}) => (
changeFegyver(idx, fegyverId)} dataTestId={`felszereles-fegyver-${idx}`} /> {(count > 1 || max > 1) &&
{' '}{count}{' db '}
} {max <= 1 &&
}
))} {viseltSize < 8 && (viseltSize + cipeltSize < teherbiras) && ()}
Viselt felszerelés
{viseltFelszereles.map(({idx, targy, count, max}) => (
{(count > 1 || max > 1) &&
{' '}{count}{' db '}
} {max <= 1 &&
}
))} {viseltSize < 8 && viseltSize + cipeltSize < teherbiras && ()} {cipeltCapacity > 0 && <>
Cipelt felszerelés
{cipeltFelszereles.map(({idx, targy, count, max}) => (
{(count > 1 || max > 1) &&
{' '}{count}{' db '}
} {max <= 1 &&
}
))} {cipeltSize < cipeltCapacity && (viseltSize + cipeltSize < teherbiras) && ()}}
Apróságok
{aprosagFelszereles.map(({idx, targy, count}) => (
x.size === 0)} onChange={changeAprosag(idx)} selectedId={targy!.id} dataTestId={`felszereles-viselt-selector-${idx}`} />
{' '}{count}{' db '}
))} {felszereles.aprosagok.length < 8 && ()} } export default Felszereles