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-23 14:44:54 +00:00
|
|
|
import { carrierDux } from "./ship/carrier";
|
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-23 14:44:54 +00:00
|
|
|
carrier: carrierDux,
|
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;
|