const toast = require('izitoast'); const eachSeries = require('async/eachSeries'); const actions = require('./actions'); const { TIMES } = require('./constants'); const { getCombatSequence } = require('./utils'); function registerEvents(store) { // timeout handlers store.subscribe(() => { const { game, instance, ws } = store.getState(); if (!ws) return true; if (!game) ws.clearGameStateTimeout(); if (!instance) ws.clearInstanceStateTimeout(); }); function setPing(ping) { store.dispatch(actions.setPing(ping)); } function setTeam(team) { localStorage.setItem('team', JSON.stringify(team)); store.dispatch(actions.setTeam(team)); } function setNav(v) { store.dispatch(actions.setNav(v)); } function setConstructList(constructs) { // check team is in list const { team } = store.getState(); const ids = constructs.map(c => c.id); // team is fucked up, or just registered // reset to the first 3 constructs if (!team.every(t => t && ids.includes(t))) { store.dispatch(actions.setTeam([ids[0], ids[1], ids[2]])); } store.dispatch(actions.setConstructs(constructs)); } function setInstanceList(list) { store.dispatch(actions.setInstanceList(list)); } function setWs(ws) { store.dispatch(actions.setWs(ws)); } function setGame(game) { const { game: currentGame, ws } = store.getState(); if (game) ws.startGameStateTimeout(game.id); if (game && currentGame) { if (game.resolved.length !== currentGame.resolved.length) { // stop fetching the game state til animations are done ws.clearGameStateTimeout(); const newRes = game.resolved.slice(currentGame.resolved.length); let id = game.resolved.length - currentGame.resolved.length; return eachSeries(newRes, (r, cb) => { if (['Disable', 'TargetKo'].includes(r.event[0])) return cb(); // Create sub events for combat animations const sequence = getCombatSequence(r); id += 1; return eachSeries(sequence, (stages, sCb) => { const stagedR = Object.create(r); stagedR.sequence = sequence; stagedR.stages = stages; stagedR.id = id; let timeout = 0; if (stages.includes('START_SKILL') && stages.includes('END_SKILL')) { timeout = TIMES.SOURCE_AND_TARGET_TOTAL_DURATION; } else if (stages.includes('START_SKILL')) timeout = TIMES.SOURCE_DURATION_MS; else if (stages.includes('END_SKILL')) timeout = TIMES.TARGET_DURATION_MS; else if (stages.includes('POST_SKILL')) timeout = TIMES.POST_SKILL_DURATION_MS; store.dispatch(actions.setResolution(stagedR)); return setTimeout(sCb, timeout); }, err => { if (err) console.error(err); // Clear the anim classes store.dispatch(actions.setResolution('clear')); // Finished this resolution small delay for reset return setTimeout(cb, 5); }); }, err => { if (err) return console.error(err); store.dispatch(actions.setAvatarAnimation({ id: -1 })); store.dispatch(actions.setResolution(null)); // stop skipping resolutions store.dispatch(actions.setSkip(false)); // update the game store.dispatch(actions.setGame(game)); // get the latest state and restart polling ws.sendGameState(currentGame.id); return true; }); } } return store.dispatch(actions.setGame(game)); return console.log('EVENT ->', 'game', game); } function setAccount(account) { store.dispatch(actions.setAccount(account)); } function clearCombiner() { store.dispatch(actions.setInfo([])); store.dispatch(actions.setCombiner([null, null, null])); } function setActiveSkill(skill) { store.dispatch(actions.setActiveSkill(skill)); } function setActiveItem(v) { store.dispatch(actions.setActiveItem(v)); } function clearInfo() { store.dispatch(actions.setInfo(null)); store.dispatch(actions.setActiveConstruct(null)); console.log('event clear item'); } function clearInstance() { store.dispatch(actions.setCombiner([null, null, null])); store.dispatch(actions.setReclaiming(false)); store.dispatch(actions.setActiveSkill(null)); store.dispatch(actions.setActiveConstruct(null)); store.dispatch(actions.setInfo(null)); store.dispatch(actions.setItemEquip(null)); store.dispatch(actions.setItemUnequip(null)); store.dispatch(actions.setVboxHighlight([])); store.dispatch(actions.setConstructDeleteId(null)); } function setAccountInstances(v) { return store.dispatch(actions.setInstances(v)); } function setInstance(v) { const { account, ws, instance } = store.getState(); if (v) { ws.startInstanceStateTimeout(v.id); const player = v.players.find(p => p.id === account.id); store.dispatch(actions.setPlayer(player)); if (!instance || v.id !== instance.id) { store.dispatch(actions.setNav('vbox')); const first = player.constructs[0]; store.dispatch(actions.setActiveConstruct(first)); } } return store.dispatch(actions.setInstance(v)); } function setItemInfo(v) { return store.dispatch(actions.setItemInfo(v)); } // events.on('SET_PLAYER', setInstance); // events.on('SEND_SKILL', function skillActive(gameId, constructId, targetConstructId, skill) { // ws.sendGameSkill(gameId, constructId, targetConstructId, skill); // setConstructStatusUpdate(constructId, skill, targetConstructId); // }); // events.on('CONSTRUCT_ACTIVE', function constructActiveCb(construct) { // for (let i = 0; i < constructs.length; i += 1) { // if (constructs[i].id === construct.id) constructs[i].active = !constructs[i].active; // } // return setConstructs(constructs); // }); const errMessages = { select_constructs: 'Select your constructs before battle using the numbered buttons next to the construct avatar', complete_nodes: 'You need to complete the previously connected nodes first', max_skills: 'Your construct can only learn a maximum of 4 skills', }; function errorPrompt(type) { const message = errMessages[type]; const OK_BUTTON = ''; toast.info({ theme: 'dark', color: 'black', timeout: false, drag: false, position: 'center', maxWidth: window.innerWidth / 2, close: false, buttons: [ [OK_BUTTON, (instance, thisToast) => instance.hide({ transitionOut: 'fadeOut' }, thisToast)], ], message, }); } // setup / localstorage const team = JSON.parse(localStorage.getItem('team')); if (team && team.every(t => t)) { setTeam(team); setNav('list'); } return { errorPrompt, clearCombiner, clearInstance, setAccount, setActiveSkill, setActiveItem, setConstructList, setGame, clearInfo, setInstance, setInstanceList, setAccountInstances, setWs, setPing, setItemInfo, }; } module.exports = registerEvents;