diff --git a/src/lib/store/__snapshots__/ship.test.ts.snap b/src/lib/store/__snapshots__/ship.test.ts.snap index 6be9769..4f447f0 100644 --- a/src/lib/store/__snapshots__/ship.test.ts.snap +++ b/src/lib/store/__snapshots__/ship.test.ts.snap @@ -53,6 +53,14 @@ exports[`state has the expected shape 1`] = ` }, "space": 0, }, + "carrier": { + "nbrBays": 0, + "reqs": { + "cost": 0, + "mass": 0, + }, + "squadrons": [], + }, "hull": { "max": 0, "min": 0, diff --git a/src/lib/store/ship.test.ts b/src/lib/store/ship.test.ts index 56a1724..6bd041f 100644 --- a/src/lib/store/ship.test.ts +++ b/src/lib/store/ship.test.ts @@ -17,11 +17,13 @@ test("kicking the tires", () => { store.dispatch.setNbrCarrierBays(2); expect(store.getState().carrier.nbrBays).toEqual(2); + expect(store.getState.isCarrier()).toBe(false); + + store.dispatch.setCarrier(true); store.dispatch.setSquadronType(2, "fast"); - expect(store.getState().carrier.squadrons[1]).toHaveProperty("type", "fast"); - expect(store.getState.isCarrier()).toBe(true); + expect(store.getState().carrier.squadrons[1]).toHaveProperty("type", "fast"); store.dispatch.setStreamlining("partial"); diff --git a/src/lib/store/ship.ts b/src/lib/store/ship.ts index b177bf8..444e56f 100644 --- a/src/lib/store/ship.ts +++ b/src/lib/store/ship.ts @@ -30,6 +30,7 @@ const structure = new Updux({ hull: hullDux, screens: screensDux, armor: armorDux, + carrier: carrierDux, }, }); diff --git a/src/lib/store/ship/carrier.ts b/src/lib/store/ship/carrier.ts index 7426fd1..2a1cdf6 100644 --- a/src/lib/store/ship/carrier.ts +++ b/src/lib/store/ship/carrier.ts @@ -3,116 +3,89 @@ import u from "@yanick/updeep-remeda"; import { reqs, type Reqs } from "$lib/shipDux/reqs"; type Squadron = { - type: string; - reqs: Reqs; + type: string; + reqs: Reqs; }; const initialState = { - nbrBays: 0, - squadrons: [] as Squadron[], - reqs, + nbrBays: 0, + squadrons: [] as Squadron[], + reqs, }; export const squadronTypes = [ - { type: "standard", cost: 3 }, - { type: "fast", cost: 4 }, - { type: "heavy", cost: 5 }, - { type: "interceptor", cost: 3 }, - { type: "attack", cost: 4 }, - { type: "long range", cost: 4 }, - { type: "torpedo", cost: 6 }, + { type: "standard", cost: 3 }, + { type: "fast", cost: 4 }, + { type: "heavy", cost: 5 }, + { type: "interceptor", cost: 3 }, + { type: "attack", cost: 4 }, + { type: "long range", cost: 4 }, + { type: "torpedo", cost: 6 }, ]; const setNbrCarrierBays = createPayloadAction("setNbrCarrierBays"); const setSquadronType = createPayloadAction( - "setSquadronType", - (id: number, type: string) => ({ id, type }) + "setSquadronType", + (id: number, type: string) => ({ id, type }) ); export const carrierDux = new Updux({ - initialState, - actions: { setNbrCarrierBays, setSquadronType }, + initialState, + actions: { setNbrCarrierBays, setSquadronType }, }); function calcBaysReqs(bays) { - return { - mass: 9 * bays, - cost: 18 * bays, - }; + return { + mass: 9 * bays, + cost: 18 * bays, + }; } const adjustSquadrons = (bays: number) => (squadrons) => { - if (squadrons.length === bays) return squadrons; + if (squadrons.length === bays) return squadrons; - if (squadrons.length > bays) { - return squadrons.slice(0, bays); - } + if (squadrons.length > bays) { + return squadrons.slice(0, bays); + } - return [ - ...squadrons, - ...Array.from({ length: bays - squadrons.length }) - .fill({ - type: squadronTypes[0].type, - reqs: { - cost: 6 * squadronTypes[0].cost, - mass: 6, - }, - }) - .map((s, i) => ({ ...s, id: squadrons.length + i + 1 })), - ]; + return [ + ...squadrons, + ...Array.from({ length: bays - squadrons.length }) + .fill({ + type: squadronTypes[0].type, + reqs: { + cost: 6 * squadronTypes[0].cost, + mass: 6, + }, + }) + .map((s, i) => ({ ...s, id: squadrons.length + i + 1 })), + ]; }; carrierDux.addMutation(setNbrCarrierBays, (nbrBays) => - u({ - nbrBays, - reqs: calcBaysReqs(nbrBays), - squadrons: adjustSquadrons(nbrBays), - }) + u({ + nbrBays, + reqs: calcBaysReqs(nbrBays), + squadrons: adjustSquadrons(nbrBays), + }) ); carrierDux.addMutation(setSquadronType, ({ id, type }) => { - return u({ - squadrons: u.map( - u.if(u.matches({ id }), (state) => { - return u(state, { - type, - reqs: squadronReqs(type), - }); - }) - ), - }); + return u({ + squadrons: u.map( + u.if(u.matches({ id }), (state) => { + return u(state, { + type, + reqs: squadronReqs(type), + }); + }) + ), + }); }); function squadronReqs(type: string) { - return { - mass: 6, - cost: 6 * squadronTypes.find((s) => s.type === type)?.cost, - }; + return { + mass: 6, + cost: 6 * squadronTypes.find((s) => s.type === type)?.cost, + }; } - -/* -export const { actions, reducer } = createSlice({ - name: "carrier", - initialStateState, - reducers: { - setCarrierBays: (state, action: PayloadAction) => { - state.bays = action.payload; - state.reqs = calcBaysReqs(action.payload); - state.squadrons = adjustSquadrons(action.payload)(state.squadrons); - }, - setSquadronType: ( - state, - action: PayloadAction<{ type: string; id: number }> - ) => { - state.squadrons[action.payload.id - 1] = { - type: action.payload.type, - reqs: squadronReqs(action.payload.type), - }; - }, - }, -}); - - - - -*/ diff --git a/src/lib/store/ship/identification.ts b/src/lib/store/ship/identification.ts index 272dde7..bdb65f0 100644 --- a/src/lib/store/ship/identification.ts +++ b/src/lib/store/ship/identification.ts @@ -1,6 +1,5 @@ import Updux, { createAction, withPayload } from "updux"; import u from "@yanick/updeep-remeda"; -import * as R from "remeda"; import { carrierDux } from "./carrier"; const initialState = { @@ -17,6 +16,7 @@ const initialState = { const setShipClass = createAction("setShipClass", withPayload()); const updateIdentification = createAction("updateIdentification"); const setShipReqs = createAction("setShipReqs", withPayload()); +const setCarrier = createAction("setCarrier", withPayload()); export const identificationDux = new Updux({ initialState, @@ -24,6 +24,7 @@ export const identificationDux = new Updux({ setShipClass, updateIdentification, setShipReqs, + setCarrier, }, selectors: { getShipMass: (state) => state.reqs.mass, @@ -33,12 +34,15 @@ export const identificationDux = new Updux({ identificationDux.addMutation(setShipClass, (shipClass) => u({ shipClass })); identificationDux.addMutation(updateIdentification, (update) => u(update)); + +identificationDux.addMutation(setCarrier, (isCarrier) => u({ isCarrier })); +identificationDux.addEffect(setCarrier, (api) => (next) => (action) => { + next(action); + if (!action.payload) { + api.dispatch(carrierDux.actions.setNbrCarrierBays(0)); + } +}); + identificationDux.addMutation(setShipReqs, (reqs) => u({ reqs })); -identificationDux.addMutation(carrierDux.actions.setNbrCarrierBays, (nbrBays) => - u({ - isCarrier: nbrBays > 0, - }) -); - export default identificationDux;