hp-redux
Version:
Hearthstone simulator
93 lines (83 loc) • 2.29 kB
JavaScript
/* eslint-env node*/
const { ADD_EFFECT, DAMAGE, FREEZE, KILL, SUMMON } = require('../actions');
const merge = require('lodash/fp/merge');
const cards = require('../../data/cards.json');
const initialState = {
currentSequenceId: 0,
minionsById: {},
};
const minions = (state = initialState, action) => {
switch (action.type) {
case ADD_EFFECT: {
if (!state.minionsById.hasOwnProperty(action.characterId)) {
return state;
}
return merge(state, {
minionsById: {
[action.characterId]: {
effects: [...state.minionsById[action.characterId].effects, action.effectId],
},
},
});
}
case DAMAGE: {
const newHealth = {
minionsById: {},
};
action.characterIds.forEach((id) => {
if (state.minionsById.hasOwnProperty(id)) {
newHealth.minionsById[id] = {
health: state.minionsById[id].health - action.amount,
};
}
});
return merge(state, newHealth);
}
case FREEZE: {
const newFreeze = {
minionsById: {},
};
action.characterIds.forEach((id) => {
if (state.minionsById.hasOwnProperty(id)) {
newFreeze.minionsById[id] = {
frozenFor: action.frozenFor,
};
}
});
return merge(state, newFreeze);
}
case KILL: {
const copy = Object.assign({}, state);
delete copy.minionsById[action.characterId];
return copy;
}
case SUMMON: {
const card = cards[action.cardId];
const newSequenceId = state.currentSequenceId + 1;
return merge(state, {
currentSequenceId: newSequenceId,
minionsById: {
[action.minionId]: {
id: action.minionId,
cardId: card.id,
name: card.name,
sequenceId: newSequenceId,
attack: card.attack,
maxHealth: card.health,
health: card.health,
divineShield: false,
exhausted: true,
alreadyAttacked: false,
windfuryUsed: false,
frozenFor: 0,
effects: [],
auras: [],
},
},
});
}
default:
return state;
}
};
module.exports = minions;