55 lines
1.4 KiB
TypeScript
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),
|
|
});
|
|
});
|