aotds-docks/src/lib/store/ship/weaponry/weapons.ts

55 lines
1.4 KiB
TypeScript

import type { Reqs } from "$lib/shipDux/reqs";
import Updux from "updux";
import u from "@yanick/updeep-remeda";
import * as R from "remeda";
import { weaponReqs, weaponTypes, type WeaponType, type Weapon } from "./rules";
type IndexedWeapon = { id: number; reqs: Reqs; specs: Weapon };
export const weaponsDux = new Updux({
initialState: [] as IndexedWeapon[],
actions: {
removeWeapon: (id: string) => id,
setWeapon: (id: string, specs: Weapon) => ({ id, specs }),
addWeapon: (type: WeaponType) => type,
},
});
weaponsDux.addMutation(weaponsDux.actions.removeWeapon, (id) =>
R.reject(u.matches({ id }))
);
// TODO not needed anymore
const mergeArcs = (newArcs) => (original) => {
if (original === undefined) return undefined;
let merged = u.filter(original, (a) => newArcs.includes(a));
let toAdd = newArcs.filter((a) => !merged.includes(a));
if (toAdd.length) return [...merged, ...toAdd];
return merged;
};
weaponsDux.addMutation(weaponsDux.actions.setWeapon, ({ id, specs }) =>
u.map(
u.if(u.matches({ id }), {
specs: {
...specs,
arcs: mergeArcs((specs as any).arcs),
},
reqs: weaponReqs(specs),
})
)
);
weaponsDux.addMutation(weaponsDux.actions.addWeapon, (type) => (state) => {
const specs = weaponTypes.find(u.matches({ type }))?.initial ?? {};
const id = 1 + Math.max(0, ...state.map(R.prop("id")));
state.push({
id,
specs,
reqs: weaponReqs(specs),
});
});