2022-03-02 00:14:01 +00:00
|
|
|
import { Updux } from "updux";
|
2022-03-14 14:53:36 +00:00
|
|
|
import u from "updeep";
|
2022-03-01 22:13:05 +00:00
|
|
|
|
2022-03-02 18:42:42 +00:00
|
|
|
import propulsion from "./propulsion/index.js";
|
2022-03-02 00:14:01 +00:00
|
|
|
import identification from "./identification.js";
|
2022-03-14 14:53:36 +00:00
|
|
|
import { calculateDriveReqs } from "./propulsion/drive.js";
|
|
|
|
import { ftlReqsReaction } from "./propulsion/ftl.js";
|
|
|
|
import structure from "./structure/index.js";
|
|
|
|
import carrier from "./carrier.js";
|
|
|
|
import weaponry from "./weaponry/index.js";
|
|
|
|
import { screensReqsReaction } from "./structure/screens.js";
|
2022-03-01 22:13:05 +00:00
|
|
|
|
|
|
|
const dux = new Updux({
|
2022-04-10 21:42:29 +00:00
|
|
|
subduxes: {
|
|
|
|
identification,
|
|
|
|
propulsion,
|
|
|
|
structure,
|
|
|
|
carrier,
|
|
|
|
weaponry,
|
|
|
|
},
|
|
|
|
initial: {
|
|
|
|
reqs: { cost: 0, mass: 10, usedMass: 0 },
|
|
|
|
},
|
|
|
|
actions: {
|
|
|
|
setShipReqs: null,
|
|
|
|
setUITransform: null,
|
|
|
|
},
|
2022-03-01 22:13:05 +00:00
|
|
|
});
|
|
|
|
|
2022-03-14 14:53:36 +00:00
|
|
|
dux.setMutation("setShipMass", (mass) => u({ reqs: { mass } }));
|
2022-04-10 21:42:29 +00:00
|
|
|
dux.setMutation("setShipReqs", (reqs) => u({ reqs }));
|
|
|
|
|
|
|
|
dux.setMutation("setUITransform", ({ system, systemId, translate }) => {
|
|
|
|
const transform = translate
|
|
|
|
? `translate(${translate[0]}px,${translate[1]}px)`
|
|
|
|
: "";
|
|
|
|
|
|
|
|
switch (system) {
|
|
|
|
case "firecons":
|
|
|
|
return u.updateIn("weaponry.firecons.uiTransform", transform);
|
|
|
|
|
|
|
|
case "weapon":
|
|
|
|
return u.updateIn(
|
|
|
|
"weaponry.weapons",
|
|
|
|
u.map(u.if(({ id }) => id === systemId, u({ uiTransform: transform })))
|
|
|
|
);
|
|
|
|
|
|
|
|
case "screens":
|
|
|
|
return u.updateIn("structure.screens.uiTransform", transform);
|
|
|
|
|
|
|
|
case "hull":
|
|
|
|
return u.updateIn("structure.hull.uiTransform", transform);
|
|
|
|
|
|
|
|
case "internalSystems":
|
|
|
|
const path = "structure.uiTransform";
|
|
|
|
return u.updateIn(path, transform);
|
|
|
|
|
|
|
|
case "ftl":
|
|
|
|
return u.updateIn("propulsion.ftl.uiTransform", transform);
|
|
|
|
|
|
|
|
case "drive":
|
|
|
|
return u.updateIn("propulsion.drive.uiTransform", transform);
|
|
|
|
|
|
|
|
default:
|
|
|
|
return (state) => state;
|
|
|
|
}
|
|
|
|
});
|
2022-03-02 16:14:31 +00:00
|
|
|
|
2022-03-14 14:53:36 +00:00
|
|
|
dux.addReaction(calculateDriveReqs);
|
|
|
|
dux.addReaction(ftlReqsReaction);
|
|
|
|
dux.addReaction(screensReqsReaction);
|
2022-03-02 19:00:18 +00:00
|
|
|
|
2022-04-10 21:42:29 +00:00
|
|
|
dux.addReaction((store) => (state) => {
|
|
|
|
let cost = 0;
|
|
|
|
let mass = 0;
|
2022-03-14 16:16:32 +00:00
|
|
|
|
2022-04-10 21:42:29 +00:00
|
|
|
let subsystems = Object.values(state);
|
2022-03-14 16:16:32 +00:00
|
|
|
|
2022-04-10 21:42:29 +00:00
|
|
|
while (subsystems.length > 0) {
|
|
|
|
const subsystem = subsystems.shift();
|
|
|
|
if (typeof subsystem !== "object") continue;
|
2022-03-14 16:16:32 +00:00
|
|
|
|
2022-04-10 21:42:29 +00:00
|
|
|
if (subsystem.reqs) {
|
|
|
|
cost += subsystem.reqs.cost;
|
|
|
|
mass += subsystem.reqs.mass;
|
2022-03-14 16:16:32 +00:00
|
|
|
}
|
|
|
|
|
2022-04-10 21:42:29 +00:00
|
|
|
subsystems.push(...Object.values(subsystem));
|
|
|
|
}
|
2022-03-14 16:16:32 +00:00
|
|
|
|
2022-04-10 21:42:29 +00:00
|
|
|
store.dispatch.setShipReqs({ cost, usedMass: mass });
|
2022-03-14 16:16:32 +00:00
|
|
|
});
|
|
|
|
|
2022-03-01 22:13:05 +00:00
|
|
|
export default dux;
|