aotds-docks/src/dux/weaponry/weapons/index.js

45 lines
1.2 KiB
JavaScript
Raw Normal View History

2020-07-19 20:21:28 +00:00
import Updux from "updux";
import { action, payload } from "ts-action";
import u from "updeep";
import { createSelector } from "reselect";
2020-07-27 22:17:55 +00:00
import { weapon_cost_mass } from '../../weapons/rules';
2020-07-19 20:21:28 +00:00
2020-07-27 22:17:55 +00:00
const add_weapon = action('add_weapon', payload());
2020-07-19 20:21:28 +00:00
const remove_weapon = action('remove_weapon', payload());
2020-07-27 22:17:55 +00:00
const uu = transform => state => transform(state)(state)
const with_reqs = uu( weapon => u(weapon_cost_mass(weapon)));
2020-07-19 20:21:28 +00:00
const dux = new Updux({
initial: [],
})
2020-07-27 22:17:55 +00:00
const weapon_initial = {
beam: { weapon_type: "beam", weapon_class: 1, arcs: ['F'] },
submunition: {
weapon_type: "submunition", arcs: ['F'] },
pds: { weapon_type: 'pds' },
scattergun: { weapon_type: 'scattergun' },
needle: { weapon_type: 'needle', arcs: ['F'] },
};
dux.addMutation( add_weapon, (type) => state => {
2020-07-19 20:21:28 +00:00
const id = 1 + Math.max( 0, ... state.map(({id})=>id) );
2020-07-27 22:17:55 +00:00
return [ ...state, { ...with_reqs(weapon_initial[type]), id }];
2020-07-19 20:21:28 +00:00
});
dux.addMutation( remove_weapon, id => state =>
state.filter( w => w.id !== id )
);
2020-07-27 22:17:55 +00:00
const set_weapon = action('set_weapon',payload());
dux.addMutation(
set_weapon, payload => u.map( u.if( _.matches({id: payload.id}),
state => with_reqs(u(payload,state)) )
)
);
2020-07-19 20:21:28 +00:00
export default dux.asDux;