diff --git a/.eslintrc.js b/.eslintrc.js index 2080e7b77..f7dbd14b8 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -28,7 +28,7 @@ module.exports = { // Generic global variables "Config": false, "BattleSearch": false, "soundManager": false, "Storage": false, "Tools": false, - "app": false, "toId": false, "toRoomid": false, "toUserid": false, "toName": false, "hashColor": false, "MD5": false, + "app": false, "toId": false, "toRoomid": false, "toUserid": false, "toName": false, "getString": false, "hashColor": false, "MD5": false, "ChatHistory": false, "Topbar": false, "UserList": false, // Rooms diff --git a/js/client-battle.js b/js/client-battle.js index 352db92d3..ee4035f80 100644 --- a/js/client-battle.js +++ b/js/client-battle.js @@ -121,13 +121,23 @@ return this.init(data); } if (data.substr(0, 9) === '|request|') { - var choiceOffset = 0; - data = data.substr(9); + var choiceData = {offset: 0}; + var requestData = null; + data = data.slice(9); if (!isNaN(data.substr(0, 1)) && data.substr(1, 1) === '|') { - choiceOffset = +data.substr(0, 1); - data = data.substr(2); + var nlIndex = data.indexOf('\n'); + if (nlIndex >= 0) { + choiceData.offset = +data.substr(0, 1); + try { + $.extend(choiceData, $.parseJSON(data.slice(2, nlIndex))); + } catch (err) {} + data = data.slice(nlIndex + 1); + } } - return this.receiveRequest($.parseJSON(data), choiceOffset); + try { + requestData = $.parseJSON(data); + } catch (err) {} + return this.receiveRequest(requestData, choiceData); } var log = data.split('\n'); @@ -301,8 +311,17 @@ if (!this.finalDecision) this.finalDecision = !!this.request.noCancel; } + var choiceOffset = this.choiceData.offset && this.choiceData.offset <= 3 ? this.choiceData.offset : 0; + var preDecided = _.map(getString(this.choiceData.done).split(''), Number); + var preSwitchFlags = _.map(getString(this.choiceData.leave).split(''), Number); + var preSwitchOutFlags = _.map(getString(this.choiceData.leave).split(''), Number); + var preTeamOrder = _.map(getString(this.choiceData.team).split(''), Number); + var type = ''; var moveTarget = ''; + if (choiceOffset >= switchables.length) { + this.choice = {waiting: true}; + } if (this.choice) { type = this.choice.type; moveTarget = this.choice.moveTarget; @@ -317,12 +336,15 @@ case 'move': if (!this.choice) { this.choice = { - choices: [], + preDecided: preDecided, + choices: new Array(choiceOffset), switchFlags: {}, switchOutFlags: {} }; - while (switchables[this.choice.choices.length] && switchables[this.choice.choices.length].fainted && this.choice.choices.length + 1 < this.battle.mySide.active.length) { - this.choice.choices.push('pass'); + for (var i = 0; i < preSwitchFlags.length; i++) this.choice.switchFlags[preSwitchFlags[i]] = 1; + for (var i = 0; i < preSwitchOutFlags.length; i++) this.choice.switchOutFlags[preSwitchOutFlags[i]] = 1; + while (preDecided.indexOf(this.choice.choices.length) >= 0 || switchables[this.choice.choices.length] && switchables[this.choice.choices.length].fainted && this.choice.choices.length + 1 < this.battle.mySide.active.length) { + this.choice.choices.push(preDecided.indexOf(this.choice.choices.length) >= 0 ? 'skip' : 'pass'); } } var pos = this.choice.choices.length - (type === 'movetarget' ? 1 : 0); @@ -478,21 +500,26 @@ case 'switch': if (!this.choice) { this.choice = { - choices: [], + preDecided: preDecided, + choices: new Array(choiceOffset), switchFlags: {}, switchOutFlags: {}, - freedomDegrees: 0, + freedomDegrees: 0, // Fancy term for the amount of Pokémon that won't be able to switch out. canSwitch: 0 }; + for (var i = 0; i < preSwitchFlags.length; i++) this.choice.switchFlags[preSwitchFlags[i]] = 1; + for (var i = 0; i < preSwitchOutFlags.length; i++) this.choice.switchOutFlags[preSwitchOutFlags[i]] = 1; } if (this.request.forceSwitch !== true) { - var faintedLength = this.request.forceSwitch.filter(function (fainted) {return fainted;}).length; - this.choice.freedomDegrees = faintedLength - switchables.slice(this.battle.mySide.active.length).filter(function (mon) {return !mon.zerohp;}).length; + var faintedLength = _.filter(this.request.forceSwitch.slice(choiceOffset), function (fainted) {return fainted;}).length; + this.choice.freedomDegrees = faintedLength - _.filter(switchables.slice(this.battle.mySide.active.length), function (mon) {return !mon.zerohp;}).length; if (this.choice.freedomDegrees < 0) this.choice.freedomDegrees = 0; this.choice.canSwitch = faintedLength - this.choice.freedomDegrees; if (!this.choice.freedomDegrees) { - while (!this.request.forceSwitch[this.choice.choices.length] && this.choice.choices.length < 6) this.choice.choices.push('pass'); + while (preDecided.indexOf(this.choice.choices.length) >= 0 || !this.request.forceSwitch[this.choice.choices.length] && this.choice.choices.length < 6) { + this.choice.choices.push(preDecided.indexOf(this.choice.choices.length) >= 0 ? 'skip' : 'pass'); + } } } var pos = this.choice.choices.length; @@ -550,6 +577,8 @@ var controls = '