From 68fdda4d67e4857f18ae2bbbfbc6e1c1466c98da Mon Sep 17 00:00:00 2001 From: Yanick Champoux Date: Sun, 10 Apr 2022 17:42:29 -0400 Subject: [PATCH] deal with the uiTransform in the dux --- src/lib/shipDux/index.js | 92 +++++++++++++++++++++--------- src/lib/shipDux/propulsion/ftl.js | 35 ++++++------ src/lib/shipDux/structure/index.js | 18 +++--- 3 files changed, 90 insertions(+), 55 deletions(-) diff --git a/src/lib/shipDux/index.js b/src/lib/shipDux/index.js index 388af19..739b2d7 100644 --- a/src/lib/shipDux/index.js +++ b/src/lib/shipDux/index.js @@ -11,48 +11,84 @@ import weaponry from "./weaponry/index.js"; import { screensReqsReaction } from "./structure/screens.js"; const dux = new Updux({ - subduxes: { - identification, - propulsion, - structure, - carrier, - weaponry, - }, - initial: { - reqs: { cost: 0, mass: 10, usedMass: 0 }, - }, - actions: { - setShipReqs: null, - }, + subduxes: { + identification, + propulsion, + structure, + carrier, + weaponry, + }, + initial: { + reqs: { cost: 0, mass: 10, usedMass: 0 }, + }, + actions: { + setShipReqs: null, + setUITransform: null, + }, }); dux.setMutation("setShipMass", (mass) => u({ reqs: { mass } })); -dux.setMutation('setShipReqs', reqs => u({reqs})); +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; + } +}); dux.addReaction(calculateDriveReqs); dux.addReaction(ftlReqsReaction); dux.addReaction(screensReqsReaction); -dux.addReaction( (store) => (state) => { - let cost = 0; - let mass = 0; +dux.addReaction((store) => (state) => { + let cost = 0; + let mass = 0; - let subsystems = Object.values(state); + let subsystems = Object.values(state); - while(subsystems.length>0) { - const subsystem = subsystems.shift(); - if( typeof subsystem !== 'object' ) continue; + 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)); + if (subsystem.reqs) { + cost += subsystem.reqs.cost; + mass += subsystem.reqs.mass; } - store.dispatch.setShipReqs({cost,usedMass: mass}); + subsystems.push(...Object.values(subsystem)); + } + store.dispatch.setShipReqs({ cost, usedMass: mass }); }); export default dux; diff --git a/src/lib/shipDux/propulsion/ftl.js b/src/lib/shipDux/propulsion/ftl.js index ee42eca..1a38061 100644 --- a/src/lib/shipDux/propulsion/ftl.js +++ b/src/lib/shipDux/propulsion/ftl.js @@ -10,35 +10,32 @@ const dux = new Updux({ subduxes: { reqs }, initial: { type: "none", + uiTransform: "", }, actions: { - setFtl: null, - setFtlReqs: null, + setFtl: null, + setFtlReqs: null, }, }); export default dux; -dux.setMutation( 'setFtl', type => u({type}) ); -dux.setMutation( 'setFtlReqs', reqs => u({reqs}) ); +dux.setMutation("setFtl", (type) => u({ type })); +dux.setMutation("setFtlReqs", (reqs) => u({ reqs })); -export function calcFtlReqs(type,shipMass) { - if(type==="none") return { cost: 0, mass: 0 }; +export function calcFtlReqs(type, shipMass) { + if (type === "none") return { cost: 0, mass: 0 }; - const mass = Math.ceil(shipMass / 10); + const mass = Math.ceil(shipMass / 10); - return { - mass, - cost: mass * ( type === 'advanced' ? 3 : 2 ), - } + return { + mass, + cost: mass * (type === "advanced" ? 3 : 2), + }; } // needs to be at the top level -export const ftlReqsReaction = store => +export const ftlReqsReaction = (store) => createSelector( - [ - (ship) => ship.propulsion.ftl.type, - (ship) => ship.reqs.mass, - ], - (type,shipMass) => - store.dispatch.setFtlReqs(calcFtlReqs(type,shipMass)) - ); + [(ship) => ship.propulsion.ftl.type, (ship) => ship.reqs.mass], + (type, shipMass) => store.dispatch.setFtlReqs(calcFtlReqs(type, shipMass)) + ); diff --git a/src/lib/shipDux/structure/index.js b/src/lib/shipDux/structure/index.js index c5fe3cb..d0a7684 100644 --- a/src/lib/shipDux/structure/index.js +++ b/src/lib/shipDux/structure/index.js @@ -1,13 +1,15 @@ -import { Updux } from 'updux'; +import { Updux } from "updux"; -import hull from './hull.js'; -import screens from './screens.js'; -import cargo from './cargo.js'; -import armor from './armor.js'; -import streamlining from './streamlining.js'; +import hull from "./hull.js"; +import screens from "./screens.js"; +import cargo from "./cargo.js"; +import armor from "./armor.js"; +import streamlining from "./streamlining.js"; const dux = new Updux({ - subduxes: { hull, screens, cargo, streamlining, armor } + subduxes: { hull, screens, cargo, streamlining, armor }, + initial: { + uiTransform: "", + }, }); export default dux; -