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

49 lines
1.1 KiB
TypeScript
Raw Normal View History

2023-03-22 17:04:47 +00:00
import { createSelector } from "@reduxjs/toolkit";
2023-03-21 19:42:45 +00:00
import Updux from "updux";
2023-03-22 17:04:47 +00:00
import * as R from "remeda";
2023-03-21 19:42:45 +00:00
import identification from "./ship/identification";
2023-03-22 17:04:47 +00:00
import ftl, { calcFtlReqs } from "./ship/propulsion/ftl";
2023-03-21 19:42:45 +00:00
const shipDux = new Updux({
subduxes: {
identification,
2023-03-22 17:04:47 +00:00
propulsion: new Updux({
subduxes: {
ftl,
},
}),
2023-03-21 19:42:45 +00:00
},
});
2023-03-22 17:04:47 +00:00
shipDux.addReaction((api) =>
createSelector(
api.selectors.getFtlType,
api.selectors.getShipMass,
(type, mass) => api.dispatch.setFtlReqs(calcFtlReqs(type, mass))
)
);
shipDux.addReaction((api) => (state) => {
let cost = 0;
let mass = 0;
let subsystems = R.values(R.omit(state, ["identification"]));
while (subsystems.length > 0) {
const subsystem = subsystems.shift();
if (typeof subsystem !== "object") continue;
if (subsystem.reqs) {
cost += subsystem.reqs.cost;
mass += subsystem.reqs.mass;
}
subsystems.push(...Object.values(subsystem));
}
api.dispatch.setShipReqs({ cost, usedMass: mass });
});
2023-03-21 19:42:45 +00:00
export default shipDux;