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

63 lines
1.6 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-22 20:18:10 +00:00
import drive from "./ship/propulsion/drive";
import { calcDriveReqs } from "$lib/shipDux/engine";
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({
2023-03-22 20:18:10 +00:00
initial: {},
2023-03-22 17:04:47 +00:00
subduxes: {
ftl,
2023-03-22 20:18:10 +00:00
drive,
2023-03-22 17:04:47 +00:00
},
}),
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-22 20:18:10 +00:00
shipDux.addReaction((api) =>
createSelector(
api.selectors.getShipMass,
(state) => state.propulsion.drive.rating,
(state) => state.propulsion.drive.advanced,
(mass, rating, advanced) =>
api.dispatch.setDriveReqs(calcDriveReqs(mass, rating, advanced))
)
);
2023-03-21 19:42:45 +00:00
export default shipDux;