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

93 lines
2.3 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-26 17:02:22 +00:00
import memoize from "memoize-one";
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-24 15:01:04 +00:00
import { streamliningDux as streamlining } from "./ship/structure/streamlining";
import { calcStreamliningReqs } from "./ship/structure/rules";
2023-03-26 15:51:54 +00:00
import { cargoDux } from "./ship/structure/cargo";
2023-03-26 17:02:22 +00:00
import { hullDux } from "./ship/structure/hull";
2023-03-21 19:42:45 +00:00
const shipDux = new Updux({
2023-03-24 15:01:04 +00:00
subduxes: {
identification,
structure: new Updux({
initialState: {},
subduxes: {
streamlining,
2023-03-26 15:51:54 +00:00
cargo: cargoDux,
2023-03-26 17:02:22 +00:00
hull: hullDux,
2023-03-24 15:01:04 +00:00
},
}),
propulsion: new Updux({
initialState: {},
subduxes: {
ftl,
drive,
},
}),
carrier: carrierDux,
},
2023-03-21 19:42:45 +00:00
});
2023-03-26 17:02:22 +00:00
shipDux.addReaction((api) => {
return createSelector(
2023-03-24 15:01:04 +00:00
api.selectors.getFtlType,
api.selectors.getShipMass,
(type, mass) => api.dispatch.setFtlReqs(calcFtlReqs(type, mass))
2023-03-26 17:02:22 +00:00
);
});
2023-03-22 17:04:47 +00:00
shipDux.addReaction((api) => (state) => {
2023-03-24 15:01:04 +00:00
let cost = 0;
let mass = 0;
2023-03-22 17:04:47 +00:00
2023-03-24 15:01:04 +00:00
let subsystems = R.values(R.omit(state, ["identification"]));
2023-03-22 17:04:47 +00:00
2023-03-24 15:01:04 +00:00
while (subsystems.length > 0) {
const subsystem = subsystems.shift();
if (typeof subsystem !== "object") continue;
2023-03-22 17:04:47 +00:00
2023-03-24 15:01:04 +00:00
if (subsystem.reqs) {
cost += subsystem.reqs.cost;
mass += subsystem.reqs.mass;
2023-03-22 17:04:47 +00:00
}
2023-03-24 15:01:04 +00:00
subsystems.push(...Object.values(subsystem));
}
api.dispatch.setShipReqs({ cost, usedMass: mass });
2023-03-22 17:04:47 +00:00
});
2023-03-26 17:02:22 +00:00
shipDux.addEffect((api) => (next) => (action) => {
next(action);
});
2023-03-22 20:18:10 +00:00
shipDux.addReaction((api) =>
2023-03-24 15:01:04 +00:00
createSelector(
api.selectors.getShipMass,
(state) => state.propulsion.drive.rating,
(state) => state.propulsion.drive.advanced,
(mass, rating, advanced) =>
api.dispatch.setDriveReqs(calcDriveReqs(mass, rating, advanced))
)
);
shipDux.addReaction((api) =>
createSelector(
// (state) => state,
api.selectors.getShipMass,
api.selectors.getStreamlining,
(mass, type) => {
api.dispatch.setStreamliningReqs(calcStreamliningReqs(type, mass));
}
)
2023-03-22 20:18:10 +00:00
);
2023-03-21 19:42:45 +00:00
export default shipDux;