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

55 lines
1.4 KiB
TypeScript
Raw Normal View History

2023-03-27 16:59:32 +00:00
import type { Reqs } from "$lib/shipDux/reqs";
import Updux from "updux";
import u from "@yanick/updeep-remeda";
import * as R from "remeda";
2023-04-08 17:47:00 +00:00
import { weaponReqs, weaponTypes, type WeaponType, type Weapon } from "./rules";
2023-03-27 16:59:32 +00:00
2023-04-08 17:47:00 +00:00
type IndexedWeapon = { id: number; reqs: Reqs; specs: Weapon };
2023-03-27 16:59:32 +00:00
export const weaponsDux = new Updux({
initialState: [] as IndexedWeapon[],
actions: {
removeWeapon: (id: string) => id,
setWeapon: (id: string, specs: Weapon) => ({ id, specs }),
2023-04-08 17:47:00 +00:00
addWeapon: (type: WeaponType) => type,
2023-03-27 16:59:32 +00:00
},
});
weaponsDux.addMutation(weaponsDux.actions.removeWeapon, (id) =>
R.reject(u.matches({ id }))
);
2023-04-08 17:47:00 +00:00
// 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),
})
)
2023-03-27 16:59:32 +00:00
);
2023-04-08 17:47:00 +00:00
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")));
2023-03-27 16:59:32 +00:00
state.push({
2023-04-08 17:47:00 +00:00
id,
2023-03-27 16:59:32 +00:00
specs,
reqs: weaponReqs(specs),
});
});