From 9bf108dad87fbf77a26578bad3d94c2906a67cd6 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Sun, 2 Sep 2018 01:12:40 -0500 Subject: [PATCH 0001/1782] Clarify README Warning --- README.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 07118c70c8..f3465412bf 100644 --- a/README.md +++ b/README.md @@ -47,16 +47,19 @@ Warning ------------------------------------------------------------------------ This repository is not "batteries included". It does NOT include instructions -to run a full Pokémon Showdown client, and we will not provide them. Please -do not ask for help on this; you will be turned away. +to run a full Pokémon Showdown login server, and we will not provide them. +Please do not ask for help on this; you will be turned away. + +If you make a mistake hosting a login server, your users' passwords can get +stolen, so we do not want anyone to host a login server unless they can +figure out how to do it without help. It also doesn't include several resource files (namely, the `/audio/` and `/sprites/` directories) for size reasons. -In other words, this repository is incomplete and NOT intended for people -who wish to serve their own Pokémon Showdown client (you can, but it'll -require you figure it out yourself). Rather, it's intended for people who -wish to contribute and submit pull requests to Pokémon Showdown's client. +On the other hand, as long as you don't want to run your own login server, +this repository contains everything you need to test changes to the client; +just see the "Testing" section above. License ------------------------------------------------------------------------ From 099fe28151683038991fcf41cee357f370c44ec8 Mon Sep 17 00:00:00 2001 From: Marty-D Date: Mon, 3 Sep 2018 14:37:48 -0400 Subject: [PATCH 0002/1782] Update minisprite sheet --- src/battle-dex.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/battle-dex.ts b/src/battle-dex.ts index 1430d5ae09..1809de586c 100644 --- a/src/battle-dex.ts +++ b/src/battle-dex.ts @@ -1366,7 +1366,8 @@ const Tools = { monohm: 1188 + 19, duohm: 1188 + 20, // protowatt: 1188 + 21, - voodoll: 1188 + 22 + voodoll: 1188 + 22, + mumbao: 1188 + 23 } as {[id: string]: number}; if (altNums[id]) { @@ -1477,7 +1478,7 @@ const Tools = { let top = Math.floor(num / 12) * 30; let left = (num % 12) * 40; let fainted = (pokemon && pokemon.fainted ? ';opacity:.7;filter:contrast(0)' : ''); - return 'background:transparent url(' + Tools.resourcePrefix + 'sprites/smicons-sheet.png?a3) no-repeat scroll -' + left + 'px -' + top + 'px' + fainted; + return 'background:transparent url(' + Tools.resourcePrefix + 'sprites/smicons-sheet.png?a4) no-repeat scroll -' + left + 'px -' + top + 'px' + fainted; }, getTeambuilderSprite(pokemon: any, gen: number = 0) { From a133ee8c5ee7a5e500f0401de952bd5b1f148cb0 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Wed, 5 Sep 2018 16:48:27 -0500 Subject: [PATCH 0003/1782] Fix some bugs caught by LGTM --- .eslintrc.js | 2 -- js/client-battle-tooltips.js | 56 +++++++++++++----------------------- js/client-battle.js | 8 ------ js/client-chat-tournament.js | 2 +- js/client-chat.js | 13 ++++----- js/client-ladder.js | 1 - js/client-mainmenu.js | 3 -- js/client-teambuilder.js | 14 ++------- js/client.js | 1 - js/search.js | 2 +- js/storage.js | 17 ++++------- lib/validate-token.js | 3 +- src/battle-animations.ts | 1 - src/battle-dex.ts | 8 +----- src/battle.ts | 22 ++++---------- 15 files changed, 45 insertions(+), 108 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index f36320e75a..46806b19b4 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,7 +1,5 @@ 'use strict'; -const os = require('os'); - module.exports = { "root": true, "parserOptions": { diff --git a/js/client-battle-tooltips.js b/js/client-battle-tooltips.js index 3ee2c8e5a4..ec909145c6 100644 --- a/js/client-battle-tooltips.js +++ b/js/client-battle-tooltips.js @@ -441,8 +441,8 @@ var BattleTooltips = (function () { } text += '

'; } else if (pokemonData.item) { - item = Tools.getItem(pokemonData.item).name; - text += '

Item: ' + item + '

'; + var itemName = Tools.getItem(pokemonData.item).name; + text += '

Item: ' + itemName + '

'; } text += '

' + pokemonData.stats['atk'] + ' Atk / ' + pokemonData.stats['def'] + ' Def / ' + pokemonData.stats['spa']; if (this.battle.gen === 1) { @@ -868,28 +868,20 @@ var BattleTooltips = (function () { } // Weather and pseudo-weather type changes. if (move.id === 'weatherball' && this.battle.weather) { - var noWeatherAbility = false; - // Check if your side has an anti weather ability to skip this. - if (!noWeatherAbility) { - for (var i = 0; i < this.battle.mySide.active.length; i++) { - if (this.battle.mySide.active[i] && this.battle.mySide.active[i].ability in {'Air Lock': 1, 'Cloud Nine': 1}) { - noWeatherAbility = true; - break; - } - } - } - // If you don't, check if the opponent has it afterwards. - if (!noWeatherAbility) { - for (var i = 0; i < this.battle.yourSide.active.length; i++) { - if (this.battle.yourSide.active[i] && this.battle.yourSide.active[i].ability in {'Air Lock': 1, 'Cloud Nine': 1}) { - noWeatherAbility = true; - break; + var antiWeatherAbility = false; + // Check if there's an anti weather ability to skip this. + abilitySearch: for (var i = 0; i < this.battle.sides.length; i++) { + var side = this.battle.sides[i]; + for (var j = 0; j < side.active.length; j++) { + if (side.active[j] && ['Air Lock', 'Cloud Nine'].includes(side.active[j].ability)) { + antiWeatherAbility = true; + break abilitySearch; } } } // If the weather is indeed active, check it to see what move type weatherball gets. - if (!noWeatherAbility) { + if (!antiWeatherAbility) { if (this.battle.weather === 'sunnyday' || this.battle.weather === 'desolateland') moveType = 'Fire'; if (this.battle.weather === 'raindance' || this.battle.weather === 'primordialsea') moveType = 'Water'; if (this.battle.weather === 'sandstorm') moveType = 'Rock'; @@ -989,26 +981,18 @@ var BattleTooltips = (function () { if (move.id in table.overrideBP) basePower = table.overrideBP[move.id]; } var basePowerComment = ''; - var noWeatherAbility = false; - // Check if your side has an anti weather ability to skip this. - if (!noWeatherAbility) { - for (var i = 0; i < this.battle.mySide.active.length; i++) { - if (this.battle.mySide.active[i] && this.battle.mySide.active[i].ability in {'Air Lock': 1, 'Cloud Nine': 1}) { - noWeatherAbility = true; - break; - } - } - } - // If you don't, check if the opponent has it afterwards. - if (!noWeatherAbility) { - for (var i = 0; i < this.battle.yourSide.active.length; i++) { - if (this.battle.yourSide.active[i] && this.battle.yourSide.active[i].ability in {'Air Lock': 1, 'Cloud Nine': 1}) { - noWeatherAbility = true; - break; + var antiWeatherAbility = false; + // Check if there's an anti weather ability to skip this. + abilitySearch2: for (var i = 0; i < this.battle.sides.length; i++) { + var side = this.battle.sides[i]; + for (var j = 0; j < side.active.length; j++) { + if (side.active[j] && ['Air Lock', 'Cloud Nine'].includes(side.active[j].ability)) { + antiWeatherAbility = true; + break abilitySearch2; } } } - var thereIsWeather = !!this.battle.weather && !noWeatherAbility; + var thereIsWeather = !!this.battle.weather && !antiWeatherAbility; if (move.id === 'acrobatics') { if (!pokemonData.item) { basePower *= 2; diff --git a/js/client-battle.js b/js/client-battle.js index 6662fde76c..7e63640f94 100644 --- a/js/client-battle.js +++ b/js/client-battle.js @@ -323,11 +323,7 @@ }, controlsShown: false, updateControlsForPlayer: function () { - var battle = this.battle; - this.callbackWaiting = true; - var active = this.battle.mySide.active[0]; - if (!active) active = {}; var act = ''; var switchables = []; @@ -904,7 +900,6 @@ return; } request.requestType = 'move'; - var notifyObject = null; if (request.forceSwitch) { request.requestType = 'switch'; } else if (request.teamPreview) { @@ -998,7 +993,6 @@ e.stopPropagation(); }, switchSides: function () { - var paused = this.battle.paused; this.battle.switchSides(); }, pause: function () { @@ -1060,10 +1054,8 @@ var isZMove = !!(this.$('input[name=zmove]')[0] || '').checked; var isUltraBurst = !!(this.$('input[name=ultraburst]')[0] || '').checked; - var move = e.getAttribute('data-move'); var target = e.getAttribute('data-target'); var choosableTargets = {normal: 1, any: 1, adjacentAlly: 1, adjacentAllyOrSelf: 1, adjacentFoe: 1}; - var spreadTargets = {allAdjacentFoes: 1, allAdjacent: 1}; this.choice.choices.push('move ' + pos + (isMega ? ' mega' : '') + (isZMove ? ' zmove' : '') + (isUltraBurst ? ' ultra' : '')); if (myActive.length > 1 && target in choosableTargets) { diff --git a/js/client-chat-tournament.js b/js/client-chat-tournament.js index e85cebf660..3849876075 100644 --- a/js/client-chat-tournament.js +++ b/js/client-chat-tournament.js @@ -804,7 +804,7 @@ initialize: function (data) { this.$el.html('

    ' + data.users.map(function (user) { var escapedUser = Tools.escapeHTML(user); - return '
  • '; + return '
  • '; }).join('') + '
'); }, selectUser: function (user) { diff --git a/js/client-chat.js b/js/client-chat.js index 5f28a439e3..b9155ed27a 100644 --- a/js/client-chat.js +++ b/js/client-chat.js @@ -860,14 +860,13 @@ case 'join': case 'j': if (noSpace) return text; - var room = toRoomid(target); if (app.rooms[target]) { app.focusRoom(target); return false; } - room = toId(target); - if (app.rooms[room]) { - app.focusRoom(room); + var roomid = toId(target); + if (app.rooms[roomid]) { + app.focusRoom(roomid); return false; } return text; // Send the /join command through to the server. @@ -1182,7 +1181,7 @@ } }, addRow: function (line) { - var name, name2, room, action, silent, oldid; + var name, name2, silent; if (line && typeof line === 'string') { if (line.charAt(0) !== '|') line = '||' + line; var row = line.substr(1).split('|'); @@ -1229,7 +1228,7 @@ if (!matches) { return; // bogus room ID could be used to inject JavaScript } - var format = Tools.escapeFormat(matches ? matches[1] : ''); + var format = Tools.escapeFormat(matches[1]); if (silent && !Tools.prefs('showbattles')) return; @@ -1621,7 +1620,7 @@ return self.comparator(a, b); }); } - for (var i = 0, len = users.length; i < users.length; i++) { + for (var i = 0; i < users.length; i++) { var userid = users[i]; buf += this.constructItem(userid); } diff --git a/js/client-ladder.js b/js/client-ladder.js index 769d662419..5cd7d4ec35 100644 --- a/js/client-ladder.js +++ b/js/client-ladder.js @@ -27,7 +27,6 @@ app.send('/leave ' + this.id); }, addRow: function (line) { - var name, name2, room, action, silent, oldid; if (!line || typeof line !== 'string') return; if (line.charAt(0) !== '|') line = '||' + line; var pipeIndex = line.indexOf('|', 1); diff --git a/js/client-mainmenu.js b/js/client-mainmenu.js index 1736e82cd8..cf80f40577 100644 --- a/js/client-mainmenu.js +++ b/js/client-mainmenu.js @@ -657,7 +657,6 @@ if (atLeastOneGen5 && !Tools.loadedSpriteData['bw']) Tools.loadSpriteData('bw'); }, openChallenge: function (name, $pmWindow) { - var userid = toId(name); if (!$pmWindow) $pmWindow = this.openPM(name, true); var $challenge = $pmWindow.find('.challenge'); if (!$challenge.length) { @@ -693,7 +692,6 @@ }, updateTeams: function () { if (!window.BattleFormats) return; - var teams = Storage.teams; var self = this; this.$('button[name=team]').each(function (i, el) { @@ -942,7 +940,6 @@ var curSection = ''; for (var i in BattleFormats) { var format = BattleFormats[i]; - var selected = false; if (selectType === 'teambuilder') { if (!format.isTeambuilderFormat) continue; } else { diff --git a/js/client-teambuilder.js b/js/client-teambuilder.js index b3c819e57b..e0ae112071 100644 --- a/js/client-teambuilder.js +++ b/js/client-teambuilder.js @@ -283,6 +283,7 @@ buf += '

Gen ' + gen + '

'; } } + var formatName; if (gen === '/') { formatName = format.slice(1); format = formatName + '/'; @@ -295,7 +296,7 @@ buf += '
' : '">') + '
' + formatName + '
' + (this.curFolder === format ? '
' : ''); continue; } - var formatName = format.slice(1); + formatName = format.slice(1); if (formatName === '~') formatName = ''; format = 'gen' + newGen + formatName; if (format.length === 4) formatName = '(uncategorized)'; @@ -768,7 +769,6 @@ e.currentTarget.className = 'team'; }, dragStartTeam: function (e) { - var target = e.currentTarget; var dataTransfer = e.originalEvent.dataTransfer; dataTransfer.effectAllowed = 'copyMove'; @@ -836,7 +836,6 @@ this.$('.teamlist').css('pointer-events', 'none'); $(teamEl).parent().removeClass('dragging'); - var format = this.curFolder; if (app.draggingFolder) { var $folder = $(app.draggingFolder); app.draggingFolder = null; @@ -848,7 +847,7 @@ var count = Number($plusOneFolder.text().substr(1)) + 1; $plusOneFolder.text('+' + count); } - format = $folder.data('value'); + var format = $folder.data('value'); if (format.slice(-1) === '/') { team.folder = format.slice(0, -1); } else { @@ -1873,9 +1872,6 @@ this.plus = ''; this.minus = ''; for (var i in stats) { - var width = stats[i] * 200 / 504; - if (i == 'hp') width = stats[i] * 200 / 704; - if (width > 200) width = 200; var val; if (this.curTeam.gen > 2) { val = '' + (set.evs[i] || ''); @@ -2426,7 +2422,6 @@ var val = entry.slice(entry.indexOf("|") + 1); if (this.curChartType === 'move' && e.currentTarget.className === 'cur') { // clicked a move, remove it if we already have it - var $emptyEl; var moves = []; for (var i = 1; i <= 4; i++) { var $inputEl = this.$('input[name=move' + i + ']'); @@ -2606,7 +2601,6 @@ }, chartSet: function (val, selectNext) { var inputName = this.curChartName; - var id = toId(val); var input = this.$('input[name=' + inputName + ']'); if (this.chartSetCustom(input.val())) return; input.val(val).removeClass('incomplete'); @@ -2770,7 +2764,6 @@ setPokemon: function (val, selectNext) { var set = this.curSet; var template = Tools.getTemplate(val); - var newPokemon = !set.species; if (!template.exists || set.species === template.species) { if (selectNext) this.$('input[name=item]').select(); return; @@ -3040,7 +3033,6 @@ else if (stats.atk > stats.spa && moveCount['Physical'] > 1) offenseBias = 'Physical'; else if (moveCount['Special'] > moveCount['Physical']) offenseBias = 'Special'; else offenseBias = 'Physical'; - var offenseStat = stats[offenseBias === 'Special' ? 'spa' : 'atk']; if (moveCount['Stall'] + moveCount['Support'] / 2 <= 2 && bulk < 135000 && moveCount[offenseBias] >= 1.5) { if (isFast) { diff --git a/js/client.js b/js/client.js index 7b65e1520b..402ca600df 100644 --- a/js/client.js +++ b/js/client.js @@ -1527,7 +1527,6 @@ var leftMin = (this.curRoom.minWidth || this.curRoom.bestWidth); var leftMinMain = (this.curRoom.minMainWidth || leftMin); var rightMin = (this.sideRoom.minWidth || this.sideRoom.bestWidth); - var rightMinMain = (this.sideRoom.minMainWidth || leftMin); var available = $(window).width(); if (this.curRoom.isSideRoom) { // we're trying to focus a side room diff --git a/js/search.js b/js/search.js index a8444fc7a8..8d4aef539c 100644 --- a/js/search.js +++ b/js/search.js @@ -897,7 +897,7 @@ var abilities = []; if (template.isMega) { if (format === 'almostanyability') abilitySet.unshift(['html', '

Will be ' + Tools.escapeHTML(template.abilities['0']) + ' after Mega Evolving.

']); - template = Tools.getTemplate(template.baseSpecies); + // template is unused after this, so no need to replace } for (var i in BattleAbilities) { if (BattleAbilities[i].isNonstandard) continue; diff --git a/js/storage.js b/js/storage.js index d2018b60c3..70ed04aee2 100644 --- a/js/storage.js +++ b/js/storage.js @@ -176,7 +176,6 @@ Storage.bg = { var s; var l = (max + min) / 2; if (max === min) { - h = s = 0; return '0, 0%'; } else { var d = max - min; @@ -1260,7 +1259,7 @@ Storage.exportTeam = function (team) { } if (defaultIvs && !hpType) { for (var stat in BattleStatNames) { - if (curSet.ivs[stat] !== 31 && typeof curSet.ivs[stat] !== undefined) { + if (curSet.ivs[stat] !== 31 && curSet.ivs[stat] !== undefined) { defaultIvs = false; break; } @@ -1282,7 +1281,7 @@ Storage.exportTeam = function (team) { if (!first) { text += " \n"; } - if (curSet.moves && curSet.moves) for (var j = 0; j < curSet.moves.length; j++) { + if (curSet.moves) for (var j = 0; j < curSet.moves.length; j++) { var move = curSet.moves[j]; if (move.substr(0, 13) === 'Hidden Power ') { move = move.substr(0, 13) + '[' + move.substr(13) + ']'; @@ -1506,19 +1505,16 @@ Storage.nwDeleteAllTeams = function (callback) { }; Storage.nwDeleteTeamFile = function (filename, callback) { - var self = this; - var line = filename; - if (line.substr(line.length - 4).toLowerCase() === '.txt') { - line = line.substr(0, line.length - 4); - } else { + if (filename.slice(-4).toLowerCase() !== '.txt') { // not a team file - self.nwTeamsLeft--; - if (!self.nwTeamsLeft) { + this.nwTeamsLeft--; + if (!this.nwTeamsLeft) { if (callback) callback(); Storage.fsReady.load(); } return; } + var self = this; fs.unlink(this.dir + 'Teams/' + filename, function (err) { var directory = filename.split('/').slice(0, -1).join('/'); fs.rmdir(directory, function () {}); @@ -1627,7 +1623,6 @@ Storage.nwStopLoggingChat = function () { }; Storage.nwLogChat = function (roomid, line) { roomid = toRoomid(roomid); - var self = this; if (!this.loggingChat) return; var chatLogFdMonth = this.getLogMonth(); if (chatLogFdMonth !== this.chatLogFdMonth) { diff --git a/lib/validate-token.js b/lib/validate-token.js index ed350bef15..c14ad19932 100644 --- a/lib/validate-token.js +++ b/lib/validate-token.js @@ -6,7 +6,6 @@ const CLIENT_ID = '912270888098-jjnre816lsuhc5clj3vbcn4o2q7p4qvk.apps.googleuser const token = process.argv[2]; -var auth = new gal.GoogleAuth(); var client = new gal.OAuth2Client(CLIENT_ID, '', ''); client.verifyIdToken({ idToken: token, @@ -17,7 +16,7 @@ client.verifyIdToken({ function(e, login) { if (e) return console.log(e); var payload = login.getPayload(); - var userid = payload['sub']; + // var userid = payload['sub']; console.log(JSON.stringify(payload)); // If request specified a G Suite domain: //var domain = payload['hd']; diff --git a/src/battle-animations.ts b/src/battle-animations.ts index 46f816559e..ac8a097994 100644 --- a/src/battle-animations.ts +++ b/src/battle-animations.ts @@ -320,7 +320,6 @@ class BattleScene { left = 210; top = 245; - scale = 1; scale = 1.5 - 0.5 * ((loc.z!) / 200); if (scale < .1) scale = .1; diff --git a/src/battle-dex.ts b/src/battle-dex.ts index 1809de586c..dc79e548e0 100644 --- a/src/battle-dex.ts +++ b/src/battle-dex.ts @@ -415,7 +415,7 @@ const Tools = { escapeHTML(str: string, jsEscapeToo?: boolean) { str = getString(str).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); - if (jsEscapeToo) str = str.replace(/'/g, '\\\''); + if (jsEscapeToo) str = str.replace(/\\/g, '\\\\').replace(/'/g, '\\\''); return str; }, @@ -428,12 +428,6 @@ const Tools = { return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); }, - escapeQuotes(str: string) { - str = (str ? '' + str : ''); - str = str.replace(/'/g, '\\\''); - return str; - }, - sanitizeHTML: (function () { if (!('html4' in window)) { return function () { diff --git a/src/battle.ts b/src/battle.ts index 23975dcc7e..df9d910a32 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -250,7 +250,6 @@ class Pokemon { delete this.volatiles[volatile]; } addVolatile(volatile: ID, ...args: any[]) { - let battle = this.side.battle; if (this.hasVolatile(volatile) && !args.length) return; this.volatiles[volatile] = [volatile, ...args] as EffectState; this.sprite.addEffect(volatile); @@ -265,7 +264,6 @@ class Pokemon { } addTurnstatus(volatile: ID) { volatile = toId(volatile); - let battle = this.side.battle; this.sprite.addEffect(volatile); if (this.hasTurnstatus(volatile)) return; this.turnstatuses[volatile] = [volatile]; @@ -633,7 +631,7 @@ class Side { this.spriteid = spriteid; } setName(name: string, spriteid?: string | number) { - if (name) this.name = (name || ''); + if (name) this.name = name; this.id = toId(this.name); if (spriteid) { this.spriteid = spriteid; @@ -652,7 +650,6 @@ class Side { return "the opposing team"; } addSideCondition(effect: Effect) { - let elem, curelem; let condition = effect.id; if (this.sideConditions[condition]) { if (condition === 'spikes' || condition === 'toxicspikes') { @@ -709,7 +706,6 @@ class Side { this.battle.scene.removeSideCondition(this.n, id); } newPokemon(data: any, replaceSlot = -1) { - let pokeobj; let poke = new Pokemon(data, this); if (!poke.ability && poke.baseAbility) poke.ability = poke.baseAbility; poke.reset(); @@ -1306,7 +1302,9 @@ class Battle { if (!this.fastForward) { this.scene.upkeepWeather(); } - if (newWeather && newWeather.upkeepMessage) this.message('
' + newWeather.upkeepMessage + '
'); + if (newWeather && newWeather.upkeepMessage) { + this.message('
' + newWeather.upkeepMessage + '
'); + } return; } if (newWeather) { @@ -1322,10 +1320,6 @@ class Battle { } this.weatherTimeLeft = (this.gen <= 5 || isExtremeWeather) ? 0 : 8; this.weatherMinTimeLeft = (this.gen <= 5 || isExtremeWeather) ? 0 : 5; - } else if (isUpkeep) { - this.scene.log('
' + newWeather.upkeepMessage + '
'); - this.weatherTimeLeft = 0; - this.weatherMinTimeLeft = 0; } else if (isExtremeWeather) { this.message('' + newWeather.startMessage + ''); this.weatherTimeLeft = 0; @@ -4577,7 +4571,6 @@ class Battle { newSpecies = args[2].substr(0, commaIndex); } let template = Tools.getTemplate(newSpecies); - let spriteData = {'shiny': poke.sprite.sp.shiny}; poke.species = newSpecies; poke.ability = poke.baseAbility = (template.abilities ? template.abilities['0'] : ''); @@ -4890,12 +4883,9 @@ class Battle { if (this.endCallback) this.endCallback(this); return; } - let ret; if (this.paused && !this.fastForward) return; - if (!ret) { - this.run(this.activityQueue[this.activityStep]); - this.activityStep++; - } + this.run(this.activityQueue[this.activityStep]); + this.activityStep++; animations = this.scene.finishAnimations(); } From caa5240e7d026f2169f4a5626a6161640b57e95f Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Thu, 6 Sep 2018 02:42:03 -0500 Subject: [PATCH 0004/1782] Update and minify JS libraries This is _mostly_ to shut up LGTM but also partially because this should be done periodically anyway. --- js/lib/lodash.core.js | 3859 +------------------------ js/lib/soundmanager2-nodebug-jsmin.js | 165 +- js/lib/soundmanager2-nodebug.js | 2722 +---------------- 3 files changed, 183 insertions(+), 6563 deletions(-) diff --git a/js/lib/lodash.core.js b/js/lib/lodash.core.js index 846d479f44..54360a3c4a 100644 --- a/js/lib/lodash.core.js +++ b/js/lib/lodash.core.js @@ -1,3836 +1,29 @@ /** * @license - * Lodash (Custom Build) - * Build: `lodash core` - * Copyright JS Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Lodash (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE + * Build: `lodash core -o ./dist/lodash.core.js` */ -;(function() { - - /** Used as a safe reference for `undefined` in pre-ES5 environments. */ - var undefined; - - /** Used as the semantic version number. */ - var VERSION = '4.17.4'; - - /** Error message constants. */ - var FUNC_ERROR_TEXT = 'Expected a function'; - - /** Used to compose bitmasks for value comparisons. */ - var COMPARE_PARTIAL_FLAG = 1, - COMPARE_UNORDERED_FLAG = 2; - - /** Used to compose bitmasks for function metadata. */ - var WRAP_BIND_FLAG = 1, - WRAP_PARTIAL_FLAG = 32; - - /** Used as references for various `Number` constants. */ - var INFINITY = 1 / 0, - MAX_SAFE_INTEGER = 9007199254740991; - - /** `Object#toString` result references. */ - var argsTag = '[object Arguments]', - arrayTag = '[object Array]', - asyncTag = '[object AsyncFunction]', - boolTag = '[object Boolean]', - dateTag = '[object Date]', - errorTag = '[object Error]', - funcTag = '[object Function]', - genTag = '[object GeneratorFunction]', - numberTag = '[object Number]', - objectTag = '[object Object]', - proxyTag = '[object Proxy]', - regexpTag = '[object RegExp]', - stringTag = '[object String]'; - - /** Used to match HTML entities and HTML characters. */ - var reUnescapedHtml = /[&<>"']/g, - reHasUnescapedHtml = RegExp(reUnescapedHtml.source); - - /** Used to map characters to HTML entities. */ - var htmlEscapes = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' - }; - - /** Detect free variable `global` from Node.js. */ - var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; - - /** Detect free variable `self`. */ - var freeSelf = typeof self == 'object' && self && self.Object === Object && self; - - /** Used as a reference to the global object. */ - var root = freeGlobal || freeSelf || Function('return this')(); - - /** Detect free variable `exports`. */ - var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; - - /** Detect free variable `module`. */ - var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; - - /*--------------------------------------------------------------------------*/ - - /** - * Appends the elements of `values` to `array`. - * - * @private - * @param {Array} array The array to modify. - * @param {Array} values The values to append. - * @returns {Array} Returns `array`. - */ - function arrayPush(array, values) { - array.push.apply(array, values); - return array; - } - - /** - * The base implementation of `_.findIndex` and `_.findLastIndex` without - * support for iteratee shorthands. - * - * @private - * @param {Array} array The array to inspect. - * @param {Function} predicate The function invoked per iteration. - * @param {number} fromIndex The index to search from. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {number} Returns the index of the matched value, else `-1`. - */ - function baseFindIndex(array, predicate, fromIndex, fromRight) { - var length = array.length, - index = fromIndex + (fromRight ? 1 : -1); - - while ((fromRight ? index-- : ++index < length)) { - if (predicate(array[index], index, array)) { - return index; - } - } - return -1; - } - - /** - * The base implementation of `_.property` without support for deep paths. - * - * @private - * @param {string} key The key of the property to get. - * @returns {Function} Returns the new accessor function. - */ - function baseProperty(key) { - return function(object) { - return object == null ? undefined : object[key]; - }; - } - - /** - * The base implementation of `_.propertyOf` without support for deep paths. - * - * @private - * @param {Object} object The object to query. - * @returns {Function} Returns the new accessor function. - */ - function basePropertyOf(object) { - return function(key) { - return object == null ? undefined : object[key]; - }; - } - - /** - * The base implementation of `_.reduce` and `_.reduceRight`, without support - * for iteratee shorthands, which iterates over `collection` using `eachFunc`. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {*} accumulator The initial value. - * @param {boolean} initAccum Specify using the first or last element of - * `collection` as the initial value. - * @param {Function} eachFunc The function to iterate over `collection`. - * @returns {*} Returns the accumulated value. - */ - function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { - eachFunc(collection, function(value, index, collection) { - accumulator = initAccum - ? (initAccum = false, value) - : iteratee(accumulator, value, index, collection); - }); - return accumulator; - } - - /** - * The base implementation of `_.values` and `_.valuesIn` which creates an - * array of `object` property values corresponding to the property names - * of `props`. - * - * @private - * @param {Object} object The object to query. - * @param {Array} props The property names to get values for. - * @returns {Object} Returns the array of property values. - */ - function baseValues(object, props) { - return baseMap(props, function(key) { - return object[key]; - }); - } - - /** - * Used by `_.escape` to convert characters to HTML entities. - * - * @private - * @param {string} chr The matched character to escape. - * @returns {string} Returns the escaped character. - */ - var escapeHtmlChar = basePropertyOf(htmlEscapes); - - /** - * Creates a unary function that invokes `func` with its argument transformed. - * - * @private - * @param {Function} func The function to wrap. - * @param {Function} transform The argument transform. - * @returns {Function} Returns the new function. - */ - function overArg(func, transform) { - return function(arg) { - return func(transform(arg)); - }; - } - - /*--------------------------------------------------------------------------*/ - - /** Used for built-in method references. */ - var arrayProto = Array.prototype, - objectProto = Object.prototype; - - /** Used to check objects for own properties. */ - var hasOwnProperty = objectProto.hasOwnProperty; - - /** Used to generate unique IDs. */ - var idCounter = 0; - - /** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ - var nativeObjectToString = objectProto.toString; - - /** Used to restore the original `_` reference in `_.noConflict`. */ - var oldDash = root._; - - /** Built-in value references. */ - var objectCreate = Object.create, - propertyIsEnumerable = objectProto.propertyIsEnumerable; - - /* Built-in method references for those with the same name as other `lodash` methods. */ - var nativeIsFinite = root.isFinite, - nativeKeys = overArg(Object.keys, Object), - nativeMax = Math.max; - - /*------------------------------------------------------------------------*/ - - /** - * Creates a `lodash` object which wraps `value` to enable implicit method - * chain sequences. Methods that operate on and return arrays, collections, - * and functions can be chained together. Methods that retrieve a single value - * or may return a primitive value will automatically end the chain sequence - * and return the unwrapped value. Otherwise, the value must be unwrapped - * with `_#value`. - * - * Explicit chain sequences, which must be unwrapped with `_#value`, may be - * enabled using `_.chain`. - * - * The execution of chained methods is lazy, that is, it's deferred until - * `_#value` is implicitly or explicitly called. - * - * Lazy evaluation allows several methods to support shortcut fusion. - * Shortcut fusion is an optimization to merge iteratee calls; this avoids - * the creation of intermediate arrays and can greatly reduce the number of - * iteratee executions. Sections of a chain sequence qualify for shortcut - * fusion if the section is applied to an array and iteratees accept only - * one argument. The heuristic for whether a section qualifies for shortcut - * fusion is subject to change. - * - * Chaining is supported in custom builds as long as the `_#value` method is - * directly or indirectly included in the build. - * - * In addition to lodash methods, wrappers have `Array` and `String` methods. - * - * The wrapper `Array` methods are: - * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` - * - * The wrapper `String` methods are: - * `replace` and `split` - * - * The wrapper methods that support shortcut fusion are: - * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, - * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, - * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` - * - * The chainable wrapper methods are: - * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, - * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, - * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, - * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, - * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, - * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, - * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, - * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, - * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, - * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, - * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, - * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, - * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, - * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, - * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, - * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, - * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, - * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, - * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, - * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, - * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, - * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, - * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, - * `zipObject`, `zipObjectDeep`, and `zipWith` - * - * The wrapper methods that are **not** chainable by default are: - * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, - * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, - * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, - * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, - * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, - * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, - * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, - * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, - * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, - * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, - * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, - * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, - * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, - * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, - * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, - * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, - * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, - * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, - * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, - * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, - * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, - * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, - * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, - * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, - * `upperFirst`, `value`, and `words` - * - * @name _ - * @constructor - * @category Seq - * @param {*} value The value to wrap in a `lodash` instance. - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * function square(n) { - * return n * n; - * } - * - * var wrapped = _([1, 2, 3]); - * - * // Returns an unwrapped value. - * wrapped.reduce(_.add); - * // => 6 - * - * // Returns a wrapped value. - * var squares = wrapped.map(square); - * - * _.isArray(squares); - * // => false - * - * _.isArray(squares.value()); - * // => true - */ - function lodash(value) { - return value instanceof LodashWrapper - ? value - : new LodashWrapper(value); - } - - /** - * The base implementation of `_.create` without support for assigning - * properties to the created object. - * - * @private - * @param {Object} proto The object to inherit from. - * @returns {Object} Returns the new object. - */ - var baseCreate = (function() { - function object() {} - return function(proto) { - if (!isObject(proto)) { - return {}; - } - if (objectCreate) { - return objectCreate(proto); - } - object.prototype = proto; - var result = new object; - object.prototype = undefined; - return result; - }; - }()); - - /** - * The base constructor for creating `lodash` wrapper objects. - * - * @private - * @param {*} value The value to wrap. - * @param {boolean} [chainAll] Enable explicit method chain sequences. - */ - function LodashWrapper(value, chainAll) { - this.__wrapped__ = value; - this.__actions__ = []; - this.__chain__ = !!chainAll; - } - - LodashWrapper.prototype = baseCreate(lodash.prototype); - LodashWrapper.prototype.constructor = LodashWrapper; - - /*------------------------------------------------------------------------*/ - - /** - * Assigns `value` to `key` of `object` if the existing value is not equivalent - * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ - function assignValue(object, key, value) { - var objValue = object[key]; - if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || - (value === undefined && !(key in object))) { - baseAssignValue(object, key, value); - } - } - - /** - * The base implementation of `assignValue` and `assignMergeValue` without - * value checks. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ - function baseAssignValue(object, key, value) { - object[key] = value; - } - - /** - * The base implementation of `_.delay` and `_.defer` which accepts `args` - * to provide to `func`. - * - * @private - * @param {Function} func The function to delay. - * @param {number} wait The number of milliseconds to delay invocation. - * @param {Array} args The arguments to provide to `func`. - * @returns {number|Object} Returns the timer id or timeout object. - */ - function baseDelay(func, wait, args) { - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - return setTimeout(function() { func.apply(undefined, args); }, wait); - } - - /** - * The base implementation of `_.forEach` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array|Object} Returns `collection`. - */ - var baseEach = createBaseEach(baseForOwn); - - /** - * The base implementation of `_.every` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {boolean} Returns `true` if all elements pass the predicate check, - * else `false` - */ - function baseEvery(collection, predicate) { - var result = true; - baseEach(collection, function(value, index, collection) { - result = !!predicate(value, index, collection); - return result; - }); - return result; - } - - /** - * The base implementation of methods like `_.max` and `_.min` which accepts a - * `comparator` to determine the extremum value. - * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} iteratee The iteratee invoked per iteration. - * @param {Function} comparator The comparator used to compare values. - * @returns {*} Returns the extremum value. - */ - function baseExtremum(array, iteratee, comparator) { - var index = -1, - length = array.length; - - while (++index < length) { - var value = array[index], - current = iteratee(value); - - if (current != null && (computed === undefined - ? (current === current && !false) - : comparator(current, computed) - )) { - var computed = current, - result = value; - } - } - return result; - } - - /** - * The base implementation of `_.filter` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {Array} Returns the new filtered array. - */ - function baseFilter(collection, predicate) { - var result = []; - baseEach(collection, function(value, index, collection) { - if (predicate(value, index, collection)) { - result.push(value); - } - }); - return result; - } - - /** - * The base implementation of `_.flatten` with support for restricting flattening. - * - * @private - * @param {Array} array The array to flatten. - * @param {number} depth The maximum recursion depth. - * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. - * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. - * @param {Array} [result=[]] The initial result value. - * @returns {Array} Returns the new flattened array. - */ - function baseFlatten(array, depth, predicate, isStrict, result) { - var index = -1, - length = array.length; - - predicate || (predicate = isFlattenable); - result || (result = []); - - while (++index < length) { - var value = array[index]; - if (depth > 0 && predicate(value)) { - if (depth > 1) { - // Recursively flatten arrays (susceptible to call stack limits). - baseFlatten(value, depth - 1, predicate, isStrict, result); - } else { - arrayPush(result, value); - } - } else if (!isStrict) { - result[result.length] = value; - } - } - return result; - } - - /** - * The base implementation of `baseForOwn` which iterates over `object` - * properties returned by `keysFunc` and invokes `iteratee` for each property. - * Iteratee functions may exit iteration early by explicitly returning `false`. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {Function} keysFunc The function to get the keys of `object`. - * @returns {Object} Returns `object`. - */ - var baseFor = createBaseFor(); - - /** - * The base implementation of `_.forOwn` without support for iteratee shorthands. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Object} Returns `object`. - */ - function baseForOwn(object, iteratee) { - return object && baseFor(object, iteratee, keys); - } - - /** - * The base implementation of `_.functions` which creates an array of - * `object` function property names filtered from `props`. - * - * @private - * @param {Object} object The object to inspect. - * @param {Array} props The property names to filter. - * @returns {Array} Returns the function names. - */ - function baseFunctions(object, props) { - return baseFilter(props, function(key) { - return isFunction(object[key]); - }); - } - - /** - * The base implementation of `getTag` without fallbacks for buggy environments. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the `toStringTag`. - */ - function baseGetTag(value) { - return objectToString(value); - } - - /** - * The base implementation of `_.gt` which doesn't coerce arguments. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is greater than `other`, - * else `false`. - */ - function baseGt(value, other) { - return value > other; - } - - /** - * The base implementation of `_.isArguments`. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an `arguments` object, - */ - var baseIsArguments = noop; - - /** - * The base implementation of `_.isDate` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a date object, else `false`. - */ - function baseIsDate(value) { - return isObjectLike(value) && baseGetTag(value) == dateTag; - } - - /** - * The base implementation of `_.isEqual` which supports partial comparisons - * and tracks traversed objects. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @param {boolean} bitmask The bitmask flags. - * 1 - Unordered comparison - * 2 - Partial comparison - * @param {Function} [customizer] The function to customize comparisons. - * @param {Object} [stack] Tracks traversed `value` and `other` objects. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - */ - function baseIsEqual(value, other, bitmask, customizer, stack) { - if (value === other) { - return true; - } - if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { - return value !== value && other !== other; - } - return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); - } - - /** - * A specialized version of `baseIsEqual` for arrays and objects which performs - * deep comparisons and tracks traversed objects enabling objects with circular - * references to be compared. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} [stack] Tracks traversed `object` and `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ - function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { - var objIsArr = isArray(object), - othIsArr = isArray(other), - objTag = objIsArr ? arrayTag : baseGetTag(object), - othTag = othIsArr ? arrayTag : baseGetTag(other); - - objTag = objTag == argsTag ? objectTag : objTag; - othTag = othTag == argsTag ? objectTag : othTag; - - var objIsObj = objTag == objectTag, - othIsObj = othTag == objectTag, - isSameTag = objTag == othTag; - - stack || (stack = []); - var objStack = find(stack, function(entry) { - return entry[0] == object; - }); - var othStack = find(stack, function(entry) { - return entry[0] == other; - }); - if (objStack && othStack) { - return objStack[1] == other; - } - stack.push([object, other]); - stack.push([other, object]); - if (isSameTag && !objIsObj) { - var result = (objIsArr) - ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) - : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); - stack.pop(); - return result; - } - if (!(bitmask & COMPARE_PARTIAL_FLAG)) { - var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), - othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); - - if (objIsWrapped || othIsWrapped) { - var objUnwrapped = objIsWrapped ? object.value() : object, - othUnwrapped = othIsWrapped ? other.value() : other; - - var result = equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); - stack.pop(); - return result; - } - } - if (!isSameTag) { - return false; - } - var result = equalObjects(object, other, bitmask, customizer, equalFunc, stack); - stack.pop(); - return result; - } - - /** - * The base implementation of `_.isRegExp` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. - */ - function baseIsRegExp(value) { - return isObjectLike(value) && baseGetTag(value) == regexpTag; - } - - /** - * The base implementation of `_.iteratee`. - * - * @private - * @param {*} [value=_.identity] The value to convert to an iteratee. - * @returns {Function} Returns the iteratee. - */ - function baseIteratee(func) { - if (typeof func == 'function') { - return func; - } - if (func == null) { - return identity; - } - return (typeof func == 'object' ? baseMatches : baseProperty)(func); - } - - /** - * The base implementation of `_.lt` which doesn't coerce arguments. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is less than `other`, - * else `false`. - */ - function baseLt(value, other) { - return value < other; - } - - /** - * The base implementation of `_.map` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - */ - function baseMap(collection, iteratee) { - var index = -1, - result = isArrayLike(collection) ? Array(collection.length) : []; - - baseEach(collection, function(value, key, collection) { - result[++index] = iteratee(value, key, collection); - }); - return result; - } - - /** - * The base implementation of `_.matches` which doesn't clone `source`. - * - * @private - * @param {Object} source The object of property values to match. - * @returns {Function} Returns the new spec function. - */ - function baseMatches(source) { - var props = nativeKeys(source); - return function(object) { - var length = props.length; - if (object == null) { - return !length; - } - object = Object(object); - while (length--) { - var key = props[length]; - if (!(key in object && - baseIsEqual(source[key], object[key], COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG) - )) { - return false; - } - } - return true; - }; - } - - /** - * The base implementation of `_.pick` without support for individual - * property identifiers. - * - * @private - * @param {Object} object The source object. - * @param {string[]} paths The property paths to pick. - * @returns {Object} Returns the new object. - */ - function basePick(object, props) { - object = Object(object); - return reduce(props, function(result, key) { - if (key in object) { - result[key] = object[key]; - } - return result; - }, {}); - } - - /** - * The base implementation of `_.rest` which doesn't validate or coerce arguments. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @returns {Function} Returns the new function. - */ - function baseRest(func, start) { - return setToString(overRest(func, start, identity), func + ''); - } - - /** - * The base implementation of `_.slice` without an iteratee call guard. - * - * @private - * @param {Array} array The array to slice. - * @param {number} [start=0] The start position. - * @param {number} [end=array.length] The end position. - * @returns {Array} Returns the slice of `array`. - */ - function baseSlice(array, start, end) { - var index = -1, - length = array.length; - - if (start < 0) { - start = -start > length ? 0 : (length + start); - } - end = end > length ? length : end; - if (end < 0) { - end += length; - } - length = start > end ? 0 : ((end - start) >>> 0); - start >>>= 0; - - var result = Array(length); - while (++index < length) { - result[index] = array[index + start]; - } - return result; - } - - /** - * Copies the values of `source` to `array`. - * - * @private - * @param {Array} source The array to copy values from. - * @param {Array} [array=[]] The array to copy values to. - * @returns {Array} Returns `array`. - */ - function copyArray(source) { - return baseSlice(source, 0, source.length); - } - - /** - * The base implementation of `_.some` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {boolean} Returns `true` if any element passes the predicate check, - * else `false`. - */ - function baseSome(collection, predicate) { - var result; - - baseEach(collection, function(value, index, collection) { - result = predicate(value, index, collection); - return !result; - }); - return !!result; - } - - /** - * The base implementation of `wrapperValue` which returns the result of - * performing a sequence of actions on the unwrapped `value`, where each - * successive action is supplied the return value of the previous. - * - * @private - * @param {*} value The unwrapped value. - * @param {Array} actions Actions to perform to resolve the unwrapped value. - * @returns {*} Returns the resolved value. - */ - function baseWrapperValue(value, actions) { - var result = value; - return reduce(actions, function(result, action) { - return action.func.apply(action.thisArg, arrayPush([result], action.args)); - }, result); - } - - /** - * Compares values to sort them in ascending order. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {number} Returns the sort order indicator for `value`. - */ - function compareAscending(value, other) { - if (value !== other) { - var valIsDefined = value !== undefined, - valIsNull = value === null, - valIsReflexive = value === value, - valIsSymbol = false; - - var othIsDefined = other !== undefined, - othIsNull = other === null, - othIsReflexive = other === other, - othIsSymbol = false; - - if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || - (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || - (valIsNull && othIsDefined && othIsReflexive) || - (!valIsDefined && othIsReflexive) || - !valIsReflexive) { - return 1; - } - if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || - (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || - (othIsNull && valIsDefined && valIsReflexive) || - (!othIsDefined && valIsReflexive) || - !othIsReflexive) { - return -1; - } - } - return 0; - } - - /** - * Copies properties of `source` to `object`. - * - * @private - * @param {Object} source The object to copy properties from. - * @param {Array} props The property identifiers to copy. - * @param {Object} [object={}] The object to copy properties to. - * @param {Function} [customizer] The function to customize copied values. - * @returns {Object} Returns `object`. - */ - function copyObject(source, props, object, customizer) { - var isNew = !object; - object || (object = {}); - - var index = -1, - length = props.length; - - while (++index < length) { - var key = props[index]; - - var newValue = customizer - ? customizer(object[key], source[key], key, object, source) - : undefined; - - if (newValue === undefined) { - newValue = source[key]; - } - if (isNew) { - baseAssignValue(object, key, newValue); - } else { - assignValue(object, key, newValue); - } - } - return object; - } - - /** - * Creates a function like `_.assign`. - * - * @private - * @param {Function} assigner The function to assign values. - * @returns {Function} Returns the new assigner function. - */ - function createAssigner(assigner) { - return baseRest(function(object, sources) { - var index = -1, - length = sources.length, - customizer = length > 1 ? sources[length - 1] : undefined; - - customizer = (assigner.length > 3 && typeof customizer == 'function') - ? (length--, customizer) - : undefined; - - object = Object(object); - while (++index < length) { - var source = sources[index]; - if (source) { - assigner(object, source, index, customizer); - } - } - return object; - }); - } - - /** - * Creates a `baseEach` or `baseEachRight` function. - * - * @private - * @param {Function} eachFunc The function to iterate over a collection. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new base function. - */ - function createBaseEach(eachFunc, fromRight) { - return function(collection, iteratee) { - if (collection == null) { - return collection; - } - if (!isArrayLike(collection)) { - return eachFunc(collection, iteratee); - } - var length = collection.length, - index = fromRight ? length : -1, - iterable = Object(collection); - - while ((fromRight ? index-- : ++index < length)) { - if (iteratee(iterable[index], index, iterable) === false) { - break; - } - } - return collection; - }; - } - - /** - * Creates a base function for methods like `_.forIn` and `_.forOwn`. - * - * @private - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new base function. - */ - function createBaseFor(fromRight) { - return function(object, iteratee, keysFunc) { - var index = -1, - iterable = Object(object), - props = keysFunc(object), - length = props.length; - - while (length--) { - var key = props[fromRight ? length : ++index]; - if (iteratee(iterable[key], key, iterable) === false) { - break; - } - } - return object; - }; - } - - /** - * Creates a function that produces an instance of `Ctor` regardless of - * whether it was invoked as part of a `new` expression or by `call` or `apply`. - * - * @private - * @param {Function} Ctor The constructor to wrap. - * @returns {Function} Returns the new wrapped function. - */ - function createCtor(Ctor) { - return function() { - // Use a `switch` statement to work with class constructors. See - // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist - // for more details. - var args = arguments; - var thisBinding = baseCreate(Ctor.prototype), - result = Ctor.apply(thisBinding, args); - - // Mimic the constructor's `return` behavior. - // See https://es5.github.io/#x13.2.2 for more details. - return isObject(result) ? result : thisBinding; - }; - } - - /** - * Creates a `_.find` or `_.findLast` function. - * - * @private - * @param {Function} findIndexFunc The function to find the collection index. - * @returns {Function} Returns the new find function. - */ - function createFind(findIndexFunc) { - return function(collection, predicate, fromIndex) { - var iterable = Object(collection); - if (!isArrayLike(collection)) { - var iteratee = baseIteratee(predicate, 3); - collection = keys(collection); - predicate = function(key) { return iteratee(iterable[key], key, iterable); }; - } - var index = findIndexFunc(collection, predicate, fromIndex); - return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; - }; - } - - /** - * Creates a function that wraps `func` to invoke it with the `this` binding - * of `thisArg` and `partials` prepended to the arguments it receives. - * - * @private - * @param {Function} func The function to wrap. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @param {*} thisArg The `this` binding of `func`. - * @param {Array} partials The arguments to prepend to those provided to - * the new function. - * @returns {Function} Returns the new wrapped function. - */ - function createPartial(func, bitmask, thisArg, partials) { - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - var isBind = bitmask & WRAP_BIND_FLAG, - Ctor = createCtor(func); - - function wrapper() { - var argsIndex = -1, - argsLength = arguments.length, - leftIndex = -1, - leftLength = partials.length, - args = Array(leftLength + argsLength), - fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; - - while (++leftIndex < leftLength) { - args[leftIndex] = partials[leftIndex]; - } - while (argsLength--) { - args[leftIndex++] = arguments[++argsIndex]; - } - return fn.apply(isBind ? thisArg : this, args); - } - return wrapper; - } - - /** - * Used by `_.defaults` to customize its `_.assignIn` use to assign properties - * of source objects to the destination object for all destination properties - * that resolve to `undefined`. - * - * @private - * @param {*} objValue The destination value. - * @param {*} srcValue The source value. - * @param {string} key The key of the property to assign. - * @param {Object} object The parent object of `objValue`. - * @returns {*} Returns the value to assign. - */ - function customDefaultsAssignIn(objValue, srcValue, key, object) { - if (objValue === undefined || - (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) { - return srcValue; - } - return objValue; - } - - /** - * A specialized version of `baseIsEqualDeep` for arrays with support for - * partial deep comparisons. - * - * @private - * @param {Array} array The array to compare. - * @param {Array} other The other array to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} stack Tracks traversed `array` and `other` objects. - * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. - */ - function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { - var isPartial = bitmask & COMPARE_PARTIAL_FLAG, - arrLength = array.length, - othLength = other.length; - - if (arrLength != othLength && !(isPartial && othLength > arrLength)) { - return false; - } - var index = -1, - result = true, - seen = (bitmask & COMPARE_UNORDERED_FLAG) ? [] : undefined; - - // Ignore non-index properties. - while (++index < arrLength) { - var arrValue = array[index], - othValue = other[index]; - - var compared; - if (compared !== undefined) { - if (compared) { - continue; - } - result = false; - break; - } - // Recursively compare arrays (susceptible to call stack limits). - if (seen) { - if (!baseSome(other, function(othValue, othIndex) { - if (!indexOf(seen, othIndex) && - (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { - return seen.push(othIndex); - } - })) { - result = false; - break; - } - } else if (!( - arrValue === othValue || - equalFunc(arrValue, othValue, bitmask, customizer, stack) - )) { - result = false; - break; - } - } - return result; - } - - /** - * A specialized version of `baseIsEqualDeep` for comparing objects of - * the same `toStringTag`. - * - * **Note:** This function only supports comparing values with tags of - * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {string} tag The `toStringTag` of the objects to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} stack Tracks traversed `object` and `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ - function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { - switch (tag) { - - case boolTag: - case dateTag: - case numberTag: - // Coerce booleans to `1` or `0` and dates to milliseconds. - // Invalid dates are coerced to `NaN`. - return eq(+object, +other); - - case errorTag: - return object.name == other.name && object.message == other.message; - - case regexpTag: - case stringTag: - // Coerce regexes to strings and treat strings, primitives and objects, - // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring - // for more details. - return object == (other + ''); - - } - return false; - } - - /** - * A specialized version of `baseIsEqualDeep` for objects with support for - * partial deep comparisons. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} stack Tracks traversed `object` and `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ - function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { - var isPartial = bitmask & COMPARE_PARTIAL_FLAG, - objProps = keys(object), - objLength = objProps.length, - othProps = keys(other), - othLength = othProps.length; - - if (objLength != othLength && !isPartial) { - return false; - } - var index = objLength; - while (index--) { - var key = objProps[index]; - if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { - return false; - } - } - var result = true; - - var skipCtor = isPartial; - while (++index < objLength) { - key = objProps[index]; - var objValue = object[key], - othValue = other[key]; - - var compared; - // Recursively compare objects (susceptible to call stack limits). - if (!(compared === undefined - ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) - : compared - )) { - result = false; - break; - } - skipCtor || (skipCtor = key == 'constructor'); - } - if (result && !skipCtor) { - var objCtor = object.constructor, - othCtor = other.constructor; - - // Non `Object` object instances with different constructors are not equal. - if (objCtor != othCtor && - ('constructor' in object && 'constructor' in other) && - !(typeof objCtor == 'function' && objCtor instanceof objCtor && - typeof othCtor == 'function' && othCtor instanceof othCtor)) { - result = false; - } - } - return result; - } - - /** - * A specialized version of `baseRest` which flattens the rest array. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @returns {Function} Returns the new function. - */ - function flatRest(func) { - return setToString(overRest(func, undefined, flatten), func + ''); - } - - /** - * Checks if `value` is a flattenable `arguments` object or array. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. - */ - function isFlattenable(value) { - return isArray(value) || isArguments(value); - } - - /** - * This function is like - * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) - * except that it includes inherited enumerable properties. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ - function nativeKeysIn(object) { - var result = []; - if (object != null) { - for (var key in Object(object)) { - result.push(key); - } - } - return result; - } - - /** - * Converts `value` to a string using `Object.prototype.toString`. - * - * @private - * @param {*} value The value to convert. - * @returns {string} Returns the converted string. - */ - function objectToString(value) { - return nativeObjectToString.call(value); - } - - /** - * A specialized version of `baseRest` which transforms the rest array. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @param {Function} transform The rest array transform. - * @returns {Function} Returns the new function. - */ - function overRest(func, start, transform) { - start = nativeMax(start === undefined ? (func.length - 1) : start, 0); - return function() { - var args = arguments, - index = -1, - length = nativeMax(args.length - start, 0), - array = Array(length); - - while (++index < length) { - array[index] = args[start + index]; - } - index = -1; - var otherArgs = Array(start + 1); - while (++index < start) { - otherArgs[index] = args[index]; - } - otherArgs[start] = transform(array); - return func.apply(this, otherArgs); - }; - } - - /** - * Sets the `toString` method of `func` to return `string`. - * - * @private - * @param {Function} func The function to modify. - * @param {Function} string The `toString` result. - * @returns {Function} Returns `func`. - */ - var setToString = identity; - - /*------------------------------------------------------------------------*/ - - /** - * Creates an array with all falsey values removed. The values `false`, `null`, - * `0`, `""`, `undefined`, and `NaN` are falsey. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to compact. - * @returns {Array} Returns the new array of filtered values. - * @example - * - * _.compact([0, 1, false, 2, '', 3]); - * // => [1, 2, 3] - */ - function compact(array) { - return baseFilter(array, Boolean); - } - - /** - * Creates a new array concatenating `array` with any additional arrays - * and/or values. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to concatenate. - * @param {...*} [values] The values to concatenate. - * @returns {Array} Returns the new concatenated array. - * @example - * - * var array = [1]; - * var other = _.concat(array, 2, [3], [[4]]); - * - * console.log(other); - * // => [1, 2, 3, [4]] - * - * console.log(array); - * // => [1] - */ - function concat() { - var length = arguments.length; - if (!length) { - return []; - } - var args = Array(length - 1), - array = arguments[0], - index = length; - - while (index--) { - args[index - 1] = arguments[index]; - } - return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); - } - - /** - * This method is like `_.find` except that it returns the index of the first - * element `predicate` returns truthy for instead of the element itself. - * - * @static - * @memberOf _ - * @since 1.1.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param {number} [fromIndex=0] The index to search from. - * @returns {number} Returns the index of the found element, else `-1`. - * @example - * - * var users = [ - * { 'user': 'barney', 'active': false }, - * { 'user': 'fred', 'active': false }, - * { 'user': 'pebbles', 'active': true } - * ]; - * - * _.findIndex(users, function(o) { return o.user == 'barney'; }); - * // => 0 - * - * // The `_.matches` iteratee shorthand. - * _.findIndex(users, { 'user': 'fred', 'active': false }); - * // => 1 - * - * // The `_.matchesProperty` iteratee shorthand. - * _.findIndex(users, ['active', false]); - * // => 0 - * - * // The `_.property` iteratee shorthand. - * _.findIndex(users, 'active'); - * // => 2 - */ - function findIndex(array, predicate, fromIndex) { - var length = array == null ? 0 : array.length; - if (!length) { - return -1; - } - var index = fromIndex == null ? 0 : toInteger(fromIndex); - if (index < 0) { - index = nativeMax(length + index, 0); - } - return baseFindIndex(array, baseIteratee(predicate, 3), index); - } - - /** - * Flattens `array` a single level deep. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to flatten. - * @returns {Array} Returns the new flattened array. - * @example - * - * _.flatten([1, [2, [3, [4]], 5]]); - * // => [1, 2, [3, [4]], 5] - */ - function flatten(array) { - var length = array == null ? 0 : array.length; - return length ? baseFlatten(array, 1) : []; - } - - /** - * Recursively flattens `array`. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to flatten. - * @returns {Array} Returns the new flattened array. - * @example - * - * _.flattenDeep([1, [2, [3, [4]], 5]]); - * // => [1, 2, 3, 4, 5] - */ - function flattenDeep(array) { - var length = array == null ? 0 : array.length; - return length ? baseFlatten(array, INFINITY) : []; - } - - /** - * Gets the first element of `array`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @alias first - * @category Array - * @param {Array} array The array to query. - * @returns {*} Returns the first element of `array`. - * @example - * - * _.head([1, 2, 3]); - * // => 1 - * - * _.head([]); - * // => undefined - */ - function head(array) { - return (array && array.length) ? array[0] : undefined; - } - - /** - * Gets the index at which the first occurrence of `value` is found in `array` - * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. If `fromIndex` is negative, it's used as the - * offset from the end of `array`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} [fromIndex=0] The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - * @example - * - * _.indexOf([1, 2, 1, 2], 2); - * // => 1 - * - * // Search from the `fromIndex`. - * _.indexOf([1, 2, 1, 2], 2, 2); - * // => 3 - */ - function indexOf(array, value, fromIndex) { - var length = array == null ? 0 : array.length; - if (typeof fromIndex == 'number') { - fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex; - } else { - fromIndex = 0; - } - var index = (fromIndex || 0) - 1, - isReflexive = value === value; - - while (++index < length) { - var other = array[index]; - if ((isReflexive ? other === value : other !== other)) { - return index; - } - } - return -1; - } - - /** - * Gets the last element of `array`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to query. - * @returns {*} Returns the last element of `array`. - * @example - * - * _.last([1, 2, 3]); - * // => 3 - */ - function last(array) { - var length = array == null ? 0 : array.length; - return length ? array[length - 1] : undefined; - } - - /** - * Creates a slice of `array` from `start` up to, but not including, `end`. - * - * **Note:** This method is used instead of - * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are - * returned. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to slice. - * @param {number} [start=0] The start position. - * @param {number} [end=array.length] The end position. - * @returns {Array} Returns the slice of `array`. - */ - function slice(array, start, end) { - var length = array == null ? 0 : array.length; - start = start == null ? 0 : +start; - end = end === undefined ? length : +end; - return length ? baseSlice(array, start, end) : []; - } - - /*------------------------------------------------------------------------*/ - - /** - * Creates a `lodash` wrapper instance that wraps `value` with explicit method - * chain sequences enabled. The result of such sequences must be unwrapped - * with `_#value`. - * - * @static - * @memberOf _ - * @since 1.3.0 - * @category Seq - * @param {*} value The value to wrap. - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36 }, - * { 'user': 'fred', 'age': 40 }, - * { 'user': 'pebbles', 'age': 1 } - * ]; - * - * var youngest = _ - * .chain(users) - * .sortBy('age') - * .map(function(o) { - * return o.user + ' is ' + o.age; - * }) - * .head() - * .value(); - * // => 'pebbles is 1' - */ - function chain(value) { - var result = lodash(value); - result.__chain__ = true; - return result; - } - - /** - * This method invokes `interceptor` and returns `value`. The interceptor - * is invoked with one argument; (value). The purpose of this method is to - * "tap into" a method chain sequence in order to modify intermediate results. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Seq - * @param {*} value The value to provide to `interceptor`. - * @param {Function} interceptor The function to invoke. - * @returns {*} Returns `value`. - * @example - * - * _([1, 2, 3]) - * .tap(function(array) { - * // Mutate input array. - * array.pop(); - * }) - * .reverse() - * .value(); - * // => [2, 1] - */ - function tap(value, interceptor) { - interceptor(value); - return value; - } - - /** - * This method is like `_.tap` except that it returns the result of `interceptor`. - * The purpose of this method is to "pass thru" values replacing intermediate - * results in a method chain sequence. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Seq - * @param {*} value The value to provide to `interceptor`. - * @param {Function} interceptor The function to invoke. - * @returns {*} Returns the result of `interceptor`. - * @example - * - * _(' abc ') - * .chain() - * .trim() - * .thru(function(value) { - * return [value]; - * }) - * .value(); - * // => ['abc'] - */ - function thru(value, interceptor) { - return interceptor(value); - } - - /** - * Creates a `lodash` wrapper instance with explicit method chain sequences enabled. - * - * @name chain - * @memberOf _ - * @since 0.1.0 - * @category Seq - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36 }, - * { 'user': 'fred', 'age': 40 } - * ]; - * - * // A sequence without explicit chaining. - * _(users).head(); - * // => { 'user': 'barney', 'age': 36 } - * - * // A sequence with explicit chaining. - * _(users) - * .chain() - * .head() - * .pick('user') - * .value(); - * // => { 'user': 'barney' } - */ - function wrapperChain() { - return chain(this); - } - - /** - * Executes the chain sequence to resolve the unwrapped value. - * - * @name value - * @memberOf _ - * @since 0.1.0 - * @alias toJSON, valueOf - * @category Seq - * @returns {*} Returns the resolved unwrapped value. - * @example - * - * _([1, 2, 3]).value(); - * // => [1, 2, 3] - */ - function wrapperValue() { - return baseWrapperValue(this.__wrapped__, this.__actions__); - } - - /*------------------------------------------------------------------------*/ - - /** - * Checks if `predicate` returns truthy for **all** elements of `collection`. - * Iteration is stopped once `predicate` returns falsey. The predicate is - * invoked with three arguments: (value, index|key, collection). - * - * **Note:** This method returns `true` for - * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because - * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of - * elements of empty collections. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {boolean} Returns `true` if all elements pass the predicate check, - * else `false`. - * @example - * - * _.every([true, 1, null, 'yes'], Boolean); - * // => false - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': false }, - * { 'user': 'fred', 'age': 40, 'active': false } - * ]; - * - * // The `_.matches` iteratee shorthand. - * _.every(users, { 'user': 'barney', 'active': false }); - * // => false - * - * // The `_.matchesProperty` iteratee shorthand. - * _.every(users, ['active', false]); - * // => true - * - * // The `_.property` iteratee shorthand. - * _.every(users, 'active'); - * // => false - */ - function every(collection, predicate, guard) { - predicate = guard ? undefined : predicate; - return baseEvery(collection, baseIteratee(predicate)); - } - - /** - * Iterates over elements of `collection`, returning an array of all elements - * `predicate` returns truthy for. The predicate is invoked with three - * arguments: (value, index|key, collection). - * - * **Note:** Unlike `_.remove`, this method returns a new array. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new filtered array. - * @see _.reject - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': true }, - * { 'user': 'fred', 'age': 40, 'active': false } - * ]; - * - * _.filter(users, function(o) { return !o.active; }); - * // => objects for ['fred'] - * - * // The `_.matches` iteratee shorthand. - * _.filter(users, { 'age': 36, 'active': true }); - * // => objects for ['barney'] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.filter(users, ['active', false]); - * // => objects for ['fred'] - * - * // The `_.property` iteratee shorthand. - * _.filter(users, 'active'); - * // => objects for ['barney'] - */ - function filter(collection, predicate) { - return baseFilter(collection, baseIteratee(predicate)); - } - - /** - * Iterates over elements of `collection`, returning the first element - * `predicate` returns truthy for. The predicate is invoked with three - * arguments: (value, index|key, collection). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to inspect. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param {number} [fromIndex=0] The index to search from. - * @returns {*} Returns the matched element, else `undefined`. - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': true }, - * { 'user': 'fred', 'age': 40, 'active': false }, - * { 'user': 'pebbles', 'age': 1, 'active': true } - * ]; - * - * _.find(users, function(o) { return o.age < 40; }); - * // => object for 'barney' - * - * // The `_.matches` iteratee shorthand. - * _.find(users, { 'age': 1, 'active': true }); - * // => object for 'pebbles' - * - * // The `_.matchesProperty` iteratee shorthand. - * _.find(users, ['active', false]); - * // => object for 'fred' - * - * // The `_.property` iteratee shorthand. - * _.find(users, 'active'); - * // => object for 'barney' - */ - var find = createFind(findIndex); - - /** - * Iterates over elements of `collection` and invokes `iteratee` for each element. - * The iteratee is invoked with three arguments: (value, index|key, collection). - * Iteratee functions may exit iteration early by explicitly returning `false`. - * - * **Note:** As with other "Collections" methods, objects with a "length" - * property are iterated like arrays. To avoid this behavior use `_.forIn` - * or `_.forOwn` for object iteration. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @alias each - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array|Object} Returns `collection`. - * @see _.forEachRight - * @example - * - * _.forEach([1, 2], function(value) { - * console.log(value); - * }); - * // => Logs `1` then `2`. - * - * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { - * console.log(key); - * }); - * // => Logs 'a' then 'b' (iteration order is not guaranteed). - */ - function forEach(collection, iteratee) { - return baseEach(collection, baseIteratee(iteratee)); - } - - /** - * Creates an array of values by running each element in `collection` thru - * `iteratee`. The iteratee is invoked with three arguments: - * (value, index|key, collection). - * - * Many lodash methods are guarded to work as iteratees for methods like - * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. - * - * The guarded methods are: - * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, - * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, - * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, - * `template`, `trim`, `trimEnd`, `trimStart`, and `words` - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - * @example - * - * function square(n) { - * return n * n; - * } - * - * _.map([4, 8], square); - * // => [16, 64] - * - * _.map({ 'a': 4, 'b': 8 }, square); - * // => [16, 64] (iteration order is not guaranteed) - * - * var users = [ - * { 'user': 'barney' }, - * { 'user': 'fred' } - * ]; - * - * // The `_.property` iteratee shorthand. - * _.map(users, 'user'); - * // => ['barney', 'fred'] - */ - function map(collection, iteratee) { - return baseMap(collection, baseIteratee(iteratee)); - } - - /** - * Reduces `collection` to a value which is the accumulated result of running - * each element in `collection` thru `iteratee`, where each successive - * invocation is supplied the return value of the previous. If `accumulator` - * is not given, the first element of `collection` is used as the initial - * value. The iteratee is invoked with four arguments: - * (accumulator, value, index|key, collection). - * - * Many lodash methods are guarded to work as iteratees for methods like - * `_.reduce`, `_.reduceRight`, and `_.transform`. - * - * The guarded methods are: - * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, - * and `sortBy` - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @param {*} [accumulator] The initial value. - * @returns {*} Returns the accumulated value. - * @see _.reduceRight - * @example - * - * _.reduce([1, 2], function(sum, n) { - * return sum + n; - * }, 0); - * // => 3 - * - * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { - * (result[value] || (result[value] = [])).push(key); - * return result; - * }, {}); - * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) - */ - function reduce(collection, iteratee, accumulator) { - return baseReduce(collection, baseIteratee(iteratee), accumulator, arguments.length < 3, baseEach); - } - - /** - * Gets the size of `collection` by returning its length for array-like - * values or the number of own enumerable string keyed properties for objects. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object|string} collection The collection to inspect. - * @returns {number} Returns the collection size. - * @example - * - * _.size([1, 2, 3]); - * // => 3 - * - * _.size({ 'a': 1, 'b': 2 }); - * // => 2 - * - * _.size('pebbles'); - * // => 7 - */ - function size(collection) { - if (collection == null) { - return 0; - } - collection = isArrayLike(collection) ? collection : nativeKeys(collection); - return collection.length; - } - - /** - * Checks if `predicate` returns truthy for **any** element of `collection`. - * Iteration is stopped once `predicate` returns truthy. The predicate is - * invoked with three arguments: (value, index|key, collection). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {boolean} Returns `true` if any element passes the predicate check, - * else `false`. - * @example - * - * _.some([null, 0, 'yes', false], Boolean); - * // => true - * - * var users = [ - * { 'user': 'barney', 'active': true }, - * { 'user': 'fred', 'active': false } - * ]; - * - * // The `_.matches` iteratee shorthand. - * _.some(users, { 'user': 'barney', 'active': false }); - * // => false - * - * // The `_.matchesProperty` iteratee shorthand. - * _.some(users, ['active', false]); - * // => true - * - * // The `_.property` iteratee shorthand. - * _.some(users, 'active'); - * // => true - */ - function some(collection, predicate, guard) { - predicate = guard ? undefined : predicate; - return baseSome(collection, baseIteratee(predicate)); - } - - /** - * Creates an array of elements, sorted in ascending order by the results of - * running each element in a collection thru each iteratee. This method - * performs a stable sort, that is, it preserves the original sort order of - * equal elements. The iteratees are invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {...(Function|Function[])} [iteratees=[_.identity]] - * The iteratees to sort by. - * @returns {Array} Returns the new sorted array. - * @example - * - * var users = [ - * { 'user': 'fred', 'age': 48 }, - * { 'user': 'barney', 'age': 36 }, - * { 'user': 'fred', 'age': 40 }, - * { 'user': 'barney', 'age': 34 } - * ]; - * - * _.sortBy(users, [function(o) { return o.user; }]); - * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] - * - * _.sortBy(users, ['user', 'age']); - * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]] - */ - function sortBy(collection, iteratee) { - var index = 0; - iteratee = baseIteratee(iteratee); - - return baseMap(baseMap(collection, function(value, key, collection) { - return { 'value': value, 'index': index++, 'criteria': iteratee(value, key, collection) }; - }).sort(function(object, other) { - return compareAscending(object.criteria, other.criteria) || (object.index - other.index); - }), baseProperty('value')); - } - - /*------------------------------------------------------------------------*/ - - /** - * Creates a function that invokes `func`, with the `this` binding and arguments - * of the created function, while it's called less than `n` times. Subsequent - * calls to the created function return the result of the last `func` invocation. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Function - * @param {number} n The number of calls at which `func` is no longer invoked. - * @param {Function} func The function to restrict. - * @returns {Function} Returns the new restricted function. - * @example - * - * jQuery(element).on('click', _.before(5, addContactToList)); - * // => Allows adding up to 4 contacts to the list. - */ - function before(n, func) { - var result; - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - n = toInteger(n); - return function() { - if (--n > 0) { - result = func.apply(this, arguments); - } - if (n <= 1) { - func = undefined; - } - return result; - }; - } - - /** - * Creates a function that invokes `func` with the `this` binding of `thisArg` - * and `partials` prepended to the arguments it receives. - * - * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, - * may be used as a placeholder for partially applied arguments. - * - * **Note:** Unlike native `Function#bind`, this method doesn't set the "length" - * property of bound functions. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to bind. - * @param {*} thisArg The `this` binding of `func`. - * @param {...*} [partials] The arguments to be partially applied. - * @returns {Function} Returns the new bound function. - * @example - * - * function greet(greeting, punctuation) { - * return greeting + ' ' + this.user + punctuation; - * } - * - * var object = { 'user': 'fred' }; - * - * var bound = _.bind(greet, object, 'hi'); - * bound('!'); - * // => 'hi fred!' - * - * // Bound with placeholders. - * var bound = _.bind(greet, object, _, '!'); - * bound('hi'); - * // => 'hi fred!' - */ - var bind = baseRest(function(func, thisArg, partials) { - return createPartial(func, WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG, thisArg, partials); - }); - - /** - * Defers invoking the `func` until the current call stack has cleared. Any - * additional arguments are provided to `func` when it's invoked. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to defer. - * @param {...*} [args] The arguments to invoke `func` with. - * @returns {number} Returns the timer id. - * @example - * - * _.defer(function(text) { - * console.log(text); - * }, 'deferred'); - * // => Logs 'deferred' after one millisecond. - */ - var defer = baseRest(function(func, args) { - return baseDelay(func, 1, args); - }); - - /** - * Invokes `func` after `wait` milliseconds. Any additional arguments are - * provided to `func` when it's invoked. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to delay. - * @param {number} wait The number of milliseconds to delay invocation. - * @param {...*} [args] The arguments to invoke `func` with. - * @returns {number} Returns the timer id. - * @example - * - * _.delay(function(text) { - * console.log(text); - * }, 1000, 'later'); - * // => Logs 'later' after one second. - */ - var delay = baseRest(function(func, wait, args) { - return baseDelay(func, toNumber(wait) || 0, args); - }); - - /** - * Creates a function that negates the result of the predicate `func`. The - * `func` predicate is invoked with the `this` binding and arguments of the - * created function. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Function - * @param {Function} predicate The predicate to negate. - * @returns {Function} Returns the new negated function. - * @example - * - * function isEven(n) { - * return n % 2 == 0; - * } - * - * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); - * // => [1, 3, 5] - */ - function negate(predicate) { - if (typeof predicate != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - return function() { - var args = arguments; - return !predicate.apply(this, args); - }; - } - - /** - * Creates a function that is restricted to invoking `func` once. Repeat calls - * to the function return the value of the first invocation. The `func` is - * invoked with the `this` binding and arguments of the created function. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to restrict. - * @returns {Function} Returns the new restricted function. - * @example - * - * var initialize = _.once(createApplication); - * initialize(); - * initialize(); - * // => `createApplication` is invoked once - */ - function once(func) { - return before(2, func); - } - - /*------------------------------------------------------------------------*/ - - /** - * Creates a shallow clone of `value`. - * - * **Note:** This method is loosely based on the - * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) - * and supports cloning arrays, array buffers, booleans, date objects, maps, - * numbers, `Object` objects, regexes, sets, strings, symbols, and typed - * arrays. The own enumerable properties of `arguments` objects are cloned - * as plain objects. An empty object is returned for uncloneable values such - * as error objects, functions, DOM nodes, and WeakMaps. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to clone. - * @returns {*} Returns the cloned value. - * @see _.cloneDeep - * @example - * - * var objects = [{ 'a': 1 }, { 'b': 2 }]; - * - * var shallow = _.clone(objects); - * console.log(shallow[0] === objects[0]); - * // => true - */ - function clone(value) { - if (!isObject(value)) { - return value; - } - return isArray(value) ? copyArray(value) : copyObject(value, nativeKeys(value)); - } - - /** - * Performs a - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * comparison between two values to determine if they are equivalent. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - * @example - * - * var object = { 'a': 1 }; - * var other = { 'a': 1 }; - * - * _.eq(object, object); - * // => true - * - * _.eq(object, other); - * // => false - * - * _.eq('a', 'a'); - * // => true - * - * _.eq('a', Object('a')); - * // => false - * - * _.eq(NaN, NaN); - * // => true - */ - function eq(value, other) { - return value === other || (value !== value && other !== other); - } - - /** - * Checks if `value` is likely an `arguments` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an `arguments` object, - * else `false`. - * @example - * - * _.isArguments(function() { return arguments; }()); - * // => true - * - * _.isArguments([1, 2, 3]); - * // => false - */ - var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { - return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && - !propertyIsEnumerable.call(value, 'callee'); - }; - - /** - * Checks if `value` is classified as an `Array` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array, else `false`. - * @example - * - * _.isArray([1, 2, 3]); - * // => true - * - * _.isArray(document.body.children); - * // => false - * - * _.isArray('abc'); - * // => false - * - * _.isArray(_.noop); - * // => false - */ - var isArray = Array.isArray; - - /** - * Checks if `value` is array-like. A value is considered array-like if it's - * not a function and has a `value.length` that's an integer greater than or - * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is array-like, else `false`. - * @example - * - * _.isArrayLike([1, 2, 3]); - * // => true - * - * _.isArrayLike(document.body.children); - * // => true - * - * _.isArrayLike('abc'); - * // => true - * - * _.isArrayLike(_.noop); - * // => false - */ - function isArrayLike(value) { - return value != null && isLength(value.length) && !isFunction(value); - } - - /** - * Checks if `value` is classified as a boolean primitive or object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. - * @example - * - * _.isBoolean(false); - * // => true - * - * _.isBoolean(null); - * // => false - */ - function isBoolean(value) { - return value === true || value === false || - (isObjectLike(value) && baseGetTag(value) == boolTag); - } - - /** - * Checks if `value` is classified as a `Date` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a date object, else `false`. - * @example - * - * _.isDate(new Date); - * // => true - * - * _.isDate('Mon April 23 2012'); - * // => false - */ - var isDate = baseIsDate; - - /** - * Checks if `value` is an empty object, collection, map, or set. - * - * Objects are considered empty if they have no own enumerable string keyed - * properties. - * - * Array-like values such as `arguments` objects, arrays, buffers, strings, or - * jQuery-like collections are considered empty if they have a `length` of `0`. - * Similarly, maps and sets are considered empty if they have a `size` of `0`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is empty, else `false`. - * @example - * - * _.isEmpty(null); - * // => true - * - * _.isEmpty(true); - * // => true - * - * _.isEmpty(1); - * // => true - * - * _.isEmpty([1, 2, 3]); - * // => false - * - * _.isEmpty({ 'a': 1 }); - * // => false - */ - function isEmpty(value) { - if (isArrayLike(value) && - (isArray(value) || isString(value) || - isFunction(value.splice) || isArguments(value))) { - return !value.length; - } - return !nativeKeys(value).length; - } - - /** - * Performs a deep comparison between two values to determine if they are - * equivalent. - * - * **Note:** This method supports comparing arrays, array buffers, booleans, - * date objects, error objects, maps, numbers, `Object` objects, regexes, - * sets, strings, symbols, and typed arrays. `Object` objects are compared - * by their own, not inherited, enumerable properties. Functions and DOM - * nodes are compared by strict equality, i.e. `===`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - * @example - * - * var object = { 'a': 1 }; - * var other = { 'a': 1 }; - * - * _.isEqual(object, other); - * // => true - * - * object === other; - * // => false - */ - function isEqual(value, other) { - return baseIsEqual(value, other); - } - - /** - * Checks if `value` is a finite primitive number. - * - * **Note:** This method is based on - * [`Number.isFinite`](https://mdn.io/Number/isFinite). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. - * @example - * - * _.isFinite(3); - * // => true - * - * _.isFinite(Number.MIN_VALUE); - * // => true - * - * _.isFinite(Infinity); - * // => false - * - * _.isFinite('3'); - * // => false - */ - function isFinite(value) { - return typeof value == 'number' && nativeIsFinite(value); - } - - /** - * Checks if `value` is classified as a `Function` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a function, else `false`. - * @example - * - * _.isFunction(_); - * // => true - * - * _.isFunction(/abc/); - * // => false - */ - function isFunction(value) { - if (!isObject(value)) { - return false; - } - // The use of `Object#toString` avoids issues with the `typeof` operator - // in Safari 9 which returns 'object' for typed arrays and other constructors. - var tag = baseGetTag(value); - return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; - } - - /** - * Checks if `value` is a valid array-like length. - * - * **Note:** This method is loosely based on - * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. - * @example - * - * _.isLength(3); - * // => true - * - * _.isLength(Number.MIN_VALUE); - * // => false - * - * _.isLength(Infinity); - * // => false - * - * _.isLength('3'); - * // => false - */ - function isLength(value) { - return typeof value == 'number' && - value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; - } - - /** - * Checks if `value` is the - * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) - * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(_.noop); - * // => true - * - * _.isObject(null); - * // => false - */ - function isObject(value) { - var type = typeof value; - return value != null && (type == 'object' || type == 'function'); - } - - /** - * Checks if `value` is object-like. A value is object-like if it's not `null` - * and has a `typeof` result of "object". - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - * @example - * - * _.isObjectLike({}); - * // => true - * - * _.isObjectLike([1, 2, 3]); - * // => true - * - * _.isObjectLike(_.noop); - * // => false - * - * _.isObjectLike(null); - * // => false - */ - function isObjectLike(value) { - return value != null && typeof value == 'object'; - } - - /** - * Checks if `value` is `NaN`. - * - * **Note:** This method is based on - * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as - * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for - * `undefined` and other non-number values. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. - * @example - * - * _.isNaN(NaN); - * // => true - * - * _.isNaN(new Number(NaN)); - * // => true - * - * isNaN(undefined); - * // => true - * - * _.isNaN(undefined); - * // => false - */ - function isNaN(value) { - // An `NaN` primitive is the only value that is not equal to itself. - // Perform the `toStringTag` check first to avoid errors with some - // ActiveX objects in IE. - return isNumber(value) && value != +value; - } - - /** - * Checks if `value` is `null`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `null`, else `false`. - * @example - * - * _.isNull(null); - * // => true - * - * _.isNull(void 0); - * // => false - */ - function isNull(value) { - return value === null; - } - - /** - * Checks if `value` is classified as a `Number` primitive or object. - * - * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are - * classified as numbers, use the `_.isFinite` method. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a number, else `false`. - * @example - * - * _.isNumber(3); - * // => true - * - * _.isNumber(Number.MIN_VALUE); - * // => true - * - * _.isNumber(Infinity); - * // => true - * - * _.isNumber('3'); - * // => false - */ - function isNumber(value) { - return typeof value == 'number' || - (isObjectLike(value) && baseGetTag(value) == numberTag); - } - - /** - * Checks if `value` is classified as a `RegExp` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. - * @example - * - * _.isRegExp(/abc/); - * // => true - * - * _.isRegExp('/abc/'); - * // => false - */ - var isRegExp = baseIsRegExp; - - /** - * Checks if `value` is classified as a `String` primitive or object. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a string, else `false`. - * @example - * - * _.isString('abc'); - * // => true - * - * _.isString(1); - * // => false - */ - function isString(value) { - return typeof value == 'string' || - (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); - } - - /** - * Checks if `value` is `undefined`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. - * @example - * - * _.isUndefined(void 0); - * // => true - * - * _.isUndefined(null); - * // => false - */ - function isUndefined(value) { - return value === undefined; - } - - /** - * Converts `value` to an array. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Lang - * @param {*} value The value to convert. - * @returns {Array} Returns the converted array. - * @example - * - * _.toArray({ 'a': 1, 'b': 2 }); - * // => [1, 2] - * - * _.toArray('abc'); - * // => ['a', 'b', 'c'] - * - * _.toArray(1); - * // => [] - * - * _.toArray(null); - * // => [] - */ - function toArray(value) { - if (!isArrayLike(value)) { - return values(value); - } - return value.length ? copyArray(value) : []; - } - - /** - * Converts `value` to an integer. - * - * **Note:** This method is loosely based on - * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {number} Returns the converted integer. - * @example - * - * _.toInteger(3.2); - * // => 3 - * - * _.toInteger(Number.MIN_VALUE); - * // => 0 - * - * _.toInteger(Infinity); - * // => 1.7976931348623157e+308 - * - * _.toInteger('3.2'); - * // => 3 - */ - var toInteger = Number; - - /** - * Converts `value` to a number. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to process. - * @returns {number} Returns the number. - * @example - * - * _.toNumber(3.2); - * // => 3.2 - * - * _.toNumber(Number.MIN_VALUE); - * // => 5e-324 - * - * _.toNumber(Infinity); - * // => Infinity - * - * _.toNumber('3.2'); - * // => 3.2 - */ - var toNumber = Number; - - /** - * Converts `value` to a string. An empty string is returned for `null` - * and `undefined` values. The sign of `-0` is preserved. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {string} Returns the converted string. - * @example - * - * _.toString(null); - * // => '' - * - * _.toString(-0); - * // => '-0' - * - * _.toString([1, 2, 3]); - * // => '1,2,3' - */ - function toString(value) { - if (typeof value == 'string') { - return value; - } - return value == null ? '' : (value + ''); - } - - /*------------------------------------------------------------------------*/ - - /** - * Assigns own enumerable string keyed properties of source objects to the - * destination object. Source objects are applied from left to right. - * Subsequent sources overwrite property assignments of previous sources. - * - * **Note:** This method mutates `object` and is loosely based on - * [`Object.assign`](https://mdn.io/Object/assign). - * - * @static - * @memberOf _ - * @since 0.10.0 - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @see _.assignIn - * @example - * - * function Foo() { - * this.a = 1; - * } - * - * function Bar() { - * this.c = 3; - * } - * - * Foo.prototype.b = 2; - * Bar.prototype.d = 4; - * - * _.assign({ 'a': 0 }, new Foo, new Bar); - * // => { 'a': 1, 'c': 3 } - */ - var assign = createAssigner(function(object, source) { - copyObject(source, nativeKeys(source), object); - }); - - /** - * This method is like `_.assign` except that it iterates over own and - * inherited source properties. - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @alias extend - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @see _.assign - * @example - * - * function Foo() { - * this.a = 1; - * } - * - * function Bar() { - * this.c = 3; - * } - * - * Foo.prototype.b = 2; - * Bar.prototype.d = 4; - * - * _.assignIn({ 'a': 0 }, new Foo, new Bar); - * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 } - */ - var assignIn = createAssigner(function(object, source) { - copyObject(source, nativeKeysIn(source), object); - }); - - /** - * This method is like `_.assignIn` except that it accepts `customizer` - * which is invoked to produce the assigned values. If `customizer` returns - * `undefined`, assignment is handled by the method instead. The `customizer` - * is invoked with five arguments: (objValue, srcValue, key, object, source). - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @alias extendWith - * @category Object - * @param {Object} object The destination object. - * @param {...Object} sources The source objects. - * @param {Function} [customizer] The function to customize assigned values. - * @returns {Object} Returns `object`. - * @see _.assignWith - * @example - * - * function customizer(objValue, srcValue) { - * return _.isUndefined(objValue) ? srcValue : objValue; - * } - * - * var defaults = _.partialRight(_.assignInWith, customizer); - * - * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); - * // => { 'a': 1, 'b': 2 } - */ - var assignInWith = createAssigner(function(object, source, srcIndex, customizer) { - copyObject(source, keysIn(source), object, customizer); - }); - - /** - * Creates an object that inherits from the `prototype` object. If a - * `properties` object is given, its own enumerable string keyed properties - * are assigned to the created object. - * - * @static - * @memberOf _ - * @since 2.3.0 - * @category Object - * @param {Object} prototype The object to inherit from. - * @param {Object} [properties] The properties to assign to the object. - * @returns {Object} Returns the new object. - * @example - * - * function Shape() { - * this.x = 0; - * this.y = 0; - * } - * - * function Circle() { - * Shape.call(this); - * } - * - * Circle.prototype = _.create(Shape.prototype, { - * 'constructor': Circle - * }); - * - * var circle = new Circle; - * circle instanceof Circle; - * // => true - * - * circle instanceof Shape; - * // => true - */ - function create(prototype, properties) { - var result = baseCreate(prototype); - return properties == null ? result : assign(result, properties); - } - - /** - * Assigns own and inherited enumerable string keyed properties of source - * objects to the destination object for all destination properties that - * resolve to `undefined`. Source objects are applied from left to right. - * Once a property is set, additional values of the same property are ignored. - * - * **Note:** This method mutates `object`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @see _.defaultsDeep - * @example - * - * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); - * // => { 'a': 1, 'b': 2 } - */ - var defaults = baseRest(function(args) { - args.push(undefined, customDefaultsAssignIn); - return assignInWith.apply(undefined, args); - }); - - /** - * Checks if `path` is a direct property of `object`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path to check. - * @returns {boolean} Returns `true` if `path` exists, else `false`. - * @example - * - * var object = { 'a': { 'b': 2 } }; - * var other = _.create({ 'a': _.create({ 'b': 2 }) }); - * - * _.has(object, 'a'); - * // => true - * - * _.has(object, 'a.b'); - * // => true - * - * _.has(object, ['a', 'b']); - * // => true - * - * _.has(other, 'a'); - * // => false - */ - function has(object, path) { - return object != null && hasOwnProperty.call(object, path); - } - - /** - * Creates an array of the own enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. See the - * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) - * for more details. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.keys(new Foo); - * // => ['a', 'b'] (iteration order is not guaranteed) - * - * _.keys('hi'); - * // => ['0', '1'] - */ - var keys = nativeKeys; - - /** - * Creates an array of the own and inherited enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.keysIn(new Foo); - * // => ['a', 'b', 'c'] (iteration order is not guaranteed) - */ - var keysIn = nativeKeysIn; - - /** - * Creates an object composed of the picked `object` properties. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The source object. - * @param {...(string|string[])} [paths] The property paths to pick. - * @returns {Object} Returns the new object. - * @example - * - * var object = { 'a': 1, 'b': '2', 'c': 3 }; - * - * _.pick(object, ['a', 'c']); - * // => { 'a': 1, 'c': 3 } - */ - var pick = flatRest(function(object, paths) { - return object == null ? {} : basePick(object, paths); - }); - - /** - * This method is like `_.get` except that if the resolved value is a - * function it's invoked with the `this` binding of its parent object and - * its result is returned. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to resolve. - * @param {*} [defaultValue] The value returned for `undefined` resolved values. - * @returns {*} Returns the resolved value. - * @example - * - * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; - * - * _.result(object, 'a[0].b.c1'); - * // => 3 - * - * _.result(object, 'a[0].b.c2'); - * // => 4 - * - * _.result(object, 'a[0].b.c3', 'default'); - * // => 'default' - * - * _.result(object, 'a[0].b.c3', _.constant('default')); - * // => 'default' - */ - function result(object, path, defaultValue) { - var value = object == null ? undefined : object[path]; - if (value === undefined) { - value = defaultValue; - } - return isFunction(value) ? value.call(object) : value; - } - - /** - * Creates an array of the own enumerable string keyed property values of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property values. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.values(new Foo); - * // => [1, 2] (iteration order is not guaranteed) - * - * _.values('hi'); - * // => ['h', 'i'] - */ - function values(object) { - return object == null ? [] : baseValues(object, keys(object)); - } - - /*------------------------------------------------------------------------*/ - - /** - * Converts the characters "&", "<", ">", '"', and "'" in `string` to their - * corresponding HTML entities. - * - * **Note:** No other characters are escaped. To escape additional - * characters use a third-party library like [_he_](https://mths.be/he). - * - * Though the ">" character is escaped for symmetry, characters like - * ">" and "/" don't need escaping in HTML and have no special meaning - * unless they're part of a tag or unquoted attribute value. See - * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) - * (under "semi-related fun fact") for more details. - * - * When working with HTML you should always - * [quote attribute values](http://wonko.com/post/html-escaping) to reduce - * XSS vectors. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category String - * @param {string} [string=''] The string to escape. - * @returns {string} Returns the escaped string. - * @example - * - * _.escape('fred, barney, & pebbles'); - * // => 'fred, barney, & pebbles' - */ - function escape(string) { - string = toString(string); - return (string && reHasUnescapedHtml.test(string)) - ? string.replace(reUnescapedHtml, escapeHtmlChar) - : string; - } - - /*------------------------------------------------------------------------*/ - - /** - * This method returns the first argument it receives. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Util - * @param {*} value Any value. - * @returns {*} Returns `value`. - * @example - * - * var object = { 'a': 1 }; - * - * console.log(_.identity(object) === object); - * // => true - */ - function identity(value) { - return value; - } - - /** - * Creates a function that invokes `func` with the arguments of the created - * function. If `func` is a property name, the created function returns the - * property value for a given element. If `func` is an array or object, the - * created function returns `true` for elements that contain the equivalent - * source properties, otherwise it returns `false`. - * - * @static - * @since 4.0.0 - * @memberOf _ - * @category Util - * @param {*} [func=_.identity] The value to convert to a callback. - * @returns {Function} Returns the callback. - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': true }, - * { 'user': 'fred', 'age': 40, 'active': false } - * ]; - * - * // The `_.matches` iteratee shorthand. - * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true })); - * // => [{ 'user': 'barney', 'age': 36, 'active': true }] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.filter(users, _.iteratee(['user', 'fred'])); - * // => [{ 'user': 'fred', 'age': 40 }] - * - * // The `_.property` iteratee shorthand. - * _.map(users, _.iteratee('user')); - * // => ['barney', 'fred'] - * - * // Create custom iteratee shorthands. - * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) { - * return !_.isRegExp(func) ? iteratee(func) : function(string) { - * return func.test(string); - * }; - * }); - * - * _.filter(['abc', 'def'], /ef/); - * // => ['def'] - */ - var iteratee = baseIteratee; - - /** - * Creates a function that performs a partial deep comparison between a given - * object and `source`, returning `true` if the given object has equivalent - * property values, else `false`. - * - * **Note:** The created function is equivalent to `_.isMatch` with `source` - * partially applied. - * - * Partial comparisons will match empty array and empty object `source` - * values against any array or object value, respectively. See `_.isEqual` - * for a list of supported value comparisons. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Util - * @param {Object} source The object of property values to match. - * @returns {Function} Returns the new spec function. - * @example - * - * var objects = [ - * { 'a': 1, 'b': 2, 'c': 3 }, - * { 'a': 4, 'b': 5, 'c': 6 } - * ]; - * - * _.filter(objects, _.matches({ 'a': 4, 'c': 6 })); - * // => [{ 'a': 4, 'b': 5, 'c': 6 }] - */ - function matches(source) { - return baseMatches(assign({}, source)); - } - - /** - * Adds all own enumerable string keyed function properties of a source - * object to the destination object. If `object` is a function, then methods - * are added to its prototype as well. - * - * **Note:** Use `_.runInContext` to create a pristine `lodash` function to - * avoid conflicts caused by modifying the original. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Util - * @param {Function|Object} [object=lodash] The destination object. - * @param {Object} source The object of functions to add. - * @param {Object} [options={}] The options object. - * @param {boolean} [options.chain=true] Specify whether mixins are chainable. - * @returns {Function|Object} Returns `object`. - * @example - * - * function vowels(string) { - * return _.filter(string, function(v) { - * return /[aeiou]/i.test(v); - * }); - * } - * - * _.mixin({ 'vowels': vowels }); - * _.vowels('fred'); - * // => ['e'] - * - * _('fred').vowels().value(); - * // => ['e'] - * - * _.mixin({ 'vowels': vowels }, { 'chain': false }); - * _('fred').vowels(); - * // => ['e'] - */ - function mixin(object, source, options) { - var props = keys(source), - methodNames = baseFunctions(source, props); - - if (options == null && - !(isObject(source) && (methodNames.length || !props.length))) { - options = source; - source = object; - object = this; - methodNames = baseFunctions(source, keys(source)); - } - var chain = !(isObject(options) && 'chain' in options) || !!options.chain, - isFunc = isFunction(object); - - baseEach(methodNames, function(methodName) { - var func = source[methodName]; - object[methodName] = func; - if (isFunc) { - object.prototype[methodName] = function() { - var chainAll = this.__chain__; - if (chain || chainAll) { - var result = object(this.__wrapped__), - actions = result.__actions__ = copyArray(this.__actions__); - - actions.push({ 'func': func, 'args': arguments, 'thisArg': object }); - result.__chain__ = chainAll; - return result; - } - return func.apply(object, arrayPush([this.value()], arguments)); - }; - } - }); - - return object; - } - - /** - * Reverts the `_` variable to its previous value and returns a reference to - * the `lodash` function. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Util - * @returns {Function} Returns the `lodash` function. - * @example - * - * var lodash = _.noConflict(); - */ - function noConflict() { - if (root._ === this) { - root._ = oldDash; - } - return this; - } - - /** - * This method returns `undefined`. - * - * @static - * @memberOf _ - * @since 2.3.0 - * @category Util - * @example - * - * _.times(2, _.noop); - * // => [undefined, undefined] - */ - function noop() { - // No operation performed. - } - - /** - * Generates a unique ID. If `prefix` is given, the ID is appended to it. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Util - * @param {string} [prefix=''] The value to prefix the ID with. - * @returns {string} Returns the unique ID. - * @example - * - * _.uniqueId('contact_'); - * // => 'contact_104' - * - * _.uniqueId(); - * // => '105' - */ - function uniqueId(prefix) { - var id = ++idCounter; - return toString(prefix) + id; - } - - /*------------------------------------------------------------------------*/ - - /** - * Computes the maximum value of `array`. If `array` is empty or falsey, - * `undefined` is returned. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Math - * @param {Array} array The array to iterate over. - * @returns {*} Returns the maximum value. - * @example - * - * _.max([4, 2, 8, 6]); - * // => 8 - * - * _.max([]); - * // => undefined - */ - function max(array) { - return (array && array.length) - ? baseExtremum(array, identity, baseGt) - : undefined; - } - - /** - * Computes the minimum value of `array`. If `array` is empty or falsey, - * `undefined` is returned. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Math - * @param {Array} array The array to iterate over. - * @returns {*} Returns the minimum value. - * @example - * - * _.min([4, 2, 8, 6]); - * // => 2 - * - * _.min([]); - * // => undefined - */ - function min(array) { - return (array && array.length) - ? baseExtremum(array, identity, baseLt) - : undefined; - } - - /*------------------------------------------------------------------------*/ - - // Add methods that return wrapped values in chain sequences. - lodash.assignIn = assignIn; - lodash.before = before; - lodash.bind = bind; - lodash.chain = chain; - lodash.compact = compact; - lodash.concat = concat; - lodash.create = create; - lodash.defaults = defaults; - lodash.defer = defer; - lodash.delay = delay; - lodash.filter = filter; - lodash.flatten = flatten; - lodash.flattenDeep = flattenDeep; - lodash.iteratee = iteratee; - lodash.keys = keys; - lodash.map = map; - lodash.matches = matches; - lodash.mixin = mixin; - lodash.negate = negate; - lodash.once = once; - lodash.pick = pick; - lodash.slice = slice; - lodash.sortBy = sortBy; - lodash.tap = tap; - lodash.thru = thru; - lodash.toArray = toArray; - lodash.values = values; - - // Add aliases. - lodash.extend = assignIn; - - // Add methods to `lodash.prototype`. - mixin(lodash, lodash); - - /*------------------------------------------------------------------------*/ - - // Add methods that return unwrapped values in chain sequences. - lodash.clone = clone; - lodash.escape = escape; - lodash.every = every; - lodash.find = find; - lodash.forEach = forEach; - lodash.has = has; - lodash.head = head; - lodash.identity = identity; - lodash.indexOf = indexOf; - lodash.isArguments = isArguments; - lodash.isArray = isArray; - lodash.isBoolean = isBoolean; - lodash.isDate = isDate; - lodash.isEmpty = isEmpty; - lodash.isEqual = isEqual; - lodash.isFinite = isFinite; - lodash.isFunction = isFunction; - lodash.isNaN = isNaN; - lodash.isNull = isNull; - lodash.isNumber = isNumber; - lodash.isObject = isObject; - lodash.isRegExp = isRegExp; - lodash.isString = isString; - lodash.isUndefined = isUndefined; - lodash.last = last; - lodash.max = max; - lodash.min = min; - lodash.noConflict = noConflict; - lodash.noop = noop; - lodash.reduce = reduce; - lodash.result = result; - lodash.size = size; - lodash.some = some; - lodash.uniqueId = uniqueId; - - // Add aliases. - lodash.each = forEach; - lodash.first = head; - - mixin(lodash, (function() { - var source = {}; - baseForOwn(lodash, function(func, methodName) { - if (!hasOwnProperty.call(lodash.prototype, methodName)) { - source[methodName] = func; - } - }); - return source; - }()), { 'chain': false }); - - /*------------------------------------------------------------------------*/ - - /** - * The semantic version number. - * - * @static - * @memberOf _ - * @type {string} - */ - lodash.VERSION = VERSION; - - // Add `Array` methods to `lodash.prototype`. - baseEach(['pop', 'join', 'replace', 'reverse', 'split', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) { - var func = (/^(?:replace|split)$/.test(methodName) ? String.prototype : arrayProto)[methodName], - chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru', - retUnwrapped = /^(?:pop|join|replace|shift)$/.test(methodName); - - lodash.prototype[methodName] = function() { - var args = arguments; - if (retUnwrapped && !this.__chain__) { - var value = this.value(); - return func.apply(isArray(value) ? value : [], args); - } - return this[chainName](function(value) { - return func.apply(isArray(value) ? value : [], args); - }); - }; - }); - - // Add chain sequence methods to the `lodash` wrapper. - lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue; - - /*--------------------------------------------------------------------------*/ - - // Some AMD build optimizers, like r.js, check for condition patterns like: - if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { - // Expose Lodash on the global object to prevent errors when Lodash is - // loaded by a script tag in the presence of an AMD loader. - // See http://requirejs.org/docs/errors.html#mismatch for more details. - // Use `_.noConflict` to remove Lodash from the global object. - root._ = lodash; - - // Define as an anonymous module so, through path mapping, it can be - // referenced as the "underscore" module. - define(function() { - return lodash; - }); - } - // Check for `exports` after `define` in case a build optimizer adds it. - else if (freeModule) { - // Export for Node.js. - (freeModule.exports = lodash)._ = lodash; - // Export for CommonJS support. - freeExports._ = lodash; - } - else { - // Export to the global object. - root._ = lodash; - } -}.call(this)); +;(function(){function n(n){return H(n)&&pn.call(n,"callee")&&!yn.call(n,"callee")}function t(n,t){return n.push.apply(n,t),n}function r(n){return function(t){return null==t?Z:t[n]}}function e(n,t,r,e,u){return u(n,function(n,u,o){r=e?(e=false,n):t(r,n,u,o)}),r}function u(n,t){return j(t,function(t){return n[t]})}function o(n){return n instanceof i?n:new i(n)}function i(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t}function c(n,t,r){if(typeof n!="function")throw new TypeError("Expected a function"); +return setTimeout(function(){n.apply(Z,r)},t)}function f(n,t){var r=true;return mn(n,function(n,e,u){return r=!!t(n,e,u)}),r}function a(n,t,r){for(var e=-1,u=n.length;++et}function b(n,t,r,e,u){return n===t||(null==n||null==t||!H(n)&&!H(t)?n!==n&&t!==t:y(n,t,r,e,b,u))}function y(n,t,r,e,u,o){var i=Nn(n),c=Nn(t),f=i?"[object Array]":hn.call(n),a=c?"[object Array]":hn.call(t),f="[object Arguments]"==f?"[object Object]":f,a="[object Arguments]"==a?"[object Object]":a,l="[object Object]"==f,c="[object Object]"==a,a=f==a;o||(o=[]);var p=An(o,function(t){return t[0]==n}),s=An(o,function(n){ +return n[0]==t});if(p&&s)return p[1]==t;if(o.push([n,t]),o.push([t,n]),a&&!l){if(i)r=T(n,t,r,e,u,o);else n:{switch(f){case"[object Boolean]":case"[object Date]":case"[object Number]":r=J(+n,+t);break n;case"[object Error]":r=n.name==t.name&&n.message==t.message;break n;case"[object RegExp]":case"[object String]":r=n==t+"";break n}r=false}return o.pop(),r}return 1&r||(i=l&&pn.call(n,"__wrapped__"),f=c&&pn.call(t,"__wrapped__"),!i&&!f)?!!a&&(r=B(n,t,r,e,u,o),o.pop(),r):(i=i?n.value():n,f=f?t.value():t, +r=u(i,f,r,e,o),o.pop(),r)}function g(n){return typeof n=="function"?n:null==n?X:(typeof n=="object"?d:r)(n)}function _(n,t){return nt&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Array(u);++ei))return false;for(var c=-1,f=true,a=2&r?[]:Z;++cr?jn(e+r,0):r:0,r=(r||0)-1;for(var u=t===t;++rarguments.length,mn)}function G(n,t){var r;if(typeof t!="function")throw new TypeError("Expected a function");return n=Fn(n), +function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=Z),r}}function J(n,t){return n===t||n!==n&&t!==t}function M(n){var t;return(t=null!=n)&&(t=n.length,t=typeof t=="number"&&-1=t),t&&!U(n)}function U(n){return!!V(n)&&(n=hn.call(n),"[object Function]"==n||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n)}function V(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function H(n){return null!=n&&typeof n=="object"}function K(n){ +return typeof n=="number"||H(n)&&"[object Number]"==hn.call(n)}function L(n){return typeof n=="string"||!Nn(n)&&H(n)&&"[object String]"==hn.call(n)}function Q(n){return typeof n=="string"?n:null==n?"":n+""}function W(n){return null==n?[]:u(n,Dn(n))}function X(n){return n}function Y(n,r,e){var u=Dn(r),o=h(r,u);null!=e||V(r)&&(o.length||!u.length)||(e=r,r=n,n=this,o=h(r,Dn(r)));var i=!(V(e)&&"chain"in e&&!e.chain),c=U(n);return mn(o,function(e){var u=r[e];n[e]=u,c&&(n.prototype[e]=function(){var r=this.__chain__; +if(i||r){var e=n(this.__wrapped__);return(e.__actions__=A(this.__actions__)).push({func:u,args:arguments,thisArg:n}),e.__chain__=r,e}return u.apply(n,t([this.value()],arguments))})}),n}var Z,nn=1/0,tn=/[&<>"']/g,rn=RegExp(tn.source),en=/^(?:0|[1-9]\d*)$/,un=typeof self=="object"&&self&&self.Object===Object&&self,on=typeof global=="object"&&global&&global.Object===Object&&global||un||Function("return this")(),cn=(un=typeof exports=="object"&&exports&&!exports.nodeType&&exports)&&typeof module=="object"&&module&&!module.nodeType&&module,fn=function(n){ +return function(t){return null==n?Z:n[t]}}({"&":"&","<":"<",">":">",'"':""","'":"'"}),an=Array.prototype,ln=Object.prototype,pn=ln.hasOwnProperty,sn=0,hn=ln.toString,vn=on._,bn=Object.create,yn=ln.propertyIsEnumerable,gn=on.isFinite,_n=function(n,t){return function(r){return n(t(r))}}(Object.keys,Object),jn=Math.max,dn=function(){function n(){}return function(t){return V(t)?bn?bn(t):(n.prototype=t,t=new n,n.prototype=Z,t):{}}}();i.prototype=dn(o.prototype),i.prototype.constructor=i; +var mn=function(n,t){return function(r,e){if(null==r)return r;if(!M(r))return n(r,e);for(var u=r.length,o=t?u:-1,i=Object(r);(t?o--:++or&&(r=jn(e+r,0));n:{for(t=g(t),e=n.length,r+=-1;++re||o&&c&&a||!u&&a||!i){r=1;break n}if(!o&&ropera.version()?new Audio(null):new Audio).canPlayType!==k}catch(ib){Ia=!1}this.hasHTML5=Ia;this.setup=function(b){var e=!c.url;b!==k&&p&&u&&c.ok();oa(b);b&& -(e&&(N&&b.url!==k)&&c.beginDelayedInit(),!N&&(b.url!==k&&"complete"===n.readyState)&&setTimeout(G,1));return c};this.supported=this.ok=function(){return u?p&&!y:c.useHTML5Audio&&c.hasHTML5};this.getMovie=function(b){return W(b)||n[b]||g[b]};this.createSound=function(b,e){function d(){a=aa(a);c.sounds[a.id]=new Ja(a);c.soundIDs.push(a.id);return c.sounds[a.id]}var a,f=null;if(!p||!c.ok())return!1;e!==k&&(b={id:b,url:e});a=w(b);a.url=da(a.url);void 0===a.id&&(a.id=c.setupOptions.idPrefix+Ya++);if(r(a.id, -!0))return c.sounds[a.id];if(ea(a))f=d(),f._setup_html5(a);else{if(c.html5Only||c.html5.usingFlash&&a.url&&a.url.match(/data\:/i))return d();8a.instanceCount?(n(),f=a._setup_html5(),a.setPosition(a._iO.position),f.play()):(h=new Audio(a._iO.url),g=function(){t.remove(h,"ended",g);a._onfinish(a);fa(h);h=null},J=function(){t.remove(h,"canplay",J);try{h.currentTime=a._iO.position/1E3}catch(b){}h.play()},t.add(h,"ended",g),void 0!==a._iO.volume&&(h.volume=Math.max(0,Math.min(1,a._iO.volume/100))),a.muted&&(h.muted=!0),a._iO.position? -t.add(h,"canplay",J):h.play()):(f=l._start(a.id,a._iO.loops||1,9===m?a.position:a.position/1E3,a._iO.multiShot||!1),9===m&&!f&&a._iO.onplayerror&&a._iO.onplayerror.apply(a))}return a};this.stop=function(b){var c=a._iO;1===a.playState&&(a._onbufferchange(0),a._resetOnPosition(0),a.paused=!1,a.isHTML5||(a.playState=0),x(),c.to&&a.clearOnPosition(c.to),a.isHTML5?a._a&&(b=a.position,a.setPosition(0),a.position=b,a._a.pause(),a.playState=0,a._onTimer(),g()):(l._stop(a.id,b),c.serverURL&&a.unload()),a.instanceCount= -0,a._iO={},c.onstop&&c.onstop.apply(a));return a};this.setAutoPlay=function(b){a._iO.autoPlay=b;a.isHTML5||(l._setAutoPlay(a.id,b),b&&!a.instanceCount&&1===a.readyState&&a.instanceCount++)};this.getAutoPlay=function(){return a._iO.autoPlay};this.setPosition=function(b){b===k&&(b=0);var c=a.isHTML5?Math.max(b,0):Math.min(a.duration||a._iO.duration,Math.max(b,0));a.position=c;b=a.position/1E3;a._resetOnPosition(a.position);a._iO.position=c;if(a.isHTML5){if(a._a){if(a._html5_canplay){if(a._a.currentTime!== -b)try{a._a.currentTime=b,(0===a.playState||a.paused)&&a._a.pause()}catch(e){}}else if(b)return a;a.paused&&a._onTimer(!0)}}else b=9===m?a.position:b,a.readyState&&2!==a.readyState&&l._setPosition(a.id,b,a.paused||!a.playState,a._iO.multiShot);return a};this.pause=function(b){if(a.paused||0===a.playState&&1!==a.readyState)return a;a.paused=!0;a.isHTML5?(a._setup_html5().pause(),g()):(b||b===k)&&l._pause(a.id,a._iO.multiShot);a._iO.onpause&&a._iO.onpause.apply(a);return a};this.resume=function(){var b= -a._iO;if(!a.paused)return a;a.paused=!1;a.playState=1;a.isHTML5?(a._setup_html5().play(),n()):(b.isMovieStar&&!b.serverURL&&a.setPosition(a.position),l._pause(a.id,b.multiShot));!s&&b.onplay?(b.onplay.apply(a),s=!0):b.onresume&&b.onresume.apply(a);return a};this.togglePause=function(){if(0===a.playState)return a.play({position:9===m&&!a.isHTML5?a.position:a.position/1E3}),a;a.paused?a.resume():a.pause();return a};this.setPan=function(b,c){b===k&&(b=0);c===k&&(c=!1);a.isHTML5||l._setPan(a.id,b);a._iO.pan= -b;c||(a.pan=b,a.options.pan=b);return a};this.setVolume=function(b,e){b===k&&(b=100);e===k&&(e=!1);a.isHTML5?a._a&&(c.muted&&!a.muted&&(a.muted=!0,a._a.muted=!0),a._a.volume=Math.max(0,Math.min(1,b/100))):l._setVolume(a.id,c.muted&&!a.muted||a.muted?0:b);a._iO.volume=b;e||(a.volume=b,a.options.volume=b);return a};this.mute=function(){a.muted=!0;a.isHTML5?a._a&&(a._a.muted=!0):l._setVolume(a.id,0);return a};this.unmute=function(){a.muted=!1;var b=a._iO.volume!==k;a.isHTML5?a._a&&(a._a.muted=!1):l._setVolume(a.id, -b?a._iO.volume:a.options.volume);return a};this.toggleMute=function(){return a.muted?a.unmute():a.mute()};this.onposition=this.onPosition=function(b,c,e){p.push({position:parseInt(b,10),method:c,scope:e!==k?e:a,fired:!1});return a};this.clearOnPosition=function(a,b){var c;a=parseInt(a,10);if(isNaN(a))return!1;for(c=0;c=b)return!1;for(b-= -1;0<=b;b--)c=p[b],!c.fired&&a.position>=c.position&&(c.fired=!0,u++,c.method.apply(c.scope,[c.position]));return!0};this._resetOnPosition=function(a){var b,c;b=p.length;if(!b)return!1;for(b-=1;0<=b;b--)c=p[b],c.fired&&a<=c.position&&(c.fired=!1,u--);return!0};y=function(){var b=a._iO,c=b.from,e=b.to,d,f;f=function(){a.clearOnPosition(e,f);a.stop()};d=function(){if(null!==e&&!isNaN(e))a.onPosition(e,f)};null!==c&&!isNaN(c)&&(b.position=c,b.multiShot=!1,d());return b};q=function(){var b,c=a._iO.onposition; -if(c)for(b in c)if(c.hasOwnProperty(b))a.onPosition(parseInt(b,10),c[b])};x=function(){var b,c=a._iO.onposition;if(c)for(b in c)c.hasOwnProperty(b)&&a.clearOnPosition(parseInt(b,10))};n=function(){a.isHTML5&&Ra(a)};g=function(){a.isHTML5&&Sa(a)};f=function(b){b||(p=[],u=0);s=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded=null;a.bytesTotal=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.buffered=[];a.eqData=[];a.eqData.left=[];a.eqData.right=[]; -a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null;a.id3={}};f();this._onTimer=function(b){var c,f=!1,h={};if(a._hasTimer||b){if(a._a&&(b||(0opera.version()?new Audio(null):new Audio,c=a._a,c._called_load=!1,A&&(Ka=c);a.isHTML5=!0;a._a=c;c._s=a;h();a._apply_loop(c,b.loops);b.autoLoad||b.autoPlay?a.load():(c.autobuffer=!1,c.preload="auto");return c};h=function(){if(a._a._added_events)return!1;var b;a._a._added_events=!0;for(b in B)B.hasOwnProperty(b)&&a._a&&a._a.addEventListener(b,B[b],!1);return!0};J=function(){var b;a._a._added_events= -!1;for(b in B)B.hasOwnProperty(b)&&a._a&&a._a.removeEventListener(b,B[b],!1)};this._onload=function(b){var c=!!b||!a.isHTML5&&8===m&&a.duration;a.loaded=c;a.readyState=c?3:2;a._onbufferchange(0);a._iO.onload&&ga(a,function(){a._iO.onload.apply(a,[c])});return!0};this._onbufferchange=function(b){if(0===a.playState||b&&a.isBuffering||!b&&!a.isBuffering)return!1;a.isBuffering=1===b;a._iO.onbufferchange&&a._iO.onbufferchange.apply(a);return!0};this._onsuspend=function(){a._iO.onsuspend&&a._iO.onsuspend.apply(a); -return!0};this._onfailure=function(b,c,e){a.failures++;if(a._iO.onfailure&&1===a.failures)a._iO.onfailure(a,b,c,e)};this._onfinish=function(){var b=a._iO.onfinish;a._onbufferchange(0);a._resetOnPosition(0);a.instanceCount&&(a.instanceCount--,a.instanceCount||(x(),a.playState=0,a.paused=!1,a.instanceCount=0,a.instanceOptions={},a._iO={},g(),a.isHTML5&&(a.position=0)),(!a.instanceCount||a._iO.multiShotEvents)&&b&&ga(a,function(){b.apply(a)}))};this._whileloading=function(b,c,e,d){var f=a._iO;a.bytesLoaded= -b;a.bytesTotal=c;a.duration=Math.floor(e);a.bufferLength=d;a.durationEstimate=!a.isHTML5&&!f.isMovieStar?f.duration?a.duration>f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10):a.duration;a.isHTML5||(a.buffered=[{start:0,end:a.duration}]);(3!==a.readyState||a.isHTML5)&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,e,d,f){var h=a._iO;if(isNaN(b)||null===b)return!1;a.position=Math.max(0,b);a._processOnPosition();!a.isHTML5&&8opera.version()?new Audio(null):new Audio:null,d,a,f={},h,g;h=c.audioFormats;for(d in h)if(h.hasOwnProperty(d)&&(a="audio/"+d,f[d]=b(h[d].type),f[a]=f[d],d.match(bb)?(c.flash[d]=!0,c.flash[a]=!0):(c.flash[d]=!1,c.flash[a]=!1),h[d]&&h[d].related))for(g=h[d].related.length-1;0<=g;g--)f["audio/"+h[d].related[g]]=f[d],c.html5[h[d].related[g]]=f[d],c.flash[h[d].related[g]]=f[d];f.canPlayType=e?b:null;c.html5=w(c.html5,f);c.html5.usingFlash= -Va();u=c.html5.usingFlash;return!0};sa={};P=function(){};aa=function(b){8===m&&(1m)&&(c.flashVersion=m=9);c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)":9===m?" (AS3/Flash 9)": -" (AS2/Flash 8)");8b&&(e=!0));setTimeout(function(){b=c.getMoviePercent();if(e)return Q=!1,g.setTimeout(F,1),!1;!p&&ab&&(null===b?c.useFlashBlock||0===c.flashLoadTimeout?c.useFlashBlock&&za():!c.useFlashBlock&&S?qa():D({type:"ontimeout",ignoreInit:!0,error:{type:"INIT_FLASHBLOCK"}}):0!==c.flashLoadTimeout&&(!c.useFlashBlock&&S?qa():xa(!0)))},c.flashLoadTimeout)};Y=function(){if(Ga||!ja)return t.remove(g,"focus", -Y),!0;Ga=ab=!0;Q=!1;F();t.remove(g,"focus",Y);return!0};M=function(b){if(p)return!1;if(c.html5Only)return p=!0,E(),!0;var e=!0,d;if(!c.useFlashBlock||!c.flashLoadTimeout||c.getMoviePercent())p=!0;d={type:!v&&u?"NO_FLASH":"INIT_TIMEOUT"};if(y||b)c.useFlashBlock&&c.oMC&&(c.oMC.className=I()+" "+(null===c.getMoviePercent()?"swf_timedout":"swf_error")),D({type:"ontimeout",error:d,ignoreInit:!0}),H(d),e=!1;y||(c.waitForWindowLoad&&!na?t.add(g,"load",E):E());return e};Ma=function(){var b,e=c.setupOptions; -for(b in e)e.hasOwnProperty(b)&&(c[b]===k?c[b]=e[b]:c[b]!==e[b]&&(c.setupOptions[b]=c[b]))};ma=function(){if(p)return!1;if(c.html5Only)return p||(t.remove(g,"load",c.beginDelayedInit),c.enabled=!0,M()),!0;Z();try{l._externalInterfaceTest(!1),Oa(!0,c.flashPollingInterval||(c.useHighPerformance?10:50)),c.debugMode||l._disableDebug(),c.enabled=!0,c.html5Only||t.add(g,"unload",la)}catch(b){return H({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),xa(!0),M(),!1}M();t.remove(g,"load",c.beginDelayedInit);return!0}; -G=function(){if(N)return!1;N=!0;Ma();wa();!v&&c.hasHTML5&&c.setup({useHTML5Audio:!0,preferFlash:!1});Wa();!v&&u&&(Ua.push(sa.needFlash),c.setup({flashLoadTimeout:1}));n.removeEventListener&&n.removeEventListener("DOMContentLoaded",G,!1);Z();return!0};Ba=function(){"complete"===n.readyState&&(G(),n.detachEvent("onreadystatechange",Ba));return!0};ua=function(){na=!0;t.remove(g,"load",ua)};ta=function(){if(Fa&&(c.setupOptions.useHTML5Audio=!0,c.setupOptions.preferFlash=!1,ha||Za&&!s.match(/android\s2\.3/i)))ha&& -(c.ignoreFlash=!0),A=!0};ta();Da();t.add(g,"focus",Y);t.add(g,"load",F);t.add(g,"load",ua);n.addEventListener?n.addEventListener("DOMContentLoaded",G,!1):n.attachEvent?n.attachEvent("onreadystatechange",Ba):H({type:"NO_DOM2_EVENTS",fatal:!0})}var ka=null;if(void 0===g.SM2_DEFER||!SM2_DEFER)ka=new U;g.SoundManager=U;g.soundManager=ka})(window); \ No newline at end of file +/** @license + * + * SoundManager 2: JavaScript Sound for the Web + * ---------------------------------------------- + * http://schillmania.com/projects/soundmanager2/ + * + * Copyright (c) 2007, Scott Schiller. All rights reserved. + * Code provided under the BSD License: + * http://schillmania.com/projects/soundmanager2/license.txt + * + * V2.97a.20170601 + */ +(function(g,h){function v(gb,v){function Z(b){return c.preferFlash&&z&&!c.ignoreFlash&&c.flash[b]!==h&&c.flash[b]}function q(b){return function(c){var d=this._s;return d&&d._a?b.call(this,c):null}}this.setupOptions={url:gb||null,flashVersion:8,debugMode:!0,debugFlash:!1,useConsole:!0,consoleOnly:!0,waitForWindowLoad:!1,bgColor:"#ffffff",useHighPerformance:!1,flashPollingInterval:null,html5PollingInterval:null,flashLoadTimeout:1E3,wmode:null,allowScriptAccess:"always",useFlashBlock:!1,useHTML5Audio:!0, +forceUseGlobalHTML5Audio:!1,ignoreMobileRestrictions:!1,html5Test:/^(probably|maybe)$/i,preferFlash:!1,noSWFCache:!1,idPrefix:"sound"};this.defaultOptions={autoLoad:!1,autoPlay:!1,from:null,loops:1,onid3:null,onerror:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onposition:null,onstop:null,onfinish:null,multiShot:!0,multiShotEvents:!1,position:null,pan:0,playbackRate:1,stream:!0,to:null,type:null,usePolicyFile:!1,volume:100};this.flash9Options={onfailure:null, +isMovieStar:null,usePeakData:!1,useWaveformData:!1,useEQData:!1,onbufferchange:null,ondataerror:null};this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null,duration:null};this.audioFormats={mp3:{type:['audio/mpeg; codecs="mp3"',"audio/mpeg","audio/mp3","audio/MPA","audio/mpa-robust"],required:!0},mp4:{related:["aac","m4a","m4b"],type:['audio/mp4; codecs="mp4a.40.2"',"audio/aac","audio/x-m4a","audio/MP4A-LATM","audio/mpeg4-generic"],required:!1},ogg:{type:["audio/ogg; codecs=vorbis"],required:!1}, +opus:{type:["audio/ogg; codecs=opus","audio/opus"],required:!1},wav:{type:['audio/wav; codecs="1"',"audio/wav","audio/wave","audio/x-wav"],required:!1},flac:{type:["audio/flac"],required:!1}};this.movieID="sm2-container";this.id=v||"sm2movie";this.debugID="soundmanager-debug";this.debugURLParam=/([#?&])debug=1/i;this.versionNumber="V2.97a.20170601";this.altURL=this.movieURL=this.version=null;this.enabled=this.swfLoaded=!1;this.oMC=null;this.sounds={};this.soundIDs=[];this.didFlashBlock=this.muted= +!1;this.filePattern=null;this.filePatterns={flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.features={buffering:!1,peakData:!1,waveformData:!1,eqData:!1,movieStar:!1};this.sandbox={};this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only=!1;var M,c=this,Na=null,k=null,aa,t=navigator.userAgent,Oa=g.location.href.toString(),n=document,oa,Pa,pa,m,x=[],N=!1,O=!1,l=!1,A=!1,qa=!1,P,w,ra,ba,sa,E,G,H,Qa,ta,ua,ca,I,da,F,va,Q,wa,ea,J,Ra,xa,ya,za,Sa,R=null,Aa=null,S,Ba,K,fa,ga,p,T= +!1,Ca=!1,Ta,Ua,Va,ha=0,U=null,ia,V=[],W,u=null,Wa,ja,X,Xa,C,ka,Da,Ya,r,hb=Array.prototype.slice,y=!1,Ea,z,Fa,Za,B,Y,$a=0,Ga,Ha=t.match(/(ipad|iphone|ipod)/i),Ia=t.match(/android/i),D=t.match(/msie|trident/i),ib=t.match(/webkit/i),la=t.match(/safari/i)&&!t.match(/chrome/i),Ja=t.match(/opera/i),ma=t.match(/(mobile|pre\/|xoom)/i)||Ha||Ia,ab=!Oa.match(/usehtml5audio/i)&&!Oa.match(/sm2-ignorebadua/i)&&la&&!t.match(/silk/i)&&t.match(/OS\sX\s10_6_([3-7])/i),Ka=n.hasFocus!==h?n.hasFocus():null,na=la&&(n.hasFocus=== +h||!n.hasFocus()),bb=!na,cb=/(mp3|mp4|mpa|m4a|m4b)/i,La=n.location?n.location.protocol.match(/http/i):null,jb=La?"":"//",db=/^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4|m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i,eb="mpeg4 aac flv mov mp4 m4v f4v m4a m4b mp4v 3gp 3g2".split(" "),kb=new RegExp("\\.("+eb.join("|")+")(\\?.*)?$","i");this.mimePattern=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.useAltURL=!La;Xa=[null,"MEDIA_ERR_ABORTED","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED"]; +var Ma;try{Ma=Audio!==h&&(Ja&&opera!==h&&10>opera.version()?new Audio(null):new Audio).canPlayType!==h}catch(lb){Ma=!1}this.hasHTML5=Ma;this.setup=function(b){var e=!c.url;b!==h&&l&&u&&c.ok();ra(b);if(!y)if(ma){if(!c.setupOptions.ignoreMobileRestrictions||c.setupOptions.forceUseGlobalHTML5Audio)V.push(I.globalHTML5),y=!0}else c.setupOptions.forceUseGlobalHTML5Audio&&(V.push(I.globalHTML5),y=!0);if(!Ga&&ma)if(c.setupOptions.ignoreMobileRestrictions)V.push(I.ignoreMobile);else if(c.setupOptions.useHTML5Audio= +!0,c.setupOptions.preferFlash=!1,Ha)c.ignoreFlash=!0;else if(Ia&&!t.match(/android\s2\.3/i)||!Ia)y=!0;b&&(e&&Q&&b.url!==h&&c.beginDelayedInit(),Q||b.url===h||"complete"!==n.readyState||setTimeout(F,1));Ga=!0;return c};this.supported=this.ok=function(){return u?l&&!A:c.useHTML5Audio&&c.hasHTML5};this.getMovie=function(b){return aa(b)||n[b]||g[b]};this.createSound=function(b,e){function d(){a=fa(a);c.sounds[a.id]=new M(a);c.soundIDs.push(a.id);return c.sounds[a.id]}var a,f=null;if(!l||!c.ok())return!1; +e!==h&&(b={id:b,url:e});a=w(b);a.url=ia(a.url);a.id===h&&(a.id=c.setupOptions.idPrefix+$a++);if(p(a.id,!0))return c.sounds[a.id];if(ja(a))f=d(),f._setup_html5(a);else{if(c.html5Only||c.html5.usingFlash&&a.url&&a.url.match(/data:/i))return d();8a.instanceCount?(n(),d=a._setup_html5(),a.setPosition(a._iO.position),d.play()):(f=new Audio(a._iO.url),g=function(){r.remove(f,"ended",g);a._onfinish(a);ka(f);f=null},L=function(){r.remove(f,"canplay",L);try{f.currentTime=a._iO.position/1E3}catch(b){}f.play()},r.add(f,"ended",g),a._iO.volume!==h&&(f.volume=Math.max(0,Math.min(1,a._iO.volume/100))),a.muted&&(f.muted=!0),a._iO.position?r.add(f,"canplay",L):f.play()):(d=k._start(a.id,a._iO.loops||1,9===m?a.position:a.position/1E3,a._iO.multiShot|| +!1),9!==m||d||a._iO.onplayerror&&a._iO.onplayerror.apply(a)));return a};this.stop=function(b){var c=a._iO;1===a.playState&&(a._onbufferchange(0),a._resetOnPosition(0),a.paused=!1,a.isHTML5||(a.playState=0),x(),c.to&&a.clearOnPosition(c.to),a.isHTML5?a._a&&(b=a.position,a.setPosition(0),a.position=b,a._a.pause(),a.playState=0,a._onTimer(),g()):(k._stop(a.id,b),c.serverURL&&a.unload()),a.instanceCount=0,a._iO={},c.onstop&&c.onstop.apply(a));return a};this.setAutoPlay=function(b){a._iO.autoPlay=b;a.isHTML5|| +(k._setAutoPlay(a.id,b),b&&(a.instanceCount||1!==a.readyState||a.instanceCount++))};this.getAutoPlay=function(){return a._iO.autoPlay};this.setPlaybackRate=function(b){b=Math.max(.5,Math.min(4,b));if(a.isHTML5)try{a._iO.playbackRate=b,a._a.playbackRate=b}catch(c){}return a};this.setPosition=function(b){b===h&&(b=0);var c=a.isHTML5?Math.max(b,0):Math.min(a.duration||a._iO.duration,Math.max(b,0));a.position=c;b=a.position/1E3;a._resetOnPosition(a.position);a._iO.position=c;if(!a.isHTML5)b=9===m?a.position: +b,a.readyState&&2!==a.readyState&&k._setPosition(a.id,b,a.paused||!a.playState,a._iO.multiShot);else if(a._a){if(a._html5_canplay){if(a._a.currentTime.toFixed(3)!==b.toFixed(3))try{a._a.currentTime=b,(0===a.playState||a.paused)&&a._a.pause()}catch(d){}}else if(b)return a;a.paused&&a._onTimer(!0)}return a};this.pause=function(b){if(a.paused||0===a.playState&&1!==a.readyState)return a;a.paused=!0;a.isHTML5?(a._setup_html5().pause(),g()):(b||b===h)&&k._pause(a.id,a._iO.multiShot);a._iO.onpause&&a._iO.onpause.apply(a); +return a};this.resume=function(){var b=a._iO;if(!a.paused)return a;a.paused=!1;a.playState=1;a.isHTML5?(a._setup_html5().play(),n()):(b.isMovieStar&&!b.serverURL&&a.setPosition(a.position),k._pause(a.id,b.multiShot));!t&&b.onplay?(b.onplay.apply(a),t=!0):b.onresume&&b.onresume.apply(a);return a};this.togglePause=function(){if(0===a.playState)return a.play({position:9!==m||a.isHTML5?a.position/1E3:a.position}),a;a.paused?a.resume():a.pause();return a};this.setPan=function(b,c){b===h&&(b=0);c===h&& +(c=!1);a.isHTML5||k._setPan(a.id,b);a._iO.pan=b;c||(a.pan=b,a.options.pan=b);return a};this.setVolume=function(b,d){b===h&&(b=100);d===h&&(d=!1);a.isHTML5?a._a&&(c.muted&&!a.muted&&(a.muted=!0,a._a.muted=!0),a._a.volume=Math.max(0,Math.min(1,b/100))):k._setVolume(a.id,c.muted&&!a.muted||a.muted?0:b);a._iO.volume=b;d||(a.volume=b,a.options.volume=b);return a};this.mute=function(){a.muted=!0;a.isHTML5?a._a&&(a._a.muted=!0):k._setVolume(a.id,0);return a};this.unmute=function(){a.muted=!1;var b=a._iO.volume!== +h;a.isHTML5?a._a&&(a._a.muted=!1):k._setVolume(a.id,b?a._iO.volume:a.options.volume);return a};this.toggleMute=function(){return a.muted?a.unmute():a.mute()};this.onposition=this.onPosition=function(b,c,d){l.push({position:parseInt(b,10),method:c,scope:d!==h?d:a,fired:!1});return a};this.clearOnPosition=function(a,b){var c;a=parseInt(a,10);if(!isNaN(a))for(c=0;c=b)return!1;for(--b;0<=b;b--)c=l[b],!c.fired&&a.position>=c.position&&(c.fired=!0,u++,c.method.apply(c.scope,[c.position]));return!0};this._resetOnPosition=function(a){var b,c;b=l.length;if(!b)return!1;for(--b;0<=b;b--)c=l[b],c.fired&&a<=c.position&&(c.fired=!1,u--);return!0};A=function(){var b=a._iO,c=b.from,d=b.to,e,f;f=function(){a.clearOnPosition(d,f);a.stop()};e=function(){if(null!==d&&!isNaN(d))a.onPosition(d,f)};null===c||isNaN(c)||(b.position=c,b.multiShot=!1,e());return b}; +q=function(){var b,c=a._iO.onposition;if(c)for(b in c)if(c.hasOwnProperty(b))a.onPosition(parseInt(b,10),c[b])};x=function(){var b,c=a._iO.onposition;if(c)for(b in c)c.hasOwnProperty(b)&&a.clearOnPosition(parseInt(b,10))};n=function(){a.isHTML5&&Ta(a)};g=function(){a.isHTML5&&Ua(a)};f=function(b){b||(l=[],u=0);t=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded=null;a.bytesTotal=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.buffered=[];a.eqData= +[];a.eqData.left=[];a.eqData.right=[];a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null;a.id3={}};f();this._onTimer=function(b){var c,f=!1,h={};(a._hasTimer||b)&&a._a&&(b||(0opera.version()?new Audio(null):new Audio,c=a._a,c._called_load=!1,y&&(Na=c);a.isHTML5=!0;a._a=c;c._s=a;L();a._apply_loop(c,b.loops);b.autoLoad||b.autoPlay?a.load():(c.autobuffer=!1,c.preload="auto");return c};L=function(){if(a._a._added_events)return!1;var b;a._a._added_events=!0;for(b in B)B.hasOwnProperty(b)&&a._a&&a._a.addEventListener(b,B[b],!1); +return!0};fb=function(){var b;a._a._added_events=!1;for(b in B)B.hasOwnProperty(b)&&a._a&&a._a.removeEventListener(b,B[b],!1)};this._onload=function(b){var c=!!b||!a.isHTML5&&8===m&&a.duration;a.loaded=c;a.readyState=c?3:2;a._onbufferchange(0);c||a.isHTML5||a._onerror();a._iO.onload&&Y(a,function(){a._iO.onload.apply(a,[c])});return!0};this._onerror=function(b,c){a._iO.onerror&&Y(a,function(){a._iO.onerror.apply(a,[b,c])})};this._onbufferchange=function(b){if(0===a.playState||b&&a.isBuffering||!b&& +!a.isBuffering)return!1;a.isBuffering=1===b;a._iO.onbufferchange&&a._iO.onbufferchange.apply(a,[b]);return!0};this._onsuspend=function(){a._iO.onsuspend&&a._iO.onsuspend.apply(a);return!0};this._onfailure=function(b,c,d){a.failures++;if(a._iO.onfailure&&1===a.failures)a._iO.onfailure(b,c,d)};this._onwarning=function(b,c,d){if(a._iO.onwarning)a._iO.onwarning(b,c,d)};this._onfinish=function(){var b=a._iO.onfinish;a._onbufferchange(0);a._resetOnPosition(0);a.instanceCount&&(a.instanceCount--,a.instanceCount|| +(x(),a.playState=0,a.paused=!1,a.instanceCount=0,a.instanceOptions={},a._iO={},g(),a.isHTML5&&(a.position=0)),(!a.instanceCount||a._iO.multiShotEvents)&&b&&Y(a,function(){b.apply(a)}))};this._whileloading=function(b,c,d,e){var f=a._iO;a.bytesLoaded=b;a.bytesTotal=c;a.duration=Math.floor(d);a.bufferLength=e;a.durationEstimate=a.isHTML5||f.isMovieStar?a.duration:f.duration?a.duration>f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10);a.isHTML5||(a.buffered=[{start:0, +end:a.duration}]);(3!==a.readyState||a.isHTML5)&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,d,e,f){var g=a._iO;if(isNaN(b)||null===b)return!1;a.position=Math.max(0,b);a._processOnPosition();!a.isHTML5&&8opera.version()? +new Audio(null):new Audio:null,d,a,f={},g,k;g=c.audioFormats;for(d in g)if(g.hasOwnProperty(d)&&(a="audio/"+d,f[d]=b(g[d].type),f[a]=f[d],d.match(cb)?(c.flash[d]=!0,c.flash[a]=!0):(c.flash[d]=!1,c.flash[a]=!1),g[d]&&g[d].related))for(k=g[d].related.length-1;0<=k;k--)f["audio/"+g[d].related[k]]=f[d],c.html5[g[d].related[k]]=f[d],c.flash[g[d].related[k]]=f[d];f.canPlayType=e?b:null;c.html5=w(c.html5,f);c.html5.usingFlash=Wa();u=c.html5.usingFlash;return!0};I={};S=function(){};fa=function(b){8===m&& +1m&&(c.flashVersion=m=9);c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)":9===m?" (AS3/Flash 9)":" (AS2/Flash 8)");8'}if(N&&O)return!1;if(c.html5Only)return ua(),c.oMC=aa(c.movieID),pa(),O=N=!0,!1;var a=e||c.url,f=c.altURL||a,g=wa(),k=K(),m=null,m=n.getElementsByTagName("html")[0],l,q,p,m=m&&m.dir&&m.dir.match(/rtl/i); +b=b===h?c.id:b;ua();c.url=Sa(La?a:f);e=c.url;c.wmode=!c.wmode&&c.useHighPerformance?"transparent":c.wmode;null!==c.wmode&&(t.match(/msie 8/i)||!D&&!c.useHighPerformance)&&navigator.platform.match(/win32|win64/i)&&(V.push(I.spcWmode),c.wmode=null);g={name:b,id:b,src:e,quality:"high",allowScriptAccess:c.allowScriptAccess,bgcolor:c.bgColor,pluginspage:jb+"www.macromedia.com/go/getflashplayer",title:"JS/Flash audio component (SoundManager 2)",type:"application/x-shockwave-flash",wmode:c.wmode,hasPriority:"true"}; +c.debugFlash&&(g.FlashVars="debug=1");c.wmode||delete g.wmode;if(D)a=n.createElement("div"),q=['',d("movie",e),d("AllowScriptAccess",c.allowScriptAccess),d("quality",g.quality),c.wmode?d("wmode",c.wmode):"",d("bgcolor",c.bgColor),d("hasPriority","true"),c.debugFlash?d("FlashVars",g.FlashVars): +"",""].join("");else for(l in a=n.createElement("embed"),g)g.hasOwnProperty(l)&&a.setAttribute(l,g[l]);xa();k=K();if(g=wa())if(c.oMC=aa(c.movieID)||n.createElement("div"),c.oMC.id)p=c.oMC.className,c.oMC.className=(p?p+" ":"movieContainer")+(k?" "+k:""),c.oMC.appendChild(a),D&&(l=c.oMC.appendChild(n.createElement("div")),l.className="sm2-object-box",l.innerHTML=q),O=!0;else{c.oMC.id=c.movieID;c.oMC.className="movieContainer "+k;l=k=null;c.useFlashBlock||(c.useHighPerformance?k={position:"fixed", +width:"8px",height:"8px",bottom:"0px",left:"0px",overflow:"hidden"}:(k={position:"absolute",width:"6px",height:"6px",top:"-9999px",left:"-9999px"},m&&(k.left=Math.abs(parseInt(k.left,10))+"px")));ib&&(c.oMC.style.zIndex=1E4);if(!c.debugFlash)for(p in k)k.hasOwnProperty(p)&&(c.oMC.style[p]=k[p]);try{D||c.oMC.appendChild(a),g.appendChild(c.oMC),D&&(l=c.oMC.appendChild(n.createElement("div")),l.className="sm2-object-box",l.innerHTML=q),O=!0}catch(r){throw Error(S("domError")+" \n"+r.toString());}}return N= +!0};da=function(){if(c.html5Only)return ea(),!1;if(k||!c.url)return!1;k=c.getMovie(c.id);k||(R?(D?c.oMC.innerHTML=Aa:c.oMC.appendChild(R),R=null,N=!0):ea(c.id,c.url),k=c.getMovie(c.id));"function"===typeof c.oninitmovie&&setTimeout(c.oninitmovie,1);return!0};H=function(){setTimeout(Qa,1E3)};ta=function(){g.setTimeout(function(){c.setup({preferFlash:!1}).reboot();c.didFlashBlock=!0;c.beginDelayedInit()},1)};Qa=function(){var b,e=!1;c.url&&!T&&(T=!0,r.remove(g,"load",H),z&&na&&!Ka||(l||(b=c.getMoviePercent(), +0b&&(e=!0)),setTimeout(function(){b=c.getMoviePercent();e?(T=!1,g.setTimeout(H,1)):!l&&bb&&(null===b?c.useFlashBlock||0===c.flashLoadTimeout?c.useFlashBlock&&Ba():!c.useFlashBlock&&W?ta():E({type:"ontimeout",ignoreInit:!0,error:{type:"INIT_FLASHBLOCK"}}):0!==c.flashLoadTimeout&&(!c.useFlashBlock&&W?ta():za(!0)))},c.flashLoadTimeout)))};ca=function(){if(Ka||!na)return r.remove(g,"focus",ca),!0;Ka=bb=!0;T=!1;H();r.remove(g,"focus",ca);return!0};P=function(b){if(l)return!1;if(c.html5Only)return l= +!0,G(),!0;var e=!0,d;c.useFlashBlock&&c.flashLoadTimeout&&!c.getMoviePercent()||(l=!0);d={type:!z&&u?"NO_FLASH":"INIT_TIMEOUT"};if(A||b)c.useFlashBlock&&c.oMC&&(c.oMC.className=K()+" "+(null===c.getMoviePercent()?"swf_timedout":"swf_error")),E({type:"ontimeout",error:d,ignoreInit:!0}),J(d),e=!1;A||(c.waitForWindowLoad&&!qa?r.add(g,"load",G):G());return e};Pa=function(){var b,e=c.setupOptions;for(b in e)e.hasOwnProperty(b)&&(c[b]===h?c[b]=e[b]:c[b]!==e[b]&&(c.setupOptions[b]=c[b]))};pa=function(){if(l)return!1; +if(c.html5Only)return l||(r.remove(g,"load",c.beginDelayedInit),c.enabled=!0,P()),!0;da();try{k._externalInterfaceTest(!1),Ra(!0,c.flashPollingInterval||(c.useHighPerformance?10:50)),c.debugMode||k._disableDebug(),c.enabled=!0,c.html5Only||r.add(g,"unload",oa)}catch(b){return J({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),za(!0),P(),!1}P();r.remove(g,"load",c.beginDelayedInit);return!0};F=function(){if(Q)return!1;Q=!0;Pa();xa();!z&&c.hasHTML5&&c.setup({useHTML5Audio:!0,preferFlash:!1});Ya();!z&&u&&(V.push(I.needFlash), +c.setup({flashLoadTimeout:1}));n.removeEventListener&&n.removeEventListener("DOMContentLoaded",F,!1);da();return!0};Da=function(){"complete"===n.readyState&&(F(),n.detachEvent("onreadystatechange",Da));return!0};va=function(){qa=!0;F();r.remove(g,"load",va)};Fa();r.add(g,"focus",ca);r.add(g,"load",H);r.add(g,"load",va);n.addEventListener?n.addEventListener("DOMContentLoaded",F,!1):n.attachEvent?n.attachEvent("onreadystatechange",Da):J({type:"NO_DOM2_EVENTS",fatal:!0})}if(!g||!g.document)throw Error("SoundManager requires a browser with window and document objects."); +var M=null;g.SM2_DEFER!==h&&SM2_DEFER||(M=new v);"object"===typeof module&&module&&"object"===typeof module.exports?(module.exports.SoundManager=v,module.exports.soundManager=M):"function"===typeof define&&define.amd&&define(function(){return{constructor:v,getInstance:function(h){!g.soundManager&&h instanceof Function&&(h=h(v),h instanceof v&&(g.soundManager=h));return g.soundManager}}});g.SoundManager=v;g.soundManager=M})(window); diff --git a/js/lib/soundmanager2-nodebug.js b/js/lib/soundmanager2-nodebug.js index 12b30e2bdf..047e540d98 100644 --- a/js/lib/soundmanager2-nodebug.js +++ b/js/lib/soundmanager2-nodebug.js @@ -8,2653 +8,77 @@ * Code provided under the BSD License: * http://schillmania.com/projects/soundmanager2/license.txt * - * V2.97a.20131201 + * V2.97a.20170601 */ - -/*global window, SM2_DEFER, sm2Debugger, console, document, navigator, setTimeout, setInterval, clearInterval, Audio, opera */ -/*jslint regexp: true, sloppy: true, white: true, nomen: true, plusplus: true, todo: true */ - -(function(window, _undefined) { -"use strict"; -var soundManager = null; -function SoundManager(smURL, smID) { - this.setupOptions = { - 'url': (smURL || null), - 'flashVersion': 8, - 'debugMode': true, - 'debugFlash': false, - 'useConsole': true, - 'consoleOnly': true, - 'waitForWindowLoad': false, - 'bgColor': '#ffffff', - 'useHighPerformance': false, - 'flashPollingInterval': null, - 'html5PollingInterval': null, - 'flashLoadTimeout': 1000, - 'wmode': null, - 'allowScriptAccess': 'always', - 'useFlashBlock': false, - 'useHTML5Audio': true, - 'html5Test': /^(probably|maybe)$/i, - 'preferFlash': false, - 'noSWFCache': false, - 'idPrefix': 'sound' - }; - this.defaultOptions = { - 'autoLoad': false, - 'autoPlay': false, - 'from': null, - 'loops': 1, - 'onid3': null, - 'onload': null, - 'whileloading': null, - 'onplay': null, - 'onpause': null, - 'onresume': null, - 'whileplaying': null, - 'onposition': null, - 'onstop': null, - 'onfailure': null, - 'onfinish': null, - 'multiShot': true, - 'multiShotEvents': false, - 'position': null, - 'pan': 0, - 'stream': true, - 'to': null, - 'type': null, - 'usePolicyFile': false, - 'volume': 100 - }; - this.flash9Options = { - 'isMovieStar': null, - 'usePeakData': false, - 'useWaveformData': false, - 'useEQData': false, - 'onbufferchange': null, - 'ondataerror': null - }; - this.movieStarOptions = { - 'bufferTime': 3, - 'serverURL': null, - 'onconnect': null, - 'duration': null - }; - this.audioFormats = { - 'mp3': { - 'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'], - 'required': true - }, - 'mp4': { - 'related': ['aac','m4a','m4b'], - 'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'], - 'required': false - }, - 'ogg': { - 'type': ['audio/ogg; codecs=vorbis'], - 'required': false - }, - 'opus': { - 'type': ['audio/ogg; codecs=opus', 'audio/opus'], - 'required': false - }, - 'wav': { - 'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'], - 'required': false - } - }; - this.movieID = 'sm2-container'; - this.id = (smID || 'sm2movie'); - this.debugID = 'soundmanager-debug'; - this.debugURLParam = /([#?&])debug=1/i; - this.versionNumber = 'V2.97a.20131201'; - this.version = null; - this.movieURL = null; - this.altURL = null; - this.swfLoaded = false; - this.enabled = false; - this.oMC = null; - this.sounds = {}; - this.soundIDs = []; - this.muted = false; - this.didFlashBlock = false; - this.filePattern = null; - this.filePatterns = { - 'flash8': /\.mp3(\?.*)?$/i, - 'flash9': /\.mp3(\?.*)?$/i - }; - this.features = { - 'buffering': false, - 'peakData': false, - 'waveformData': false, - 'eqData': false, - 'movieStar': false - }; - this.sandbox = { - }; - this.html5 = { - 'usingFlash': null - }; - this.flash = {}; - this.html5Only = false; - this.ignoreFlash = false; - var SMSound, - sm2 = this, globalHTML5Audio = null, flash = null, sm = 'soundManager', smc = sm + ': ', h5 = 'HTML5::', id, ua = navigator.userAgent, wl = window.location.href.toString(), doc = document, doNothing, setProperties, init, fV, on_queue = [], debugOpen = true, debugTS, didAppend = false, appendSuccess = false, didInit = false, disabled = false, windowLoaded = false, _wDS, wdCount = 0, initComplete, mixin, assign, extraOptions, addOnEvent, processOnEvents, initUserOnload, delayWaitForEI, waitForEI, rebootIntoHTML5, setVersionInfo, handleFocus, strings, initMovie, preInit, domContentLoaded, winOnLoad, didDCLoaded, getDocument, createMovie, catchError, setPolling, initDebug, debugLevels = ['log', 'info', 'warn', 'error'], defaultFlashVersion = 8, disableObject, failSafely, normalizeMovieURL, oRemoved = null, oRemovedHTML = null, str, flashBlockHandler, getSWFCSS, swfCSS, toggleDebug, loopFix, policyFix, complain, idCheck, waitingForEI = false, initPending = false, startTimer, stopTimer, timerExecute, h5TimerCount = 0, h5IntervalTimer = null, parseURL, messages = [], - canIgnoreFlash, needsFlash = null, featureCheck, html5OK, html5CanPlay, html5Ext, html5Unload, domContentLoadedIE, testHTML5, event, slice = Array.prototype.slice, useGlobalHTML5Audio = false, lastGlobalHTML5URL, hasFlash, detectFlash, badSafariFix, html5_events, showSupport, flushMessages, wrapCallback, idCounter = 0, - is_iDevice = ua.match(/(ipad|iphone|ipod)/i), isAndroid = ua.match(/android/i), isIE = ua.match(/msie/i), isWebkit = ua.match(/webkit/i), isSafari = (ua.match(/safari/i) && !ua.match(/chrome/i)), isOpera = (ua.match(/opera/i)), - mobileHTML5 = (ua.match(/(mobile|pre\/|xoom)/i) || is_iDevice || isAndroid), - isBadSafari = (!wl.match(/usehtml5audio/i) && !wl.match(/sm2\-ignorebadua/i) && isSafari && !ua.match(/silk/i) && ua.match(/OS X 10_6_([3-7])/i)), - hasConsole = (window.console !== _undefined && console.log !== _undefined), isFocused = (doc.hasFocus !== _undefined?doc.hasFocus():null), tryInitOnFocus = (isSafari && (doc.hasFocus === _undefined || !doc.hasFocus())), okToDisable = !tryInitOnFocus, flashMIME = /(mp3|mp4|mpa|m4a|m4b)/i, msecScale = 1000, - emptyURL = 'about:blank', - emptyWAV = 'data:audio/wave;base64,/UklGRiYAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQIAAAD//w==', - overHTTP = (doc.location?doc.location.protocol.match(/http/i):null), - http = (!overHTTP ? 'http:/'+'/' : ''), - netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i, - netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'm4b', 'mp4v', '3gp', '3g2'], - netStreamPattern = new RegExp('\\.(' + netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); - this.mimePattern = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; - this.useAltURL = !overHTTP; - swfCSS = { - 'swfBox': 'sm2-object-box', - 'swfDefault': 'movieContainer', - 'swfError': 'swf_error', - 'swfTimedout': 'swf_timedout', - 'swfLoaded': 'swf_loaded', - 'swfUnblocked': 'swf_unblocked', - 'sm2Debug': 'sm2_debug', - 'highPerf': 'high_performance', - 'flashDebug': 'flash_debug' - }; - this.hasHTML5 = (function() { - try { - return (Audio !== _undefined && (isOpera && opera !== _undefined && opera.version() < 10 ? new Audio(null) : new Audio()).canPlayType !== _undefined); - } catch(e) { - return false; - } - }()); - this.setup = function(options) { - var noURL = (!sm2.url); - if (options !== _undefined && didInit && needsFlash && sm2.ok() && (options.flashVersion !== _undefined || options.url !== _undefined || options.html5Test !== _undefined)) { - } - assign(options); - if (options) { - if (noURL && didDCLoaded && options.url !== _undefined) { - sm2.beginDelayedInit(); - } - if (!didDCLoaded && options.url !== _undefined && doc.readyState === 'complete') { - setTimeout(domContentLoaded, 1); - } - } - return sm2; - }; - this.ok = function() { - return (needsFlash ? (didInit && !disabled) : (sm2.useHTML5Audio && sm2.hasHTML5)); - }; - this.supported = this.ok; - this.getMovie = function(smID) { - return id(smID) || doc[smID] || window[smID]; - }; - this.createSound = function(oOptions, _url) { - var cs, cs_string, options, oSound = null; - if (!didInit || !sm2.ok()) { - return false; - } - if (_url !== _undefined) { - oOptions = { - 'id': oOptions, - 'url': _url - }; - } - options = mixin(oOptions); - options.url = parseURL(options.url); - if (options.id === undefined) { - options.id = sm2.setupOptions.idPrefix + (idCounter++); - } - if (idCheck(options.id, true)) { - return sm2.sounds[options.id]; - } - function make() { - options = loopFix(options); - sm2.sounds[options.id] = new SMSound(options); - sm2.soundIDs.push(options.id); - return sm2.sounds[options.id]; - } - if (html5OK(options)) { - oSound = make(); - oSound._setup_html5(options); - } else { - if (sm2.html5Only) { - return make(); - } - if (sm2.html5.usingFlash && options.url && options.url.match(/data\:/i)) { - return make(); - } - if (fV > 8) { - if (options.isMovieStar === null) { - options.isMovieStar = !!(options.serverURL || (options.type ? options.type.match(netStreamMimeTypes) : false) || (options.url && options.url.match(netStreamPattern))); - } - } - options = policyFix(options, cs); - oSound = make(); - if (fV === 8) { - flash._createSound(options.id, options.loops||1, options.usePolicyFile); - } else { - flash._createSound(options.id, options.url, options.usePeakData, options.useWaveformData, options.useEQData, options.isMovieStar, (options.isMovieStar?options.bufferTime:false), options.loops||1, options.serverURL, options.duration||null, options.autoPlay, true, options.autoLoad, options.usePolicyFile); - if (!options.serverURL) { - oSound.connected = true; - if (options.onconnect) { - options.onconnect.apply(oSound); - } - } - } - if (!options.serverURL && (options.autoLoad || options.autoPlay)) { - oSound.load(options); - } - } - if (!options.serverURL && options.autoPlay) { - oSound.play(); - } - return oSound; - }; - this.destroySound = function(sID, _bFromSound) { - if (!idCheck(sID)) { - return false; - } - var oS = sm2.sounds[sID], i; - oS._iO = {}; - oS.stop(); - oS.unload(); - for (i = 0; i < sm2.soundIDs.length; i++) { - if (sm2.soundIDs[i] === sID) { - sm2.soundIDs.splice(i, 1); - break; - } - } - if (!_bFromSound) { - oS.destruct(true); - } - oS = null; - delete sm2.sounds[sID]; - return true; - }; - this.load = function(sID, oOptions) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].load(oOptions); - }; - this.unload = function(sID) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].unload(); - }; - this.onPosition = function(sID, nPosition, oMethod, oScope) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].onposition(nPosition, oMethod, oScope); - }; - this.onposition = this.onPosition; - this.clearOnPosition = function(sID, nPosition, oMethod) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].clearOnPosition(nPosition, oMethod); - }; - this.play = function(sID, oOptions) { - var result = null, - overloaded = (oOptions && !(oOptions instanceof Object)); - if (!didInit || !sm2.ok()) { - return false; - } - if (!idCheck(sID, overloaded)) { - if (!overloaded) { - return false; - } - if (overloaded) { - oOptions = { - url: oOptions - }; - } - if (oOptions && oOptions.url) { - oOptions.id = sID; - result = sm2.createSound(oOptions).play(); - } - } else if (overloaded) { - oOptions = { - url: oOptions - }; - } - if (result === null) { - result = sm2.sounds[sID].play(oOptions); - } - return result; - }; - this.start = this.play; - this.setPosition = function(sID, nMsecOffset) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].setPosition(nMsecOffset); - }; - this.stop = function(sID) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].stop(); - }; - this.stopAll = function() { - var oSound; - for (oSound in sm2.sounds) { - if (sm2.sounds.hasOwnProperty(oSound)) { - sm2.sounds[oSound].stop(); - } - } - }; - this.pause = function(sID) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].pause(); - }; - this.pauseAll = function() { - var i; - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - sm2.sounds[sm2.soundIDs[i]].pause(); - } - }; - this.resume = function(sID) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].resume(); - }; - this.resumeAll = function() { - var i; - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - sm2.sounds[sm2.soundIDs[i]].resume(); - } - }; - this.togglePause = function(sID) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].togglePause(); - }; - this.setPan = function(sID, nPan) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].setPan(nPan); - }; - this.setVolume = function(sID, nVol) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].setVolume(nVol); - }; - this.mute = function(sID) { - var i = 0; - if (sID instanceof String) { - sID = null; - } - if (!sID) { - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - sm2.sounds[sm2.soundIDs[i]].mute(); - } - sm2.muted = true; - } else { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].mute(); - } - return true; - }; - this.muteAll = function() { - sm2.mute(); - }; - this.unmute = function(sID) { - var i; - if (sID instanceof String) { - sID = null; - } - if (!sID) { - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - sm2.sounds[sm2.soundIDs[i]].unmute(); - } - sm2.muted = false; - } else { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].unmute(); - } - return true; - }; - this.unmuteAll = function() { - sm2.unmute(); - }; - this.toggleMute = function(sID) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].toggleMute(); - }; - this.getMemoryUse = function() { - var ram = 0; - if (flash && fV !== 8) { - ram = parseInt(flash._getMemoryUse(), 10); - } - return ram; - }; - this.disable = function(bNoDisable) { - var i; - if (bNoDisable === _undefined) { - bNoDisable = false; - } - if (disabled) { - return false; - } - disabled = true; - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - disableObject(sm2.sounds[sm2.soundIDs[i]]); - } - initComplete(bNoDisable); - event.remove(window, 'load', initUserOnload); - return true; - }; - this.canPlayMIME = function(sMIME) { - var result; - if (sm2.hasHTML5) { - result = html5CanPlay({type:sMIME}); - } - if (!result && needsFlash) { - result = (sMIME && sm2.ok() ? !!((fV > 8 ? sMIME.match(netStreamMimeTypes) : null) || sMIME.match(sm2.mimePattern)) : null); - } - return result; - }; - this.canPlayURL = function(sURL) { - var result; - if (sm2.hasHTML5) { - result = html5CanPlay({url: sURL}); - } - if (!result && needsFlash) { - result = (sURL && sm2.ok() ? !!(sURL.match(sm2.filePattern)) : null); - } - return result; - }; - this.canPlayLink = function(oLink) { - if (oLink.type !== _undefined && oLink.type) { - if (sm2.canPlayMIME(oLink.type)) { - return true; - } - } - return sm2.canPlayURL(oLink.href); - }; - this.getSoundById = function(sID, _suppressDebug) { - if (!sID) { - return null; - } - var result = sm2.sounds[sID]; - return result; - }; - this.onready = function(oMethod, oScope) { - var sType = 'onready', - result = false; - if (typeof oMethod === 'function') { - if (!oScope) { - oScope = window; - } - addOnEvent(sType, oMethod, oScope); - processOnEvents(); - result = true; - } else { - throw str('needFunction', sType); - } - return result; - }; - this.ontimeout = function(oMethod, oScope) { - var sType = 'ontimeout', - result = false; - if (typeof oMethod === 'function') { - if (!oScope) { - oScope = window; - } - addOnEvent(sType, oMethod, oScope); - processOnEvents({type:sType}); - result = true; - } else { - throw str('needFunction', sType); - } - return result; - }; - this._writeDebug = function(sText, sTypeOrObject) { - return true; - }; - this._wD = this._writeDebug; - this._debug = function() { - }; - this.reboot = function(resetEvents, excludeInit) { - var i, j, k; - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - sm2.sounds[sm2.soundIDs[i]].destruct(); - } - if (flash) { - try { - if (isIE) { - oRemovedHTML = flash.innerHTML; - } - oRemoved = flash.parentNode.removeChild(flash); - } catch(e) { - } - } - oRemovedHTML = oRemoved = needsFlash = flash = null; - sm2.enabled = didDCLoaded = didInit = waitingForEI = initPending = didAppend = appendSuccess = disabled = useGlobalHTML5Audio = sm2.swfLoaded = false; - sm2.soundIDs = []; - sm2.sounds = {}; - idCounter = 0; - if (!resetEvents) { - for (i in on_queue) { - if (on_queue.hasOwnProperty(i)) { - for (j = 0, k = on_queue[i].length; j < k; j++) { - on_queue[i][j].fired = false; - } - } - } - } else { - on_queue = []; - } - sm2.html5 = { - 'usingFlash': null - }; - sm2.flash = {}; - sm2.html5Only = false; - sm2.ignoreFlash = false; - window.setTimeout(function() { - preInit(); - if (!excludeInit) { - sm2.beginDelayedInit(); - } - }, 20); - return sm2; - }; - this.reset = function() { - return sm2.reboot(true, true); - }; - this.getMoviePercent = function() { - return (flash && 'PercentLoaded' in flash ? flash.PercentLoaded() : null); - }; - this.beginDelayedInit = function() { - windowLoaded = true; - domContentLoaded(); - setTimeout(function() { - if (initPending) { - return false; - } - createMovie(); - initMovie(); - initPending = true; - return true; - }, 20); - delayWaitForEI(); - }; - this.destruct = function() { - sm2.disable(true); - }; - SMSound = function(oOptions) { - var s = this, resetProperties, add_html5_events, remove_html5_events, stop_html5_timer, start_html5_timer, attachOnPosition, onplay_called = false, onPositionItems = [], onPositionFired = 0, detachOnPosition, applyFromTo, lastURL = null, lastHTML5State, urlOmitted; - lastHTML5State = { - duration: null, - time: null - }; - this.id = oOptions.id; - this.sID = this.id; - this.url = oOptions.url; - this.options = mixin(oOptions); - this.instanceOptions = this.options; - this._iO = this.instanceOptions; - this.pan = this.options.pan; - this.volume = this.options.volume; - this.isHTML5 = false; - this._a = null; - urlOmitted = (this.url ? false : true); - this.id3 = {}; - this._debug = function() { - }; - this.load = function(oOptions) { - var oSound = null, instanceOptions; - if (oOptions !== _undefined) { - s._iO = mixin(oOptions, s.options); - } else { - oOptions = s.options; - s._iO = oOptions; - if (lastURL && lastURL !== s.url) { - s._iO.url = s.url; - s.url = null; - } - } - if (!s._iO.url) { - s._iO.url = s.url; - } - s._iO.url = parseURL(s._iO.url); - s.instanceOptions = s._iO; - instanceOptions = s._iO; - if (!instanceOptions.url && !s.url) { - return s; - } - if (instanceOptions.url === s.url && s.readyState !== 0 && s.readyState !== 2) { - if (s.readyState === 3 && instanceOptions.onload) { - wrapCallback(s, function() { - instanceOptions.onload.apply(s, [(!!s.duration)]); - }); - } - return s; - } - s.loaded = false; - s.readyState = 1; - s.playState = 0; - s.id3 = {}; - if (html5OK(instanceOptions)) { - oSound = s._setup_html5(instanceOptions); - if (!oSound._called_load) { - s._html5_canplay = false; - if (s.url !== instanceOptions.url) { - s._a.src = instanceOptions.url; - s.setPosition(0); - } - s._a.autobuffer = 'auto'; - s._a.preload = 'auto'; - s._a._called_load = true; - } else { - } - } else { - if (sm2.html5Only) { - return s; - } - if (s._iO.url && s._iO.url.match(/data\:/i)) { - return s; - } - try { - s.isHTML5 = false; - s._iO = policyFix(loopFix(instanceOptions)); - instanceOptions = s._iO; - if (fV === 8) { - flash._load(s.id, instanceOptions.url, instanceOptions.stream, instanceOptions.autoPlay, instanceOptions.usePolicyFile); - } else { - flash._load(s.id, instanceOptions.url, !!(instanceOptions.stream), !!(instanceOptions.autoPlay), instanceOptions.loops||1, !!(instanceOptions.autoLoad), instanceOptions.usePolicyFile); - } - } catch(e) { - catchError({type:'SMSOUND_LOAD_JS_EXCEPTION', fatal:true}); - } - } - s.url = instanceOptions.url; - return s; - }; - this.unload = function() { - if (s.readyState !== 0) { - if (!s.isHTML5) { - if (fV === 8) { - flash._unload(s.id, emptyURL); - } else { - flash._unload(s.id); - } - } else { - stop_html5_timer(); - if (s._a) { - s._a.pause(); - lastURL = html5Unload(s._a); - } - } - resetProperties(); - } - return s; - }; - this.destruct = function(_bFromSM) { - if (!s.isHTML5) { - s._iO.onfailure = null; - flash._destroySound(s.id); - } else { - stop_html5_timer(); - if (s._a) { - s._a.pause(); - html5Unload(s._a); - if (!useGlobalHTML5Audio) { - remove_html5_events(); - } - s._a._s = null; - s._a = null; - } - } - if (!_bFromSM) { - sm2.destroySound(s.id, true); - } - }; - this.play = function(oOptions, _updatePlayState) { - var fN, allowMulti, a, onready, - audioClone, onended, oncanplay, - startOK = true, - exit = null; - _updatePlayState = (_updatePlayState === _undefined ? true : _updatePlayState); - if (!oOptions) { - oOptions = {}; - } - if (s.url) { - s._iO.url = s.url; - } - s._iO = mixin(s._iO, s.options); - s._iO = mixin(oOptions, s._iO); - s._iO.url = parseURL(s._iO.url); - s.instanceOptions = s._iO; - if (!s.isHTML5 && s._iO.serverURL && !s.connected) { - if (!s.getAutoPlay()) { - s.setAutoPlay(true); - } - return s; - } - if (html5OK(s._iO)) { - s._setup_html5(s._iO); - start_html5_timer(); - } - if (s.playState === 1 && !s.paused) { - allowMulti = s._iO.multiShot; - if (!allowMulti) { - if (s.isHTML5) { - s.setPosition(s._iO.position); - } - exit = s; - } else { - } - } - if (exit !== null) { - return exit; - } - if (oOptions.url && oOptions.url !== s.url) { - if (!s.readyState && !s.isHTML5 && fV === 8 && urlOmitted) { - urlOmitted = false; - } else { - s.load(s._iO); - } - } - if (!s.loaded) { - if (s.readyState === 0) { - if (!s.isHTML5 && !sm2.html5Only) { - s._iO.autoPlay = true; - s.load(s._iO); - } else if (s.isHTML5) { - s.load(s._iO); - } else { - exit = s; - } - s.instanceOptions = s._iO; - } else if (s.readyState === 2) { - exit = s; - } else { - } - } else { - } - if (exit !== null) { - return exit; - } - if (!s.isHTML5 && fV === 9 && s.position > 0 && s.position === s.duration) { - oOptions.position = 0; - } - if (s.paused && s.position >= 0 && (!s._iO.serverURL || s.position > 0)) { - s.resume(); - } else { - s._iO = mixin(oOptions, s._iO); - if (s._iO.from !== null && s._iO.to !== null && s.instanceCount === 0 && s.playState === 0 && !s._iO.serverURL) { - onready = function() { - s._iO = mixin(oOptions, s._iO); - s.play(s._iO); - }; - if (s.isHTML5 && !s._html5_canplay) { - s.load({ - _oncanplay: onready - }); - exit = false; - } else if (!s.isHTML5 && !s.loaded && (!s.readyState || s.readyState !== 2)) { - s.load({ - onload: onready - }); - exit = false; - } - if (exit !== null) { - return exit; - } - s._iO = applyFromTo(); - } - if (!s.instanceCount || s._iO.multiShotEvents || (s.isHTML5 && s._iO.multiShot && !useGlobalHTML5Audio) || (!s.isHTML5 && fV > 8 && !s.getAutoPlay())) { - s.instanceCount++; - } - if (s._iO.onposition && s.playState === 0) { - attachOnPosition(s); - } - s.playState = 1; - s.paused = false; - s.position = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position : 0); - if (!s.isHTML5) { - s._iO = policyFix(loopFix(s._iO)); - } - if (s._iO.onplay && _updatePlayState) { - s._iO.onplay.apply(s); - onplay_called = true; - } - s.setVolume(s._iO.volume, true); - s.setPan(s._iO.pan, true); - if (!s.isHTML5) { - startOK = flash._start(s.id, s._iO.loops || 1, (fV === 9 ? s.position : s.position / msecScale), s._iO.multiShot || false); - if (fV === 9 && !startOK) { - if (s._iO.onplayerror) { - s._iO.onplayerror.apply(s); - } - } - } else { - if (s.instanceCount < 2) { - start_html5_timer(); - a = s._setup_html5(); - s.setPosition(s._iO.position); - a.play(); - } else { - audioClone = new Audio(s._iO.url); - onended = function() { - event.remove(audioClone, 'ended', onended); - s._onfinish(s); - html5Unload(audioClone); - audioClone = null; - }; - oncanplay = function() { - event.remove(audioClone, 'canplay', oncanplay); - try { - audioClone.currentTime = s._iO.position/msecScale; - } catch(err) { - } - audioClone.play(); - }; - event.add(audioClone, 'ended', onended); - if (s._iO.volume !== undefined) { - audioClone.volume = Math.max(0, Math.min(1, s._iO.volume/100)); - } - if (s.muted) { - audioClone.muted = true; - } - if (s._iO.position) { - event.add(audioClone, 'canplay', oncanplay); - } else { - audioClone.play(); - } - } - } - } - return s; - }; - this.start = this.play; - this.stop = function(bAll) { - var instanceOptions = s._iO, - originalPosition; - if (s.playState === 1) { - s._onbufferchange(0); - s._resetOnPosition(0); - s.paused = false; - if (!s.isHTML5) { - s.playState = 0; - } - detachOnPosition(); - if (instanceOptions.to) { - s.clearOnPosition(instanceOptions.to); - } - if (!s.isHTML5) { - flash._stop(s.id, bAll); - if (instanceOptions.serverURL) { - s.unload(); - } - } else { - if (s._a) { - originalPosition = s.position; - s.setPosition(0); - s.position = originalPosition; - s._a.pause(); - s.playState = 0; - s._onTimer(); - stop_html5_timer(); - } - } - s.instanceCount = 0; - s._iO = {}; - if (instanceOptions.onstop) { - instanceOptions.onstop.apply(s); - } - } - return s; - }; - this.setAutoPlay = function(autoPlay) { - s._iO.autoPlay = autoPlay; - if (!s.isHTML5) { - flash._setAutoPlay(s.id, autoPlay); - if (autoPlay) { - if (!s.instanceCount && s.readyState === 1) { - s.instanceCount++; - } - } - } - }; - this.getAutoPlay = function() { - return s._iO.autoPlay; - }; - this.setPosition = function(nMsecOffset) { - if (nMsecOffset === _undefined) { - nMsecOffset = 0; - } - var position, position1K, - offset = (s.isHTML5 ? Math.max(nMsecOffset, 0) : Math.min(s.duration || s._iO.duration, Math.max(nMsecOffset, 0))); - s.position = offset; - position1K = s.position/msecScale; - s._resetOnPosition(s.position); - s._iO.position = offset; - if (!s.isHTML5) { - position = (fV === 9 ? s.position : position1K); - if (s.readyState && s.readyState !== 2) { - flash._setPosition(s.id, position, (s.paused || !s.playState), s._iO.multiShot); - } - } else if (s._a) { - if (s._html5_canplay) { - if (s._a.currentTime !== position1K) { - try { - s._a.currentTime = position1K; - if (s.playState === 0 || s.paused) { - s._a.pause(); - } - } catch(e) { - } - } - } else if (position1K) { - return s; - } - if (s.paused) { - s._onTimer(true); - } - } - return s; - }; - this.pause = function(_bCallFlash) { - if (s.paused || (s.playState === 0 && s.readyState !== 1)) { - return s; - } - s.paused = true; - if (!s.isHTML5) { - if (_bCallFlash || _bCallFlash === _undefined) { - flash._pause(s.id, s._iO.multiShot); - } - } else { - s._setup_html5().pause(); - stop_html5_timer(); - } - if (s._iO.onpause) { - s._iO.onpause.apply(s); - } - return s; - }; - this.resume = function() { - var instanceOptions = s._iO; - if (!s.paused) { - return s; - } - s.paused = false; - s.playState = 1; - if (!s.isHTML5) { - if (instanceOptions.isMovieStar && !instanceOptions.serverURL) { - s.setPosition(s.position); - } - flash._pause(s.id, instanceOptions.multiShot); - } else { - s._setup_html5().play(); - start_html5_timer(); - } - if (!onplay_called && instanceOptions.onplay) { - instanceOptions.onplay.apply(s); - onplay_called = true; - } else if (instanceOptions.onresume) { - instanceOptions.onresume.apply(s); - } - return s; - }; - this.togglePause = function() { - if (s.playState === 0) { - s.play({ - position: (fV === 9 && !s.isHTML5 ? s.position : s.position / msecScale) - }); - return s; - } - if (s.paused) { - s.resume(); - } else { - s.pause(); - } - return s; - }; - this.setPan = function(nPan, bInstanceOnly) { - if (nPan === _undefined) { - nPan = 0; - } - if (bInstanceOnly === _undefined) { - bInstanceOnly = false; - } - if (!s.isHTML5) { - flash._setPan(s.id, nPan); - } - s._iO.pan = nPan; - if (!bInstanceOnly) { - s.pan = nPan; - s.options.pan = nPan; - } - return s; - }; - this.setVolume = function(nVol, _bInstanceOnly) { - if (nVol === _undefined) { - nVol = 100; - } - if (_bInstanceOnly === _undefined) { - _bInstanceOnly = false; - } - if (!s.isHTML5) { - flash._setVolume(s.id, (sm2.muted && !s.muted) || s.muted?0:nVol); - } else if (s._a) { - if (sm2.muted && !s.muted) { - s.muted = true; - s._a.muted = true; - } - s._a.volume = Math.max(0, Math.min(1, nVol/100)); - } - s._iO.volume = nVol; - if (!_bInstanceOnly) { - s.volume = nVol; - s.options.volume = nVol; - } - return s; - }; - this.mute = function() { - s.muted = true; - if (!s.isHTML5) { - flash._setVolume(s.id, 0); - } else if (s._a) { - s._a.muted = true; - } - return s; - }; - this.unmute = function() { - s.muted = false; - var hasIO = (s._iO.volume !== _undefined); - if (!s.isHTML5) { - flash._setVolume(s.id, hasIO?s._iO.volume:s.options.volume); - } else if (s._a) { - s._a.muted = false; - } - return s; - }; - this.toggleMute = function() { - return (s.muted?s.unmute():s.mute()); - }; - this.onPosition = function(nPosition, oMethod, oScope) { - onPositionItems.push({ - position: parseInt(nPosition, 10), - method: oMethod, - scope: (oScope !== _undefined ? oScope : s), - fired: false - }); - return s; - }; - this.onposition = this.onPosition; - this.clearOnPosition = function(nPosition, oMethod) { - var i; - nPosition = parseInt(nPosition, 10); - if (isNaN(nPosition)) { - return false; - } - for (i=0; i < onPositionItems.length; i++) { - if (nPosition === onPositionItems[i].position) { - if (!oMethod || (oMethod === onPositionItems[i].method)) { - if (onPositionItems[i].fired) { - onPositionFired--; - } - onPositionItems.splice(i, 1); - } - } - } - }; - this._processOnPosition = function() { - var i, item, j = onPositionItems.length; - if (!j || !s.playState || onPositionFired >= j) { - return false; - } - for (i=j-1; i >= 0; i--) { - item = onPositionItems[i]; - if (!item.fired && s.position >= item.position) { - item.fired = true; - onPositionFired++; - item.method.apply(item.scope, [item.position]); - j = onPositionItems.length; - } - } - return true; - }; - this._resetOnPosition = function(nPosition) { - var i, item, j = onPositionItems.length; - if (!j) { - return false; - } - for (i=j-1; i >= 0; i--) { - item = onPositionItems[i]; - if (item.fired && nPosition <= item.position) { - item.fired = false; - onPositionFired--; - } - } - return true; - }; - applyFromTo = function() { - var instanceOptions = s._iO, - f = instanceOptions.from, - t = instanceOptions.to, - start, end; - end = function() { - s.clearOnPosition(t, end); - s.stop(); - }; - start = function() { - if (t !== null && !isNaN(t)) { - s.onPosition(t, end); - } - }; - if (f !== null && !isNaN(f)) { - instanceOptions.position = f; - instanceOptions.multiShot = false; - start(); - } - return instanceOptions; - }; - attachOnPosition = function() { - var item, - op = s._iO.onposition; - if (op) { - for (item in op) { - if (op.hasOwnProperty(item)) { - s.onPosition(parseInt(item, 10), op[item]); - } - } - } - }; - detachOnPosition = function() { - var item, - op = s._iO.onposition; - if (op) { - for (item in op) { - if (op.hasOwnProperty(item)) { - s.clearOnPosition(parseInt(item, 10)); - } - } - } - }; - start_html5_timer = function() { - if (s.isHTML5) { - startTimer(s); - } - }; - stop_html5_timer = function() { - if (s.isHTML5) { - stopTimer(s); - } - }; - resetProperties = function(retainPosition) { - if (!retainPosition) { - onPositionItems = []; - onPositionFired = 0; - } - onplay_called = false; - s._hasTimer = null; - s._a = null; - s._html5_canplay = false; - s.bytesLoaded = null; - s.bytesTotal = null; - s.duration = (s._iO && s._iO.duration ? s._iO.duration : null); - s.durationEstimate = null; - s.buffered = []; - s.eqData = []; - s.eqData.left = []; - s.eqData.right = []; - s.failures = 0; - s.isBuffering = false; - s.instanceOptions = {}; - s.instanceCount = 0; - s.loaded = false; - s.metadata = {}; - s.readyState = 0; - s.muted = false; - s.paused = false; - s.peakData = { - left: 0, - right: 0 - }; - s.waveformData = { - left: [], - right: [] - }; - s.playState = 0; - s.position = null; - s.id3 = {}; - }; - resetProperties(); - this._onTimer = function(bForce) { - var duration, isNew = false, time, x = {}; - if (s._hasTimer || bForce) { - if (s._a && (bForce || ((s.playState > 0 || s.readyState === 1) && !s.paused))) { - duration = s._get_html5_duration(); - if (duration !== lastHTML5State.duration) { - lastHTML5State.duration = duration; - s.duration = duration; - isNew = true; - } - s.durationEstimate = s.duration; - time = (s._a.currentTime * msecScale || 0); - if (time !== lastHTML5State.time) { - lastHTML5State.time = time; - isNew = true; - } - if (isNew || bForce) { - s._whileplaying(time,x,x,x,x); - } - } - return isNew; - } - }; - this._get_html5_duration = function() { - var instanceOptions = s._iO, - d = (s._a && s._a.duration ? s._a.duration*msecScale : (instanceOptions && instanceOptions.duration ? instanceOptions.duration : null)), - result = (d && !isNaN(d) && d !== Infinity ? d : null); - return result; - }; - this._apply_loop = function(a, nLoops) { - a.loop = (nLoops > 1 ? 'loop' : ''); - }; - this._setup_html5 = function(oOptions) { - var instanceOptions = mixin(s._iO, oOptions), - a = useGlobalHTML5Audio ? globalHTML5Audio : s._a, - dURL = decodeURI(instanceOptions.url), - sameURL; - if (useGlobalHTML5Audio) { - if (dURL === decodeURI(lastGlobalHTML5URL)) { - sameURL = true; - } - } else if (dURL === decodeURI(lastURL)) { - sameURL = true; - } - if (a) { - if (a._s) { - if (useGlobalHTML5Audio) { - if (a._s && a._s.playState && !sameURL) { - a._s.stop(); - } - } else if (!useGlobalHTML5Audio && dURL === decodeURI(lastURL)) { - s._apply_loop(a, instanceOptions.loops); - return a; - } - } - if (!sameURL) { - if (lastURL) { - resetProperties(false); - } - a.src = instanceOptions.url; - s.url = instanceOptions.url; - lastURL = instanceOptions.url; - lastGlobalHTML5URL = instanceOptions.url; - a._called_load = false; - } - } else { - if (instanceOptions.autoLoad || instanceOptions.autoPlay) { - s._a = new Audio(instanceOptions.url); - s._a.load(); - } else { - s._a = (isOpera && opera.version() < 10 ? new Audio(null) : new Audio()); - } - a = s._a; - a._called_load = false; - if (useGlobalHTML5Audio) { - globalHTML5Audio = a; - } - } - s.isHTML5 = true; - s._a = a; - a._s = s; - add_html5_events(); - s._apply_loop(a, instanceOptions.loops); - if (instanceOptions.autoLoad || instanceOptions.autoPlay) { - s.load(); - } else { - a.autobuffer = false; - a.preload = 'auto'; - } - return a; - }; - add_html5_events = function() { - if (s._a._added_events) { - return false; - } - var f; - function add(oEvt, oFn, bCapture) { - return s._a ? s._a.addEventListener(oEvt, oFn, bCapture||false) : null; - } - s._a._added_events = true; - for (f in html5_events) { - if (html5_events.hasOwnProperty(f)) { - add(f, html5_events[f]); - } - } - return true; - }; - remove_html5_events = function() { - var f; - function remove(oEvt, oFn, bCapture) { - return (s._a ? s._a.removeEventListener(oEvt, oFn, bCapture||false) : null); - } - s._a._added_events = false; - for (f in html5_events) { - if (html5_events.hasOwnProperty(f)) { - remove(f, html5_events[f]); - } - } - }; - this._onload = function(nSuccess) { - var fN, - loadOK = !!nSuccess || (!s.isHTML5 && fV === 8 && s.duration); - s.loaded = loadOK; - s.readyState = loadOK?3:2; - s._onbufferchange(0); - if (s._iO.onload) { - wrapCallback(s, function() { - s._iO.onload.apply(s, [loadOK]); - }); - } - return true; - }; - this._onbufferchange = function(nIsBuffering) { - if (s.playState === 0) { - return false; - } - if ((nIsBuffering && s.isBuffering) || (!nIsBuffering && !s.isBuffering)) { - return false; - } - s.isBuffering = (nIsBuffering === 1); - if (s._iO.onbufferchange) { - s._iO.onbufferchange.apply(s); - } - return true; - }; - this._onsuspend = function() { - if (s._iO.onsuspend) { - s._iO.onsuspend.apply(s); - } - return true; - }; - this._onfailure = function(msg, level, code) { - s.failures++; - if (s._iO.onfailure && s.failures === 1) { - s._iO.onfailure(s, msg, level, code); - } else { - } - }; - this._onfinish = function() { - var io_onfinish = s._iO.onfinish; - s._onbufferchange(0); - s._resetOnPosition(0); - if (s.instanceCount) { - s.instanceCount--; - if (!s.instanceCount) { - detachOnPosition(); - s.playState = 0; - s.paused = false; - s.instanceCount = 0; - s.instanceOptions = {}; - s._iO = {}; - stop_html5_timer(); - if (s.isHTML5) { - s.position = 0; - } - } - if (!s.instanceCount || s._iO.multiShotEvents) { - if (io_onfinish) { - wrapCallback(s, function() { - io_onfinish.apply(s); - }); - } - } - } - }; - this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) { - var instanceOptions = s._iO; - s.bytesLoaded = nBytesLoaded; - s.bytesTotal = nBytesTotal; - s.duration = Math.floor(nDuration); - s.bufferLength = nBufferLength; - if (!s.isHTML5 && !instanceOptions.isMovieStar) { - if (instanceOptions.duration) { - s.durationEstimate = (s.duration > instanceOptions.duration) ? s.duration : instanceOptions.duration; - } else { - s.durationEstimate = parseInt((s.bytesTotal / s.bytesLoaded) * s.duration, 10); - } - } else { - s.durationEstimate = s.duration; - } - if (!s.isHTML5) { - s.buffered = [{ - 'start': 0, - 'end': s.duration - }]; - } - if ((s.readyState !== 3 || s.isHTML5) && instanceOptions.whileloading) { - instanceOptions.whileloading.apply(s); - } - }; - this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) { - var instanceOptions = s._iO, - eqLeft; - if (isNaN(nPosition) || nPosition === null) { - return false; - } - s.position = Math.max(0, nPosition); - s._processOnPosition(); - if (!s.isHTML5 && fV > 8) { - if (instanceOptions.usePeakData && oPeakData !== _undefined && oPeakData) { - s.peakData = { - left: oPeakData.leftPeak, - right: oPeakData.rightPeak - }; - } - if (instanceOptions.useWaveformData && oWaveformDataLeft !== _undefined && oWaveformDataLeft) { - s.waveformData = { - left: oWaveformDataLeft.split(','), - right: oWaveformDataRight.split(',') - }; - } - if (instanceOptions.useEQData) { - if (oEQData !== _undefined && oEQData && oEQData.leftEQ) { - eqLeft = oEQData.leftEQ.split(','); - s.eqData = eqLeft; - s.eqData.left = eqLeft; - if (oEQData.rightEQ !== _undefined && oEQData.rightEQ) { - s.eqData.right = oEQData.rightEQ.split(','); - } - } - } - } - if (s.playState === 1) { - if (!s.isHTML5 && fV === 8 && !s.position && s.isBuffering) { - s._onbufferchange(0); - } - if (instanceOptions.whileplaying) { - instanceOptions.whileplaying.apply(s); - } - } - return true; - }; - this._oncaptiondata = function(oData) { - s.captiondata = oData; - if (s._iO.oncaptiondata) { - s._iO.oncaptiondata.apply(s, [oData]); - } - }; - this._onmetadata = function(oMDProps, oMDData) { - var oData = {}, i, j; - for (i = 0, j = oMDProps.length; i < j; i++) { - oData[oMDProps[i]] = oMDData[i]; - } - s.metadata = oData; - if (s._iO.onmetadata) { - s._iO.onmetadata.apply(s); - } - }; - this._onid3 = function(oID3Props, oID3Data) { - var oData = [], i, j; - for (i = 0, j = oID3Props.length; i < j; i++) { - oData[oID3Props[i]] = oID3Data[i]; - } - s.id3 = mixin(s.id3, oData); - if (s._iO.onid3) { - s._iO.onid3.apply(s); - } - }; - this._onconnect = function(bSuccess) { - bSuccess = (bSuccess === 1); - s.connected = bSuccess; - if (bSuccess) { - s.failures = 0; - if (idCheck(s.id)) { - if (s.getAutoPlay()) { - s.play(_undefined, s.getAutoPlay()); - } else if (s._iO.autoLoad) { - s.load(); - } - } - if (s._iO.onconnect) { - s._iO.onconnect.apply(s, [bSuccess]); - } - } - }; - this._ondataerror = function(sError) { - if (s.playState > 0) { - if (s._iO.ondataerror) { - s._iO.ondataerror.apply(s); - } - } - }; - }; - getDocument = function() { - return (doc.body || doc.getElementsByTagName('div')[0]); - }; - id = function(sID) { - return doc.getElementById(sID); - }; - mixin = function(oMain, oAdd) { - var o1 = (oMain || {}), o2, o; - o2 = (oAdd === _undefined ? sm2.defaultOptions : oAdd); - for (o in o2) { - if (o2.hasOwnProperty(o) && o1[o] === _undefined) { - if (typeof o2[o] !== 'object' || o2[o] === null) { - o1[o] = o2[o]; - } else { - o1[o] = mixin(o1[o], o2[o]); - } - } - } - return o1; - }; - wrapCallback = function(oSound, callback) { - if (!oSound.isHTML5 && fV === 8) { - window.setTimeout(callback, 0); - } else { - callback(); - } - }; - extraOptions = { - 'onready': 1, - 'ontimeout': 1, - 'defaultOptions': 1, - 'flash9Options': 1, - 'movieStarOptions': 1 - }; - assign = function(o, oParent) { - var i, - result = true, - hasParent = (oParent !== _undefined), - setupOptions = sm2.setupOptions, - bonusOptions = extraOptions; - for (i in o) { - if (o.hasOwnProperty(i)) { - if (typeof o[i] !== 'object' || o[i] === null || o[i] instanceof Array || o[i] instanceof RegExp) { - if (hasParent && bonusOptions[oParent] !== _undefined) { - sm2[oParent][i] = o[i]; - } else if (setupOptions[i] !== _undefined) { - sm2.setupOptions[i] = o[i]; - sm2[i] = o[i]; - } else if (bonusOptions[i] === _undefined) { - result = false; - } else { - if (sm2[i] instanceof Function) { - sm2[i].apply(sm2, (o[i] instanceof Array? o[i] : [o[i]])); - } else { - sm2[i] = o[i]; - } - } - } else { - if (bonusOptions[i] === _undefined) { - result = false; - } else { - return assign(o[i], i); - } - } - } - } - return result; - }; - function preferFlashCheck(kind) { - return (sm2.preferFlash && hasFlash && !sm2.ignoreFlash && (sm2.flash[kind] !== _undefined && sm2.flash[kind])); - } - event = (function() { - var old = (window.attachEvent), - evt = { - add: (old?'attachEvent':'addEventListener'), - remove: (old?'detachEvent':'removeEventListener') - }; - function getArgs(oArgs) { - var args = slice.call(oArgs), - len = args.length; - if (old) { - args[1] = 'on' + args[1]; - if (len > 3) { - args.pop(); - } - } else if (len === 3) { - args.push(false); - } - return args; - } - function apply(args, sType) { - var element = args.shift(), - method = [evt[sType]]; - if (old) { - element[method](args[0], args[1]); - } else { - element[method].apply(element, args); - } - } - function add() { - apply(getArgs(arguments), 'add'); - } - function remove() { - apply(getArgs(arguments), 'remove'); - } - return { - 'add': add, - 'remove': remove - }; - }()); - function html5_event(oFn) { - return function(e) { - var s = this._s, - result; - if (!s || !s._a) { - result = null; - } else { - result = oFn.call(this, e); - } - return result; - }; - } - html5_events = { - abort: html5_event(function() { - }), - canplay: html5_event(function() { - var s = this._s, - position1K; - if (s._html5_canplay) { - return true; - } - s._html5_canplay = true; - s._onbufferchange(0); - position1K = (s._iO.position !== _undefined && !isNaN(s._iO.position)?s._iO.position/msecScale:null); - if (s.position && this.currentTime !== position1K) { - try { - this.currentTime = position1K; - } catch(ee) { - } - } - if (s._iO._oncanplay) { - s._iO._oncanplay(); - } - }), - canplaythrough: html5_event(function() { - var s = this._s; - if (!s.loaded) { - s._onbufferchange(0); - s._whileloading(s.bytesLoaded, s.bytesTotal, s._get_html5_duration()); - s._onload(true); - } - }), - ended: html5_event(function() { - var s = this._s; - s._onfinish(); - }), - error: html5_event(function() { - this._s._onload(false); - }), - loadeddata: html5_event(function() { - var s = this._s; - if (!s._loaded && !isSafari) { - s.duration = s._get_html5_duration(); - } - }), - loadedmetadata: html5_event(function() { - }), - loadstart: html5_event(function() { - this._s._onbufferchange(1); - }), - play: html5_event(function() { - this._s._onbufferchange(0); - }), - playing: html5_event(function() { - this._s._onbufferchange(0); - }), - progress: html5_event(function(e) { - var s = this._s, - i, j, progStr, buffered = 0, - isProgress = (e.type === 'progress'), - ranges = e.target.buffered, - loaded = (e.loaded||0), - total = (e.total||1); - s.buffered = []; - if (ranges && ranges.length) { - for (i=0, j=ranges.length; i= 0; i--) { - support['audio/'+aF[item].related[i]] = support[item]; - sm2.html5[aF[item].related[i]] = support[item]; - sm2.flash[aF[item].related[i]] = support[item]; - } - } - } - } - support.canPlayType = (a?cp:null); - sm2.html5 = mixin(sm2.html5, support); - sm2.html5.usingFlash = featureCheck(); - needsFlash = sm2.html5.usingFlash; - return true; - }; - strings = { - }; - str = function() { - }; - loopFix = function(sOpt) { - if (fV === 8 && sOpt.loops > 1 && sOpt.stream) { - sOpt.stream = false; - } - return sOpt; - }; - policyFix = function(sOpt, sPre) { - if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) { - sOpt.usePolicyFile = true; - } - return sOpt; - }; - complain = function(sMsg) { - }; - doNothing = function() { - return false; - }; - disableObject = function(o) { - var oProp; - for (oProp in o) { - if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') { - o[oProp] = doNothing; - } - } - oProp = null; - }; - failSafely = function(bNoDisable) { - if (bNoDisable === _undefined) { - bNoDisable = false; - } - if (disabled || bNoDisable) { - sm2.disable(bNoDisable); - } - }; - normalizeMovieURL = function(smURL) { - var urlParams = null, url; - if (smURL) { - if (smURL.match(/\.swf(\?.*)?$/i)) { - urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4); - if (urlParams) { - return smURL; - } - } else if (smURL.lastIndexOf('/') !== smURL.length - 1) { - smURL += '/'; - } - } - url = (smURL && smURL.lastIndexOf('/') !== - 1 ? smURL.substr(0, smURL.lastIndexOf('/') + 1) : './') + sm2.movieURL; - if (sm2.noSWFCache) { - url += ('?ts=' + new Date().getTime()); - } - return url; - }; - setVersionInfo = function() { - fV = parseInt(sm2.flashVersion, 10); - if (fV !== 8 && fV !== 9) { - sm2.flashVersion = fV = defaultFlashVersion; - } - var isDebug = (sm2.debugMode || sm2.debugFlash?'_debug.swf':'.swf'); - if (sm2.useHTML5Audio && !sm2.html5Only && sm2.audioFormats.mp4.required && fV < 9) { - sm2.flashVersion = fV = 9; - } - sm2.version = sm2.versionNumber + (sm2.html5Only?' (HTML5-only mode)':(fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)')); - if (fV > 8) { - sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.flash9Options); - sm2.features.buffering = true; - sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.movieStarOptions); - sm2.filePatterns.flash9 = new RegExp('\\.(mp3|' + netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); - sm2.features.movieStar = true; - } else { - sm2.features.movieStar = false; - } - sm2.filePattern = sm2.filePatterns[(fV !== 8?'flash9':'flash8')]; - sm2.movieURL = (fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf', isDebug); - sm2.features.peakData = sm2.features.waveformData = sm2.features.eqData = (fV > 8); - }; - setPolling = function(bPolling, bHighPerformance) { - if (!flash) { - return false; - } - flash._setPolling(bPolling, bHighPerformance); - }; - initDebug = function() { - }; - idCheck = this.getSoundById; - getSWFCSS = function() { - var css = []; - if (sm2.debugMode) { - css.push(swfCSS.sm2Debug); - } - if (sm2.debugFlash) { - css.push(swfCSS.flashDebug); - } - if (sm2.useHighPerformance) { - css.push(swfCSS.highPerf); - } - return css.join(' '); - }; - flashBlockHandler = function() { - var name = str('fbHandler'), - p = sm2.getMoviePercent(), - css = swfCSS, - error = {type:'FLASHBLOCK'}; - if (sm2.html5Only) { - return false; - } - if (!sm2.ok()) { - if (needsFlash) { - sm2.oMC.className = getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null?css.swfTimedout:css.swfError); - } - sm2.didFlashBlock = true; - processOnEvents({type:'ontimeout', ignoreInit:true, error:error}); - catchError(error); - } else { - if (sm2.oMC) { - sm2.oMC.className = [getSWFCSS(), css.swfDefault, css.swfLoaded + (sm2.didFlashBlock?' '+css.swfUnblocked:'')].join(' '); - } - } - }; - addOnEvent = function(sType, oMethod, oScope) { - if (on_queue[sType] === _undefined) { - on_queue[sType] = []; - } - on_queue[sType].push({ - 'method': oMethod, - 'scope': (oScope || null), - 'fired': false - }); - }; - processOnEvents = function(oOptions) { - if (!oOptions) { - oOptions = { - type: (sm2.ok() ? 'onready' : 'ontimeout') - }; - } - if (!didInit && oOptions && !oOptions.ignoreInit) { - return false; - } - if (oOptions.type === 'ontimeout' && (sm2.ok() || (disabled && !oOptions.ignoreInit))) { - return false; - } - var status = { - success: (oOptions && oOptions.ignoreInit?sm2.ok():!disabled) - }, - srcQueue = (oOptions && oOptions.type?on_queue[oOptions.type]||[]:[]), - queue = [], i, j, - args = [status], - canRetry = (needsFlash && !sm2.ok()); - if (oOptions.error) { - args[0].error = oOptions.error; - } - for (i = 0, j = srcQueue.length; i < j; i++) { - if (srcQueue[i].fired !== true) { - queue.push(srcQueue[i]); - } - } - if (queue.length) { - for (i = 0, j = queue.length; i < j; i++) { - if (queue[i].scope) { - queue[i].method.apply(queue[i].scope, args); - } else { - queue[i].method.apply(this, args); - } - if (!canRetry) { - queue[i].fired = true; - } - } - } - return true; - }; - initUserOnload = function() { - window.setTimeout(function() { - if (sm2.useFlashBlock) { - flashBlockHandler(); - } - processOnEvents(); - if (typeof sm2.onload === 'function') { - sm2.onload.apply(window); - } - if (sm2.waitForWindowLoad) { - event.add(window, 'load', initUserOnload); - } - },1); - }; - detectFlash = function() { - if (hasFlash !== _undefined) { - return hasFlash; - } - var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = window.ActiveXObject; - if (nP && nP.length) { - type = 'application/x-shockwave-flash'; - types = n.mimeTypes; - if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) { - hasPlugin = true; - } - } else if (AX !== _undefined && !ua.match(/MSAppHost/i)) { - try { - obj = new AX('ShockwaveFlash.ShockwaveFlash'); - } catch(e) { - obj = null; - } - hasPlugin = (!!obj); - obj = null; - } - hasFlash = hasPlugin; - return hasPlugin; - }; - featureCheck = function() { - var flashNeeded, - item, - formats = sm2.audioFormats, - isSpecial = (is_iDevice && !!(ua.match(/os (1|2|3_0|3_1)/i))); - if (isSpecial) { - sm2.hasHTML5 = false; - sm2.html5Only = true; - if (sm2.oMC) { - sm2.oMC.style.display = 'none'; - } - } else { - if (sm2.useHTML5Audio) { - if (!sm2.html5 || !sm2.html5.canPlayType) { - sm2.hasHTML5 = false; - } - } - } - if (sm2.useHTML5Audio && sm2.hasHTML5) { - canIgnoreFlash = true; - for (item in formats) { - if (formats.hasOwnProperty(item)) { - if (formats[item].required) { - if (!sm2.html5.canPlayType(formats[item].type)) { - canIgnoreFlash = false; - flashNeeded = true; - } else if (sm2.preferFlash && (sm2.flash[item] || sm2.flash[formats[item].type])) { - flashNeeded = true; - } - } - } - } - } - if (sm2.ignoreFlash) { - flashNeeded = false; - canIgnoreFlash = true; - } - sm2.html5Only = (sm2.hasHTML5 && sm2.useHTML5Audio && !flashNeeded); - return (!sm2.html5Only); - }; - parseURL = function(url) { - var i, j, urlResult = 0, result; - if (url instanceof Array) { - for (i=0, j=url.length; i= 0; i--) { - if (sm2.sounds[sm2.soundIDs[i]].isHTML5 && sm2.sounds[sm2.soundIDs[i]]._hasTimer) { - sm2.sounds[sm2.soundIDs[i]]._onTimer(); - } - } - }; - catchError = function(options) { - options = (options !== _undefined ? options : {}); - if (typeof sm2.onerror === 'function') { - sm2.onerror.apply(window, [{type:(options.type !== _undefined ? options.type : null)}]); - } - if (options.fatal !== _undefined && options.fatal) { - sm2.disable(); - } - }; - badSafariFix = function() { - if (!isBadSafari || !detectFlash()) { - return false; - } - var aF = sm2.audioFormats, i, item; - for (item in aF) { - if (aF.hasOwnProperty(item)) { - if (item === 'mp3' || item === 'mp4') { - sm2.html5[item] = false; - if (aF[item] && aF[item].related) { - for (i = aF[item].related.length-1; i >= 0; i--) { - sm2.html5[aF[item].related[i]] = false; - } - } - } - } - } - }; - this._setSandboxType = function(sandboxType) { - }; - this._externalInterfaceOK = function(swfVersion) { - if (sm2.swfLoaded) { - return false; - } - var e; - sm2.swfLoaded = true; - tryInitOnFocus = false; - if (isBadSafari) { - badSafariFix(); - } - setTimeout(init, isIE ? 100 : 1); - }; - createMovie = function(smID, smURL) { - if (didAppend && appendSuccess) { - return false; - } - function initMsg() { - } - if (sm2.html5Only) { - setVersionInfo(); - initMsg(); - sm2.oMC = id(sm2.movieID); - init(); - didAppend = true; - appendSuccess = true; - return false; - } - var remoteURL = (smURL || sm2.url), - localURL = (sm2.altURL || remoteURL), - swfTitle = 'JS/Flash audio component (SoundManager 2)', - oTarget = getDocument(), - extraClass = getSWFCSS(), - isRTL = null, - html = doc.getElementsByTagName('html')[0], - oEmbed, oMovie, tmp, movieHTML, oEl, s, x, sClass; - isRTL = (html && html.dir && html.dir.match(/rtl/i)); - smID = (smID === _undefined?sm2.id:smID); - function param(name, value) { - return ''; - } - setVersionInfo(); - sm2.url = normalizeMovieURL(overHTTP?remoteURL:localURL); - smURL = sm2.url; - sm2.wmode = (!sm2.wmode && sm2.useHighPerformance ? 'transparent' : sm2.wmode); - if (sm2.wmode !== null && (ua.match(/msie 8/i) || (!isIE && !sm2.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) { - messages.push(strings.spcWmode); - sm2.wmode = null; - } - oEmbed = { - 'name': smID, - 'id': smID, - 'src': smURL, - 'quality': 'high', - 'allowScriptAccess': sm2.allowScriptAccess, - 'bgcolor': sm2.bgColor, - 'pluginspage': http+'www.macromedia.com/go/getflashplayer', - 'title': swfTitle, - 'type': 'application/x-shockwave-flash', - 'wmode': sm2.wmode, - 'hasPriority': 'true' - }; - if (sm2.debugFlash) { - oEmbed.FlashVars = 'debug=1'; - } - if (!sm2.wmode) { - delete oEmbed.wmode; - } - if (isIE) { - oMovie = doc.createElement('div'); - movieHTML = [ - '', - param('movie', smURL), - param('AllowScriptAccess', sm2.allowScriptAccess), - param('quality', oEmbed.quality), - (sm2.wmode? param('wmode', sm2.wmode): ''), - param('bgcolor', sm2.bgColor), - param('hasPriority', 'true'), - (sm2.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''), - '' - ].join(''); - } else { - oMovie = doc.createElement('embed'); - for (tmp in oEmbed) { - if (oEmbed.hasOwnProperty(tmp)) { - oMovie.setAttribute(tmp, oEmbed[tmp]); - } - } - } - initDebug(); - extraClass = getSWFCSS(); - oTarget = getDocument(); - if (oTarget) { - sm2.oMC = (id(sm2.movieID) || doc.createElement('div')); - if (!sm2.oMC.id) { - sm2.oMC.id = sm2.movieID; - sm2.oMC.className = swfCSS.swfDefault + ' ' + extraClass; - s = null; - oEl = null; - if (!sm2.useFlashBlock) { - if (sm2.useHighPerformance) { - s = { - 'position': 'fixed', - 'width': '8px', - 'height': '8px', - 'bottom': '0px', - 'left': '0px', - 'overflow': 'hidden' - }; - } else { - s = { - 'position': 'absolute', - 'width': '6px', - 'height': '6px', - 'top': '-9999px', - 'left': '-9999px' - }; - if (isRTL) { - s.left = Math.abs(parseInt(s.left,10))+'px'; - } - } - } - if (isWebkit) { - sm2.oMC.style.zIndex = 10000; - } - if (!sm2.debugFlash) { - for (x in s) { - if (s.hasOwnProperty(x)) { - sm2.oMC.style[x] = s[x]; - } - } - } - try { - if (!isIE) { - sm2.oMC.appendChild(oMovie); - } - oTarget.appendChild(sm2.oMC); - if (isIE) { - oEl = sm2.oMC.appendChild(doc.createElement('div')); - oEl.className = swfCSS.swfBox; - oEl.innerHTML = movieHTML; - } - appendSuccess = true; - } catch(e) { - throw new Error(str('domError')+' \n'+e.toString()); - } - } else { - sClass = sm2.oMC.className; - sm2.oMC.className = (sClass?sClass+' ':swfCSS.swfDefault) + (extraClass?' '+extraClass:''); - sm2.oMC.appendChild(oMovie); - if (isIE) { - oEl = sm2.oMC.appendChild(doc.createElement('div')); - oEl.className = swfCSS.swfBox; - oEl.innerHTML = movieHTML; - } - appendSuccess = true; - } - } - didAppend = true; - initMsg(); - return true; - }; - initMovie = function() { - if (sm2.html5Only) { - createMovie(); - return false; - } - if (flash) { - return false; - } - if (!sm2.url) { - return false; - } - flash = sm2.getMovie(sm2.id); - if (!flash) { - if (!oRemoved) { - createMovie(sm2.id, sm2.url); - } else { - if (!isIE) { - sm2.oMC.appendChild(oRemoved); - } else { - sm2.oMC.innerHTML = oRemovedHTML; - } - oRemoved = null; - didAppend = true; - } - flash = sm2.getMovie(sm2.id); - } - if (typeof sm2.oninitmovie === 'function') { - setTimeout(sm2.oninitmovie, 1); - } - return true; - }; - delayWaitForEI = function() { - setTimeout(waitForEI, 1000); - }; - rebootIntoHTML5 = function() { - window.setTimeout(function() { - sm2.setup({ - preferFlash: false - }).reboot(); - sm2.didFlashBlock = true; - sm2.beginDelayedInit(); - }, 1); - }; - waitForEI = function() { - var p, - loadIncomplete = false; - if (!sm2.url) { - return false; - } - if (waitingForEI) { - return false; - } - waitingForEI = true; - event.remove(window, 'load', delayWaitForEI); - if (hasFlash && tryInitOnFocus && !isFocused) { - return false; - } - if (!didInit) { - p = sm2.getMoviePercent(); - if (p > 0 && p < 100) { - loadIncomplete = true; - } - } - setTimeout(function() { - p = sm2.getMoviePercent(); - if (loadIncomplete) { - waitingForEI = false; - window.setTimeout(delayWaitForEI, 1); - return false; - } - if (!didInit && okToDisable) { - if (p === null) { - if (sm2.useFlashBlock || sm2.flashLoadTimeout === 0) { - if (sm2.useFlashBlock) { - flashBlockHandler(); - } - } else { - if (!sm2.useFlashBlock && canIgnoreFlash) { - rebootIntoHTML5(); - } else { - processOnEvents({type:'ontimeout', ignoreInit: true, error: {type: 'INIT_FLASHBLOCK'}}); - } - } - } else { - if (sm2.flashLoadTimeout === 0) { - } else { - if (!sm2.useFlashBlock && canIgnoreFlash) { - rebootIntoHTML5(); - } else { - failSafely(true); - } - } - } - } - }, sm2.flashLoadTimeout); - }; - handleFocus = function() { - function cleanup() { - event.remove(window, 'focus', handleFocus); - } - if (isFocused || !tryInitOnFocus) { - cleanup(); - return true; - } - okToDisable = true; - isFocused = true; - waitingForEI = false; - delayWaitForEI(); - cleanup(); - return true; - }; - flushMessages = function() { - }; - showSupport = function() { - }; - initComplete = function(bNoDisable) { - if (didInit) { - return false; - } - if (sm2.html5Only) { - didInit = true; - initUserOnload(); - return true; - } - var wasTimeout = (sm2.useFlashBlock && sm2.flashLoadTimeout && !sm2.getMoviePercent()), - result = true, - error; - if (!wasTimeout) { - didInit = true; - } - error = {type: (!hasFlash && needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')}; - if (disabled || bNoDisable) { - if (sm2.useFlashBlock && sm2.oMC) { - sm2.oMC.className = getSWFCSS() + ' ' + (sm2.getMoviePercent() === null?swfCSS.swfTimedout:swfCSS.swfError); - } - processOnEvents({type:'ontimeout', error:error, ignoreInit: true}); - catchError(error); - result = false; - } else { - } - if (!disabled) { - if (sm2.waitForWindowLoad && !windowLoaded) { - event.add(window, 'load', initUserOnload); - } else { - initUserOnload(); - } - } - return result; - }; - setProperties = function() { - var i, - o = sm2.setupOptions; - for (i in o) { - if (o.hasOwnProperty(i)) { - if (sm2[i] === _undefined) { - sm2[i] = o[i]; - } else if (sm2[i] !== o[i]) { - sm2.setupOptions[i] = sm2[i]; - } - } - } - }; - init = function() { - if (didInit) { - return false; - } - function cleanup() { - event.remove(window, 'load', sm2.beginDelayedInit); - } - if (sm2.html5Only) { - if (!didInit) { - cleanup(); - sm2.enabled = true; - initComplete(); - } - return true; - } - initMovie(); - try { - flash._externalInterfaceTest(false); - setPolling(true, (sm2.flashPollingInterval || (sm2.useHighPerformance ? 10 : 50))); - if (!sm2.debugMode) { - flash._disableDebug(); - } - sm2.enabled = true; - if (!sm2.html5Only) { - event.add(window, 'unload', doNothing); - } - } catch(e) { - catchError({type:'JS_TO_FLASH_EXCEPTION', fatal:true}); - failSafely(true); - initComplete(); - return false; - } - initComplete(); - cleanup(); - return true; - }; - domContentLoaded = function() { - if (didDCLoaded) { - return false; - } - didDCLoaded = true; - setProperties(); - initDebug(); - if (!hasFlash && sm2.hasHTML5) { - sm2.setup({ - 'useHTML5Audio': true, - 'preferFlash': false - }); - } - testHTML5(); - if (!hasFlash && needsFlash) { - messages.push(strings.needFlash); - sm2.setup({ - 'flashLoadTimeout': 1 - }); - } - if (doc.removeEventListener) { - doc.removeEventListener('DOMContentLoaded', domContentLoaded, false); - } - initMovie(); - return true; - }; - domContentLoadedIE = function() { - if (doc.readyState === 'complete') { - domContentLoaded(); - doc.detachEvent('onreadystatechange', domContentLoadedIE); - } - return true; - }; - winOnLoad = function() { - windowLoaded = true; - event.remove(window, 'load', winOnLoad); - }; - preInit = function() { - if (mobileHTML5) { - sm2.setupOptions.useHTML5Audio = true; - sm2.setupOptions.preferFlash = false; - if (is_iDevice || (isAndroid && !ua.match(/android\s2\.3/i))) { - if (is_iDevice) { - sm2.ignoreFlash = true; - } - useGlobalHTML5Audio = true; - } - } - }; - preInit(); - detectFlash(); - event.add(window, 'focus', handleFocus); - event.add(window, 'load', delayWaitForEI); - event.add(window, 'load', winOnLoad); - if (doc.addEventListener) { - doc.addEventListener('DOMContentLoaded', domContentLoaded, false); - } else if (doc.attachEvent) { - doc.attachEvent('onreadystatechange', domContentLoadedIE); - } else { - catchError({type:'NO_DOM2_EVENTS', fatal:true}); - } -} -// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading -if (window.SM2_DEFER === undefined || !SM2_DEFER) { - soundManager = new SoundManager(); -} -window.SoundManager = SoundManager; -window.soundManager = soundManager; -}(window)); +(function(g,h){function v(gb,v){function Z(b){return c.preferFlash&&z&&!c.ignoreFlash&&c.flash[b]!==h&&c.flash[b]}function q(b){return function(c){var d=this._s;return d&&d._a?b.call(this,c):null}}this.setupOptions={url:gb||null,flashVersion:8,debugMode:!0,debugFlash:!1,useConsole:!0,consoleOnly:!0,waitForWindowLoad:!1,bgColor:"#ffffff",useHighPerformance:!1,flashPollingInterval:null,html5PollingInterval:null,flashLoadTimeout:1E3,wmode:null,allowScriptAccess:"always",useFlashBlock:!1,useHTML5Audio:!0, +forceUseGlobalHTML5Audio:!1,ignoreMobileRestrictions:!1,html5Test:/^(probably|maybe)$/i,preferFlash:!1,noSWFCache:!1,idPrefix:"sound"};this.defaultOptions={autoLoad:!1,autoPlay:!1,from:null,loops:1,onid3:null,onerror:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onposition:null,onstop:null,onfinish:null,multiShot:!0,multiShotEvents:!1,position:null,pan:0,playbackRate:1,stream:!0,to:null,type:null,usePolicyFile:!1,volume:100};this.flash9Options={onfailure:null, +isMovieStar:null,usePeakData:!1,useWaveformData:!1,useEQData:!1,onbufferchange:null,ondataerror:null};this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null,duration:null};this.audioFormats={mp3:{type:['audio/mpeg; codecs="mp3"',"audio/mpeg","audio/mp3","audio/MPA","audio/mpa-robust"],required:!0},mp4:{related:["aac","m4a","m4b"],type:['audio/mp4; codecs="mp4a.40.2"',"audio/aac","audio/x-m4a","audio/MP4A-LATM","audio/mpeg4-generic"],required:!1},ogg:{type:["audio/ogg; codecs=vorbis"],required:!1}, +opus:{type:["audio/ogg; codecs=opus","audio/opus"],required:!1},wav:{type:['audio/wav; codecs="1"',"audio/wav","audio/wave","audio/x-wav"],required:!1},flac:{type:["audio/flac"],required:!1}};this.movieID="sm2-container";this.id=v||"sm2movie";this.debugID="soundmanager-debug";this.debugURLParam=/([#?&])debug=1/i;this.versionNumber="V2.97a.20170601";this.altURL=this.movieURL=this.version=null;this.enabled=this.swfLoaded=!1;this.oMC=null;this.sounds={};this.soundIDs=[];this.didFlashBlock=this.muted= +!1;this.filePattern=null;this.filePatterns={flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.features={buffering:!1,peakData:!1,waveformData:!1,eqData:!1,movieStar:!1};this.sandbox={};this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only=!1;var M,c=this,Na=null,k=null,aa,t=navigator.userAgent,Oa=g.location.href.toString(),n=document,oa,Pa,pa,m,x=[],N=!1,O=!1,l=!1,A=!1,qa=!1,P,w,ra,ba,sa,E,G,H,Qa,ta,ua,ca,I,da,F,va,Q,wa,ea,J,Ra,xa,ya,za,Sa,R=null,Aa=null,S,Ba,K,fa,ga,p,T= +!1,Ca=!1,Ta,Ua,Va,ha=0,U=null,ia,V=[],W,u=null,Wa,ja,X,Xa,C,ka,Da,Ya,r,hb=Array.prototype.slice,y=!1,Ea,z,Fa,Za,B,Y,$a=0,Ga,Ha=t.match(/(ipad|iphone|ipod)/i),Ia=t.match(/android/i),D=t.match(/msie|trident/i),ib=t.match(/webkit/i),la=t.match(/safari/i)&&!t.match(/chrome/i),Ja=t.match(/opera/i),ma=t.match(/(mobile|pre\/|xoom)/i)||Ha||Ia,ab=!Oa.match(/usehtml5audio/i)&&!Oa.match(/sm2-ignorebadua/i)&&la&&!t.match(/silk/i)&&t.match(/OS\sX\s10_6_([3-7])/i),Ka=n.hasFocus!==h?n.hasFocus():null,na=la&&(n.hasFocus=== +h||!n.hasFocus()),bb=!na,cb=/(mp3|mp4|mpa|m4a|m4b)/i,La=n.location?n.location.protocol.match(/http/i):null,jb=La?"":"//",db=/^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4|m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i,eb="mpeg4 aac flv mov mp4 m4v f4v m4a m4b mp4v 3gp 3g2".split(" "),kb=new RegExp("\\.("+eb.join("|")+")(\\?.*)?$","i");this.mimePattern=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.useAltURL=!La;Xa=[null,"MEDIA_ERR_ABORTED","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED"]; +var Ma;try{Ma=Audio!==h&&(Ja&&opera!==h&&10>opera.version()?new Audio(null):new Audio).canPlayType!==h}catch(lb){Ma=!1}this.hasHTML5=Ma;this.setup=function(b){var e=!c.url;b!==h&&l&&u&&c.ok();ra(b);if(!y)if(ma){if(!c.setupOptions.ignoreMobileRestrictions||c.setupOptions.forceUseGlobalHTML5Audio)V.push(I.globalHTML5),y=!0}else c.setupOptions.forceUseGlobalHTML5Audio&&(V.push(I.globalHTML5),y=!0);if(!Ga&&ma)if(c.setupOptions.ignoreMobileRestrictions)V.push(I.ignoreMobile);else if(c.setupOptions.useHTML5Audio= +!0,c.setupOptions.preferFlash=!1,Ha)c.ignoreFlash=!0;else if(Ia&&!t.match(/android\s2\.3/i)||!Ia)y=!0;b&&(e&&Q&&b.url!==h&&c.beginDelayedInit(),Q||b.url===h||"complete"!==n.readyState||setTimeout(F,1));Ga=!0;return c};this.supported=this.ok=function(){return u?l&&!A:c.useHTML5Audio&&c.hasHTML5};this.getMovie=function(b){return aa(b)||n[b]||g[b]};this.createSound=function(b,e){function d(){a=fa(a);c.sounds[a.id]=new M(a);c.soundIDs.push(a.id);return c.sounds[a.id]}var a,f=null;if(!l||!c.ok())return!1; +e!==h&&(b={id:b,url:e});a=w(b);a.url=ia(a.url);a.id===h&&(a.id=c.setupOptions.idPrefix+$a++);if(p(a.id,!0))return c.sounds[a.id];if(ja(a))f=d(),f._setup_html5(a);else{if(c.html5Only||c.html5.usingFlash&&a.url&&a.url.match(/data:/i))return d();8a.instanceCount?(n(),d=a._setup_html5(),a.setPosition(a._iO.position),d.play()):(f=new Audio(a._iO.url),g=function(){r.remove(f,"ended",g);a._onfinish(a);ka(f);f=null},L=function(){r.remove(f,"canplay",L);try{f.currentTime=a._iO.position/1E3}catch(b){}f.play()},r.add(f,"ended",g),a._iO.volume!==h&&(f.volume=Math.max(0,Math.min(1,a._iO.volume/100))),a.muted&&(f.muted=!0),a._iO.position?r.add(f,"canplay",L):f.play()):(d=k._start(a.id,a._iO.loops||1,9===m?a.position:a.position/1E3,a._iO.multiShot|| +!1),9!==m||d||a._iO.onplayerror&&a._iO.onplayerror.apply(a)));return a};this.stop=function(b){var c=a._iO;1===a.playState&&(a._onbufferchange(0),a._resetOnPosition(0),a.paused=!1,a.isHTML5||(a.playState=0),x(),c.to&&a.clearOnPosition(c.to),a.isHTML5?a._a&&(b=a.position,a.setPosition(0),a.position=b,a._a.pause(),a.playState=0,a._onTimer(),g()):(k._stop(a.id,b),c.serverURL&&a.unload()),a.instanceCount=0,a._iO={},c.onstop&&c.onstop.apply(a));return a};this.setAutoPlay=function(b){a._iO.autoPlay=b;a.isHTML5|| +(k._setAutoPlay(a.id,b),b&&(a.instanceCount||1!==a.readyState||a.instanceCount++))};this.getAutoPlay=function(){return a._iO.autoPlay};this.setPlaybackRate=function(b){b=Math.max(.5,Math.min(4,b));if(a.isHTML5)try{a._iO.playbackRate=b,a._a.playbackRate=b}catch(c){}return a};this.setPosition=function(b){b===h&&(b=0);var c=a.isHTML5?Math.max(b,0):Math.min(a.duration||a._iO.duration,Math.max(b,0));a.position=c;b=a.position/1E3;a._resetOnPosition(a.position);a._iO.position=c;if(!a.isHTML5)b=9===m?a.position: +b,a.readyState&&2!==a.readyState&&k._setPosition(a.id,b,a.paused||!a.playState,a._iO.multiShot);else if(a._a){if(a._html5_canplay){if(a._a.currentTime.toFixed(3)!==b.toFixed(3))try{a._a.currentTime=b,(0===a.playState||a.paused)&&a._a.pause()}catch(d){}}else if(b)return a;a.paused&&a._onTimer(!0)}return a};this.pause=function(b){if(a.paused||0===a.playState&&1!==a.readyState)return a;a.paused=!0;a.isHTML5?(a._setup_html5().pause(),g()):(b||b===h)&&k._pause(a.id,a._iO.multiShot);a._iO.onpause&&a._iO.onpause.apply(a); +return a};this.resume=function(){var b=a._iO;if(!a.paused)return a;a.paused=!1;a.playState=1;a.isHTML5?(a._setup_html5().play(),n()):(b.isMovieStar&&!b.serverURL&&a.setPosition(a.position),k._pause(a.id,b.multiShot));!t&&b.onplay?(b.onplay.apply(a),t=!0):b.onresume&&b.onresume.apply(a);return a};this.togglePause=function(){if(0===a.playState)return a.play({position:9!==m||a.isHTML5?a.position/1E3:a.position}),a;a.paused?a.resume():a.pause();return a};this.setPan=function(b,c){b===h&&(b=0);c===h&& +(c=!1);a.isHTML5||k._setPan(a.id,b);a._iO.pan=b;c||(a.pan=b,a.options.pan=b);return a};this.setVolume=function(b,d){b===h&&(b=100);d===h&&(d=!1);a.isHTML5?a._a&&(c.muted&&!a.muted&&(a.muted=!0,a._a.muted=!0),a._a.volume=Math.max(0,Math.min(1,b/100))):k._setVolume(a.id,c.muted&&!a.muted||a.muted?0:b);a._iO.volume=b;d||(a.volume=b,a.options.volume=b);return a};this.mute=function(){a.muted=!0;a.isHTML5?a._a&&(a._a.muted=!0):k._setVolume(a.id,0);return a};this.unmute=function(){a.muted=!1;var b=a._iO.volume!== +h;a.isHTML5?a._a&&(a._a.muted=!1):k._setVolume(a.id,b?a._iO.volume:a.options.volume);return a};this.toggleMute=function(){return a.muted?a.unmute():a.mute()};this.onposition=this.onPosition=function(b,c,d){l.push({position:parseInt(b,10),method:c,scope:d!==h?d:a,fired:!1});return a};this.clearOnPosition=function(a,b){var c;a=parseInt(a,10);if(!isNaN(a))for(c=0;c=b)return!1;for(--b;0<=b;b--)c=l[b],!c.fired&&a.position>=c.position&&(c.fired=!0,u++,c.method.apply(c.scope,[c.position]));return!0};this._resetOnPosition=function(a){var b,c;b=l.length;if(!b)return!1;for(--b;0<=b;b--)c=l[b],c.fired&&a<=c.position&&(c.fired=!1,u--);return!0};A=function(){var b=a._iO,c=b.from,d=b.to,e,f;f=function(){a.clearOnPosition(d,f);a.stop()};e=function(){if(null!==d&&!isNaN(d))a.onPosition(d,f)};null===c||isNaN(c)||(b.position=c,b.multiShot=!1,e());return b}; +q=function(){var b,c=a._iO.onposition;if(c)for(b in c)if(c.hasOwnProperty(b))a.onPosition(parseInt(b,10),c[b])};x=function(){var b,c=a._iO.onposition;if(c)for(b in c)c.hasOwnProperty(b)&&a.clearOnPosition(parseInt(b,10))};n=function(){a.isHTML5&&Ta(a)};g=function(){a.isHTML5&&Ua(a)};f=function(b){b||(l=[],u=0);t=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded=null;a.bytesTotal=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.buffered=[];a.eqData= +[];a.eqData.left=[];a.eqData.right=[];a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null;a.id3={}};f();this._onTimer=function(b){var c,f=!1,h={};(a._hasTimer||b)&&a._a&&(b||(0opera.version()?new Audio(null):new Audio,c=a._a,c._called_load=!1,y&&(Na=c);a.isHTML5=!0;a._a=c;c._s=a;L();a._apply_loop(c,b.loops);b.autoLoad||b.autoPlay?a.load():(c.autobuffer=!1,c.preload="auto");return c};L=function(){if(a._a._added_events)return!1;var b;a._a._added_events=!0;for(b in B)B.hasOwnProperty(b)&&a._a&&a._a.addEventListener(b,B[b],!1); +return!0};fb=function(){var b;a._a._added_events=!1;for(b in B)B.hasOwnProperty(b)&&a._a&&a._a.removeEventListener(b,B[b],!1)};this._onload=function(b){var c=!!b||!a.isHTML5&&8===m&&a.duration;a.loaded=c;a.readyState=c?3:2;a._onbufferchange(0);c||a.isHTML5||a._onerror();a._iO.onload&&Y(a,function(){a._iO.onload.apply(a,[c])});return!0};this._onerror=function(b,c){a._iO.onerror&&Y(a,function(){a._iO.onerror.apply(a,[b,c])})};this._onbufferchange=function(b){if(0===a.playState||b&&a.isBuffering||!b&& +!a.isBuffering)return!1;a.isBuffering=1===b;a._iO.onbufferchange&&a._iO.onbufferchange.apply(a,[b]);return!0};this._onsuspend=function(){a._iO.onsuspend&&a._iO.onsuspend.apply(a);return!0};this._onfailure=function(b,c,d){a.failures++;if(a._iO.onfailure&&1===a.failures)a._iO.onfailure(b,c,d)};this._onwarning=function(b,c,d){if(a._iO.onwarning)a._iO.onwarning(b,c,d)};this._onfinish=function(){var b=a._iO.onfinish;a._onbufferchange(0);a._resetOnPosition(0);a.instanceCount&&(a.instanceCount--,a.instanceCount|| +(x(),a.playState=0,a.paused=!1,a.instanceCount=0,a.instanceOptions={},a._iO={},g(),a.isHTML5&&(a.position=0)),(!a.instanceCount||a._iO.multiShotEvents)&&b&&Y(a,function(){b.apply(a)}))};this._whileloading=function(b,c,d,e){var f=a._iO;a.bytesLoaded=b;a.bytesTotal=c;a.duration=Math.floor(d);a.bufferLength=e;a.durationEstimate=a.isHTML5||f.isMovieStar?a.duration:f.duration?a.duration>f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10);a.isHTML5||(a.buffered=[{start:0, +end:a.duration}]);(3!==a.readyState||a.isHTML5)&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,d,e,f){var g=a._iO;if(isNaN(b)||null===b)return!1;a.position=Math.max(0,b);a._processOnPosition();!a.isHTML5&&8opera.version()? +new Audio(null):new Audio:null,d,a,f={},g,k;g=c.audioFormats;for(d in g)if(g.hasOwnProperty(d)&&(a="audio/"+d,f[d]=b(g[d].type),f[a]=f[d],d.match(cb)?(c.flash[d]=!0,c.flash[a]=!0):(c.flash[d]=!1,c.flash[a]=!1),g[d]&&g[d].related))for(k=g[d].related.length-1;0<=k;k--)f["audio/"+g[d].related[k]]=f[d],c.html5[g[d].related[k]]=f[d],c.flash[g[d].related[k]]=f[d];f.canPlayType=e?b:null;c.html5=w(c.html5,f);c.html5.usingFlash=Wa();u=c.html5.usingFlash;return!0};I={};S=function(){};fa=function(b){8===m&& +1m&&(c.flashVersion=m=9);c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)":9===m?" (AS3/Flash 9)":" (AS2/Flash 8)");8'}if(N&&O)return!1;if(c.html5Only)return ua(),c.oMC=aa(c.movieID),pa(),O=N=!0,!1;var a=e||c.url,f=c.altURL||a,g=wa(),k=K(),m=null,m=n.getElementsByTagName("html")[0],l,q,p,m=m&&m.dir&&m.dir.match(/rtl/i); +b=b===h?c.id:b;ua();c.url=Sa(La?a:f);e=c.url;c.wmode=!c.wmode&&c.useHighPerformance?"transparent":c.wmode;null!==c.wmode&&(t.match(/msie 8/i)||!D&&!c.useHighPerformance)&&navigator.platform.match(/win32|win64/i)&&(V.push(I.spcWmode),c.wmode=null);g={name:b,id:b,src:e,quality:"high",allowScriptAccess:c.allowScriptAccess,bgcolor:c.bgColor,pluginspage:jb+"www.macromedia.com/go/getflashplayer",title:"JS/Flash audio component (SoundManager 2)",type:"application/x-shockwave-flash",wmode:c.wmode,hasPriority:"true"}; +c.debugFlash&&(g.FlashVars="debug=1");c.wmode||delete g.wmode;if(D)a=n.createElement("div"),q=['',d("movie",e),d("AllowScriptAccess",c.allowScriptAccess),d("quality",g.quality),c.wmode?d("wmode",c.wmode):"",d("bgcolor",c.bgColor),d("hasPriority","true"),c.debugFlash?d("FlashVars",g.FlashVars): +"",""].join("");else for(l in a=n.createElement("embed"),g)g.hasOwnProperty(l)&&a.setAttribute(l,g[l]);xa();k=K();if(g=wa())if(c.oMC=aa(c.movieID)||n.createElement("div"),c.oMC.id)p=c.oMC.className,c.oMC.className=(p?p+" ":"movieContainer")+(k?" "+k:""),c.oMC.appendChild(a),D&&(l=c.oMC.appendChild(n.createElement("div")),l.className="sm2-object-box",l.innerHTML=q),O=!0;else{c.oMC.id=c.movieID;c.oMC.className="movieContainer "+k;l=k=null;c.useFlashBlock||(c.useHighPerformance?k={position:"fixed", +width:"8px",height:"8px",bottom:"0px",left:"0px",overflow:"hidden"}:(k={position:"absolute",width:"6px",height:"6px",top:"-9999px",left:"-9999px"},m&&(k.left=Math.abs(parseInt(k.left,10))+"px")));ib&&(c.oMC.style.zIndex=1E4);if(!c.debugFlash)for(p in k)k.hasOwnProperty(p)&&(c.oMC.style[p]=k[p]);try{D||c.oMC.appendChild(a),g.appendChild(c.oMC),D&&(l=c.oMC.appendChild(n.createElement("div")),l.className="sm2-object-box",l.innerHTML=q),O=!0}catch(r){throw Error(S("domError")+" \n"+r.toString());}}return N= +!0};da=function(){if(c.html5Only)return ea(),!1;if(k||!c.url)return!1;k=c.getMovie(c.id);k||(R?(D?c.oMC.innerHTML=Aa:c.oMC.appendChild(R),R=null,N=!0):ea(c.id,c.url),k=c.getMovie(c.id));"function"===typeof c.oninitmovie&&setTimeout(c.oninitmovie,1);return!0};H=function(){setTimeout(Qa,1E3)};ta=function(){g.setTimeout(function(){c.setup({preferFlash:!1}).reboot();c.didFlashBlock=!0;c.beginDelayedInit()},1)};Qa=function(){var b,e=!1;c.url&&!T&&(T=!0,r.remove(g,"load",H),z&&na&&!Ka||(l||(b=c.getMoviePercent(), +0b&&(e=!0)),setTimeout(function(){b=c.getMoviePercent();e?(T=!1,g.setTimeout(H,1)):!l&&bb&&(null===b?c.useFlashBlock||0===c.flashLoadTimeout?c.useFlashBlock&&Ba():!c.useFlashBlock&&W?ta():E({type:"ontimeout",ignoreInit:!0,error:{type:"INIT_FLASHBLOCK"}}):0!==c.flashLoadTimeout&&(!c.useFlashBlock&&W?ta():za(!0)))},c.flashLoadTimeout)))};ca=function(){if(Ka||!na)return r.remove(g,"focus",ca),!0;Ka=bb=!0;T=!1;H();r.remove(g,"focus",ca);return!0};P=function(b){if(l)return!1;if(c.html5Only)return l= +!0,G(),!0;var e=!0,d;c.useFlashBlock&&c.flashLoadTimeout&&!c.getMoviePercent()||(l=!0);d={type:!z&&u?"NO_FLASH":"INIT_TIMEOUT"};if(A||b)c.useFlashBlock&&c.oMC&&(c.oMC.className=K()+" "+(null===c.getMoviePercent()?"swf_timedout":"swf_error")),E({type:"ontimeout",error:d,ignoreInit:!0}),J(d),e=!1;A||(c.waitForWindowLoad&&!qa?r.add(g,"load",G):G());return e};Pa=function(){var b,e=c.setupOptions;for(b in e)e.hasOwnProperty(b)&&(c[b]===h?c[b]=e[b]:c[b]!==e[b]&&(c.setupOptions[b]=c[b]))};pa=function(){if(l)return!1; +if(c.html5Only)return l||(r.remove(g,"load",c.beginDelayedInit),c.enabled=!0,P()),!0;da();try{k._externalInterfaceTest(!1),Ra(!0,c.flashPollingInterval||(c.useHighPerformance?10:50)),c.debugMode||k._disableDebug(),c.enabled=!0,c.html5Only||r.add(g,"unload",oa)}catch(b){return J({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),za(!0),P(),!1}P();r.remove(g,"load",c.beginDelayedInit);return!0};F=function(){if(Q)return!1;Q=!0;Pa();xa();!z&&c.hasHTML5&&c.setup({useHTML5Audio:!0,preferFlash:!1});Ya();!z&&u&&(V.push(I.needFlash), +c.setup({flashLoadTimeout:1}));n.removeEventListener&&n.removeEventListener("DOMContentLoaded",F,!1);da();return!0};Da=function(){"complete"===n.readyState&&(F(),n.detachEvent("onreadystatechange",Da));return!0};va=function(){qa=!0;F();r.remove(g,"load",va)};Fa();r.add(g,"focus",ca);r.add(g,"load",H);r.add(g,"load",va);n.addEventListener?n.addEventListener("DOMContentLoaded",F,!1):n.attachEvent?n.attachEvent("onreadystatechange",Da):J({type:"NO_DOM2_EVENTS",fatal:!0})}if(!g||!g.document)throw Error("SoundManager requires a browser with window and document objects."); +var M=null;g.SM2_DEFER!==h&&SM2_DEFER||(M=new v);"object"===typeof module&&module&&"object"===typeof module.exports?(module.exports.SoundManager=v,module.exports.soundManager=M):"function"===typeof define&&define.amd&&define(function(){return{constructor:v,getInstance:function(h){!g.soundManager&&h instanceof Function&&(h=h(v),h instanceof v&&(g.soundManager=h));return g.soundManager}}});g.SoundManager=v;g.soundManager=M})(window); From b207be59a6816837c9d8762283db314035a02316 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Thu, 6 Sep 2018 02:57:01 -0500 Subject: [PATCH 0005/1782] Comment out unused variables in battle.ts I know, I know, unused code should be removed, not commented out. In my defense: 1. This kind of code is really annoying to dig out of Git. 2. This kind of code will be used when this is refactored for use for an external messages file, which is planned (and necessary for translation support.) --- src/battle.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/battle.ts b/src/battle.ts index df9d910a32..1d1ed4be20 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -1846,7 +1846,7 @@ class Battle { break; } case '-sethp': { let effect = Tools.getEffect(kwargs.from); - let poke, ofpoke; + // let poke, ofpoke; for (let k = 0; k < 2; k++) { let cpoke = this.getPokemon(args[1 + 2 * k]); if (cpoke) { @@ -1860,8 +1860,8 @@ class Battle { this.scene.damageAnim(cpoke, formattedRange); } } - if (k == 0) poke = cpoke; - if (k == 1) ofpoke = cpoke; + // if (k == 0) poke = cpoke; + // if (k == 1) ofpoke = cpoke; } switch (effect.id) { case 'painsplit': @@ -1973,7 +1973,7 @@ class Battle { let stat = args[2] as BoostStatName; let amount = parseInt(args[3], 10); let effect = Tools.getEffect(kwargs.from); - let ofpoke = this.getPokemon(kwargs.of); + // let ofpoke = this.getPokemon(kwargs.of); poke.boosts[stat] = amount; this.scene.resultAnim(poke, poke.getBoost(stat), (amount > 0 ? 'good' : 'bad')); @@ -2064,7 +2064,7 @@ class Battle { let poke = this.getPokemon(args[1])!; let frompoke = this.getPokemon(args[2])!; let stats = args[3] ? args[3].split(', ') : ['atk', 'def', 'spa', 'spd', 'spe', 'accuracy', 'evasion']; - let effect = Tools.getEffect(kwargs.from); + // let effect = Tools.getEffect(kwargs.from); for (let i = 0; i < stats.length; i++) { poke.boosts[stats[i]] = frompoke.boosts[stats[i]]; if (!poke.boosts[stats[i]]) delete poke.boosts[stats[i]]; @@ -2825,7 +2825,7 @@ class Battle { } case '-endability': { let poke = this.getPokemon(args[1])!; let ability = Tools.getAbility(args[2]); - let effect = Tools.getEffect(kwargs.from); + // let effect = Tools.getEffect(kwargs.from); poke.ability = '(suppressed)'; if (kwargs.silent) { @@ -3347,7 +3347,7 @@ class Battle { let poke = this.getPokemon(args[1])!; let effect = Tools.getEffect(args[2]); let ofpoke = this.getPokemon(kwargs.of); - let fromeffect = Tools.getEffect(kwargs.from); + // let fromeffect = Tools.getEffect(kwargs.from); poke.addTurnstatus(effect.id); switch (effect.id) { @@ -3428,8 +3428,8 @@ class Battle { } case '-singlemove': { let poke = this.getPokemon(args[1])!; let effect = Tools.getEffect(args[2]); - let ofpoke = this.getPokemon(kwargs.of); - let fromeffect = Tools.getEffect(kwargs.from); + // let ofpoke = this.getPokemon(kwargs.of); + // let fromeffect = Tools.getEffect(kwargs.from); poke.addMovestatus(effect.id); switch (effect.id) { @@ -3860,8 +3860,8 @@ class Battle { } case '-sideend': { let side = this.getSide(args[1]); let effect = Tools.getEffect(args[2]); - let from = Tools.getEffect(kwargs.from); - let ofpoke = this.getPokemon(kwargs.of); + // let from = Tools.getEffect(kwargs.from); + // let ofpoke = this.getPokemon(kwargs.of); side.removeSideCondition(effect.name); switch (effect.id) { @@ -3991,7 +3991,7 @@ class Battle { } case '-fieldend': { let effect = Tools.getEffect(args[1]); - let poke = this.getPokemon(kwargs.of); + // let poke = this.getPokemon(kwargs.of); this.removePseudoWeather(effect.name); switch (effect.id) { From 31b0fb4460d856db03cd51839963b3c7437836ba Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Thu, 6 Sep 2018 02:59:24 -0500 Subject: [PATCH 0006/1782] Stop using document.write in replay-embed.js I absolutely refuse to believe there's any risk at all to using document.write with a constant string. But it's fair that it's non-standard, and won't work if the script is loaded dynamically/asynchronously, so let's switch to the standard way to dynamically load scripts and styles. I'm still using `.src = foo` instead of `.setAttribute('src', foo)` because there's no reason to write modern code when old-school code works and is arguably more readable. --- js/replay-embed.js | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/js/replay-embed.js b/js/replay-embed.js index 0ab1af52f5..8b0d6d6704 100644 --- a/js/replay-embed.js +++ b/js/replay-embed.js @@ -1,16 +1,29 @@ -document.write(''); -document.write(''); -document.write(''); -document.write(''); -document.write(''); -document.write(''); -document.write(''); -document.write(''); -document.write(''); -document.write(''); -document.write(''); -document.write(''); -document.write(''); +function linkStyle(url) { + var linkEl = document.createElement('link'); + linkEl.rel = 'stylesheet'; + linkEl.href = url; + document.head.appendChild(linkEl); +} +function requireScript(url) { + var scriptEl = document.createElement('script'); + scriptEl.src = url; + document.head.appendChild(scriptEl); +} + +linkStyle('https://play.pokemonshowdown.com/style/font-awesome.css?'); +linkStyle('https://play.pokemonshowdown.com/style/battle.css?a7'); +linkStyle('https://play.pokemonshowdown.com/style/replay.css?a7'); + +requireScript('https://play.pokemonshowdown.com/js/lib/jquery-1.11.0.min.js'); +requireScript('https://play.pokemonshowdown.com/js/lib/lodash.compat.js'); +requireScript('https://play.pokemonshowdown.com/js/lib/html-sanitizer-minified.js'); +requireScript('https://play.pokemonshowdown.com/js/lib/soundmanager2-nodebug-jsmin.js'); +requireScript('https://play.pokemonshowdown.com/js/config.js?a7'); +requireScript('https://play.pokemonshowdown.com/js/battledata.js?a7'); +requireScript('https://play.pokemonshowdown.com/data/pokedex-mini.js?a7'); +requireScript('https://play.pokemonshowdown.com/data/pokedex-mini-bw.js?a7'); +requireScript('https://play.pokemonshowdown.com/data/graphics.js?a7'); +requireScript('https://play.pokemonshowdown.com/js/battle.js?a7'); var Replays = { init: function (log) { From 11b30222508265a887dfaa0b5832afb4f8ac57fd Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Thu, 6 Sep 2018 05:31:32 -0500 Subject: [PATCH 0007/1782] Clean up more unused variables --- build-tools/build-learnsets | 2 -- js/client-rooms.js | 1 - js/client-topbar.js | 6 +----- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/build-tools/build-learnsets b/build-tools/build-learnsets index 0ecdc08f9f..48cb1cf524 100755 --- a/build-tools/build-learnsets +++ b/build-tools/build-learnsets @@ -13,8 +13,6 @@ const path = require('path'); const fs = require('fs'); -const crypto = require('crypto'); -const exec = require('child_process').exec; const thisFile = __filename; const thisDir = __dirname; diff --git a/js/client-rooms.js b/js/client-rooms.js index 524095aca8..21524abf6f 100644 --- a/js/client-rooms.js +++ b/js/client-rooms.js @@ -42,7 +42,6 @@ }); }, update: function (rooms) { - var firstOpen = !app.roomsData; if (rooms) { this.lastUpdate = new Date().getTime(); app.roomsData = rooms; diff --git a/js/client-topbar.js b/js/client-topbar.js index 490261c083..5d0c49cc0f 100644 --- a/js/client-topbar.js +++ b/js/client-topbar.js @@ -127,9 +127,6 @@ this.$('.logo').show(); this.$('.maintabbar').removeClass('minitabbar'); - var curId = (app.curRoom ? app.curRoom.id : ''); - var curSideId = (app.curSideRoom ? app.curSideRoom.id : ''); - var buf = '
    ' + this.renderRoomTab(app.rooms['']) + this.renderRoomTab(app.rooms['teambuilder']) + this.renderRoomTab(app.rooms['ladder']) + '
'; var sideBuf = ''; @@ -719,7 +716,6 @@ buf += '
'; buf += '

Official

'; buf += '
'; - var bgs = ['charizards', 'horizon', 'waterfall', 'ocean', 'shaymin']; buf += ''; buf += ''; @@ -979,7 +975,7 @@ 'longtitle': true, 'theme': 'dark', 'onsuccess': function (googleUser) { - var profile = googleUser.getBasicProfile(); + // var profile = googleUser.getBasicProfile(); var id_token = googleUser.getAuthResponse().id_token; self.close(); app.user.passwordRename(data.username, id_token, data.special); From aade9ef11e323cc95fb91caa94453973c003d739 Mon Sep 17 00:00:00 2001 From: Ridaz Date: Fri, 7 Sep 2018 19:24:59 +0100 Subject: [PATCH 0008/1782] Fix misc animation errors --- src/battle-animations-moves.ts | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/battle-animations-moves.ts b/src/battle-animations-moves.ts index d362ad955d..c8c927d23d 100644 --- a/src/battle-animations-moves.ts +++ b/src/battle-animations-moves.ts @@ -18812,9 +18812,9 @@ const BattleMoveAnims: AnimTable = { }, solarblade: { anim(scene, [attacker, defender]) { - var xstep = (attacker.x - attacker.x) / 5; + var xstep = attacker.x / 5; var ystep = (attacker.x + 200 - attacker.x) / 5; - var zstep = (attacker.z - attacker.z) / 5; + var zstep = attacker.z / 5; scene.backgroundEffect("url('https://play.pokemonshowdown.com/fx/weather-sunnyday.jpg')", 900, 0.5); @@ -23407,11 +23407,6 @@ const BattleMoveAnims: AnimTable = { time: 500 }, 'ballistic2Back'); - var xf = [1, -1, 1, -1]; - var yf = [1, -1, -1, 1]; - var xf2 = [1, 0, -1, 0]; - var yf2 = [0, 1, 0, -1]; - scene.showEffect('shadowball', { x: attacker.x, y: attacker.y - 50, @@ -23424,7 +23419,7 @@ const BattleMoveAnims: AnimTable = { scale: 2, xscale: 8, opacity: 0.1, - time: 1300 + time: 700 }, 'decel', 'fade'); } }, @@ -27345,7 +27340,7 @@ const BattleMoveAnims: AnimTable = { scene.backgroundEffect('linear-gradient(#440044 30%, #000000', 1500, 0.6); var xstep = (defender.x + 200 - defender.x) / 5; var ystep = (defender.x - 200 - defender.x) / 5; - var zstep = (defender.z - defender.z) / 5; + var zstep = defender.z / 5; for (var i = 0; i < 5; i++) { scene.showEffect('poisonwisp', { From 3cccd571bb969b8dcce67d3854c57de22c70a6cd Mon Sep 17 00:00:00 2001 From: Ridaz Date: Sat, 8 Sep 2018 16:02:28 +0100 Subject: [PATCH 0009/1782] Correct Solar Blade animation --- src/battle-animations-moves.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/battle-animations-moves.ts b/src/battle-animations-moves.ts index c8c927d23d..5a795bac44 100644 --- a/src/battle-animations-moves.ts +++ b/src/battle-animations-moves.ts @@ -18812,9 +18812,9 @@ const BattleMoveAnims: AnimTable = { }, solarblade: { anim(scene, [attacker, defender]) { - var xstep = attacker.x / 5; - var ystep = (attacker.x + 200 - attacker.x) / 5; - var zstep = attacker.z / 5; + var xstep = 0; + var ystep = 20; + var zstep = 0; scene.backgroundEffect("url('https://play.pokemonshowdown.com/fx/weather-sunnyday.jpg')", 900, 0.5); From 8dafd449c0d3476decd438b9dc32c9ed76b35aa3 Mon Sep 17 00:00:00 2001 From: asgdf Date: Sun, 9 Sep 2018 10:25:28 +0200 Subject: [PATCH 0010/1782] Tooltips: Show status Z-move effects (#1145) --- js/client-battle-tooltips.js | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/js/client-battle-tooltips.js b/js/client-battle-tooltips.js index ec909145c6..9c88440941 100644 --- a/js/client-battle-tooltips.js +++ b/js/client-battle-tooltips.js @@ -180,6 +180,29 @@ var BattleTooltips = (function () { BattleTooltips.hideTooltip(); }; + BattleTooltips.prototype.zMoveEffects = { + 'clearnegativeboost': "Restores negative stat stages to 0", + 'crit2': "Crit ratio +2", + 'heal': "Restores HP 100%", + 'curse': "Restores HP 100% if user is Ghost type, otherwise Attack +1", + 'redirect': "Redirects opposing attacks to user", + 'healreplacement': "Restores replacement's HP 100%" + }; + + BattleTooltips.prototype.getStatusZMoveEffect = function (move) { + if (move.zMoveEffect in this.zMoveEffects) { + return this.zMoveEffects[move.zMoveEffect]; + } + var boostText = ''; + if (move.zMoveBoost) { + var boosts = Object.keys(move.zMoveBoost); + boostText = boosts.map(function (stat) { + return BattleStats[stat] + ' +' + move.zMoveBoost[stat]; + }).join(', '); + } + return boostText; + }; + BattleTooltips.prototype.zMoveTable = { Poison: "Acid Downpour", Fighting: "All-Out Pummeling", @@ -205,6 +228,7 @@ var BattleTooltips = (function () { var text = ''; var basePowerText = ''; var additionalInfo = ''; + var zEffect = ''; var yourActive = this.battle.yourSide.active; var pokemon = this.battle.mySide.active[this.room.choice.choices.length]; var pokemonData = this.room.myPokemon[pokemon.slot]; @@ -219,7 +243,7 @@ var BattleTooltips = (function () { } else if (move.category === 'Status') { move = JSON.parse(JSON.stringify(move)); move.name = 'Z-' + move.name; - // TODO: show zMoveBoost/Effect + zEffect = this.getStatusZMoveEffect(move); } else { var zmove = Tools.getMove(this.zMoveTable[item.zMoveType]); zmove = JSON.parse(JSON.stringify(zmove)); @@ -297,6 +321,7 @@ var BattleTooltips = (function () { text += basePowerText; if (additionalInfo) text += '

' + additionalInfo + '

'; text += '

Accuracy: ' + accuracy + '

'; + if (zEffect) text += '

Z-Effect: ' + zEffect + '

'; if (move.desc) { if (this.battle.gen < 7 || this.battle.hardcoreMode) { var desc = move.shortDesc; From 8e9c95b509bcb4dae6f7a42dbd6233f9a7bdf89a Mon Sep 17 00:00:00 2001 From: asgdf Date: Mon, 10 Sep 2018 06:52:41 +0200 Subject: [PATCH 0011/1782] Tooltips: Properly show shortdesc for moves without long desc (#1146) --- js/client-battle-tooltips.js | 136 +++++++++++++++++------------------ 1 file changed, 67 insertions(+), 69 deletions(-) diff --git a/js/client-battle-tooltips.js b/js/client-battle-tooltips.js index 9c88440941..58b0834d3c 100644 --- a/js/client-battle-tooltips.js +++ b/js/client-battle-tooltips.js @@ -322,80 +322,78 @@ var BattleTooltips = (function () { if (additionalInfo) text += '

' + additionalInfo + '

'; text += '

Accuracy: ' + accuracy + '

'; if (zEffect) text += '

Z-Effect: ' + zEffect + '

'; - if (move.desc) { - if (this.battle.gen < 7 || this.battle.hardcoreMode) { - var desc = move.shortDesc; - for (var i = this.battle.gen; i < 7; i++) { - if (move.id in BattleTeambuilderTable['gen' + i].overrideMoveDesc) { - desc = BattleTeambuilderTable['gen' + i].overrideMoveDesc[move.id]; - break; - } - } - text += '

' + desc + '

'; - } else { - text += '

'; - if (move.priority > 1) { - text += 'Nearly always moves first (priority +' + move.priority + ').

'; - } else if (move.priority <= -1) { - text += 'Nearly always moves last (priority −' + (-move.priority) + ').

'; - } else if (move.priority == 1) { - text += 'Usually moves first (priority +' + move.priority + ').

'; + if (this.battle.gen < 7 || this.battle.hardcoreMode) { + var desc = move.shortDesc; + for (var i = this.battle.gen; i < 7; i++) { + if (move.id in BattleTeambuilderTable['gen' + i].overrideMoveDesc) { + desc = BattleTeambuilderTable['gen' + i].overrideMoveDesc[move.id]; + break; } + } + text += '

' + desc + '

'; + } else { + text += '

'; + if (move.priority > 1) { + text += 'Nearly always moves first (priority +' + move.priority + ').

'; + } else if (move.priority <= -1) { + text += 'Nearly always moves last (priority −' + (-move.priority) + ').

'; + } else if (move.priority == 1) { + text += 'Usually moves first (priority +' + move.priority + ').

'; + } - text += '' + (move.desc || move.shortDesc) + '

'; + text += '' + (move.desc || move.shortDesc) + '

'; - if ('defrost' in move.flags) { - text += '

The user thaws out if it is frozen.

'; - } - if (!('protect' in move.flags) && move.target !== 'self' && move.target !== 'allySide' && move.target !== 'allyTeam') { - text += '

Bypasses Protect (and Detect, King\'s Shield, Spiky Shield)

'; - } - if ('authentic' in move.flags) { - text += '

Bypasses Substitute (but does not break it)

'; - } - if (!('reflectable' in move.flags) && move.target !== 'self' && move.target !== 'allySide' && move.target !== 'allyTeam' && move.category === 'Status') { - text += '

✓ Not bounceable (can\'t be bounced by Magic Coat/Bounce)

'; - } + if ('defrost' in move.flags) { + text += '

The user thaws out if it is frozen.

'; + } + if (!('protect' in move.flags) && move.target !== 'self' && move.target !== 'allySide' && move.target !== 'allyTeam') { + text += '

Bypasses Protect (and Detect, King\'s Shield, Spiky Shield)

'; + } + if ('authentic' in move.flags) { + text += '

Bypasses Substitute (but does not break it)

'; + } + if (!('reflectable' in move.flags) && move.target !== 'self' && move.target !== 'allySide' && move.target !== 'allyTeam' && move.category === 'Status') { + text += '

✓ Not bounceable (can\'t be bounced by Magic Coat/Bounce)

'; + } - if ('contact' in move.flags) { - text += '

✓ Contact (triggers Iron Barbs, Spiky Shield, etc)

'; - } - if ('sound' in move.flags) { - text += '

✓ Sound (doesn\'t affect Soundproof pokemon)

'; - } - if ('powder' in move.flags) { - text += '

✓ Powder (doesn\'t affect Grass, Overcoat, Safety Goggles)

'; - } - if ('punch' in move.flags && ability === 'ironfist') { - text += '

✓ Fist (boosted by Iron Fist)

'; - } - if ('pulse' in move.flags && ability === 'megalauncher') { - text += '

✓ Pulse (boosted by Mega Launcher)

'; - } - if ('bite' in move.flags && ability === 'strongjaw') { - text += '

✓ Bite (boosted by Strong Jaw)

'; - } - if ((move.recoil || move.hasCustomRecoil) && ability === 'reckless') { - text += '

✓ Recoil (boosted by Reckless)

'; - } - if ('bullet' in move.flags) { - text += '

✓ Ballistic (doesn\'t affect Bulletproof pokemon)

'; - } + if ('contact' in move.flags) { + text += '

✓ Contact (triggers Iron Barbs, Spiky Shield, etc)

'; + } + if ('sound' in move.flags) { + text += '

✓ Sound (doesn\'t affect Soundproof pokemon)

'; + } + if ('powder' in move.flags) { + text += '

✓ Powder (doesn\'t affect Grass, Overcoat, Safety Goggles)

'; + } + if ('punch' in move.flags && ability === 'ironfist') { + text += '

✓ Fist (boosted by Iron Fist)

'; + } + if ('pulse' in move.flags && ability === 'megalauncher') { + text += '

✓ Pulse (boosted by Mega Launcher)

'; + } + if ('bite' in move.flags && ability === 'strongjaw') { + text += '

✓ Bite (boosted by Strong Jaw)

'; + } + if ((move.recoil || move.hasCustomRecoil) && ability === 'reckless') { + text += '

✓ Recoil (boosted by Reckless)

'; + } + if ('bullet' in move.flags) { + text += '

✓ Ballistic (doesn\'t affect Bulletproof pokemon)

'; + } - if (this.battle.gameType === 'doubles') { - if (move.target === 'allAdjacent') { - text += '

◎ Hits both foes and ally.

'; - } else if (move.target === 'allAdjacentFoes') { - text += '

◎ Hits both foes.

'; - } - } else if (this.battle.gameType === 'triples') { - if (move.target === 'allAdjacent') { - text += '

◎ Hits adjacent foes and allies.

'; - } else if (move.target === 'allAdjacentFoes') { - text += '

◎ Hits adjacent foes.

'; - } else if (move.target === 'any') { - text += '

◎ Can target distant Pokémon in Triples.

'; - } + if (this.battle.gameType === 'doubles') { + if (move.target === 'allAdjacent') { + text += '

◎ Hits both foes and ally.

'; + } else if (move.target === 'allAdjacentFoes') { + text += '

◎ Hits both foes.

'; + } + } else if (this.battle.gameType === 'triples') { + if (move.target === 'allAdjacent') { + text += '

◎ Hits adjacent foes and allies.

'; + } else if (move.target === 'allAdjacentFoes') { + text += '

◎ Hits adjacent foes.

'; + } else if (move.target === 'any') { + text += '

◎ Can target distant Pokémon in Triples.

'; } } } From 73030656bb1ec477524f1212378adb1167337cb0 Mon Sep 17 00:00:00 2001 From: The Immortal Date: Wed, 19 Sep 2018 00:28:34 +0400 Subject: [PATCH 0012/1782] Ladder: Hide sections without any formats And fix Unrated Random Battle being displayed. --- js/client-ladder.js | 2 +- js/client.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/client-ladder.js b/js/client-ladder.js index 5cd7d4ec35..c8b3e674fd 100644 --- a/js/client-ladder.js +++ b/js/client-ladder.js @@ -116,11 +116,11 @@ var curSection = ''; for (var i in BattleFormats) { var format = BattleFormats[i]; + if (!format.rated || !format.searchShow) continue; if (format.section && format.section !== curSection) { curSection = format.section; buf += '

' + Tools.escapeHTML(curSection) + '

    '; } - if (!format.searchShow || !format.rated) continue; buf += '
  • '; } buf += '
'; diff --git a/js/client.js b/js/client.js index 402ca600df..b7f565c7c7 100644 --- a/js/client.js +++ b/js/client.js @@ -1171,7 +1171,7 @@ searchShow: searchShow, challengeShow: challengeShow, tournamentShow: tournamentShow, - rated: searchShow && id.substr(0, 7) !== 'unrated', + rated: searchShow && id.substr(4, 7) !== 'unrated', teambuilderLevel: teambuilderLevel, teambuilderFormat: teambuilderFormat, isTeambuilderFormat: isTeambuilderFormat, From 24ed8577bf51057633be35115bb1d750e1f0ef51 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Thu, 27 Sep 2018 20:28:16 -0500 Subject: [PATCH 0013/1782] Battles: Fix weather state when switching sides --- src/battle-animations.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle-animations.ts b/src/battle-animations.ts index ac8a097994..3dd585b6fe 100644 --- a/src/battle-animations.ts +++ b/src/battle-animations.ts @@ -182,6 +182,8 @@ class BattleScene { this.messagebarOpen = false; this.timeOffset = 0; this.pokemonTimeOffset = 0; + this.curTerrain = ''; + this.curWeather = ''; } animationOff() { From a05669b7542b87fa1890d835bbca23cb4e6de245 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Fri, 21 Sep 2018 20:18:53 -0400 Subject: [PATCH 0014/1782] Support importing teams in mixed format Restoring a backup previously required all teams to be packed, or all teams to be unpacked. Now, we support pasting a mix of packed and unpacked teams. --- js/storage.js | 48 +++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/js/storage.js b/js/storage.js index 70ed04aee2..76889d72c8 100644 --- a/js/storage.js +++ b/js/storage.js @@ -587,23 +587,25 @@ Storage.unpackAllTeams = function (buffer) { }); } - return buffer.split('\n').map(function (line) { - var pipeIndex = line.indexOf('|'); - if (pipeIndex < 0) return ''; - var bracketIndex = line.indexOf(']'); - if (bracketIndex > pipeIndex) bracketIndex = -1; - var slashIndex = line.lastIndexOf('/', pipeIndex); - if (slashIndex < 0) slashIndex = bracketIndex; // line.slice(slashIndex + 1, pipeIndex) will be '' - var format = bracketIndex > 0 ? line.slice(0, bracketIndex) : 'gen7'; - if (format && format.slice(0, 3) !== 'gen') format = 'gen6' + format; - return { - name: line.slice(slashIndex + 1, pipeIndex), - format: format, - team: line.slice(pipeIndex + 1), - folder: line.slice(bracketIndex + 1, slashIndex > 0 ? slashIndex : bracketIndex + 1), - iconCache: '' - }; - }).filter(function (v) { return v; }); + return buffer.split('\n').map(Storage.unpackLine).filter(function (v) { return v; }); +}; + +Storage.unpackLine = function (line) { + var pipeIndex = line.indexOf('|'); + if (pipeIndex < 0) return null; + var bracketIndex = line.indexOf(']'); + if (bracketIndex > pipeIndex) bracketIndex = -1; + var slashIndex = line.lastIndexOf('/', pipeIndex); + if (slashIndex < 0) slashIndex = bracketIndex; // line.slice(slashIndex + 1, pipeIndex) will be '' + var format = bracketIndex > 0 ? line.slice(0, bracketIndex) : 'gen7'; + if (format && format.slice(0, 3) !== 'gen') format = 'gen6' + format; + return { + name: line.slice(slashIndex + 1, pipeIndex), + format: format, + team: line.slice(pipeIndex + 1), + folder: line.slice(bracketIndex + 1, slashIndex > 0 ? slashIndex : bracketIndex + 1), + iconCache: '' + }; }; Storage.packAllTeams = function (teams) { @@ -1045,7 +1047,7 @@ Storage.importTeam = function (buffer, teams) { if (format && format.slice(0, 3) !== 'gen') format = 'gen6' + format; line = $.trim(line.substr(bracketIndex + 1)); } - if (teams.length) { + if (teams.length && typeof teams[teams.length - 1].team !== 'string') { teams[teams.length - 1].team = Storage.packTeam(teams[teams.length - 1].team); } var slashIndex = line.lastIndexOf('/'); @@ -1061,10 +1063,10 @@ Storage.importTeam = function (buffer, teams) { folder: folder, iconCache: '' }); - } else if (!team) { - // not in backup format - Storage.teams = Storage.unpackAllTeams(buffer); - return; + } else if (line.includes('|')) { + // packed format + curSet = null; + teams.push(Storage.unpackLine(line)); } else if (!curSet) { curSet = {name: '', species: '', gender: ''}; team.push(curSet); @@ -1159,7 +1161,7 @@ Storage.importTeam = function (buffer, teams) { curSet.moves.push(line); } } - if (teams && teams.length) { + if (teams && teams.length && typeof teams[teams.length - 1].team !== 'string') { teams[teams.length - 1].team = Storage.packTeam(teams[teams.length - 1].team); } return team; From 22aedd4471669d5cb8d19a1fda8c12e7bd68737b Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Sun, 7 Oct 2018 05:52:43 -0600 Subject: [PATCH 0015/1782] Support ZU in the teambuilder (#1152) --- build-tools/build-indexes | 10 +++++----- js/search.js | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/build-tools/build-indexes b/build-tools/build-indexes index 9ae6e35a62..d8ba110d77 100755 --- a/build-tools/build-indexes +++ b/build-tools/build-indexes @@ -367,18 +367,18 @@ process.stdout.write("Building `data/teambuilder-tables.js`... "); return ["CAP", "CAP NFE", "CAP LC", "Uber", "OU", "UUBL", "UU", "RUBL", "RU", "NUBL", "NU", "NFE", "LC Uber", "LC"]; } if (gen === 'gen7') { - return ["CAP", "CAP NFE", "CAP LC", "Uber", "OU", "UUBL", "(OU)", "UU", "RUBL", "RU", "NUBL", "NU", "PUBL", "PU", "New", "Unreleased", "NFE", "LC Uber", "LC"]; + return ["CAP", "CAP NFE", "CAP LC", "Uber", "OU", "UUBL", "(OU)", "UU", "RUBL", "RU", "NUBL", "NU", "PUBL", "PU", "(PU)", "New", "Unreleased", "NFE", "LC Uber", "LC"]; } - return ["CAP", "CAP NFE", "CAP LC", "Uber", "OU", "UUBL", "(OU)", "UU", "RUBL", "RU", "NUBL", "NU", "PUBL", "PU", "NFE", "LC Uber", "LC"]; + return ["CAP", "CAP NFE", "CAP LC", "Uber", "OU", "UUBL", "(OU)", "UU", "RUBL", "RU", "NUBL", "NU", "PUBL", "PU", "(PU)", "NFE", "LC Uber", "LC"]; })(); for (const tier of tierOrder) { - if (tier in {OU:1, Uber:1, UU:1, RU:1, NU:1, PU:1, LC:1, DOU:1, DUU:1, DNU:1, "(PU)":1, New:1, Legal:1, Regular:1, "Restricted Legendary":1, "CAP LC":1}) { - formatSlices[tier === "(PU)" ? "FU" : tier] = tiers.length; + if (tier in {OU:1, Uber:1, UU:1, RU:1, NU:1, PU:1, "(PU)":1, LC:1, DOU:1, DUU:1, DNU:1, New:1, Legal:1, Regular:1, "Restricted Legendary":1, "CAP LC":1}) { + formatSlices[tier === "(PU)" ? "ZU" : tier] = tiers.length; } if (!tierTable[tier]) continue; if (tier === '(PU)') { - // tiers.push(['header', "Below PU"]); + tiers.push(['header', "Below PU"]); } else if (tier.charAt(0) === '(') { tiers.push(['header', tier.slice(1, -1) + " by technicality"]); } else if (tier === "NFE") { diff --git a/js/search.js b/js/search.js index 8d4aef539c..0c4a97a73b 100644 --- a/js/search.js +++ b/js/search.js @@ -835,7 +835,8 @@ else if (format === 'uu') tierSet = tierSet.slice(slices.UU); else if (format === 'ru') tierSet = tierSet.slice(slices.RU); else if (format === 'nu') tierSet = tierSet.slice(slices.NU); - else if (format === 'pu' || format === 'zu') tierSet = tierSet.slice(slices.PU); + else if (format === 'pu') tierSet = tierSet.slice(slices.PU); + else if (format === 'zu') tierSet = tierSet.slice(slices.ZU); else if (format === 'lc' || format === 'lcuu') tierSet = tierSet.slice(slices.LC); else if (format === 'cap') tierSet = tierSet.slice(0, slices.Uber).concat(tierSet.slice(slices.OU)); else if (format === 'caplc') tierSet = tierSet.slice(slices['CAP LC'], slices.Uber).concat(tierSet.slice(slices.LC)); From ce14663c254d1773c121d2c7287a40fc432eeccd Mon Sep 17 00:00:00 2001 From: Alvin Ho Date: Mon, 8 Oct 2018 14:32:46 -0700 Subject: [PATCH 0016/1782] Fix Toxic Orb and 'Next Damage' toolbox interaction (#1155) --- src/battle.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/battle.ts b/src/battle.ts index 1d1ed4be20..dfeb000b66 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -868,7 +868,7 @@ class Side { this.battle.message('' + Tools.escapeHTML(pokemon.side.name) + ' withdrew ' + pokemon.getFullName() + '!'); } } - if (pokemon.statusData.toxicTurns) pokemon.statusData.toxicTurns = 1; + if (pokemon.statusData.toxicTurns != null) pokemon.statusData.toxicTurns = 1; if (this.battle.gen === 5) pokemon.statusData.sleepTurns = 0; this.lastPokemon = pokemon; this.active[slot] = null; @@ -1239,7 +1239,7 @@ class Battle { for (let i = 0; i < this.sides.length; i++) { for (let slot = 0; slot < this.sides[i].active.length; slot++) { let poke = this.sides[i].active[slot]; - if (poke && poke.statusData && poke.statusData.toxicTurns) poke.statusData.toxicTurns++; + if (poke && poke.statusData && poke.statusData.toxicTurns !== null) poke.statusData.toxicTurns++; } } } @@ -2383,7 +2383,8 @@ class Battle { case 'tox': this.scene.resultAnim(poke, 'Toxic poison', 'psn'); this.scene.runStatusAnim('psn' as ID, [poke]); - poke.statusData.toxicTurns = 1; + if (effect.name === "Toxic Orb") poke.statusData.toxicTurns = 0; + else poke.statusData.toxicTurns = 1; actions += "" + poke.getName() + " was badly poisoned" + effectMessage + "!"; break; case 'psn': @@ -2472,7 +2473,7 @@ class Battle { else actions += "" + pokeName + " healed its burn!"; break; case 'tox': - if (poke) poke.statusData.toxicTurns = 0; + if (poke) poke.statusData.toxicTurns = null; // falls through case 'psn': if (poke) this.scene.resultAnim(poke, 'Poison cured', 'good'); From 06621ba2f7ca041853cca40566a57e4265be4b6d Mon Sep 17 00:00:00 2001 From: Alvin Ho Date: Mon, 8 Oct 2018 14:35:17 -0700 Subject: [PATCH 0017/1782] Fix Forme Change and Autotomize Interaction (Client Side) (#1153) --- src/battle.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle.ts b/src/battle.ts index dfeb000b66..b5eb85c8b8 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -2875,6 +2875,7 @@ class Battle { let isCustomAnim = false; poke.removeVolatile('typeadd' as ID); poke.removeVolatile('typechange' as ID); + if (this.gen >= 7) poke.removeVolatile('autotomize' as ID); if (kwargs.silent) { // do nothing From 7df9e5a7ea28f4cba2e396a9cd10ca016ab4bc1b Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Sun, 14 Oct 2018 04:36:58 -0500 Subject: [PATCH 0018/1782] Make Babel output compact This doesn't change debuggability and saves a bit of bandwidth. But most importantly, it might help Windows users who are having trouble compiling because Babel runs out of memory. --- .babelrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.babelrc b/.babelrc index 1b8ed30b21..516922132b 100644 --- a/.babelrc +++ b/.babelrc @@ -27,5 +27,6 @@ "ignore": [ "src/globals.d.ts" ], + "compact": true, "retainLines": true } From 2c43954c41191e20999ee57d55998df848fc4a37 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Sun, 14 Oct 2018 21:14:48 -0500 Subject: [PATCH 0019/1782] Fix Toxic turn tracking The Toxic turn tracker is now 1 off from previously; it now counts the previous Toxic turn rather than the next one. This makes "0" more intuitively represent the state before any Toxic damage is taken. This fix mainly just fixes the type issue by removing the need for a null value at all. --- js/client-battle-tooltips.js | 4 ++-- src/battle.ts | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/js/client-battle-tooltips.js b/js/client-battle-tooltips.js index 58b0834d3c..439ccc8809 100644 --- a/js/client-battle-tooltips.js +++ b/js/client-battle-tooltips.js @@ -440,9 +440,9 @@ var BattleTooltips = (function () { if (pokemon.statusData) { if (pokemon.status === 'tox') { if (pokemon.ability === 'Poison Heal' || pokemon.ability === 'Magic Guard') { - text += ' Would take if ability removed: ' + Math.floor(100 / 16) * Math.min(pokemon.statusData.toxicTurns, 15) + '%'; + text += ' Would take if ability removed: ' + Math.floor(100 / 16) * Math.min(pokemon.statusData.toxicTurns + 1, 15) + '%'; } else { - text += ' Next damage: ' + Math.floor(100 / 16) * Math.min(pokemon.statusData.toxicTurns, 15) + '%'; + text += ' Next damage: ' + Math.floor(100 / 16) * Math.min(pokemon.statusData.toxicTurns + 1, 15) + '%'; } } else if (pokemon.status === 'slp') { text += ' Turns asleep: ' + pokemon.statusData.sleepTurns; diff --git a/src/battle.ts b/src/battle.ts index b5eb85c8b8..cc533caffb 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -868,7 +868,7 @@ class Side { this.battle.message('' + Tools.escapeHTML(pokemon.side.name) + ' withdrew ' + pokemon.getFullName() + '!'); } } - if (pokemon.statusData.toxicTurns != null) pokemon.statusData.toxicTurns = 1; + pokemon.statusData.toxicTurns = 0; if (this.battle.gen === 5) pokemon.statusData.sleepTurns = 0; this.lastPokemon = pokemon; this.active[slot] = null; @@ -1239,7 +1239,7 @@ class Battle { for (let i = 0; i < this.sides.length; i++) { for (let slot = 0; slot < this.sides[i].active.length; slot++) { let poke = this.sides[i].active[slot]; - if (poke && poke.statusData && poke.statusData.toxicTurns !== null) poke.statusData.toxicTurns++; + if (poke && poke.status === 'tox') poke.statusData.toxicTurns++; } } } @@ -2383,8 +2383,7 @@ class Battle { case 'tox': this.scene.resultAnim(poke, 'Toxic poison', 'psn'); this.scene.runStatusAnim('psn' as ID, [poke]); - if (effect.name === "Toxic Orb") poke.statusData.toxicTurns = 0; - else poke.statusData.toxicTurns = 1; + poke.statusData.toxicTurns = (effect.name === "Toxic Orb" ? -1 : 0); actions += "" + poke.getName() + " was badly poisoned" + effectMessage + "!"; break; case 'psn': @@ -2473,9 +2472,8 @@ class Battle { else actions += "" + pokeName + " healed its burn!"; break; case 'tox': - if (poke) poke.statusData.toxicTurns = null; - // falls through case 'psn': + if (poke) poke.statusData.toxicTurns = 0; if (poke) this.scene.resultAnim(poke, 'Poison cured', 'good'); if (effect.effectType === 'Item') { actions += "" + pokeName + "'s " + effect.name + " cured its poison!"; From 42d6c0d1641b958a815dbe06b3b5ed0f931e85f9 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Sun, 14 Oct 2018 21:28:22 -0500 Subject: [PATCH 0020/1782] Battles: Use polyfills over jQuery We were previously using jQuery's $.trim() and Array.isArray(), but we're now trying to remove the jQuery dependency from battle.ts. --- src/battle-dex.ts | 24 +++++++++++++++++------- src/battle.ts | 10 +++++----- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/battle-dex.ts b/src/battle-dex.ts index dc79e548e0..6e54717a6b 100644 --- a/src/battle-dex.ts +++ b/src/battle-dex.ts @@ -29,6 +29,11 @@ if (!Array.prototype.includes) { return this.indexOf(thing) !== -1; }; } +if (!Array.isArray) { + Array.isArray = function (thing): thing is any[] { + return Object.prototype.toString.call(thing) === '[object Array]'; + }; +} if (!String.prototype.includes) { String.prototype.includes = function (thing) { return this.indexOf(thing) !== -1; @@ -44,6 +49,11 @@ if (!String.prototype.endsWith) { return this.slice(-thing.length) === thing; }; } +if (!String.prototype.trim) { + String.prototype.trim = function () { + return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + }; +} if (!Object.assign) { Object.assign = function (thing: any, rest: any) { for (var i = 1; i < arguments.length; i++) { @@ -183,12 +193,12 @@ const Tools = { resourcePrefix: (() => { let prefix = ''; - if (document.location.protocol !== 'http:') prefix = 'https:'; + if (document.location!.protocol !== 'http:') prefix = 'https:'; return prefix + '//play.pokemonshowdown.com/'; })(), fxPrefix: (() => { - if (document.location.protocol === 'file:') { + if (document.location!.protocol === 'file:') { if (window.Replays) return 'https://play.pokemonshowdown.com/fx/'; return 'fx/'; } @@ -649,7 +659,7 @@ const Tools = { getEffect(effect: any): Effect { if (!effect || typeof effect === 'string') { - let name = $.trim(effect || ''); + let name = (effect || '').trim(); if (name.substr(0, 5) === 'item:') { return Tools.getItem(name.substr(5)); } else if (name.substr(0, 8) === 'ability:') { @@ -692,7 +702,7 @@ const Tools = { getMove(move: any): Move { if (!move || typeof move === 'string') { - let name = $.trim(move || ''); + let name = (move || '').trim(); let id = toId(name); move = (window.BattleMovedex && window.BattleMovedex[id]) || {}; if (move.name) move.exists = true; @@ -752,7 +762,7 @@ const Tools = { getItem(item: any): Item { if (!item || typeof item === 'string') { - let name = $.trim(item || ''); + let name = (item || '').trim(); let id = toId(name); item = (window.BattleItems && window.BattleItems[id]) || {}; if (item.name) item.exists = true; @@ -777,7 +787,7 @@ const Tools = { getAbility(ability: any): Ability { if (!ability || typeof ability === 'string') { - let name = $.trim(ability || ''); + let name = (ability || '').trim(); let id = toId(name); ability = (window.BattleAbilities && window.BattleAbilities[id]) || {}; if (ability.name) ability.exists = true; @@ -888,7 +898,7 @@ const Tools = { if (template.otherForms && template.otherForms.indexOf(speciesid) >= 0) { if (!window.BattlePokedexAltForms) window.BattlePokedexAltForms = {}; if (!window.BattlePokedexAltForms[speciesid]) { - template = window.BattlePokedexAltForms[speciesid] = $.extend({}, template); + template = window.BattlePokedexAltForms[speciesid] = Object.assign({}, template); let form = speciesid.slice(template.baseSpecies.length); let formid = '-' + form; form = form[0].toUpperCase() + form.slice(1); diff --git a/src/battle.ts b/src/battle.ts index cc533caffb..8e680e7fc9 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -4438,7 +4438,7 @@ class Battle { let message = args[1].slice(pipeIndex + 1); let isHighlighted = window.app && app.rooms && app.rooms[this.roomid].getHighlight(message); let parsedMessage = Tools.parseChatMessage(message, name, '', isHighlighted); - if (!$.isArray(parsedMessage)) parsedMessage = [parsedMessage]; + if (!Array.isArray(parsedMessage)) parsedMessage = [parsedMessage]; for (let i = 0; i < parsedMessage.length; i++) { if (!parsedMessage[i]) continue; this.scene.log(parsedMessage[i], preempt); @@ -4564,7 +4564,7 @@ class Battle { let newSpecies = args[2]; let commaIndex = newSpecies.indexOf(','); if (commaIndex !== -1) { - let level = $.trim(newSpecies.substr(commaIndex + 1)); + let level = newSpecies.substr(commaIndex + 1).trim(); if (level.charAt(0) === 'L') { poke.level = parseInt(level.substr(1), 10); } @@ -4737,7 +4737,7 @@ class Battle { let bracketPos = argstr.indexOf(']'); if (bracketPos <= 0) break; // default to '.' so it evaluates to boolean true - kwargs[argstr.substr(1, bracketPos - 1)] = ($.trim(argstr.substr(bracketPos + 1)) || '.'); + kwargs[argstr.substr(1, bracketPos - 1)] = (argstr.substr(bracketPos + 1).trim() || '.'); args.pop(); } } @@ -4748,14 +4748,14 @@ class Battle { let nextKwargs = {} as {[k: string]: string}; nextLine = this.activityQueue[this.activityStep + 1] || ''; if (nextLine && nextLine.substr(0, 2) === '|-') { - nextLine = $.trim(nextLine.substr(1)); + nextLine = nextLine.substr(1).trim(); nextArgs = nextLine.split('|'); while (nextArgs[nextArgs.length - 1] && nextArgs[nextArgs.length - 1].substr(0, 1) === '[') { let bracketPos = nextArgs[nextArgs.length - 1].indexOf(']'); if (bracketPos <= 0) break; let argstr = nextArgs.pop()!; // default to '.' so it evaluates to boolean true - nextKwargs[argstr.substr(1, bracketPos - 1)] = ($.trim(argstr.substr(bracketPos + 1)) || '.'); + nextKwargs[argstr.substr(1, bracketPos - 1)] = (argstr.substr(bracketPos + 1).trim() || '.'); } } From 8133c8fd3f17fa6a37bb916814806eff0b88fbc2 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Sun, 14 Oct 2018 21:47:03 -0500 Subject: [PATCH 0021/1782] Battles: Move more jQuery stuff to BattleScene --- src/battle-animations.ts | 11 +++++++++++ src/battle.ts | 19 ++----------------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/battle-animations.ts b/src/battle-animations.ts index 3dd585b6fe..c004da393f 100644 --- a/src/battle-animations.ts +++ b/src/battle-animations.ts @@ -204,6 +204,7 @@ class BattleScene { } animationOn() { if (this.animating) return; + $.fx.off = false; this.animating = true; this.$battle.find('.seeking').remove(); this.updateSidebars(); @@ -490,6 +491,16 @@ class BattleScene { } } } + unlink(userid: string, showRevealButton = false) { + if (Tools.prefs('nounlink')) return; + let $messages = $('.chatmessage-' + userid); + if (!$messages.length) return; + $messages.find('a').contents().unwrap(); + if (window.BattleRoom && showRevealButton) { + $messages.hide().addClass('revealed').find('button').parent().remove(); + this.log('
'); + } + } // General updating ///////////////////////////////////////////////////////////////////// diff --git a/src/battle.ts b/src/battle.ts index 8e680e7fc9..dd3c87bec1 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -1097,18 +1097,10 @@ class Battle { if (side) side.reset(); } - if (this.ignoreNicks) { - let $log = $('.battle-log .inner'); - if ($log.length) $log.addClass('hidenicks'); - let $message = $('.battle .message'); - if ($message.length) $message.addClass('hidenicks'); - } - // activity queue state this.activeMoveIsSpread = null; this.activityStep = 0; this.fastForwardOff(); - $.fx.off = false; this.minorQueue = []; this.resultWaiting = false; this.paused = true; @@ -1407,7 +1399,7 @@ class Battle { default: // April Fool's 2014 if (window.Config && Config.server && Config.server.afd && move.id === 'earthquake') { - if (!this.fastForward) { + if (!this.fastForward && window.$) { $('body').css({ position: 'absolute', left: 0, @@ -4680,15 +4672,8 @@ class Battle { } case 'seed': case 'choice': { break; } case 'unlink': { - if (Tools.prefs('nounlink')) return; let user = toId(args[2]) || toId(args[1]); - let $messages = $('.chatmessage-' + user); - if (!$messages.length) break; - $messages.find('a').contents().unwrap(); - if (window.BattleRoom && args[2]) { - $messages.hide().addClass('revealed').find('button').parent().remove(); - this.scene.log('
'); - } + this.scene.unlink(user, !!args[2]); break; } case 'fieldhtml': { this.playbackState = Playback.Seeking; // force seeking to prevent controls etc From 2aa13ed10c98b5076269a75b714536986cc46dd7 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Sun, 14 Oct 2018 22:05:10 -0500 Subject: [PATCH 0022/1782] Update CONTRIBUTING.md for new polyfills --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1abc9bff84..fc7de3f7d6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,9 +19,11 @@ This is very restrictive for 2018, but fortunately, with Babel 7 and polyfills, We have polyfills for: - `Array#includes` - Note: won't be able to find `NaN`s +- `Array.isArray` - `String#startsWith` - `String#endsWith` - `String#includes` +- `String#trim` - `Object.assign` - `Object.create` - Note: second argument is unsupported From b6dcc4da3505ac94c74cc75f1022edf4d872d9c1 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Sun, 14 Oct 2018 22:05:29 -0500 Subject: [PATCH 0023/1782] Remove jQuery-JSON dependency We now just use JSON.parse and JSON.stringify - it's supported by all browsers supported by the client. Tools.safeJSON has also been moved to Storage.safeJSON, since it's not used in replays at all. --- index.template.html | 1 - js/client-battle.js | 2 +- js/client-chat.js | 2 +- js/client-topbar.js | 4 ++-- js/client.js | 8 ++++---- js/lib/jquery.json-2.3.min.js | 23 ----------------------- js/storage.js | 18 +++++++++++++----- src/battle-dex.ts | 8 -------- testclient.html | 1 - 9 files changed, 21 insertions(+), 46 deletions(-) delete mode 100644 js/lib/jquery.json-2.3.min.js diff --git a/index.template.html b/index.template.html index 6433665b0d..f2128c4b3e 100644 --- a/index.template.html +++ b/index.template.html @@ -101,7 +101,6 @@

'; this.$el.html(buf); }, @@ -890,9 +890,9 @@ } else { buf += '

Register your account:

'; } - buf += '

'; - buf += '

'; - buf += '

'; + buf += '

'; + buf += '

'; + buf += '

'; buf += '

'; buf += '

'; buf += '

'; @@ -949,12 +949,12 @@ } buf += '

If this is your account:

'; - buf += '

'; + buf += '

'; if (data.special === '@gmail') { buf += '
[loading Google log-in button]
'; buf += '

'; } else { - buf += '

'; + buf += '

'; buf += '

'; } From 5b21cce99a9db72b21d3434d68e9dea3a25b9cee Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Wed, 14 Nov 2018 21:48:41 -0500 Subject: [PATCH 0050/1782] Improve action.php POSTing JSON data is now supported, since apparently Axios does that by default: #1160 In addition, error messages should be more informative, for anyone else trying to write a third-party client. --- lib/dispatcher.lib.php | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/dispatcher.lib.php b/lib/dispatcher.lib.php index 03a7fc38a8..a7b3af1878 100644 --- a/lib/dispatcher.lib.php +++ b/lib/dispatcher.lib.php @@ -9,7 +9,24 @@ class ActionDispatcher { public function __construct($handlers) { $this->handlers = $handlers; - $this->reqs = array($_REQUEST); + if (empty($_REQUEST)) { + $this->reqs = null; + if (substr($_SERVER["CONTENT_TYPE"], 0, 16) === 'application/json') { + // screw you too Axios + // also come on PHP, you could just support JSON natively instead of putting me through this + $input = trim(file_get_contents('php://input')); + if ($input[0] === '[') { + $this->reqs = json_decode($input, true); + } else if ($input[0] === '{') { + $this->reqs = [json_decode($input, true)]; + } + } + + if (empty($this->reqs)) die("no request data found - you need to send some sort of data"); + $_POST['is_post_request'] = true; + } else { + $this->reqs = [$_REQUEST]; + } if (@$_REQUEST['json']) { $this->reqs = json_decode($_REQUEST['json'], true); $this->multiReqs = true; @@ -96,8 +113,9 @@ public function executeActions() { foreach ($this->reqs as $this->reqData) { $this->reqData = array_merge($_REQUEST, $this->reqData); - $action = @$this->reqData['act']; - if (!ctype_alnum($action)) die("invalid action"); + if (!isset($this->reqData['act'])) die("action not found - make sure your request data includes act=something"); + $action = $this->reqData['act']; + if (!ctype_alnum($action)) die("invalid action: " . var_export($action, true)); $out = array(); foreach ($this->handlers as &$i) { @@ -128,7 +146,8 @@ public function login($dispatcher, &$reqData, &$out) { global $users, $curuser; $challengeprefix = $dispatcher->verifyCrossDomainRequest(); - if (!$_POST || empty($reqData['name']) || empty($reqData['pass'])) die(); + if (!$_POST) die('for security reasons, logins must happen with POST data'); + if (empty($reqData['name']) || empty($reqData['pass'])) die('incorrect login data, you need "name" and "pass" fields'); try { $users->login($reqData['name'], $reqData['pass']); } catch (Exception $e) { From 368ee06bcc005a409278a832c2287ffe726eaad8 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Thu, 15 Nov 2018 19:09:53 -0500 Subject: [PATCH 0051/1782] Fix freeze when transforming into self in Gen 1 --- src/battle.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle.ts b/src/battle.ts index 3385d85510..f3fe0c2db3 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -307,6 +307,7 @@ class Pokemon { if (recursionSource === this.ident) return; if (pp === undefined) pp = 1; moveName = Tools.getMove(moveName).name; + if (moveName.charAt(0) === '*') return; if (moveName === 'Struggle') return; if (this.volatiles.transform) { // make sure there is no infinite recursion if both Pokemon are transformed into each other From 5f05adc856859fcf0f2e3c57a487e6f9f1ff02af Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Sun, 4 Nov 2018 13:54:02 -0600 Subject: [PATCH 0052/1782] Split battle-log.ts off from battle-dex.ts This splits battle-dex.ts up into: - `battle-dex.ts` - dex data access, misc tools - `battle-log.ts` - manipulating HTML, especially in battle logs This turned out to be a pretty significant portion of what was previously battle-dex. --- .eslintignore | 1 + .eslintrc.js | 4 +- .gitignore | 1 + build-tools/update | 3 +- js/client-battle-tooltips.js | 6 +- js/client-battle.js | 32 +- js/client-chat-tournament.js | 18 +- js/client-chat.js | 54 +- js/client-ladder.js | 12 +- js/client-mainmenu.js | 42 +- js/client-rooms.js | 16 +- js/client-teambuilder.js | 52 +- js/client-topbar.js | 42 +- js/client.js | 20 +- js/replay-embed.js | 2 +- js/search.js | 40 +- js/storage.js | 6 +- src/battle-animations.ts | 6 +- src/battle-dex.ts | 496 +----------------- ...{battle-dex-misc.js => battle-log-misc.js} | 8 +- src/battle-log.ts | 486 +++++++++++++++++ src/battle.ts | 110 ++-- src/globals.d.ts | 2 +- test/battle-test.mocha.js | 1 + 24 files changed, 732 insertions(+), 728 deletions(-) rename src/{battle-dex-misc.js => battle-log-misc.js} (97%) create mode 100644 src/battle-log.ts diff --git a/.eslintignore b/.eslintignore index 5ca096b50a..4572b06420 100644 --- a/.eslintignore +++ b/.eslintignore @@ -4,6 +4,7 @@ node_modules/ /js/battle.js /js/battledata.js +/js/battle-log.js /js/battle-dex.js /js/battle-dex-data.js /js/battle-animations-moves.js diff --git a/.eslintrc.js b/.eslintrc.js index 9620a04efa..d2dde77f46 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -18,7 +18,7 @@ module.exports = { "fs": false, "gui": false, "ga": false, "macgap": false, "nwWindow": false, "webkitNotifications": false, // Battle stuff - "Battle": true, "Pokemon": true, "BattleSound": true, "BattleTooltips": true, + "Battle": true, "Pokemon": true, "BattleSound": true, "BattleTooltips": true, "BattleLog": true, "BattleAbilities": false, "BattleAliases": false, "BattleBackdrops": false, "BattleBackdropsFive": false, "BattleBackdropsFour": false, "BattleBackdropsThree": false, "BattleEffects": false, "BattleFormats": false, "BattleFormatsData": false, "BattleLearnsets": false, "BattleItems": false, "BattleMoveAnims": false, "BattleMovedex": false, "BattleNatures": false, "BattleOtherAnims": false, "BattlePokedex": false,"BattlePokemonSprites": false, "BattlePokemonSpritesBW": false, "BattleSearchCountIndex": false, "BattleSearchIndex": false, "BattleArticleTitles": false, @@ -26,7 +26,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, "getString": false, "hashColor": false, "MD5": false, + "app": false, "toId": false, "toRoomid": false, "toUserid": false, "toName": false, "getString": false, "MD5": false, "ChatHistory": false, "Topbar": false, "UserList": false, // Rooms diff --git a/.gitignore b/.gitignore index 6bc4083686..60d45e0477 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ package-lock.json /js/battle.js /js/battledata.js +/js/battle-log.js /js/battle-dex.js /js/battle-dex-data.js /js/battle-animations-moves.js diff --git a/build-tools/update b/build-tools/update index 744d6b1e1a..199f0a0a82 100755 --- a/build-tools/update +++ b/build-tools/update @@ -52,7 +52,8 @@ fs.writeFileSync( 'js/battledata.js', fs.readFileSync('js/battle-dex.js') + '\n\n' + fs.readFileSync('js/battle-dex-data.js') + '\n\n' + - fs.readFileSync('src/battle-dex-misc.js') + fs.readFileSync('js/battle-log.js') + '\n\n' + + fs.readFileSync('src/battle-log-misc.js') ); if (!ignoreGraphics) { diff --git a/js/client-battle-tooltips.js b/js/client-battle-tooltips.js index 7041bb1e63..d4112fe8a7 100644 --- a/js/client-battle-tooltips.js +++ b/js/client-battle-tooltips.js @@ -99,12 +99,12 @@ var BattleTooltips = (function () { BattleTooltips.prototype.tooltipAttrs = function (thing, type, ownHeight) { var roomid = this.room.id; return ' onclick="BattleTooltips._handleClickFor(event)"' + - ' ontouchstart="BattleTooltips._handleTouchStartFor(event, \'' + roomid + '\', \'' + Tools.escapeHTML('' + thing, true) + '\',\'' + type + '\', this, ' + (ownHeight ? 'true' : 'false') + ')"' + + ' ontouchstart="BattleTooltips._handleTouchStartFor(event, \'' + roomid + '\', \'' + BattleLog.escapeHTML('' + thing, true) + '\',\'' + type + '\', this, ' + (ownHeight ? 'true' : 'false') + ')"' + ' ontouchend="BattleTooltips._handleTouchEndFor(event, this)"' + ' ontouchleave="BattleTooltips._handleTouchLeaveFor(event)"' + ' ontouchcancel="BattleTooltips._handleTouchLeaveFor(event)"' + - ' onmouseover="BattleTooltips.showTooltipFor(\'' + roomid + '\', \'' + Tools.escapeHTML('' + thing, true) + '\',\'' + type + '\', this, ' + (ownHeight ? 'true' : 'false') + ')"' + - ' onfocus="BattleTooltips.showTooltipFor(\'' + roomid + '\', \'' + Tools.escapeHTML('' + thing, true) + '\',\'' + type + '\', this, ' + (ownHeight ? 'true' : 'false') + ')"' + + ' onmouseover="BattleTooltips.showTooltipFor(\'' + roomid + '\', \'' + BattleLog.escapeHTML('' + thing, true) + '\',\'' + type + '\', this, ' + (ownHeight ? 'true' : 'false') + ')"' + + ' onfocus="BattleTooltips.showTooltipFor(\'' + roomid + '\', \'' + BattleLog.escapeHTML('' + thing, true) + '\',\'' + type + '\', this, ' + (ownHeight ? 'true' : 'false') + ')"' + ' onmouseout="BattleTooltips.hideTooltip()"' + ' onblur="BattleTooltips.hideTooltip()"' + ' onmouseup="BattleTooltips._handleMouseUpFor()"' + diff --git a/js/client-battle.js b/js/client-battle.js index 08348eb485..bcd23efd49 100644 --- a/js/client-battle.js +++ b/js/client-battle.js @@ -191,7 +191,7 @@ switch (args[0]) { case 'trapped': requestData.trapped = true; - var pokeName = pokemon.side.n === 0 ? Tools.escapeHTML(pokemon.name) : "The opposing " + (this.battle.ignoreOpponent || this.battle.ignoreNicks ? pokemon.species : Tools.escapeHTML(pokemon.name)); + var pokeName = pokemon.side.n === 0 ? BattleLog.escapeHTML(pokemon.name) : "The opposing " + (this.battle.ignoreOpponent || this.battle.ignoreNicks ? pokemon.species : BattleLog.escapeHTML(pokemon.name)); this.battle.activityQueue.push('|message|' + pokeName + ' is trapped and cannot switch!'); break; case 'cant': @@ -554,7 +554,7 @@ } else if (!pokemon || pokemon.fainted) { targetMenus[0] += ' '; } else { - targetMenus[0] += ' '; + targetMenus[0] += ' '; } } for (var i = 0; i < myActive.length; i++) { @@ -573,7 +573,7 @@ } else if (!pokemon || pokemon.fainted) { targetMenus[1] += ' '; } else { - targetMenus[1] += ' '; + targetMenus[1] += ' '; } } @@ -587,7 +587,7 @@ } else { // Move chooser var hpBar = 'HP ' + switchables[pos].hp + '/' + switchables[pos].maxhp + ''; - requestTitle += ' What will ' + Tools.escapeHTML(switchables[pos].name) + ' do? ' + hpBar; + requestTitle += ' What will ' + BattleLog.escapeHTML(switchables[pos].name) + ' do? ' + hpBar; var hasMoves = false; var moveMenu = ''; @@ -605,7 +605,7 @@ if (moveData.disabled) { movebuttons += ' '; @@ -620,7 +620,7 @@ var move = Tools.getMove(moveData.move); var moveType = this.tooltips.getMoveType(move, this.battle.mySide.active[pos] || this.myPokemon[pos]); if (canZMove[i]) { - movebuttons += ' '; } else { movebuttons += ''; @@ -662,9 +662,9 @@ var pokemon = switchables[i]; pokemon.name = pokemon.ident.substr(4); if (pokemon.fainted || i < this.battle.mySide.active.length || this.choice.switchFlags[i]) { - switchMenu += ' '; + switchMenu += ' '; } else { - switchMenu += ' '; + switchMenu += ' '; } } if (this.finalDecisionSwitch && this.battle.gen > 2) { @@ -711,11 +711,11 @@ for (var i = 0; i < myActive.length; i++) { var pokemon = this.myPokemon[i]; if (pokemon && !pokemon.fainted || this.choice.switchOutFlags[i]) { - controls += ' '; + controls += ' '; } else if (!pokemon) { controls += ' '; } else { - controls += ' '; + controls += ' '; } } controls += ''; @@ -729,18 +729,18 @@ if (this.choice.freedomDegrees >= 1) { requestTitle += "Choose a Pokémon to send to battle!"; } else { - requestTitle += "Switch " + Tools.escapeHTML(switchables[pos].name) + " to:"; + requestTitle += "Switch " + BattleLog.escapeHTML(switchables[pos].name) + " to:"; } var switchMenu = ''; for (var i = 0; i < switchables.length; i++) { var pokemon = switchables[i]; if (pokemon.fainted || i < this.battle.mySide.active.length || this.choice.switchFlags[i]) { - switchMenu += ' '; + switchMenu += '' + BattleLog.escapeHTML(pokemon.name) + (!pokemon.fainted ? '' + (pokemon.status ? '' : '') : '') + ' '; } var controls = ( @@ -774,9 +774,9 @@ var oIndex = this.choice.teamPreview[i] - 1; var pokemon = switchables[oIndex]; if (i < this.choice.done) { - switchMenu += ' '; + switchMenu += ' '; } else { - switchMenu += ' '; + switchMenu += ' '; } } @@ -987,7 +987,7 @@ filename += '-' + toId(this.battle.p1.name); filename += '-' + toId(this.battle.p2.name); - e.currentTarget.href = Tools.createReplayFileHref(this); + e.currentTarget.href = BattleLog.createReplayFileHref(this); e.currentTarget.download = filename + '.html'; e.stopPropagation(); diff --git a/js/client-chat-tournament.js b/js/client-chat-tournament.js index 7be4da66e5..f0bcbdcd9c 100644 --- a/js/client-chat-tournament.js +++ b/js/client-chat-tournament.js @@ -271,7 +271,7 @@ case 'create': var formatName = window.BattleFormats && BattleFormats[data[0]] ? BattleFormats[data[0]].name : data[0]; var type = data[1]; - this.room.$chat.append("
" + Tools.escapeHTML(formatName) + " " + Tools.escapeHTML(type) + " Tournament created.
"); + this.room.$chat.append("
" + BattleLog.escapeHTML(formatName) + " " + BattleLog.escapeHTML(type) + " Tournament created.
"); this.room.notifyOnce("Tournament created", "Room: " + this.room.title + "\nFormat: " + formatName + "\nType: " + type, 'tournament-create'); this.curTeamIndex = 0; this.updateTeams(); @@ -317,7 +317,7 @@ break; case 'disqualify': - this.room.$chat.append("
" + Tools.escapeHTML(data[0]) + " has been disqualified from the tournament.
"); + this.room.$chat.append("
" + BattleLog.escapeHTML(data[0]) + " has been disqualified from the tournament.
"); break; case 'autodq': @@ -448,7 +448,7 @@ case 'battlestart': var roomid = toRoomid(data[2]).toLowerCase(); this.room.$chat.append(''); break; @@ -458,7 +458,7 @@ result = "won"; else if (data[2] === 'loss') result = "lost"; - var message = Tools.escapeHTML(data[0]) + " has " + result + " the match " + Tools.escapeHTML(data[3].split(',').join(' - ')) + " against " + Tools.escapeHTML(data[1]) + + var message = BattleLog.escapeHTML(data[0]) + " has " + result + " the match " + BattleLog.escapeHTML(data[3].split(',').join(' - ')) + " against " + BattleLog.escapeHTML(data[1]) + (data[4] === 'fail' ? " but the tournament does not support drawing, so it did not count" : "") + "."; var $battleMessage = data[5] ? this.room.$chat.find('.tournament-' + toRoomid(data[5]).toLowerCase()) : ''; if ($battleMessage && $battleMessage.length) { @@ -483,9 +483,9 @@ } var type = endData.generator; - this.room.$chat.append("
Congratulations to " + Tools.escapeHTML(arrayToPhrase(endData.results[0])) + " for winning the " + Tools.escapeFormat(endData.format) + " " + Tools.escapeHTML(type) + " Tournament!
"); + this.room.$chat.append("
Congratulations to " + BattleLog.escapeHTML(arrayToPhrase(endData.results[0])) + " for winning the " + BattleLog.escapeFormat(endData.format) + " " + BattleLog.escapeHTML(type) + " Tournament!
"); if (endData.results[1]) - this.room.$chat.append("
Runner-up" + (endData.results[1].length > 1 ? "s" : "") + ": " + Tools.escapeHTML(arrayToPhrase(endData.results[1])) + "
"); + this.room.$chat.append("
Runner-up" + (endData.results[1].length > 1 ? "s" : "") + ": " + BattleLog.escapeHTML(arrayToPhrase(endData.results[1])) + "
"); // Fallthrough @@ -510,7 +510,7 @@ case 'error': var appendError = function (message) { - this.room.$chat.append("
" + Tools.sanitizeHTML(message) + "
"); + this.room.$chat.append("
" + BattleLog.sanitizeHTML(message) + "
"); }.bind(this); switch (data[0]) { @@ -586,7 +586,7 @@ if (!data.rootNode) { if (!('users' in data)) return; var users = data.users.length; - if (users) $div.html('' + users + ' user' + (users !== 1 ? 's' : '') + ':
' + Tools.escapeHTML(data.users.join(", "))); + if (users) $div.html('' + users + ' user' + (users !== 1 ? 's' : '') + ':
' + BattleLog.escapeHTML(data.users.join(", "))); return $div; } @@ -803,7 +803,7 @@ var UserPopup = this.Popup.extend({ initialize: function (data) { this.$el.html('
    ' + data.users.map(function (user) { - var escapedUser = Tools.escapeHTML(user); + var escapedUser = BattleLog.escapeHTML(user); return '
  • '; }).join('') + '
'); }, diff --git a/js/client-chat.js b/js/client-chat.js index 7aabd497f9..430e08f79c 100644 --- a/js/client-chat.js +++ b/js/client-chat.js @@ -28,7 +28,7 @@ var name = app.user.get('name'); var userid = app.user.get('userid'); if (this.expired) { - this.$chatAdd.html(this.expired === true ? 'This room is expired' : Tools.sanitizeHTML(this.expired)); + this.$chatAdd.html(this.expired === true ? 'This room is expired' : BattleLog.sanitizeHTML(this.expired)); this.$chatbox = null; } else if (!name) { this.$chatAdd.html('Connecting...'); @@ -37,7 +37,7 @@ this.$chatAdd.html('
'); this.$chatbox = null; } else { - this.$chatAdd.html('
'); + this.$chatAdd.html('
'); this.$chatbox = this.$chatAdd.find('textarea'); this.$chatbox.autoResize({ animate: false, @@ -479,7 +479,7 @@ if (target === 'extractteams') { app.addPopup(Popup, { type: 'modal', - htmlMessage: "Extracted team data:
" + htmlMessage: "Extracted team data:
" }); } else { this.add('|error|Unknown debug command.'); @@ -795,7 +795,7 @@ buffer += ''; } else { buffer += ''; - hiddenFormats.push(Tools.escapeFormat(formatId)); + hiddenFormats.push(BattleLog.escapeFormat(formatId)); } // Validate all the numerical data @@ -804,7 +804,7 @@ if (typeof values[j] !== 'number' && typeof values[j] !== 'string' || isNaN(values[j])) return self.add('|raw|Error: corrupted ranking data'); } - buffer += '' + Tools.escapeFormat(formatId) + '' + Math.round(row.elo) + ''; + buffer += '' + BattleLog.escapeFormat(formatId) + '' + Math.round(row.elo) + ''; if (row.rprd > 100) { // High rating deviation. Provisional rating. buffer += '–'; @@ -1231,7 +1231,7 @@ if (!matches) { return; // bogus room ID could be used to inject JavaScript } - var format = Tools.escapeFormat(matches[1]); + var format = BattleLog.escapeFormat(matches[1]); if (silent && !Tools.prefs('showbattles')) return; @@ -1241,7 +1241,7 @@ battletype = format + ' battle'; if (format === 'Random Battle') battletype = 'Random Battle'; } - this.$chat.append(''); + this.$chat.append(''); break; case 'j': @@ -1281,7 +1281,7 @@ case 'raw': case 'html': - this.$chat.append('
' + Tools.sanitizeHTML(row.slice(1).join('|')) + '
'); + this.$chat.append('
' + BattleLog.sanitizeHTML(row.slice(1).join('|')) + '
'); break; case 'notify': @@ -1307,7 +1307,7 @@ break; case 'error': - this.$chat.append('
' + Tools.escapeHTML(row.slice(1).join('|')) + '
'); + this.$chat.append('
' + BattleLog.escapeHTML(row.slice(1).join('|')) + '
'); break; case 'uhtml': @@ -1317,12 +1317,12 @@ if (!html) { $elements.remove(); } else if (!$elements.length) { - this.$chat.append('
' + Tools.sanitizeHTML(html) + '
'); + this.$chat.append('
' + BattleLog.sanitizeHTML(html) + '
'); } else if (row[0] === 'uhtmlchange') { - $elements.html(Tools.sanitizeHTML(html)); + $elements.html(BattleLog.sanitizeHTML(html)); } else { $elements.remove(); - this.$chat.append('
' + Tools.sanitizeHTML(html) + '
'); + this.$chat.append('
' + BattleLog.sanitizeHTML(html) + '
'); } break; @@ -1349,7 +1349,7 @@ case 'tournaments': if (Tools.prefs('notournaments')) { if (row[1] === 'create') { - this.$chat.append('
' + Tools.escapeFormat(row[2]) + ' ' + Tools.escapeHTML(row[3]) + ' tournament created (and hidden because you have tournaments disabled).
'); + this.$chat.append('
' + BattleLog.escapeFormat(row[2]) + ' ' + BattleLog.escapeHTML(row[3]) + ' tournament created (and hidden because you have tournaments disabled).
'); } else if (row[1] === 'start') { this.$chat.append('
Tournament started.
'); } else if (row[1] === 'forceend') { @@ -1364,11 +1364,11 @@ // fallthrough in case of unparsed message case '': - this.$chat.append('
' + Tools.escapeHTML(row.slice(1).join('|')) + '
'); + this.$chat.append('
' + BattleLog.escapeHTML(row.slice(1).join('|')) + '
'); break; default: - this.$chat.append('
|' + Tools.escapeHTML(row.join('|')) + '
'); + this.$chat.append('
|' + BattleLog.escapeHTML(row.join('|')) + '
'); break; } } @@ -1465,7 +1465,7 @@ message += ', '; } } - message += Tools.escapeHTML(list[j]); + message += BattleLog.escapeHTML(list[j]); } message += ' joined'; } @@ -1494,7 +1494,7 @@ message += ', '; } } - message += Tools.escapeHTML(list[j]); + message += BattleLog.escapeHTML(list[j]); } message += ' left
'; } @@ -1519,11 +1519,11 @@ if (pm) { var pmuserid = toUserid(pm); var oName = pmuserid === app.user.get('userid') ? name : pm; - var clickableName = '' + Tools.escapeHTML(name.substr(1)) + ''; + var clickableName = '' + BattleLog.escapeHTML(name.substr(1)) + ''; this.$chat.append( '
' + ChatRoom.getTimestamp('lobby', msgTime) + - '' + clickableName + ':' + - '(Private to ' + Tools.escapeHTML(pm) + ') ' + Tools.parseMessage(message) + '' + + '' + clickableName + ':' + + '(Private to ' + BattleLog.escapeHTML(pm) + ') ' + BattleLog.parseMessage(message) + '' + '
' ); return; // PMs independently notify in the main menu; no need to make them notify again with `inchatpm`. @@ -1546,7 +1546,7 @@ } var isHighlighted = userid !== app.user.get('userid') && this.getHighlight(message); - var parsedMessage = Tools.parseChatMessage(message, name, ChatRoom.getTimestamp('chat', msgTime), isHighlighted); + var parsedMessage = BattleLog.parseChatMessage(message, name, ChatRoom.getTimestamp('chat', msgTime), isHighlighted); if (!$.isArray(parsedMessage)) parsedMessage = [parsedMessage]; for (var i = 0; i < parsedMessage.length; i++) { if (!parsedMessage[i]) continue; @@ -1687,17 +1687,17 @@ var text = ''; // Sanitising the `userid` here is probably unnecessary, because // IDs can't contain anything dangerous. - text += ''; - text += ''; text += ''; diff --git a/js/client-ladder.js b/js/client-ladder.js index a932badfb7..6fa4851974 100644 --- a/js/client-ladder.js +++ b/js/client-ladder.js @@ -48,14 +48,14 @@ break; case 'pagehtml': - this.$el.html(Tools.sanitizeHTML(row[1])); + this.$el.html(BattleLog.sanitizeHTML(row[1])); this.subtleNotifyOnce(); break; case 'selectorhtml': var pipeIndex2 = row[1].indexOf('|'); if (pipeIndex2 < 0) return; - this.$(row[1].slice(0, pipeIndex2)).html(Tools.sanitizeHTML(row[1].slice(pipeIndex2 + 1))); + this.$(row[1].slice(0, pipeIndex2)).html(BattleLog.sanitizeHTML(row[1].slice(pipeIndex2 + 1))); this.subtleNotifyOnce(); break; @@ -96,7 +96,7 @@ return; } if (this.curFormat !== data[0]) return; - buf += Tools.sanitizeHTML(data[1]) + ''; + buf += BattleLog.sanitizeHTML(data[1]) + ''; this.$el.html(buf); }, this); }, @@ -119,9 +119,9 @@ if (!format.rated || !format.searchShow) continue; if (format.section && format.section !== curSection) { curSection = format.section; - buf += '

' + Tools.escapeHTML(curSection) + '

    '; + buf += '

' + BattleLog.escapeHTML(curSection) + '

    '; } - buf += '
  • '; + buf += '
  • '; } buf += '
'; this.$el.html(buf); @@ -141,7 +141,7 @@ }, function (data) { if (self.curFormat !== format) return; var buf = '

'; - buf += '

' + Tools.escapeFormat(format) + ' Top 500

'; + buf += '

' + BattleLog.escapeFormat(format) + ' Top 500

'; buf += data + '
'; self.$el.html(buf); }, 'html'); diff --git a/js/client-mainmenu.js b/js/client-mainmenu.js index 65ee131e92..dbf33779cf 100644 --- a/js/client-mainmenu.js +++ b/js/client-mainmenu.js @@ -143,7 +143,7 @@ var autoscroll = ($chatFrame.scrollTop() + 60 >= $chat.height() - $chatFrame.height()); - var parsedMessage = Tools.parseChatMessage(message, name, ChatRoom.getTimestamp('pms'), false, $chat); + var parsedMessage = BattleLog.parseChatMessage(message, name, ChatRoom.getTimestamp('pms'), false, $chat); if (!$.isArray(parsedMessage)) parsedMessage = [parsedMessage]; for (var i = 0; i < parsedMessage.length; i++) { if (!parsedMessage[i]) continue; @@ -176,12 +176,12 @@ if (group === ' ') { group = ''; } else { - group = '' + Tools.escapeHTML(group) + ''; + group = '' + BattleLog.escapeHTML(group) + ''; } var buf = '
'; buf += '

'; buf += ''; - buf += group + Tools.escapeHTML(name.substr(1)) + '

'; + buf += group + BattleLog.escapeHTML(name.substr(1)) + '

'; buf += '
'; buf += '
'; $pmWindow = $(buf).prependTo(this.$pmBox); @@ -569,7 +569,7 @@ for (var roomid in this.games) { var name = this.games[roomid]; if (name.slice(-1) === '*') name = name.slice(0, -1); - buf += ''; + buf += ''; } buf += ''; if (!$searchGroup.is(':visible')) buf += '

'; @@ -606,7 +606,7 @@ var userid = toId(name); var $challenge = this.openChallenge(name); - var buf = '

Waiting for ' + Tools.escapeHTML(name) + '...

'; + var buf = '

Waiting for ' + BattleLog.escapeHTML(name) + '...

'; buf += '

' + this.renderFormats(challenge.format, true) + '

'; buf += '

'; @@ -623,10 +623,10 @@ if (data.challengesFrom[userid]) { var format = data.challengesFrom[userid]; if (!$pmWindow.find('.challenge').length) { - self.notifyOnce("Challenge from " + name, "Format: " + Tools.escapeFormat(format), 'challenge:' + userid); + self.notifyOnce("Challenge from " + name, "Format: " + BattleLog.escapeFormat(format), 'challenge:' + userid); } var $challenge = self.openChallenge(name, $pmWindow); - var buf = '

' + Tools.escapeHTML(name) + ' wants to battle!

'; + var buf = '

' + BattleLog.escapeHTML(name) + ' wants to battle!

'; buf += '

' + self.renderFormats(format, true) + '

'; buf += '

' + self.renderTeams(format) + '

'; buf += '

'; @@ -729,7 +729,7 @@ } $challenge = this.openChallenge(name); - var buf = '

Challenge ' + Tools.escapeHTML(name) + '?

'; + var buf = '

Challenge ' + BattleLog.escapeHTML(name) + '?

'; buf += '

' + this.renderFormats(format) + '

'; buf += '

' + this.renderTeams(format, teamIndex) + '

'; buf += '

'; @@ -773,7 +773,7 @@ return; } - var buf = '

Challenging ' + Tools.escapeHTML(name) + '...

'; + var buf = '

Challenging ' + BattleLog.escapeHTML(name) + '...

'; buf += '

' + this.renderFormats(format, true) + '

'; buf += '

'; @@ -802,7 +802,7 @@ curFormat: '', renderFormats: function (formatid, noChoice) { if (!window.BattleFormats) { - return ''; + return ''; } if (_.isEmpty(BattleFormats)) { return ''; @@ -820,7 +820,7 @@ } formatid = this.curFormat; } - return ''; + return ''; }, curTeamFormat: '', curTeamIndex: 0, @@ -957,9 +957,9 @@ if (!bufs[curBuf]) { bufs[curBuf] = ''; } - bufs[curBuf] += '
  • ' + Tools.escapeHTML(curSection) + '

  • '; + bufs[curBuf] += '
  • ' + BattleLog.escapeHTML(curSection) + '

  • '; } - var formatName = Tools.escapeFormat(format.id); + var formatName = BattleLog.escapeFormat(format.id); if (formatName.charAt(0) !== '[') formatName = '[Gen 6] ' + formatName; formatName = formatName.replace('[Gen 7] ', ''); bufs[curBuf] += '
  • '; @@ -989,7 +989,7 @@ var $teamButton = this.sourceEl.closest('form').find('button[name=team]'); if ($teamButton.length) $teamButton.replaceWith(app.rooms[''].renderTeams(format)); } - this.sourceEl.val(format).html(Tools.escapeFormat(format) || '(Select a format)'); + this.sourceEl.val(format).html(BattleLog.escapeFormat(format) || '(Select a format)'); this.close(); } @@ -1023,22 +1023,22 @@ if (!teams.length) { bufs[curBuf] = '
  • You have no teams

  • '; - bufs[curBuf] += '
  • '; + bufs[curBuf] += '
  • '; } else { var curTeam = (data.team === '' ? -1 : +data.team); var count = 0; if (teamFormat) { - bufs[curBuf] = '
  • ' + Tools.escapeFormat(teamFormat) + ' teams

  • '; + bufs[curBuf] = '
  • ' + BattleLog.escapeFormat(teamFormat) + ' teams

  • '; for (var i = 0; i < teams.length; i++) { if ((!teams[i].format && !teamFormat) || teams[i].format === teamFormat) { var selected = (i === curTeam); - bufs[curBuf] += '
  • '; + bufs[curBuf] += '
  • '; count++; if (count % bufBoundary == 0 && curBuf < 4) curBuf++; } } - if (!count) bufs[curBuf] += '
  • You have no ' + Tools.escapeFormat(teamFormat) + ' teams

  • '; - bufs[curBuf] += '
  • '; + if (!count) bufs[curBuf] += '
  • You have no ' + BattleLog.escapeFormat(teamFormat) + ' teams

  • '; + bufs[curBuf] += '
  • '; bufs[curBuf] += '
  • Other teams

  • '; } else { bufs[curBuf] = '
  • '; @@ -1049,7 +1049,7 @@ for (var i = 0; i < teams.length; i++) { if (teamFormat && teams[i].format === teamFormat) continue; var selected = (i === curTeam); - bufs[curBuf] += '
  • '; + bufs[curBuf] += '
  • '; count++; if (count % bufBoundary == 0 && curBuf < 4) curBuf++; } @@ -1112,7 +1112,7 @@ } var team = Storage.teams[i]; if (!team) return 'Error: Corrupted team'; - var buf = '' + Tools.escapeHTML(team.name) + ''; + var buf = '' + BattleLog.escapeHTML(team.name) + ''; buf += Storage.getTeamIcons(team) + ''; return buf; } diff --git a/js/client-rooms.js b/js/client-rooms.js index d704717858..5db1fb6fc2 100644 --- a/js/client-rooms.js +++ b/js/client-rooms.js @@ -59,12 +59,12 @@ }, renderRoomBtn: function (roomData) { var id = toId(roomData.title); - var buf = '
    (' + Number(roomData.userCount) + ' users) ' + Tools.escapeHTML(roomData.title) + '
    ' + Tools.escapeHTML(roomData.desc || ''); + var buf = '
    (' + Number(roomData.userCount) + ' users) ' + BattleLog.escapeHTML(roomData.title) + '
    ' + BattleLog.escapeHTML(roomData.desc || ''); if (roomData.subRooms && roomData.subRooms.length) { buf += '
    Subrooms: '; for (var i = 0; i < roomData.subRooms.length; i++) { if (i) buf += ', '; - buf += ' ' + Tools.escapeHTML(roomData.subRooms[i]); + buf += ' ' + BattleLog.escapeHTML(roomData.subRooms[i]); } buf += ''; } @@ -167,14 +167,14 @@ renderRoomBtn: function (id, roomData, matches) { var format = (matches[1] || ''); var formatBuf = ''; - if (roomData.minElo) formatBuf += '(' + (typeof roomData.minElo === 'number' ? 'rated: ' : '') + Tools.escapeHTML(roomData.minElo) + ')'; - formatBuf += (format ? '[' + Tools.escapeFormat(format) + ']
    ' : ''); - var roomDesc = formatBuf + '' + Tools.escapeHTML(roomData.p1) + ' vs. ' + Tools.escapeHTML(roomData.p2) + ''; + if (roomData.minElo) formatBuf += '(' + (typeof roomData.minElo === 'number' ? 'rated: ' : '') + BattleLog.escapeHTML(roomData.minElo) + ')'; + formatBuf += (format ? '[' + BattleLog.escapeFormat(format) + ']
    ' : ''); + var roomDesc = formatBuf + '' + BattleLog.escapeHTML(roomData.p1) + ' vs. ' + BattleLog.escapeHTML(roomData.p2) + ''; if (!roomData.p1) { matches = id.match(/[^0-9]([0-9]*)$/); roomDesc = formatBuf + 'empty room ' + matches[1]; } else if (!roomData.p2) { - roomDesc = formatBuf + '' + Tools.escapeHTML(roomData.p1) + ''; + roomDesc = formatBuf + '' + BattleLog.escapeHTML(roomData.p1) + ''; } return '
    '; }, @@ -204,8 +204,8 @@ buf.push(this.renderRoomBtn(id, roomData, matches)); } - if (!buf.length) return this.$list.html('

    No ' + Tools.escapeFormat(this.format) + ' battles are going on right now.

    '); - return this.$list.html('

    ' + buf.length + (buf.length === 100 ? '+' : '') + ' ' + Tools.escapeFormat(this.format) + ' ' + (buf.length === 1 ? 'battle' : 'battles') + '

    ' + buf.join("")); + if (!buf.length) return this.$list.html('

    No ' + BattleLog.escapeFormat(this.format) + ' battles are going on right now.

    '); + return this.$list.html('

    ' + buf.length + (buf.length === 100 ? '+' : '') + ' ' + BattleLog.escapeFormat(this.format) + ' ' + (buf.length === 1 ? 'battle' : 'battles') + '

    ' + buf.join("")); }, refresh: function () { var elofilter = ''; diff --git a/js/client-teambuilder.js b/js/client-teambuilder.js index 3edb62bd71..025b1b6682 100644 --- a/js/client-teambuilder.js +++ b/js/client-teambuilder.js @@ -149,14 +149,14 @@ if (this.exportMode) { if (this.curFolder) { buf = '
    '; - buf += '
    '; + buf += '
    '; } else { buf = '
    '; buf += '
    '; } @@ -291,7 +291,7 @@ formatName = '(uncategorized)'; format = '/'; } else { - formatName = Tools.escapeHTML(formatName); + formatName = BattleLog.escapeHTML(formatName); } buf += '
    ' : '">') + '
    ' + formatName + '
    ' + (this.curFolder === format ? '
    ' : ''); continue; @@ -347,7 +347,7 @@ var newButtonText = "New Team"; if (filterFolder) newButtonText = "New Team in folder"; if (filterFormat && filterFormat !== 'gen7') { - newButtonText = "New " + Tools.escapeFormat(filterFormat) + " Team"; + newButtonText = "New " + BattleLog.escapeFormat(filterFormat) + " Team"; } buf += '

    '; @@ -399,7 +399,7 @@ // teams are
    s rather than '; } @@ -1019,10 +1019,10 @@ var buf = ''; if (this.exportMode) { - buf = '
    '; - buf += '
    '; + buf = '
    '; + buf += '
    '; } else { - buf = '
    '; + buf = '
    '; buf += '
    '; buf += '
      '; buf += '
    1. ' + this.clipboardHTML() + '
    2. '; @@ -1038,7 +1038,7 @@ }; if (exports.BattleFormats) { buf += '
    3. '; - buf += ''; + buf += ''; var btnClass = 'button' + (!this.curSetList.length ? ' disabled' : ''); buf += '
    4. '; } @@ -1081,7 +1081,7 @@ } buf += '
      '; buf += '
      '; - buf += ''; + buf += ''; buf += '
      '; buf += '
      '; @@ -1092,7 +1092,7 @@ } else { buf += '
      '; } - buf += '
      '; + buf += '
    '; // details buf += '
    '; @@ -1131,17 +1131,17 @@ buf += '
    '; buf += '
    '; - if (this.curTeam.gen > 1) buf += '
    '; - if (this.curTeam.gen > 2) buf += '
    '; + if (this.curTeam.gen > 1) buf += '
    '; + if (this.curTeam.gen > 2) buf += '
    '; buf += '
    '; // moves if (!set.moves) set.moves = []; buf += '
    '; - buf += '
    '; - buf += '
    '; - buf += '
    '; - buf += '
    '; + buf += '
    '; + buf += '
    '; + buf += '
    '; + buf += '
    '; buf += '
    '; // stats @@ -1533,9 +1533,9 @@ buf += ' '; isAdd = true; } else if (i == this.curSetLoc) { - buf += ' '; + buf += ' '; } else { - buf += ' '; + buf += ' '; } } if (this.curSetList.length < 6 && !isAdd) { @@ -1902,7 +1902,7 @@ buf += '
    '; for (var i in stats) { if (i === 'spd' && this.curTeam.gen === 1) continue; - buf += '
    '; + buf += '
    '; } buf += '
    '; @@ -1912,7 +1912,7 @@ for (var i in stats) { if (set.ivs[i] === undefined || isNaN(set.ivs[i])) set.ivs[i] = 31; var val = '' + (set.ivs[i]); - buf += '
    '; + buf += '
    '; } var hpType = ''; if (set.moves) { @@ -2032,7 +2032,7 @@ for (var i in stats) { if (set.ivs[i] === undefined || isNaN(set.ivs[i])) set.ivs[i] = 31; var val = '' + Math.floor(set.ivs[i] / 2); - buf += '
    '; + buf += '
    '; } buf += '
    '; } @@ -2304,7 +2304,7 @@ buf += '

    Details

    '; buf += '
    '; - buf += '
    '; + buf += '
    '; if (this.curTeam.gen > 1) { buf += '
    '; @@ -3354,7 +3354,7 @@ if (i !== data.i && i !== data.i + 1) { buf += '
  • '; } - buf += ' ' + Tools.escapeHTML(set.name || set.species) + ''; + buf += ' ' + BattleLog.escapeHTML(set.name || set.species) + ''; } if (i !== data.i && i !== data.i + 1) { buf += '
  • '; @@ -3387,7 +3387,7 @@ initialize: function (data) { this.room = data.room; this.folder = data.folder; - var buf = '

    Remove "' + data.folder.slice(0, -1) + '"?

    '; + var buf = '

    Remove "' + data.folder.slice(0, -1) + '"?

    '; buf += '

    '; this.$el.html(buf); }, diff --git a/js/client-topbar.js b/js/client-topbar.js index f2c8f528dc..66e0545ef5 100644 --- a/js/client-topbar.js +++ b/js/client-topbar.js @@ -30,11 +30,11 @@ updateUserbar: function () { var buf = ''; var name = ' ' + app.user.get('name'); - var color = hashColor(app.user.get('userid')); + var color = BattleLog.hashColor(app.user.get('userid')); if (!app.user.loaded) { buf = ''; } else if (app.user.get('named')) { - buf = ' ' + Tools.escapeHTML(name) + ''; + buf = ' ' + BattleLog.escapeHTML(name) + ''; } else { buf = ''; } @@ -74,7 +74,7 @@ if (room.notifications[tag].title) title += room.notifications[tag].title + '\n'; if (room.notifications[tag].body) title += room.notifications[tag].body + '\n'; } - if (title) buf += ' title="' + Tools.escapeHTML(title) + '"'; + if (title) buf += ' title="' + BattleLog.escapeHTML(title) + '"'; } switch (room ? room.type : id) { case '': @@ -89,7 +89,7 @@ case 'rooms': return buf + ' aria-label="Join chatroom">  '; case 'battle': - var name = Tools.escapeHTML(room.title); + var name = BattleLog.escapeHTML(room.title); var idChunks = id.substr(7).split('-'); var formatid; if (idChunks.length <= 1) { @@ -101,25 +101,25 @@ var p1 = (room.battle && room.battle.p1 && room.battle.p1.name) || ''; var p2 = (room.battle && room.battle.p2 && room.battle.p2.name) || ''; if (p1 && p2) { - name = '' + Tools.escapeHTML(p1) + ' v. ' + Tools.escapeHTML(p2); + name = '' + BattleLog.escapeHTML(p1) + ' v. ' + BattleLog.escapeHTML(p2); } else if (p1 || p2) { - name = '' + Tools.escapeHTML(p1) + Tools.escapeHTML(p2); + name = '' + BattleLog.escapeHTML(p1) + BattleLog.escapeHTML(p2); } else { name = '(empty room)'; } } - return buf + ' draggable="true">' + Tools.escapeFormat(formatid) + '' + name + '

    '; if (app.user.get('named')) { var registered = app.user.get('registered'); @@ -776,7 +776,7 @@ var buf = '
    '; if (data.error) { - buf += '

    ' + Tools.escapeHTML(data.error) + '

    '; + buf += '

    ' + BattleLog.escapeHTML(data.error) + '

    '; if (data.error.indexOf('inappropriate') >= 0) { buf += '

    Keep in mind these rules:

    '; buf += '
      '; @@ -786,14 +786,14 @@ buf += '
    '; } } else if (data.reason) { - buf += '

    ' + Tools.parseMessage(data.reason) + '

    '; + buf += '

    ' + BattleLog.parseMessage(data.reason) + '

    '; } else if (!data.force) { var noRenameGames = ''; if (app.rooms[''].games) { for (var roomid in app.rooms[''].games) { var title = app.rooms[''].games[roomid]; if (title.slice(-1) === '*') { - noRenameGames += '
  • ' + Tools.escapeHTML(title.slice(0, -1)) + '
  • '; + noRenameGames += '
  • ' + BattleLog.escapeHTML(title.slice(0, -1)) + '
  • '; } } } @@ -810,7 +810,7 @@ var name = (data.name || ''); if (!name && app.user.get('named')) name = app.user.get('name'); - buf += '

    '; + buf += '

    '; if (name) { buf += '

    (Others will be able to see your name change. To change name privately, use "Log out")

    '; } @@ -825,7 +825,7 @@ updateColor: function (e) { var name = e.currentTarget.value; var preview = this.$('.preview'); - var css = hashColor(toUserid(name)).slice(6, -1); + var css = BattleLog.hashColor(toUserid(name)).slice(6, -1); preview.css('color', css); }, force: function () { @@ -890,11 +890,11 @@ } else { buf += '

    Register your account:

    '; } - buf += '

    '; + buf += '

    '; buf += '

    '; buf += '

    '; buf += '

    '; - buf += '

    '; + buf += '

    '; buf += '

    '; this.$el.html(buf); }, @@ -933,7 +933,7 @@ var buf = '
    '; if (data.error) { - buf += '

    ' + Tools.escapeHTML(data.error) + '

    '; + buf += '

    ' + BattleLog.escapeHTML(data.error) + '

    '; if (data.error.indexOf(' forced you to change ') >= 0) { buf += '

    Keep in mind these rules:

    '; buf += '
      '; @@ -943,13 +943,13 @@ buf += '
    '; } } else if (data.reason) { - buf += '

    ' + Tools.escapeHTML(data.reason) + '

    '; + buf += '

    ' + BattleLog.escapeHTML(data.reason) + '

    '; } else { buf += '

    The name you chose is registered.

    '; } buf += '

    If this is your account:

    '; - buf += '

    '; + buf += '

    '; if (data.special === '@gmail') { buf += '
    [loading Google log-in button]
    '; buf += '

    '; diff --git a/js/client.js b/js/client.js index 6c85f0855a..2df8fa2232 100644 --- a/js/client.js +++ b/js/client.js @@ -831,7 +831,7 @@ var replayLink = 'https://replay.pokemonshowdown.com/' + replayid; $.ajax(replayLink + '.json', {dataType: 'json'}).done(function (replay) { if (replay) { - var title = Tools.escapeHTML(replay.p1) + ' vs. ' + Tools.escapeHTML(replay.p2); + var title = BattleLog.escapeHTML(replay.p1) + ' vs. ' + BattleLog.escapeHTML(replay.p2); app.receive('>battle-' + replayid + '\n|init|battle\n|title|' + title + '\n' + replay.log); app.receive('>battle-' + replayid + '\n|expire|Open replay in new tab'); } else { @@ -980,7 +980,7 @@ app.addPopup(Popup, { type: type, maxWidth: maxWidth, - htmlMessage: Tools.sanitizeHTML(data) + htmlMessage: BattleLog.sanitizeHTML(data) }); } else { app.addPopup(Popup, { @@ -993,7 +993,7 @@ break; case 'disconnect': - app.trigger('init:socketclosed', Tools.sanitizeHTML(data.substr(12))); + app.trigger('init:socketclosed', BattleLog.sanitizeHTML(data.substr(12))); break; case 'pm': @@ -1060,7 +1060,7 @@ if (!groupName) Config.defaultGroup = symbol; groups[symbol] = { - name: groupName ? Tools.escapeHTML(groupName + ' (' + symbol + ')') : null, + name: groupName ? BattleLog.escapeHTML(groupName + ' (' + symbol + ')') : null, type: groupType, order: i + 1 }; @@ -2231,7 +2231,7 @@ }, initialize: function (data) { if (!this.type) this.type = 'semimodal'; - this.$el.html('

    ' + (data.htmlMessage || Tools.parseMessage(data.message)) + '

    ' + (data.buttons || '') + '

    ').css('max-width', data.maxWidth || 480); + this.$el.html('

    ' + (data.htmlMessage || BattleLog.parseMessage(data.message)) + '

    ' + (data.buttons || '') + '

    ').css('max-width', data.maxWidth || 480); }, dispatchClickButton: function (e) { @@ -2284,7 +2284,7 @@ var buf = '
    '; buf += '

    '; + buf += '

    '; buf += '

    '; buf += '
    '; @@ -2403,7 +2403,7 @@ var buf = '
    '; if (avatar) buf += ''; - buf += '' + Tools.escapeHTML(name) + '
    '; + buf += '' + BattleLog.escapeHTML(name) + '
    '; buf += '' + (group || ' ') + ''; if (globalgroup) buf += '
    ' + globalgroup + ''; if (data.rooms) { @@ -2421,7 +2421,7 @@ var p1 = data.rooms[i].p1.substr(1); var p2 = data.rooms[i].p2.substr(1); var ownBattle = (ownUserid === toUserid(p1) || ownUserid === toUserid(p2)); - var room = '' + '' + roomrank + roomid.substr(7) + ''; + var room = '' + '' + roomrank + roomid.substr(7) + ''; if (data.rooms[i].isPrivate) { if (!privatebuf) privatebuf = '
    Private rooms: '; else privatebuf += ', '; @@ -2524,7 +2524,7 @@ } var $pm = $('.pm-window-' + this.userid); if ($pm.length && $pm.css('display') !== 'none') { - $pm.find('.inner').append('
    ' + Tools.escapeHTML(buf) + '
    '); + $pm.find('.inner').append('
    ' + BattleLog.escapeHTML(buf) + '
    '); } else { var room = (app.curRoom && app.curRoom.add ? app.curRoom : app.curSideRoom); if (!room || !room.add) { @@ -2619,7 +2619,7 @@ var warning = ('warning' in data); var buf = ''; if (warning) { - buf += '

    ' + (Tools.escapeHTML(data.warning) || 'You have been warned for breaking the rules.') + '

    '; + buf += '

    ' + (BattleLog.escapeHTML(data.warning) || 'You have been warned for breaking the rules.') + '

    '; } buf += '

    Pokémon Showdown Rules

    '; buf += 'Global

    1. Be nice to people. Respect people. Don\'t be rude or mean to people.

    2. Follow US laws (PS is based in the US). No porn (minors use PS), don\'t distribute pirated material, and don\'t slander others.

    3. No sex. Don\'t discuss anything sexually explicit, not even in private messages, not even if you\'re both adults.

    4. No cheating. Don\'t exploit bugs to gain an unfair advantage. Don\'t game the system (by intentionally losing against yourself or a friend in a ladder match, by timerstalling, etc). Don\'t impersonate staff if you\'re not.

    5. Moderators have discretion to punish any behaviour they deem inappropriate, whether or not it\'s on this list. If you disagree with a moderator ruling, appeal to a leader (a user with & next to their name) or Discipline Appeals.

    (Note: The First Amendment does not apply to PS, since PS is not a government organization.)

    '; diff --git a/js/replay-embed.js b/js/replay-embed.js index 8b0d6d6704..a9516dbb5b 100644 --- a/js/replay-embed.js +++ b/js/replay-embed.js @@ -125,7 +125,7 @@ var Replays = { var replayid = this.$('input[name=replayid]').val(); var m = /^([a-z0-9]+)-[a-z0-9]+-[0-9]+$/.exec(replayid); if (m) { - this.battle.log('
    This replay was uploaded from a third-party server (' + Tools.escapeHTML(m[1]) + '). It contains errors and cannot be viewed.
    Replays uploaded from third-party servers can contain errors if the server is running custom code, or the server operator has otherwise incorrectly configured their server.
    ', true); + this.battle.log('
    This replay was uploaded from a third-party server (' + BattleLog.escapeHTML(m[1]) + '). It contains errors and cannot be viewed.
    Replays uploaded from third-party servers can contain errors if the server is running custom code, or the server operator has otherwise incorrectly configured their server.
    ', true); this.battle.pause(); } }, diff --git a/js/search.js b/js/search.js index 24c882f22c..b78e418c80 100644 --- a/js/search.js +++ b/js/search.js @@ -541,7 +541,7 @@ var text = this.filters[i][1]; if (this.filters[i][0] === 'move') text = Tools.getMove(text).name; if (this.filters[i][0] === 'pokemon') text = Tools.getTemplate(text).name; - buf += ' '; + buf += ' '; } if (!q) buf += '(backspace = delete filter)'; return buf + '

    '; @@ -878,7 +878,7 @@ template = Tools.getTemplate(set.species); var abilitySet = [['header', "Abilities"]]; if (template.isMega) { - abilitySet.unshift(['html', '

    Will be ' + Tools.escapeHTML(template.abilities['0']) + ' after Mega Evolving.

    ']); + abilitySet.unshift(['html', '

    Will be ' + BattleLog.escapeHTML(template.abilities['0']) + ' after Mega Evolving.

    ']); template = Tools.getTemplate(template.baseSpecies); } var abilitiesInThisGen = Tools.getAbilitiesFor(template.id, this.gen); @@ -898,7 +898,7 @@ template = Tools.getTemplate(set.species); var abilities = []; if (template.isMega) { - if (format === 'almostanyability') abilitySet.unshift(['html', '

    Will be ' + Tools.escapeHTML(template.abilities['0']) + ' after Mega Evolving.

    ']); + if (format === 'almostanyability') abilitySet.unshift(['html', '

    Will be ' + BattleLog.escapeHTML(template.abilities['0']) + ' after Mega Evolving.

    ']); // template is unused after this, so no need to replace } for (var i in BattleAbilities) { @@ -1290,7 +1290,7 @@ if (!pokemon) return '
  • Unrecognized pokemon
  • '; var id = toId(pokemon.species); if (Search.urlRoot) attrs += ' href="' + Search.urlRoot + 'pokemon/' + id + '" data-target="push"'; - var buf = '
  • '; + var buf = '
  • '; // number // buf += '' + (pokemon.num >= 0 ? pokemon.num : 'CAP') + ' '; @@ -1414,7 +1414,7 @@ Search.prototype.renderTaggedPokemonRowInner = function (pokemon, tag, errorMessage) { var attrs = ''; if (Search.urlRoot) attrs = ' href="' + Search.urlRoot + 'pokemon/' + toId(pokemon.species) + '" data-target="push"'; - var buf = ''; + var buf = ''; // tag buf += '' + tag + ' '; @@ -1485,7 +1485,7 @@ if (!item) return '
  • Unrecognized item
  • '; var id = toId(item.name); if (Search.urlRoot) attrs += ' href="' + Search.urlRoot + 'items/' + id + '" data-target="push"'; - var buf = '
  • '; + var buf = '
  • '; // icon buf += ''; @@ -1515,7 +1515,7 @@ } } } - buf += '' + Tools.escapeHTML(desc) + ' '; + buf += '' + BattleLog.escapeHTML(desc) + ' '; buf += '
  • '; @@ -1526,7 +1526,7 @@ if (!ability) return '
  • Unrecognized ability
  • '; var id = toId(ability.name); if (Search.urlRoot) attrs += ' href="' + Search.urlRoot + 'abilities/' + id + '" data-target="push"'; - var buf = '
  • '; + var buf = '
  • '; // name var name = ability.name; @@ -1541,7 +1541,7 @@ return buf; } - buf += '' + Tools.escapeHTML(ability.shortDesc || ability.desc) + ' '; + buf += '' + BattleLog.escapeHTML(ability.shortDesc || ability.desc) + ' '; buf += '
  • '; @@ -1552,7 +1552,7 @@ if (!move) return '
  • Unrecognized move
  • '; var id = toId(move.name); if (Search.urlRoot) attrs += ' href="' + Search.urlRoot + 'moves/' + id + '" data-target="push"'; - var buf = '
  • '; + var buf = '
  • '; // name var name = move.name; @@ -1614,7 +1614,7 @@ } } } - buf += '' + Tools.escapeHTML(desc) + ' '; + buf += '' + BattleLog.escapeHTML(desc) + ' '; buf += '
  • '; @@ -1623,7 +1623,7 @@ Search.prototype.renderMoveRowInner = function (move, errorMessage) { var attrs = ''; if (Search.urlRoot) attrs = ' href="' + Search.urlRoot + 'moves/' + toId(move.name) + '" data-target="push"'; - var buf = ''; + var buf = ''; // name var name = move.name; @@ -1649,7 +1649,7 @@ buf += 'PP
    ' + (move.pp === 1 || move.noPPBoosts ? move.pp : move.pp * 8 / 5) + '
    '; // desc - buf += '' + Tools.escapeHTML(move.shortDesc || move.desc) + ' '; + buf += '' + BattleLog.escapeHTML(move.shortDesc || move.desc) + ' '; buf += ''; @@ -1658,7 +1658,7 @@ Search.prototype.renderTaggedMoveRow = function (move, tag, errorMessage) { var attrs = ''; if (Search.urlRoot) attrs = ' href="' + Search.urlRoot + 'moves/' + toId(move.name) + '" data-target="push"'; - var buf = '
  • '; + var buf = '
  • '; // tag buf += '' + tag + ' '; @@ -1686,7 +1686,7 @@ buf += 'PP
    ' + (move.pp !== 1 ? move.pp * 8 / 5 : move.pp) + '
    '; // desc - buf += '' + Tools.escapeHTML(move.shortDesc || move.desc) + ' '; + buf += '' + BattleLog.escapeHTML(move.shortDesc || move.desc) + ' '; buf += '
  • '; @@ -1696,7 +1696,7 @@ Search.prototype.renderTypeRow = function (type, matchStart, matchLength, errorMessage) { var attrs = ''; if (Search.urlRoot) attrs = ' href="' + Search.urlRoot + 'types/' + toId(type.name) + '" data-target="push"'; - var buf = '
  • '; + var buf = '
  • '; // name var name = type.name; @@ -1723,7 +1723,7 @@ Search.prototype.renderCategoryRow = function (category, matchStart, matchLength, errorMessage) { var attrs = ''; if (Search.urlRoot) attrs = ' href="' + Search.urlRoot + 'categories/' + category.id + '" data-target="push"'; - var buf = '
  • '; + var buf = '
  • '; // name var name = category.name; @@ -1752,7 +1752,7 @@ if (Search.urlRoot) attrs = ' href="' + Search.urlRoot + 'articles/' + article.id + '" data-target="push"'; var isSearchType = (article.id === 'pokemon' || article.id === 'moves'); if (isSearchType) attrs = ' href="' + article.id + '/" data-target="replace"'; - var buf = '
  • '; + var buf = '
  • '; // name var name = article.name; @@ -1781,7 +1781,7 @@ Search.prototype.renderEggGroupRow = function (egggroup, matchStart, matchLength, errorMessage) { var attrs = ''; if (Search.urlRoot) attrs = ' href="' + Search.urlRoot + 'egggroups/' + toId(egggroup.name) + '" data-target="push"'; - var buf = '
  • '; + var buf = '
  • '; // name var name = egggroup.name; @@ -1803,7 +1803,7 @@ Search.prototype.renderTierRow = function (tier, matchStart, matchLength, errorMessage) { var attrs = ''; if (Search.urlRoot) attrs = ' href="' + Search.urlRoot + 'tiers/' + toId(tier.name) + '" data-target="push"'; - var buf = '
  • '; + var buf = '
  • '; // name var name = tier.name; diff --git a/js/storage.js b/js/storage.js index 55047837f5..c616348d30 100644 --- a/js/storage.js +++ b/js/storage.js @@ -486,10 +486,10 @@ Storage.initTestClient = function () { if (uri[0] === '/') { //relative URI uri = Tools.resourcePrefix + uri.substr(1); } - var src = '
    '; + var src = ''; src += ''; for (var i in data) { - src += ''; + src += ''; } src += '
    '; app.addPopup(ProxyPopup, {uri: "data:text/html;charset=UTF-8," + encodeURIComponent(src), callback: callback}); @@ -529,7 +529,7 @@ Storage.loadPackedTeams = function (buffer) { Storage.whenAppLoaded(function (app) { app.addPopup(Popup, { type: 'modal', - htmlMessage: "Your teams are corrupt and could not be loaded. :( We may be able to recover a team from this data:
    " + htmlMessage: "Your teams are corrupt and could not be loaded. :( We may be able to recover a team from this data:
    " }); }); } diff --git a/src/battle-animations.ts b/src/battle-animations.ts index 54cbf97a4a..14ea1f576f 100644 --- a/src/battle-animations.ts +++ b/src/battle-animations.ts @@ -657,7 +657,7 @@ class BattleScene { pokemonhtml = '
    ' + pokemonhtml + '
    '; const $sidebar = (side.n ? this.$rightbar : this.$leftbar); if (side.name) { - $sidebar.html('
    ' + Tools.escapeHTML(side.name) + '
    ' + pokemonhtml + '
    '); + $sidebar.html('
    ' + BattleLog.escapeHTML(side.name) + '
    ' + pokemonhtml + '
    '); $sidebar.find('.trainer').css('opacity', 1); } else { $sidebar.find('.trainer').css('opacity', 0.4); @@ -729,7 +729,7 @@ class BattleScene { } side.totalPokemon = side.pokemon.length; if (textBuf) { - this.log('
    ' + Tools.escapeHTML(side.name) + '\'s team: ' + Tools.escapeHTML(textBuf) + '
    '); + this.log('
    ' + BattleLog.escapeHTML(side.name) + '\'s team: ' + BattleLog.escapeHTML(textBuf) + '
    '); } this.$sprites[siden].html(buf + buf2); @@ -2270,7 +2270,7 @@ class PokemonSprite extends Sprite { getStatbarHTML(pokemon: Pokemon) { let buf = '
  • '; - let template = Tools.getTemplate(target); - if (!template.abilities || !template.baseStats) return '[not supported in replays]'; - buf += '' + (template.tier || Tools.getTemplate(template.baseSpecies).tier) + ' '; - buf += ' '; - buf += '' + template.species + ' '; - buf += ''; - if (template.types) for (let i = 0; i < template.types.length; i++) { - buf += Tools.getTypeIcon(template.types[i]); - } - buf += ' '; - buf += ''; - if (template.abilities['1']) { - buf += '' + template.abilities['0'] + '
    ' + template.abilities['1'] + '
    '; - } else { - buf += '' + template.abilities['0'] + ''; - } - if (template.abilities['S']) { - buf += '' + template.abilities['H'] + '
    ' + template.abilities['S'] + '
    '; - } else if (template.abilities['H']) { - buf += '' + template.abilities['H'] + ''; - } else { - buf += ''; - } - buf += '
    '; - buf += ''; - buf += 'HP
    ' + template.baseStats.hp + '
    '; - buf += 'Atk
    ' + template.baseStats.atk + '
    '; - buf += 'Def
    ' + template.baseStats.def + '
    '; - buf += 'SpA
    ' + template.baseStats.spa + '
    '; - buf += 'SpD
    ' + template.baseStats.spd + '
    '; - buf += 'Spe
    ' + template.baseStats.spe + '
    '; - let bst = 0; - for (const i in template.baseStats) bst += template.baseStats[i as StatName]; - buf += 'BST
    ' + bst + '
    '; - buf += '
    '; - buf += '
  • '; - return '
      ' + buf + '
    '; - case 'data-item': - if (!window.BattleSearch) return '[not supported in replays]'; - return '
      ' + BattleSearch.renderItemRow(Tools.getItem(target), 0, 0) + '
    '; - case 'data-ability': - if (!window.BattleSearch) return '[not supported in replays]'; - return '
      ' + BattleSearch.renderAbilityRow(Tools.getAbility(target), 0, 0) + '
    '; - case 'data-move': - if (!window.BattleSearch) return '[not supported in replays]'; - return '
      ' + BattleSearch.renderMoveRow(Tools.getMove(target), 0, 0) + '
    '; - case 'text': - return '
    ' + Tools.parseMessage(target) + '
    '; - case 'error': - return '
    ' + Tools.escapeHTML(target) + '
    '; - case 'html': - return '
    ' + timestamp + '' + clickableName + ': ' + Tools.sanitizeHTML(target) + '
    '; - case 'uhtml': - case 'uhtmlchange': - let parts = target.split(','); - let $elements = $chatElem.find('div.uhtml-' + toId(parts[0])); - let html = parts.slice(1).join(','); - if (!html) { - $elements.remove(); - } else if (!$elements.length) { - $chatElem.append('
    ' + Tools.sanitizeHTML(html) + '
    '); - } else if (cmd === 'uhtmlchange') { - $elements.html(Tools.sanitizeHTML(html)); - } else { - $elements.remove(); - $chatElem.append('
    ' + Tools.sanitizeHTML(html) + '
    '); - } - return ''; - case 'raw': - return '
    ' + Tools.sanitizeHTML(target) + '
    '; - default: - // Not a command or unsupported. Parsed as a normal chat message. - if (!name) { - return '
    ' + timestamp + '' + Tools.parseMessage(message) + '
    '; - } - return '
    ' + timestamp + '' + clickableName + ': ' + Tools.parseMessage(message) + '
    '; - } - }, - - parseMessage(str: string) { - // Don't format console commands (>>). - if (str.substr(0, 3) === '>> ' || str.substr(0, 4) === '>>> ') return Tools.escapeHTML(str); - // Don't format console results (<<). - if (str.substr(0, 3) === '<< ') return Tools.escapeHTML(str); - str = formatText(str); - - let options = Tools.prefs('chatformatting') || {}; - - if (options.hidelinks) { - str = str.replace(/]*>/g, '').replace(/<\/a>/g, ''); - } - if (options.hidespoiler) { - str = str.replace(//g, ''); - } - if (options.hidegreentext) { - str = str.replace(//g, ''); - } - - return str; - }, - - escapeHTML(str: string, jsEscapeToo?: boolean) { - str = getString(str).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); - if (jsEscapeToo) str = str.replace(/\\/g, '\\\\').replace(/'/g, '\\\''); - return str; - }, - - unescapeHTML(str: string) { - str = (str ? '' + str : ''); - return str.replace(/"/g, '"').replace(/>/g, '>').replace(/</g, '<').replace(/&/g, '&'); - }, - - escapeRegExp(str: string) { - return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); - }, - - sanitizeHTML: (function () { - if (!('html4' in window)) { - return function () { - throw new Error('sanitizeHTML requires caja'); - }; - } - // Add to the whitelist. - Object.assign(html4.ELEMENTS, { - 'marquee': 0, - 'blink': 0, - 'psicon': html4.eflags['OPTIONAL_ENDTAG'] | html4.eflags['EMPTY'] - }); - Object.assign(html4.ATTRIBS, { - // See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/marquee - 'marquee::behavior': 0, - 'marquee::bgcolor': 0, - 'marquee::direction': 0, - 'marquee::height': 0, - 'marquee::hspace': 0, - 'marquee::loop': 0, - 'marquee::scrollamount': 0, - 'marquee::scrolldelay': 0, - 'marquee::truespeed': 0, - 'marquee::vspace': 0, - 'marquee::width': 0, - 'psicon::pokemon': 0, - 'psicon::item': 0 - }); - - let uriRewriter = function (urlData: any) { - if (urlData.scheme_ === 'geo' || urlData.scheme_ === 'sms' || urlData.scheme_ === 'tel') return null; - return urlData; - }; - let tagPolicy = function (tagName: string, attribs: string[]) { - if (html4.ELEMENTS[tagName] & html4.eflags['UNSAFE']) { - return; - } - let targetIdx = 0, srcIdx = 0; - if (tagName === 'a') { - // Special handling of tags. - - for (let i = 0; i < attribs.length - 1; i += 2) { - switch (attribs[i]) { - case 'target': - targetIdx = i + 1; - break; - } - } - } - let dataUri = ''; - if (tagName === 'img') { - for (let i = 0; i < attribs.length - 1; i += 2) { - if (attribs[i] === 'src' && attribs[i + 1].substr(0, 11) === 'data:image/') { - srcIdx = i; - dataUri = attribs[i + 1]; - } - if (attribs[i] === 'src' && attribs[i + 1].substr(0, 2) === '//') { - if (location.protocol !== 'http:' && location.protocol !== 'https:') { - attribs[i + 1] = 'http:' + attribs[i + 1]; - } - } - } - } else if (tagName === 'psicon') { - // is a custom element which supports a set of mutually incompatible attributes: - // and - let classValueIndex = -1; - let styleValueIndex = -1; - let iconAttrib = null; - for (let i = 0; i < attribs.length - 1; i += 2) { - if (attribs[i] === 'pokemon' || attribs[i] === 'item') { - // If declared more than once, use the later. - iconAttrib = attribs.slice(i, i + 2); - } else if (attribs[i] === 'class') { - classValueIndex = i + 1; - } else if (attribs[i] === 'style') { - styleValueIndex = i + 1; - } - } - tagName = 'span'; - - if (iconAttrib) { - if (classValueIndex < 0) { - attribs.push('class', ''); - classValueIndex = attribs.length - 1; - } - if (styleValueIndex < 0) { - attribs.push('style', ''); - styleValueIndex = attribs.length - 1; - } - - // Prepend all the classes and styles associated to the custom element. - if (iconAttrib[0] === 'pokemon') { - attribs[classValueIndex] = attribs[classValueIndex] ? 'picon ' + attribs[classValueIndex] : 'picon'; - attribs[styleValueIndex] = attribs[styleValueIndex] ? Tools.getPokemonIcon(iconAttrib[1]) + '; ' + attribs[styleValueIndex] : Tools.getPokemonIcon(iconAttrib[1]); - } else if (iconAttrib[0] === 'item') { - attribs[classValueIndex] = attribs[classValueIndex] ? 'itemicon ' + attribs[classValueIndex] : 'itemicon'; - attribs[styleValueIndex] = attribs[styleValueIndex] ? Tools.getItemIcon(iconAttrib[1]) + '; ' + attribs[styleValueIndex] : Tools.getItemIcon(iconAttrib[1]); - } - } - } - - if (attribs[targetIdx] === 'replace') { - targetIdx = -targetIdx; - } - attribs = html.sanitizeAttribs(tagName, attribs, uriRewriter); - if (targetIdx < 0) { - targetIdx = -targetIdx; - attribs[targetIdx - 1] = 'data-target'; - attribs[targetIdx] = 'replace'; - targetIdx = 0; - } - - if (dataUri && tagName === 'img') { - attribs[srcIdx + 1] = dataUri; - } - if (tagName === 'a' || tagName === 'form') { - if (targetIdx) { - attribs[targetIdx] = '_blank'; - } else { - attribs.push('target'); - attribs.push('_blank'); - } - if (tagName === 'a') { - attribs.push('rel'); - attribs.push('noopener'); - } - } - return {tagName: tagName, attribs: attribs}; - }; - let localizeTime = function (full: string, date: string, time: string, timezone?: string) { - let parsedTime = new Date(date + 'T' + time + (timezone || 'Z').toUpperCase()); - // Very old (pre-ES5) web browsers may be incapable of parsing ISO 8601 - // dates. In such a case, gracefully continue without replacing the date - // format. - if (!parsedTime.getTime()) return full; - - let formattedTime; - // Try using Intl API if it exists - if (window.Intl && Intl.DateTimeFormat) { - formattedTime = new Intl.DateTimeFormat(undefined, {month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric'}).format(parsedTime); - } else { - // toLocaleString even exists in ECMAScript 1, so no need to check - // if it exists. - formattedTime = parsedTime.toLocaleString(); - } - return ''; - }; - return function (input: any) { - //
  • '; + let template = Tools.getTemplate(target); + if (!template.abilities || !template.baseStats) return '[not supported in replays]'; + buf += '' + (template.tier || Tools.getTemplate(template.baseSpecies).tier) + ' '; + buf += ' '; + buf += '' + template.species + ' '; + buf += ''; + if (template.types) for (let i = 0; i < template.types.length; i++) { + buf += Tools.getTypeIcon(template.types[i]); + } + buf += ' '; + buf += ''; + if (template.abilities['1']) { + buf += '' + template.abilities['0'] + '
    ' + template.abilities['1'] + '
    '; + } else { + buf += '' + template.abilities['0'] + ''; + } + if (template.abilities['S']) { + buf += '' + template.abilities['H'] + '
    ' + template.abilities['S'] + '
    '; + } else if (template.abilities['H']) { + buf += '' + template.abilities['H'] + ''; + } else { + buf += ''; + } + buf += '
    '; + buf += ''; + buf += 'HP
    ' + template.baseStats.hp + '
    '; + buf += 'Atk
    ' + template.baseStats.atk + '
    '; + buf += 'Def
    ' + template.baseStats.def + '
    '; + buf += 'SpA
    ' + template.baseStats.spa + '
    '; + buf += 'SpD
    ' + template.baseStats.spd + '
    '; + buf += 'Spe
    ' + template.baseStats.spe + '
    '; + let bst = 0; + for (const i in template.baseStats) bst += template.baseStats[i as StatName]; + buf += 'BST
    ' + bst + '
    '; + buf += '
    '; + buf += '
  • '; + return '
      ' + buf + '
    '; + case 'data-item': + if (!window.BattleSearch) return '[not supported in replays]'; + return '
      ' + BattleSearch.renderItemRow(Tools.getItem(target), 0, 0) + '
    '; + case 'data-ability': + if (!window.BattleSearch) return '[not supported in replays]'; + return '
      ' + BattleSearch.renderAbilityRow(Tools.getAbility(target), 0, 0) + '
    '; + case 'data-move': + if (!window.BattleSearch) return '[not supported in replays]'; + return '
      ' + BattleSearch.renderMoveRow(Tools.getMove(target), 0, 0) + '
    '; + case 'text': + return '
    ' + this.parseMessage(target) + '
    '; + case 'error': + return '
    ' + this.escapeHTML(target) + '
    '; + case 'html': + return '
    ' + timestamp + '' + clickableName + ': ' + BattleLog.sanitizeHTML(target) + '
    '; + case 'uhtml': + case 'uhtmlchange': + let parts = target.split(','); + let $elements = $chatElem.find('div.uhtml-' + toId(parts[0])); + let html = parts.slice(1).join(','); + if (!html) { + $elements.remove(); + } else if (!$elements.length) { + $chatElem.append('
    ' + BattleLog.sanitizeHTML(html) + '
    '); + } else if (cmd === 'uhtmlchange') { + $elements.html(BattleLog.sanitizeHTML(html)); + } else { + $elements.remove(); + $chatElem.append('
    ' + BattleLog.sanitizeHTML(html) + '
    '); + } + return ''; + case 'raw': + return '
    ' + BattleLog.sanitizeHTML(target) + '
    '; + default: + // Not a command or unsupported. Parsed as a normal chat message. + if (!name) { + return '
    ' + timestamp + '' + this.parseMessage(message) + '
    '; + } + return '
    ' + timestamp + '' + clickableName + ': ' + this.parseMessage(message) + '
    '; + } + } + + static parseMessage(str: string) { + // Don't format console commands (>>). + if (str.substr(0, 3) === '>> ' || str.substr(0, 4) === '>>> ') return this.escapeHTML(str); + // Don't format console results (<<). + if (str.substr(0, 3) === '<< ') return this.escapeHTML(str); + str = formatText(str); + + let options = Tools.prefs('chatformatting') || {}; + + if (options.hidelinks) { + str = str.replace(/]*>/g, '').replace(/<\/a>/g, ''); + } + if (options.hidespoiler) { + str = str.replace(//g, ''); + } + if (options.hidegreentext) { + str = str.replace(//g, ''); + } + + return str; + } + + static interstice = (() => { + const whitelist: string[] = (window.Config && Config.whitelist) ? Config.whitelist : []; + const patterns = whitelist.map(entry => new RegExp( + `^(https?:)?//([A-Za-z0-9-]*\\.)?${entry}(/.*)?`, + 'i')); + return { + isWhitelisted(uri: string) { + if (uri[0] === '/' && uri[1] !== '/') { + // domain-relative URIs are safe + return true; + } + for (const pattern of patterns) { + if (pattern.test(uri)) return true; + } + return false; + }, + getURI(uri: string) { + return 'http://pokemonshowdown.com/interstice?uri=' + encodeURIComponent(uri); + }, + }; + })(); + + static tagPolicy: (tagName: string, attribs: string[]) => any = null!; + static initSanitizeHTML() { + if (this.tagPolicy) return; + if (!('html4' in window)) { + throw new Error('sanitizeHTML requires caja'); + } + // Add to the whitelist. + Object.assign(html4.ELEMENTS, { + 'marquee': 0, + 'blink': 0, + 'psicon': html4.eflags['OPTIONAL_ENDTAG'] | html4.eflags['EMPTY'] + }); + Object.assign(html4.ATTRIBS, { + // See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/marquee + 'marquee::behavior': 0, + 'marquee::bgcolor': 0, + 'marquee::direction': 0, + 'marquee::height': 0, + 'marquee::hspace': 0, + 'marquee::loop': 0, + 'marquee::scrollamount': 0, + 'marquee::scrolldelay': 0, + 'marquee::truespeed': 0, + 'marquee::vspace': 0, + 'marquee::width': 0, + 'psicon::pokemon': 0, + 'psicon::item': 0 + }); + + this.tagPolicy = (tagName: string, attribs: string[]) => { + if (html4.ELEMENTS[tagName] & html4.eflags['UNSAFE']) { + return; + } + let targetIdx = 0, srcIdx = 0; + if (tagName === 'a') { + // Special handling of tags. + + for (let i = 0; i < attribs.length - 1; i += 2) { + switch (attribs[i]) { + case 'target': + targetIdx = i + 1; + break; + } + } + } + let dataUri = ''; + if (tagName === 'img') { + for (let i = 0; i < attribs.length - 1; i += 2) { + if (attribs[i] === 'src' && attribs[i + 1].substr(0, 11) === 'data:image/') { + srcIdx = i; + dataUri = attribs[i + 1]; + } + if (attribs[i] === 'src' && attribs[i + 1].substr(0, 2) === '//') { + if (location.protocol !== 'http:' && location.protocol !== 'https:') { + attribs[i + 1] = 'http:' + attribs[i + 1]; + } + } + } + } else if (tagName === 'psicon') { + // is a custom element which supports a set of mutually incompatible attributes: + // and + let classValueIndex = -1; + let styleValueIndex = -1; + let iconAttrib = null; + for (let i = 0; i < attribs.length - 1; i += 2) { + if (attribs[i] === 'pokemon' || attribs[i] === 'item') { + // If declared more than once, use the later. + iconAttrib = attribs.slice(i, i + 2); + } else if (attribs[i] === 'class') { + classValueIndex = i + 1; + } else if (attribs[i] === 'style') { + styleValueIndex = i + 1; + } + } + tagName = 'span'; + + if (iconAttrib) { + if (classValueIndex < 0) { + attribs.push('class', ''); + classValueIndex = attribs.length - 1; + } + if (styleValueIndex < 0) { + attribs.push('style', ''); + styleValueIndex = attribs.length - 1; + } + + // Prepend all the classes and styles associated to the custom element. + if (iconAttrib[0] === 'pokemon') { + attribs[classValueIndex] = attribs[classValueIndex] ? 'picon ' + attribs[classValueIndex] : 'picon'; + attribs[styleValueIndex] = attribs[styleValueIndex] ? Tools.getPokemonIcon(iconAttrib[1]) + '; ' + attribs[styleValueIndex] : Tools.getPokemonIcon(iconAttrib[1]); + } else if (iconAttrib[0] === 'item') { + attribs[classValueIndex] = attribs[classValueIndex] ? 'itemicon ' + attribs[classValueIndex] : 'itemicon'; + attribs[styleValueIndex] = attribs[styleValueIndex] ? Tools.getItemIcon(iconAttrib[1]) + '; ' + attribs[styleValueIndex] : Tools.getItemIcon(iconAttrib[1]); + } + } + } + + if (attribs[targetIdx] === 'replace') { + targetIdx = -targetIdx; + } + attribs = html.sanitizeAttribs(tagName, attribs, (urlData: any) => { + if (urlData.scheme_ === 'geo' || urlData.scheme_ === 'sms' || urlData.scheme_ === 'tel') return null; + return urlData; + }); + if (targetIdx < 0) { + targetIdx = -targetIdx; + attribs[targetIdx - 1] = 'data-target'; + attribs[targetIdx] = 'replace'; + targetIdx = 0; + } + + if (dataUri && tagName === 'img') { + attribs[srcIdx + 1] = dataUri; + } + if (tagName === 'a' || tagName === 'form') { + if (targetIdx) { + attribs[targetIdx] = '_blank'; + } else { + attribs.push('target'); + attribs.push('_blank'); + } + if (tagName === 'a') { + attribs.push('rel'); + attribs.push('noopener'); + } + } + return {tagName: tagName, attribs: attribs}; + }; + } + static localizeTime(full: string, date: string, time: string, timezone?: string) { + let parsedTime = new Date(date + 'T' + time + (timezone || 'Z').toUpperCase()); + // Very old (pre-ES5) web browsers may be incapable of parsing ISO 8601 + // dates. In such a case, gracefully continue without replacing the date + // format. + if (!parsedTime.getTime()) return full; + + let formattedTime; + // Try using Intl API if it exists + if (window.Intl && Intl.DateTimeFormat) { + formattedTime = new Intl.DateTimeFormat(undefined, {month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric'}).format(parsedTime); + } else { + // toLocaleString even exists in ECMAScript 1, so no need to check + // if it exists. + formattedTime = parsedTime.toLocaleString(); + } + return ''; + } + static sanitizeHTML(input: string) { + this.initSanitizeHTML(); + const sanitized = html.sanitizeWithPolicy(getString(input), this.tagPolicy) as string; + //
    ' + Tools.escapeHTML(args[1]) + ': (Private to ' + Tools.escapeHTML(args[3]) + ') ' + Tools.parseMessage(args[4]) + ''); + this.scene.log('
    ' + BattleLog.escapeHTML(args[1]) + ': (Private to ' + BattleLog.escapeHTML(args[3]) + ') ' + BattleLog.parseMessage(args[4]) + ''); break; } case 'askreg': { - this.scene.log('
    Register an account to protect your ladder rating!
    '); + this.scene.log('
    Register an account to protect your ladder rating!
    '); break; } case 'inactive': { if (!this.kickingInactive) this.kickingInactive = true; @@ -4469,11 +4469,11 @@ class Battle { this.kickingInactive = parseInt(args[1].slice(hasIndex + 5), 10) || true; } } - this.scene.log('
    ' + Tools.escapeHTML(args[1]) + '
    ', preempt); + this.scene.log('
    ' + BattleLog.escapeHTML(args[1]) + '
    ', preempt); break; } case 'inactiveoff': { this.kickingInactive = false; - this.scene.log('
    ' + Tools.escapeHTML(args[1]) + '
    ', preempt); + this.scene.log('
    ' + BattleLog.escapeHTML(args[1]) + '
    ', preempt); break; } case 'timer': { break; @@ -4490,7 +4490,7 @@ class Battle { room.userList.updateNoUsersOnline(); } if (!this.ignoreSpects) { - this.scene.log('
    ' + Tools.escapeHTML(args[1]) + ' joined.
    ', preempt); + this.scene.log('
    ' + BattleLog.escapeHTML(args[1]) + ' joined.
    ', preempt); } break; } case 'leave': case 'l': { @@ -4505,7 +4505,7 @@ class Battle { room.userList.updateNoUsersOnline(); } if (!this.ignoreSpects) { - this.scene.log('
    ' + Tools.escapeHTML(args[1]) + ' left.
    ', preempt); + this.scene.log('
    ' + BattleLog.escapeHTML(args[1]) + ' left.
    ', preempt); } break; } case 'J': case 'L': case 'N': case 'n': case 'spectator': case 'spectatorleave': { @@ -4637,16 +4637,16 @@ class Battle { this.cantUseMove(poke, effect, move, kwargs); break; } case 'message': { - this.message(Tools.escapeHTML(args[1])); + this.message(BattleLog.escapeHTML(args[1])); break; } case 'bigerror': { - this.message('
    ' + Tools.escapeHTML(args[1]).replace(/\|/g, '
    ') + '
    '); + this.message('
    ' + BattleLog.escapeHTML(args[1]).replace(/\|/g, '
    ') + '
    '); break; } case 'done': case '': { if (this.ended || this.endPrevAction()) return; break; } case 'warning': { - this.message('Warning: ' + Tools.escapeHTML(args[1])); + this.message('Warning: ' + BattleLog.escapeHTML(args[1])); this.message('Bug? Report it to
    the replay viewer\'s Smogon thread'); this.scene.wait(1000); break; @@ -4661,7 +4661,7 @@ class Battle { } case 'debug': { args.shift(); const name = args.join(' '); - this.scene.log('
    [DEBUG] ' + Tools.escapeHTML(name) + '.
    ', preempt); + this.scene.log('
    [DEBUG] ' + BattleLog.escapeHTML(name) + '.
    ', preempt); break; } case 'seed': case 'choice': { break; @@ -4671,13 +4671,13 @@ class Battle { break; } case 'fieldhtml': { this.playbackState = Playback.Seeking; // force seeking to prevent controls etc - this.scene.setFrameHTML(Tools.sanitizeHTML(args[1])); + this.scene.setFrameHTML(BattleLog.sanitizeHTML(args[1])); break; } case 'controlshtml': { - this.scene.setControlsHTML(Tools.sanitizeHTML(args[1])); + this.scene.setControlsHTML(BattleLog.sanitizeHTML(args[1])); break; } default: { - this.scene.log('
    Unknown command: ' + Tools.escapeHTML(args[0]) + '
    '); + this.scene.log('
    Unknown command: ' + BattleLog.escapeHTML(args[0]) + '
    '); if (this.errorCallback) this.errorCallback(this); break; }} @@ -4691,7 +4691,7 @@ class Battle { if (!str) return; if (str.charAt(0) !== '|' || str.substr(0, 2) === '||') { if (str.charAt(0) === '|') str = str.substr(2); - this.scene.log('
    ' + Tools.escapeHTML(str) + '
    ', preempt); + this.scene.log('
    ' + BattleLog.escapeHTML(str) + '
    ', preempt); return; } let args = ['done']; @@ -4751,9 +4751,9 @@ class Battle { this.runMajor(args, kwargs, preempt); } } catch (e) { - this.scene.log('
    Error parsing: ' + Tools.escapeHTML(str) + ' (' + Tools.escapeHTML('' + e) + ')
    ', preempt); + this.scene.log('
    Error parsing: ' + BattleLog.escapeHTML(str) + ' (' + BattleLog.escapeHTML('' + e) + ')
    ', preempt); if (e.stack) { - let stack = Tools.escapeHTML('' + e.stack).split('\n'); + let stack = BattleLog.escapeHTML('' + e.stack).split('\n'); for (let i = 0; i < stack.length; i++) { if (/\brun\b/.test(stack[i])) { stack.length = i; diff --git a/src/globals.d.ts b/src/globals.d.ts index 17d67c8a6e..8c649bbb81 100644 --- a/src/globals.d.ts +++ b/src/globals.d.ts @@ -29,7 +29,7 @@ declare var BattleStatuses: any; declare var BattlePokemonSprites: any; declare var BattlePokemonSpritesBW: any; -// defined in battle-dex-misc +// defined in battle-log-misc declare function MD5(input: string): string; declare function formatText(input: string): string; diff --git a/test/battle-test.mocha.js b/test/battle-test.mocha.js index 964be32373..f3c62d686b 100644 --- a/test/battle-test.mocha.js +++ b/test/battle-test.mocha.js @@ -8,6 +8,7 @@ window = global; // Without making these modules, the best we can do is directly include them into this workspace. eval('' + fs.readFileSync(`js/battle-scene-stub.js`)); +eval('' + fs.readFileSync(`js/battle-log.js`)); eval('' + fs.readFileSync(`js/battle-dex.js`)); eval('' + fs.readFileSync(`js/battle-dex-data.js`)); eval('' + fs.readFileSync(`js/battle.js`)); From f6c03e0370a81ac0dc138febdeaa201e40e26c5f Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Wed, 14 Nov 2018 16:05:05 -0600 Subject: [PATCH 0053/1782] Implement new battle-text-parser All battle text messages have been moved out of `src/battle.ts` and into its own file `data/text.js`. Code for handling this is in the new files `src/battle-log.ts` and `src/battle-text-parser.ts`. `data/text.js` is now extremely self-contained, and nearly ready for translation support! This is a significant modernization of battle.ts. In addition to moving messages out: Functions for getting names (`pokemon.getLowerName()` etc) have been removed. `battle.minorQueue` has been removed. Minor lines are now processed directly on the main queue, with a new `battle.waitForAnimations` flag to decide whether or not the main queue should wait for animations to finish before moving on to the next line. `battle.waitForResult()` and `battle.endPrevAction()` have been removed. These confusingly-named functions closed the messagebar (and flush the minor queue). They've been replaced with `scene.maybeCloseMessagebar()`. `pokemon.markMove()` and `pokemon.markAbility()` have been renamed `pokemon.rememberMove()` and `pokemon.rememberAbility()`. --- .eslintignore | 1 + .gitignore | 1 + build-tools/update | 4 +- data/text.js | 1100 ++++++++ js/client-battle-tooltips.js | 8 +- js/client-battle.js | 1 - js/client-mainmenu.js | 80 + src/battle-animations-moves.ts | 47 +- src/battle-animations.ts | 146 +- src/battle-dex-data.ts | 2 +- src/battle-log.ts | 398 ++- src/battle-scene-stub.ts | 3 +- src/battle-text-parser.ts | 902 +++++++ src/battle.ts | 4319 ++++++++++---------------------- 14 files changed, 3880 insertions(+), 3132 deletions(-) create mode 100644 data/text.js create mode 100644 src/battle-text-parser.ts diff --git a/.eslintignore b/.eslintignore index 4572b06420..bc0ada612f 100644 --- a/.eslintignore +++ b/.eslintignore @@ -5,6 +5,7 @@ node_modules/ /js/battle.js /js/battledata.js /js/battle-log.js +/js/battle-text-parser.js /js/battle-dex.js /js/battle-dex-data.js /js/battle-animations-moves.js diff --git a/.gitignore b/.gitignore index 60d45e0477..c2086a3391 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ package-lock.json /js/battle.js /js/battledata.js /js/battle-log.js +/js/battle-text-parser.js /js/battle-dex.js /js/battle-dex-data.js /js/battle-animations-moves.js diff --git a/build-tools/update b/build-tools/update index 199f0a0a82..35c7ffa73e 100755 --- a/build-tools/update +++ b/build-tools/update @@ -60,7 +60,9 @@ if (!ignoreGraphics) { fs.writeFileSync( 'data/graphics.js', fs.readFileSync('js/battle-animations.js') + '\n\n' + - fs.readFileSync('js/battle-animations-moves.js') + fs.readFileSync('js/battle-animations-moves.js') + '\n\n' + + fs.readFileSync('data/text.js') + '\n\n' + + fs.readFileSync('js/battle-text-parser.js') ); } diff --git a/data/text.js b/data/text.js new file mode 100644 index 0000000000..d76ff5358a --- /dev/null +++ b/data/text.js @@ -0,0 +1,1100 @@ +var BattleText = exports.BattleText = { + default: { + startBattle: "Battle started between [TRAINER] and [TRAINER]!", + winBattle: "**[TRAINER]** won the battle!", + tieBattle: "Tie between [TRAINER] and [TRAINER]!", + + pokemon: "[NICKNAME]", + opposingPokemon: "the opposing [NICKNAME]", + team: "your team", + opposingTeam: "the opposing team", + + turn: "== Turn [NUMBER] ==", + switchIn: "[TRAINER] sent out [FULLNAME]!", + switchInOwn: "Go! [FULLNAME]!", + switchOut: "[TRAINER] withdrew [NICKNAME]!", + switchOutOwn: "[NICKNAME], come back!", + drag: "[FULLNAME] was dragged out!", + faint: "[POKEMON] fainted!", + swap: "[POKEMON] and [TARGET] switched places!", + swapCenter: "[POKEMON] moved to the center!", + + zEffect: " [POKEMON] unleases its full-force Z-Move!", + move: "[POKEMON] used **[MOVE]**!", + abilityActivation: " [[POKEMON]'s [ABILITY]]", + + mega: " [POKEMON]'s [ITEM] is reacting to the Key Stone!", + megaGen6: " [POKEMON]'s [ITEM] is reacting to [TRAINER]'s Mega Bracelet!", + transformMega: "[POKEMON] has Mega Evolved into Mega [SPECIES]!", + primal: "[POKEMON]'s Primal Reversion! It reverted to its primal state!", + zPower: " [POKEMON] surrounded itself with its Z-Power!", + zBroken: " [POKEMON] couldn't fully protect itself and got hurt!", + + // in case the different default messages didn't make it obvious, the difference + // is that the `cant` message REPLACES "Pokemon used Move!", while the `fail` + // message happens AFTER "Pokemon used Move!" + cant: "[POKEMON] can't use [MOVE]!", + fail: " But it failed!", + + // n.b. this is the default message for in-battle forme changes + // for the move Transform and ability Imposter, see the entry for the move Transform + transform: "[POKEMON] transformed!", + typeChange: " [POKEMON] transformed into the [TYPE] type!", + typeChangeFromEffect: " [POKEMON]'s [EFFECT] made it the [TYPE] type!", + typeAdd: " [TYPE] type was added to [POKEMON]!", + + start: " ([POKEMON]'s [EFFECT] started!)", + end: " [POKEMON] was freed from [EFFECT]!", + activate: " ([POKEMON]'s [EFFECT] activated!)", + + changeAbility: " [POKEMON] acquired [ABILITY]!", + addItem: " [POKEMON] obtained one [ITEM].", // Trick, Switcheroo + takeItem: " [POKEMON] stole [SOURCE]'s [ITEM]!", + eatItem: " [POKEMON] ate its [ITEM]!", + useGem: " The [ITEM] strengthened [POKEMON]'s power!", + eatItemWeaken: " The [ITEM] weakened damage to [POKEMON]!", + removeItem: " [POKEMON] lost its [ITEM]!", + + damage: " ([POKEMON] was hurt!)", + damagePercentage: " ([POKEMON] lost [PERCENTAGE] of its health!)", + damageFromPokemon: " [POKEMON] is hurt by [SOURCE]'s [EFFECT]!", + damageFromItem: " [POKEMON] is hurt by its [ITEM]!", // Sticky Barb + damageFromPartialTrapping: " [POKEMON] is hurt by [MOVE]!", + heal: " [POKEMON] restored its HP.", + healFromZEffect: " [POKEMON] restored its HP using its Z-Power!", + healFromEffect: " [POKEMON] restored HP using its [EFFECT]!", + + boost: " [POKEMON]'s [STAT] rose!", + boost2: " [POKEMON]'s [STAT] rose sharply!", + boost3: " [POKEMON]'s [STAT] rose drastically!", + boost0: " [POKEMON]'s [STAT] won't go any higher!", + boostFromItem: " The [ITEM] raised [POKEMON]'s [STAT]!", + boost2FromItem: " The [ITEM] sharply raised [POKEMON]'s [STAT]!", + boost3FromItem: " The [ITEM] drastically raised [POKEMON]'s [STAT]!", + boostFromZEffect: " [POKEMON] boosted its [STAT] using its Z-Power!", + boost2FromZEffect: " [POKEMON] boosted its [STAT] sharply using its Z-Power!", + boost3FromZEffect: " [POKEMON] boosted its [STAT] drastically using its Z-Power!", + boostMultipleFromZEffect: " [POKEMON] boosted its stats using its Z-Power!", + + unboost: " [POKEMON]'s [STAT] fell!", + unboost2: " [POKEMON]'s [STAT] fell harshly!", + unboost3: " [POKEMON]'s [STAT] fell severely!", + unboost0: " [POKEMON]'s [STAT] won't go any lower!", + unboostFromItem: " The [ITEM] lowered [POKEMON]'s [STAT]!", + unboost2FromItem: " The [ITEM] harshly lowered [POKEMON]'s [STAT]!", + unboost3FromItem: " The [ITEM] drastically lowered [POKEMON]'s [STAT]!", + + swapBoost: " [POKEMON] switched stat changes with its target!", + swapOffensiveBoost: " [POKEMON] switched all changes to its Attack and Sp. Atk with its target!", + swapDefensiveBoost: " [POKEMON] switched all changes to its Defense and Sp. Def with its target!", + copyBoost: " [POKEMON] copied [TARGET]'s stat changes!", + clearBoost: " [POKEMON]'s stat changes were removed!", + clearBoostFromZEffect: " [POKEMON] returned its decreased stats to normal using its Z-Power!", + invertBoost: " [POKEMON]'s stat changes were inverted!", + clearAllBoost: " All stat changes were eliminated!", + + superEffective: " It's super effective!", + superEffectiveSpread: " It's super effective on [POKEMON]!", + resisted: " It's not very effective...", + resistedSpread: " It's not very effective on [POKEMON].", + crit: " A critical hit!", + critSpread: " A critical hit on [POKEMON]!", + immune: " It doesn't affect [POKEMON]...", + immuneNoPokemon: " It had no effect!", // old gens + immuneOHKO: " [POKEMON] is unaffected!", + miss: " [POKEMON] avoided the attack!", + missNoPokemon: " [SOURCE]'s attack missed!", // old gens + + center: " Automatic center!", + noTarget: " But there was no target...", // gen 5 and earlier + ohko: " It's a one-hit KO!", + combine: " The two moves have become one! It's a combined move!", + hitCount: " Hit [NUMBER] times!", + hitCountSingular: " Hit 1 time!", + }, + + // statuses + brn: { + start: " [POKEMON] was burned!", + startFromItem: " [POKEMON] was burned by the [ITEM]!", + alreadyStarted: " [POKEMON] already has a burn.", + end: " [POKEMON]'s burn was healed.", + endFromItem: " [POKEMON]'s [ITEM] healed its burn!", + damage: " [POKEMON] was hurt by its burn!", + }, + frz: { + start: " [POKEMON] was frozen solid!", + alreadyStarted: " [POKEMON] is already frozen solid!", + end: " [POKEMON] thawed out!", + endFromItem: " [POKEMON]'s [ITEM] defrosted it!", + endFromMove: " [POKEMON]'s [MOVE] melted the ice!", + cant: "[POKEMON] is frozen solid!", + }, + par: { + start: " [POKEMON] is paralyzed! It may be unable to move!", + alreadyStarted: " [POKEMON] is already paralyzed.", + end: " [POKEMON] was cured of paralysis.", + endFromItem: " [POKEMON]'s [ITEM] cured its paralysis!", + cant: "[POKEMON] is paralyzed! It can't move!", + }, + psn: { + start: " [POKEMON] was poisoned!", + alreadyStarted: " [POKEMON] is already poisoned.", + end: " [POKEMON] was cured of its poisoning.", + endFromItem: " [POKEMON]'s [ITEM] cured its poison!", + damage: " [POKEMON] was hurt by poison!", + }, + tox: { + start: " [POKEMON] was badly poisoned!", + startFromItem: " [POKEMON] was badly poisoned by the [ITEM]!", + end: "#psn", + endFromItem: "#psn", + alreadyStarted: "#psn", + damage: "#psn", + }, + slp: { + start: " [POKEMON] fell asleep!", + startFromRest: " [POKEMON] slept and became healthy!", + alreadyStarted: " [POKEMON] is already asleep!", + end: " [POKEMON] woke up!", + endFromItem: " [POKEMON]'s [ITEM] woke it up!", + cant: "[POKEMON] is fast asleep.", + }, + + // misc effects + confusion: { + start: " [POKEMON] became confused!", + startFromFatigue: " [POKEMON] became confused due to fatigue!", + // end: " [POKEMON] snapped out of confusion!", // PO artifact? + end: " [POKEMON] snapped out of its confusion!", + endFromItem: " [POKEMON]'s [ITEM] snapped it out of its confusion!", + alreadyStarted: " [POKEMON] is already confused!", + activate: " [POKEMON] is confused!", + damage: "It hurt itself in its confusion!", + }, + drain: { + heal: " [SOURCE] had its energy drained!", + }, + flinch: { + cant: "[POKEMON] flinched and couldn't move!", + }, + healreplacement: { + activate: " [POKEMON] will restore its replacement's HP using its Z-Power!", + }, + nopp: { + cant: "[POKEMON] used [MOVE]!\n But there was no PP left for the move!", + }, + recharge: { + cant: "[POKEMON] must recharge!", + }, + recoil: { + damage: " [POKEMON] is damaged by the recoil!", + }, + unboost: { + fail: " [POKEMON]'s stats were not lowered!", + failSingular: " [POKEMON]'s [STAT] was not lowered!", + }, + struggle: { + activate: " [POKEMON] has no moves left!", + }, + trapped: { + start: " [POKEMON] can no longer escape!", + }, + + // weather + sandstorm: { + weatherName: "Sandstorm", + start: " A sandstorm kicked up!", + startFromAbility: " [POKEMON]'s Sand Stream whipped up a sandstorm!", + end: " The sandstorm subsided.", + activate: " The sandstorm is raging.", + damage: " [POKEMON] is buffeted by the sandstorm!", + }, + sunnyday: { + weatherName: "Sun", + start: " The sunlight turned harsh!", + startFromAbility: " [POKEMON]'s Drought intensified the sun's rays!", + end: " The sunlight faded.", + activate: " (The sunlight is strong!)", + }, + raindance: { + weatherName: "Rain", + start: " It started to rain!", + startFromAbility: " [POKEMON]'s Drizzle made it rain!", + end: " The rain stopped.", + activate: " (Rain continues to fall!)", + }, + hail: { + weatherName: "Hail", + start: " It started to hail!", + startFromAbility: " [POKEMON]'s Snow Warning whipped up a hailstorm!", + end: " The hail stopped.", + activate: " The hail is crashing down.", + damage: " [POKEMON] is buffeted by the hail!", + }, + desolateland: { + weatherName: "Intense Sun", + start: " The sunlight turned extremely harsh!", + block: " The extremely harsh sunlight was not lessened at all!", + blockMove: " The Water-type attack evaporated in the harsh sunlight!", + }, + primordialsea: { + weatherName: "Heavy Rain", + start: " A heavy rain began to fall!", + end: " The heavy rain has lifted!", + block: " There is no relief from this heavy rain!", + blockMove: " The Fire-type attack fizzled out in the heavy rain!", + }, + deltastream: { + weatherName: "Strong Winds", + start: " Mysterious strong winds are protecting Flying-type Pok\u00E9mon!", + end: " The mysterious strong winds have dissipated!", + activate: " The mysterious strong winds weakened the attack!", + block: " The mysterious strong winds blow on regardless!", + }, + + // terrain + electricterrain: { + start: " An electric current runs across the battlefield!", + end: " The electricity disappeared from the battlefield.", + block: " [POKEMON] surrounds itself with electrified terrain!", + }, + grassyterrain: { + start: " Grass grew to cover the battlefield!", + end: " The grass disappeared from the battlefield.", + }, + mistyterrain: { + start: " Mist swirls around the battlefield!", + end: " The mist disappeared from the battlefield.", + block: " [POKEMON] surrounds itself with a protective mist!", + }, + psychicterrain: { + start: " The battlefield got weird!", + end: " The weirdness disappeared from the battlefield!", + block: " [POKEMON] surrounds itself with psychic terrain!", + }, + + // field effects + gravity: { + start: " Gravity intensified!", + end: " Gravity returned to normal!", + cant: "[POKEMON] can't use [MOVE] because of gravity!", + activate: "[POKEMON] couldn't stay airborne because of gravity!", + }, + magicroom: { + start: " It created a bizarre area in which Pokémon's held items lose their effects!", + end: " Magic Room wore off, and held items' effects returned to normal!", + }, + mudsport: { + start: " Electricity's power was weakened!", + end: " The effects of Mud Sport have faded.", + }, + trickroom: { + start: " [POKEMON] twisted the dimensions!", + end: " The twisted dimensions returned to normal!", + }, + watersport: { + start: " Fire's power was weakened!", + end: " The effects of Water Sport have faded.", + }, + wonderroom: { + start: " It created a bizarre area in which Defense and Sp. Def stats are swapped!", + end: " Wonder Room wore off, and Defense and Sp. Def stats returned to normal!", + }, + + // moves + afteryou: { + activate: " [TARGET] took the kind offer!", + }, + aquaring: { + start: " [POKEMON] surrounded itself with a veil of water!", + heal: " A veil of water restored [POKEMON]'s HP!", + }, + aromatherapy: { + activate: " A soothing aroma wafted through the area!", + }, + attract: { + start: " [POKEMON] fell in love!", + startFromItem: " [POKEMON] fell in love from the [ITEM]!", + end: " [POKEMON] got over its infatuation!", + endFromItem: " [POKEMON] cured its infatuation using its [ITEM]!", + activate: " [POKEMON] is in love with [TARGET]!", + cant: "[POKEMON] is immobilized by love!", + }, + auroraveil: { + start: " Aurora Veil made [TEAM] stronger against physical and special moves!", + end: " [TEAM]'s Aurora Veil wore off!", + }, + autotomize: { + start: " [POKEMON] became nimble!", + }, + beakblast: { + start: " [POKEMON] started heating up its beak!", + }, + beatup: { + activate: " [TARGET]'s attack!", // past gen only + }, + bestow: { + takeItem: " [POKEMON] received [ITEM] from [SOURCE]!", + }, + bide: { + start: " [POKEMON] is storing energy!", + end: " [POKEMON] unleashed its energy!", + activate: " [POKEMON] is storing energy!", + }, + bind: { + start: " [POKEMON] was squeezed by [SOURCE]!", + move: "#wrap", // gen 1 only + }, + brickbreak: { + activate: " [POKEMON] shattered [TEAM]'s protections!", + }, + bellydrum: { + boost: " [POKEMON] cut its own HP and maximized its Attack!" + }, + bounce: { + prepare: "[POKEMON] sprang up!", + }, + bugbite: { + removeItem: " [SOURCE] stole and ate its target's [ITEM]!", + }, + burnup: { + typeChange: " [POKEMON] burned itself out!", + }, + celebrate: { + activate: " Congratulations, [TRAINER]!", + }, + charge: { + start: " [POKEMON] began charging power!", + }, + clamp: { + start: " [SOURCE] clamped down on [POKEMON]!", + move: "#wrap", // gen 1 only + }, + craftyshield: { + start: " Crafty Shield protected [TEAM]!", + block: " Crafty Shield protected [POKEMON]!", + }, + curse: { + start: " [SOURCE] cut its own HP and put a curse on [POKEMON]!", + damage: " [POKEMON] is afflicted by the curse!", + }, + darkvoid: { + fail: "But [POKEMON] can't use the move!", + failWrongForme: "But [POKEMON] can't use it the way it is now!", + }, + destinybond: { + start: "[POKEMON] is hoping to take its attacker down with it!", + activate: " [POKEMON] took its attacker down with it!", + }, + dig: { + prepare: "[POKEMON] burrowed its way under the ground!", + }, + disable: { + start: " [POKEMON]'s [MOVE] was disabled!", + end: " [POKEMON]'s move is no longer disabled!", + }, + dive: { + prepare: "[POKEMON] hid underwater!", + }, + doomdesire: { + start: " [POKEMON] chose Doom Desire as its destiny!", + activate: " [TARGET] took the Doom Desire attack!", + }, + dragonascent: { + mega: "[TRAINER]'s fervent wish has reached [POKEMON]!\n[POKEMON] has Mega Evolved into [SPECIES]!", + }, + electrify: { + start: " [POKEMON]'s moves have been electrified!", + }, + embargo: { + start: " [POKEMON] can't use items anymore!", + end: " [POKEMON] can use items again!", + }, + encore: { + start: " [POKEMON] received an encore!", + end: " [POKEMON]'s encore ended!", + }, + endure: { + start: " [POKEMON] braced itself!", + activate: " [POKEMON] endured the hit!", + }, + fairylock: { + start: " No one will be able to run away during the next turn!", + }, + feint: { + activate: " [TARGET] fell for the feint!", + }, + firepledge: { + activate: "#waterpledge", + start: " A sea of fire enveloped [TEAM]!", + end: " The sea of fire around [TEAM] disappeared!", + damage: " [POKEMON] is hurt by the sea of fire!", + }, + firespin: { + start: " [POKEMON] became trapped in the fiery vortex!", + move: "#wrap", // gen 1 only + }, + flameburst: { + damage: " The bursting flame hit [POKEMON]!", + }, + fling: { + removeItem: " [POKEMON] flung its [ITEM]!", + }, + fly: { + prepare: "[POKEMON] flew up high!", + }, + focusenergy: { + start: " [POKEMON] is getting pumped!", + startFromItem: " [POKEMON] used the [ITEM] to get pumped!", + startFromZEffect: " [POKEMON] boosted its critical-hit ratio using its Z-Power!", + }, + focuspunch: { + start: " [POKEMON] is tightening its focus!", + cant: "[POKEMON] lost its focus and couldn't move!", + }, + followme: { + start: " [POKEMON] became the center of attention!", + startFromZEffect: " [POKEMON] became the center of attention!", + }, + foresight: { + start: " [POKEMON] was identified!", + }, + freezeshock: { + prepare: " [POKEMON] became cloaked in a freezing light!", + }, + futuresight: { + start: " [POKEMON] foresaw an attack!", + activate: " [TARGET] took the Future Sight attack!", + }, + gastroacid: { + start: " [POKEMON]'s Ability was suppressed!", + }, + geomancy: { + prepare: "[POKEMON] is absorbing power!", + }, + grasspledge: { + activate: "#waterpledge", + start: " A swamp enveloped [TEAM]!", + end: " The swamp around [TEAM] disappeared!", + }, + grudge: { + start: "[POKEMON] wants its target to bear a grudge!", + }, + guardsplit: { + activate: " [POKEMON] shared its guard with the target!", + }, + happyhour: { + activate: " Everyone is caught up in the happy atmosphere!", + }, + healbell: { + activate: " A bell chimed!", + }, + healblock: { + start: " [POKEMON] was prevented from healing!", + end: " [POKEMON]'s Heal Block wore off!", + cant: "[POKEMON] can't use [MOVE] because of Heal Block!", + }, + healingwish: { + heal: " The healing wish came true for [POKEMON]!", + }, + helpinghand: { + start: " [SOURCE] is ready to help [POKEMON]!", + }, + highjumpkick: { + damage: " [POKEMON] kept going and crashed!", + }, + hyperspacefury: { + activate: "#shadowforce", + fail: "#darkvoid", + }, + hyperspacehole: { + activate: "#shadowforce", + }, + iceburn: { + prepare: " [POKEMON] became cloaked in freezing air!", + }, + imprison: { + start: " [POKEMON] sealed any moves its target shares with it!", + cant: "[POKEMON] can't use its sealed [MOVE]!", + }, + incinerate: { + removeItem: " [POKEMON]'s [ITEM] was burned up!", + }, + infestation: { + start: " [POKEMON] has been afflicted with an infestation by [SOURCE]!", + }, + ingrain: { + start: " [POKEMON] planted its roots!", + block: " [POKEMON] anchored itself with its roots!", + heal: " [POKEMON] absorbed nutrients with its roots!", + }, + instruct: { + activate: " [TARGET] used the move instructed by [POKEMON]!", + }, + iondeluge: { + activate: " A deluge of ions showers the battlefield!", + }, + jumpkick: { + damage: "#highjumpkick", + }, + knockoff: { + removeItem: " [SOURCE] knocked off [POKEMON]'s [ITEM]!", + }, + laserfocus: { + start: " [POKEMON] concentrated intensely!", + }, + leechseed: { + start: " [POKEMON] was seeded!", + end: " [POKEMON] was freed from Leech Seed!", + damage: " [POKEMON]'s health is sapped by Leech Seed!", + }, + lightscreen: { + start: " Light Screen made [TEAM] stronger against special moves!", + end: " [TEAM]'s Light Screen wore off!", + // gen 1 + start: " [POKEMON]'s protected against special attacks!", + }, + lockon: { + start: " [SOURCE] took aim at [POKEMON]!", + }, + luckychant: { + start: " Lucky Chant shielded [TEAM] from critical hits!", + end: " [TEAM]'s Lucky Chant wore off!", + }, + lunardance: { + heal: " [POKEMON] became cloaked in mystical moonlight!", + }, + magiccoat: { + start: " [POKEMON] shrouded itself with Magic Coat!", + move: "[POKEMON] bounced the [MOVE] back!", + }, + magikarpsrevenge: { + fail: "#darkvoid", + }, + magmastorm: { + start: " [POKEMON] became trapped by swirling magma!", + }, + magnitude: { + start: " Magnitude [NUMBER]!", + }, + matblock: { + start: " [POKEMON] intends to flip up a mat and block incoming attacks!", + block: " [MOVE] was blocked by the kicked-up mat!", + }, + magnetrise: { + start: " [POKEMON] levitated with electromagnetism!", + end: " [POKEMON]'s electromagnetism wore off!", + // "The electromagnetism of [POKEMON] wore off!" // PO artifact? + }, + memento: { + heal: " [POKEMON]'s HP was restored by the Z-Power!", + }, + metronome: { + move: "Waggling a finger let it use [MOVE]!", + }, + mimic: { + start: " [POKEMON] learned [MOVE]!", + }, + mindreader: { + start: "#lockon", + }, + miracleeye: { + start: "#foresight", + }, + mist: { + start: " [TEAM] became shrouded in mist!", + end: " [TEAM] is no longer protected by mist!", + block: " [POKEMON] is protected by the mist!", + }, + naturepower: { + move: "Nature Power turned into [MOVE]!", + }, + nightmare: { + start: " [POKEMON] began having a nightmare!", + damage: " [POKEMON] is locked in a nightmare!", + }, + painsplit: { + activate: " The battlers shared their pain!", + }, + partingshot: { + heal: "#memento", + }, + payday: { + activate: " Coins were scattered everywhere!", + }, + perishsong: { + start: " All Pokémon that heard the song will faint in three turns!", + activate: " [POKEMON]'s perish count fell to [NUMBER].", + }, + phantomforce: { + prepare: "#shadowforce", + activate: "#shadowforce", + }, + pluck: { + removeItem: '#bugbite', + }, + powder: { + start: " [POKEMON] is covered in powder!", + activate: " When the flame touched the powder on the Pokémon, it exploded!", + }, + powersplit: { + activate: " [POKEMON] shared its power with the target!", + }, + powertrick: { + start: " [POKEMON] switched its Attack and Defense!", + end: '#.start', + }, + protect: { + start: " [POKEMON] protected itself!", + block: " [POKEMON] protected itself!", + }, + pursuit: { + activate: " ([TARGET] is being withdrawn...)", + }, + quash: { + activate: " [TARGET]'s move was postponed!", + }, + quickguard: { + start: " Quick Guard protected [TEAM]!", + block: " Quick Guard protected [POKEMON]!", + }, + ragepowder: { + start: '#followme', + startFromZEffect: '#followme', + }, + razorwind: { + prepare: " [POKEMON] whipped up a whirlwind!", + }, + recycle: { + addItem: " [POKEMON] found one [ITEM]!", + }, + reflect: { + start: " Reflect made [TEAM] stronger against physical moves!", + end: " [TEAM]'s Reflect wore off!", + // gen 1 + start: " [POKEMON] gained armor!", + }, + reflecttype: { + typeChange: " [POKEMON]'s type became the same as [SOURCE]'s type!", + }, + roleplay: { + changeAbility: " [POKEMON] copied [SOURCE]'s [ABILITY] Ability!", + }, + roost: { + start: " ([POKEMON] loses Flying type this turn.)", + }, + safeguard: { + start: " [TEAM] cloaked itself in a mystical veil!", + end: " [TEAM] is no longer protected by Safeguard!", + block: " [POKEMON] is protected by Safeguard!", + }, + sandtomb: { + start: " [POKEMON] became trapped by the quicksand!", + }, + shadowforce: { + activate: " It broke through [TARGET]'s protection!", + prepare: "[POKEMON] vanished instantly!", + }, + shelltrap: { + start: " [POKEMON] set a shell trap!", + prepare: " [POKEMON] set a shell trap!", + cant: "[POKEMON]'s shell trap didn't work!", + }, + sketch: { + activate: " [POKEMON] sketched [MOVE]!", + }, + skillswap: { + activate: " [POKEMON] swapped Abilities with its target!", + }, + skullbash: { + prepare: "[POKEMON] tucked in its head!", + }, + skyattack: { + prepare: "[POKEMON] became cloaked in a harsh light!", + }, + skydrop: { + prepare: "[POKEMON] took [TARGET] into the sky!", + end: " [POKEMON] was freed from the Sky Drop!", + failSelect: "Sky Drop won't let [POKEMON] go!", + failTooHeavy: " [POKEMON] is too heavy to be lifted!", + }, + smackdown: { + start: " [POKEMON] fell straight down!", + }, + snatch: { + start: " [POKEMON] waits for a target to make a move!", + activate: " [POKEMON] snatched [TARGET]'s move!", + }, + solarbeam: { + prepare: " [POKEMON] absorbed light!", + }, + solarblade: { + prepare: "#solarbeam", + }, + spectralthief: { + clearBoost: " [SOURCE] stole the target's boosted stats!", + }, + speedswap: { + activate: " [POKEMON] switched Speed with its target!", + }, + spikes: { + start: " Spikes were scattered on the ground all around [TEAM]!", + end: " The spikes disappeared from the ground around [TEAM]!", + damage: " [POKEMON] is hurt by the spikes!", + }, + spikyshield: { + damage: "#roughskin", + }, + spite: { + activate: " It reduced the PP of [TARGET]'s [MOVE] by [NUMBER]!", + }, + splash: { + activate: " But nothing happened!", + }, + spotlight: { + start: "#followme", + startFromZEffect: "#followme", + }, + stealthrock: { + start: " Pointed stones float in the air around [TEAM]!", + end: " The pointed stones disappeared from around [TEAM]!", + damage: " Pointed stones dug into [POKEMON]!", + }, + stickyweb: { + start: " A sticky web spreads out on the ground around [TEAM]!", + end: " The sticky web has disappeared from the ground around [TEAM]!", + activate: " [POKEMON] was caught in a sticky web!", + }, + stockpile: { + start: " [POKEMON] stockpiled [NUMBER]!", + end: " [POKEMON]'s stockpiled effect wore off!", + }, + substitute: { + start: " [POKEMON] put in a substitute!", + alreadyStarted: " [POKEMON] already has a substitute!", + end: " [POKEMON]'s substitute faded!", + fail: " But it does not have enough HP left to make a substitute!", + activate: " The substitute took damage for [POKEMON]!", + }, + switcheroo: { + activate: "#trick", + }, + tailwind: { + start: " The Tailwind blew from behind [TEAM]!", + end: " [TEAM]'s Tailwind petered out!", + }, + taunt: { + start: " [POKEMON] fell for the taunt!", + end: " [POKEMON]'s taunt wore off!", + cant: "[POKEMON] can't use [MOVE] after the taunt!", + }, + telekinesis: { + start: " [POKEMON] was hurled into the air!", + end: " [POKEMON] was freed from the telekinesis!", + }, + throatchop: { + cant: "The effects of Throat Chop prevent [POKEMON] from using certain moves!", + }, + torment: { + start: " [POKEMON] was subjected to torment!", + end: " [POKEMON]'s torment wore off!", + }, + toxicspikes: { + start: " Poison spikes were scattered on the ground all around [TEAM]!", + end: " The poison spikes disappeared from the ground around [TEAM]!", + }, + transform: { + transform: "[POKEMON] transformed into [SPECIES]!", + }, + trick: { + activate: " [POKEMON] switched items with its target!", + }, + uproar: { + start: " [POKEMON] caused an uproar!", + end: " [POKEMON] calmed down.", + activate: " [POKEMON] is making an uproar!", + block: " But the uproar kept [POKEMON] awake!", + blockSelf: " [POKEMON] can't sleep in an uproar!", + }, + uturn: { + switchOut: "[POKEMON] went back to [TRAINER]!", + }, + voltswitch: { + switchOut: '#uturn', + }, + waterpledge: { + activate: " [POKEMON] is waiting for [TARGET]'s move...", + start: " A rainbow appeared in the sky on [TEAM]'s side!", + end: " The rainbow on [TEAM]'s side disappeared!", + }, + weatherball: { + move: "Breakneck Blitz turned into [MOVE] due to the weather!", + }, + whirlpool: { + start: " [POKEMON] became trapped in the vortex!", + }, + wideguard: { + start: " Wide Guard protected [TEAM]!", + block: " Wide Guard protected [POKEMON]!", + }, + wish: { + heal: " [SOURCE]'s wish came true!", + }, + wrap: { + start: " [POKEMON] was wrapped by [SOURCE]!", + move: "[POKEMON]'s attack continues!", // gen 1 only + }, + yawn: { + start: " [POKEMON] grew drowsy!", + }, + + // abilities + aftermath: { + damage: " [POKEMON] is hurt!", + }, + airlock: { + start: " The effects of the weather disappeared.", + }, + angerpoint: { + boost: " [POKEMON] maxed its Attack!", + }, + anticipation: { + activate: " [POKEMON] shuddered!", + }, + aromaveil: { + block: " [TARGET] is protected by an aromatic veil!", + }, + aurabreak: { + start: " [POKEMON] reversed all other Pokémon's auras!", + }, + baddreams: { + damage: " [POKEMON] is tormented!", + }, + battlebond: { + activate: " [POKEMON] became fully charged due to its bond with its Trainer!", + transform: "[POKEMON] became Ash-Greninja!", + }, + blacksludge: { + heal: " [POKEMON] restored a little HP using its Black Sludge!", + }, + cloudnine: { + start: "#airlock", + }, + comatose: { + start: " [POKEMON] is drowsing!", + }, + damp: { + cant: "[POKEMON] cannot use [MOVE]!", + }, + darkaura: { + start: " [POKEMON] is radiating a dark aura!", + }, + dazzling: { + cant: "#damp", + }, + disguise: { + block: " Its disguise served it as a decoy!", + transform: "[POKEMON]'s disguise was busted!", + }, + dryskin: { + damage: " ([POKEMON] was hurt by its Dry Skin.)", + }, + fairyaura: { + start: " [POKEMON] is radiating a fairy aura!", + }, + flashfire: { + start: " The power of [POKEMON]'s Fire-type moves rose'!", + }, + flowerveil: { + block: " [TARGET] surrounded itself with a veil of petals!", + }, + forewarn: { + activate: " It was alerted to [TARGET]'s [MOVE]!", + activateNoTarget: " [POKEMON]'s Forewarn alerted it to [MOVE]!", + }, + frisk: { + activate: " [POKEMON] frisked [TARGET] and found its [ITEM]!", + activateNoTarget: " [POKEMON] frisked its target and found one [ITEM]!", + }, + harvest: { + addItem: " [POKEMON] harvested one [ITEM]!", + }, + illusion: { + end: " [POKEMON]'s illusion wore off!", + }, + innardsout: { + damage: "#aftermath", + }, + ironbarbs: { + damage: "#roughskin", + }, + leftovers: { + heal: " [POKEMON] restored a little HP using its Leftovers!", + }, + lightningrod: { + activate: " [POKEMON] took the attack!", + }, + liquidooze: { + damage: " [POKEMON] sucked up the liquid ooze!", + }, + magicbounce: { + move: '#magiccoat', + }, + moldbreaker: { + start: " [POKEMON] breaks the mold!", + }, + mummy: { + changeAbility: " [TARGET]'s Ability became Mummy!", + }, + naturalcure: { + activate: " ([POKEMON] is cured by its Natural Cure!)", + }, + owntempo: { + block: " [POKEMON] doesn't become confused!", + }, + persistent: { + activate: " [POKEMON] extends [MOVE] by 2 turns!", + }, + pickup: { + addItem: '#recycle', + }, + powerconstruct: { + activate: " You sense the presence of many!", + transform: "[POKEMON] transformed into its Complete Forme!", + }, + powerofalchemy: { + changeAbility: "#receiver", + }, + pressure: { + start: " [POKEMON] is exerting its pressure!", + }, + queenlymajesty: { + cant: "#damp", + }, + rebound: { + move: '#magiccoat', + }, + receiver: { + changeAbility: " [SOURCE]'s [ABILITY] was taken over!", + }, + rockyhelmet: { + damage: " [POKEMON] was hurt by the Rocky Helmet!", + }, + roughskin: { + damage: " [POKEMON] was hurt!", + }, + schooling: { + transform: "[POKEMON] formed a school!", + transformEnd: "[POKEMON] stopped schooling!", + }, + shellbell: { + heal: " [POKEMON] restored a little HP using its Shell Bell!", + }, + shieldsdown: { + // n.b. this isn't a bug, the game actually says "Shields Down deactivated" on first transformation + // https://www.youtube.com/watch?v=SThjYBz4SEA + transform: "Shields Down deactivated!\n([POKEMON] shielded itself.)", + transformEnd: "Shields Down activated!\n([POKEMON] stopped shielding itself.)", + }, + slowstart: { + start: " [POKEMON] can't get it going!", + end: " [POKEMON] finally got its act together!", + }, + solarpower: { + damage: " ([POKEMON] was hurt by its Solar Power.)", + }, + stancechange: { + transform: "Changed to Blade Forme!", + transformEnd: "Changed to Shield Forme!", + }, + stickyhold: { + block: " [POKEMON]'s item cannot be removed!", + }, + stormdrain: { + activate: "#lightningrod", + }, + sturdy: { + activate: " [POKEMON] endured the hit!", + }, + suctioncups: { + block: " [POKEMON] anchors itself!", + }, + sweetveil: { + block: " [TARGET] surrounded itself with a veil of sweetness!", + }, + symbiosis: { + activate: " [POKEMON] shared its [ITEM] with [TARGET]!", + }, + telepathy: { + block: " [POKEMON] avoids attacks by its ally Pok\u00E9mon!", + }, + teravolt: { + start: " [POKEMON] is radiating a bursting aura!", + }, + trace: { + changeAbility: " [POKEMON] traced [SOURCE]'s [ABILITY]!", + }, + truant: { + cant: "[POKEMON] is loafing around!", + }, + turboblaze: { + start: " [POKEMON] is radiating a blazing aura!", + }, + unnerve: { + start: " [TEAM] is too nervous to eat Berries!", + }, + zenmode: { + transform: 'Zen Mode triggered!', + transformEnd: 'Zen Mode ended!', + }, + + // items + airballoon: { + start: " [POKEMON] floats in the air with its Air Balloon!", + end: " [POKEMON]'s Air Balloon popped!", + }, + custapberry: { + activate: " [POKEMON]'s Custap Berry let it move first!", + }, + ejectbutton: { + end: " [POKEMON] is switched out with the Eject Button!", + }, + focusband: { + activate: " [POKEMON] hung on using its Focus Band!", + }, + focussash: { + end: " [POKEMON] hung on using its Focus Sash!", + }, + leppaberry: { + activate: " [POKEMON] restored PP to its [MOVE] move using Leppa Berry!", + }, + lifeorb: { + damage: " [POKEMON] lost some of its HP!", + }, + mysteryberry: { + activate: " [POKEMON] restored PP to its [MOVE] move using Mystery Berry!", + }, + powerherb: { + end: " [POKEMON] became fully charged due to its Power Herb!", + }, + protectivepads: { + block: " [POKEMON] protected itself with the Protective Pads!", + }, + quickclaw: { + activate: " [POKEMON]'s Quick Claw let it move first!", + }, + redcard: { + end: " [POKEMON] held up its Red Card against [TARGET]!", + }, + safetygoggles: { + block: " [POKEMON] is not affected by [MOVE] thanks to its Safety Goggles!", + }, + ultranecroziumz: { + transform: " Bright light is about to burst out of [POKEMON]!", + activate: "[POKEMON] regained its true power through Ultra Burst!", + }, + whiteherb: { + end: " [POKEMON] returned its status to normal using its White Herb!", + }, +}; diff --git a/js/client-battle-tooltips.js b/js/client-battle-tooltips.js index d4112fe8a7..653b6b9012 100644 --- a/js/client-battle-tooltips.js +++ b/js/client-battle-tooltips.js @@ -406,7 +406,13 @@ var BattleTooltips = (function () { var gender = pokemon.gender; if (gender) gender = ' ' + gender + ''; text = '
    '; - text += '

    ' + pokemon.getFullName() + gender + (pokemon.level !== 100 ? ' L' + pokemon.level + '' : '') + '
    '; + + var name = BattleLog.escapeHTML(pokemon.name); + if (pokemon.species !== pokemon.name) { + name += ' (' + BattleLog.escapeHTML(pokemon.species) + ')'; + } + + text += '

    ' + name + gender + (pokemon.level !== 100 ? ' L' + pokemon.level + '' : '') + '
    '; var template = Tools.getTemplate(pokemon.getSpecies ? pokemon.getSpecies() : pokemon.species); if (pokemon.volatiles && pokemon.volatiles.formechange) { diff --git a/js/client-battle.js b/js/client-battle.js index bcd23efd49..5549e52a19 100644 --- a/js/client-battle.js +++ b/js/client-battle.js @@ -955,7 +955,6 @@ pokemonData.getFormattedRange = Pokemon.prototype.getFormattedRange; pokemonData.getHPColorClass = Pokemon.prototype.getHPColorClass; pokemonData.getHPColor = Pokemon.prototype.getHPColor; - pokemonData.getFullName = Pokemon.prototype.getFullName; } }, diff --git a/js/client-mainmenu.js b/js/client-mainmenu.js index dbf33779cf..354d4bea4a 100644 --- a/js/client-mainmenu.js +++ b/js/client-mainmenu.js @@ -924,6 +924,86 @@ app.addPopup(UserPopup, {name: target}); }); } + }, { + parseChatMessage: function (message, name, timestamp, isHighlighted, $chatElem) { + var showMe = !((Tools.prefs('chatformatting') || {}).hideme); + var group = ' '; + if (!/[A-Za-z0-9]/.test(name.charAt(0))) { + // Backwards compatibility + group = name.charAt(0); + name = name.substr(1); + } + var color = BattleLog.hashColor(toId(name)); + var clickableName = '' + BattleLog.escapeHTML(group) + '' + BattleLog.escapeHTML(name) + ''; + var hlClass = isHighlighted ? ' highlighted' : ''; + var mineClass = (window.app && app.user && app.user.get('name') === name ? ' mine' : ''); + + var cmd = ''; + var target = ''; + if (message.charAt(0) === '/') { + if (message.charAt(1) === '/') { + message = message.slice(1); + } else { + var spaceIndex = message.indexOf(' '); + cmd = (spaceIndex >= 0 ? message.slice(1, spaceIndex) : message.slice(1)); + if (spaceIndex >= 0) target = message.slice(spaceIndex + 1); + } + } + + switch (cmd) { + case 'me': + if (!showMe) return '
    ' + timestamp + '' + clickableName + ': /me' + BattleLog.parseMessage(' ' + target) + '
    '; + return '
    ' + timestamp + ' ' + clickableName + '' + BattleLog.parseMessage(' ' + target) + '
    '; + case 'mee': + if (!showMe) return '
    ' + timestamp + '' + clickableName + ': /me' + BattleLog.parseMessage(' ' + target).slice(1) + '
    '; + return '
    ' + timestamp + ' ' + clickableName + '' + BattleLog.parseMessage(' ' + target).slice(1) + '
    '; + case 'invite': + var roomid = toRoomid(target); + return [ + '
    ' + timestamp + '' + clickableName + ' invited you to join the room "' + roomid + '"
    ', + '
    ' + ]; + case 'announce': + return '
    ' + timestamp + '' + clickableName + ': ' + BattleLog.parseMessage(target) + '
    '; + case 'log': + return '
    ' + timestamp + '' + BattleLog.parseMessage(target) + '
    '; + case 'data-pokemon': + case 'data-item': + case 'data-ability': + case 'data-move': + return '[outdated message type not supported]'; + case 'text': + return '
    ' + BattleLog.parseMessage(target) + '
    '; + case 'error': + return '
    ' + BattleLog.escapeHTML(target) + '
    '; + case 'html': + return '
    ' + timestamp + '' + clickableName + ': ' + BattleLog.sanitizeHTML(target) + '
    '; + case 'uhtml': + case 'uhtmlchange': + var parts = target.split(','); + var $elements = $chatElem.find('div.uhtml-' + toId(parts[0])); + var html = parts.slice(1).join(','); + if (!html) { + $elements.remove(); + } else if (!$elements.length) { + $chatElem.append('
    ' + BattleLog.sanitizeHTML(html) + '
    '); + } else if (cmd === 'uhtmlchange') { + $elements.html(BattleLog.sanitizeHTML(html)); + } else { + $elements.remove(); + $chatElem.append('
    ' + BattleLog.sanitizeHTML(html) + '
    '); + } + return ''; + case 'raw': + return '
    ' + BattleLog.sanitizeHTML(target) + '
    '; + default: + // Not a command or unsupported. Parsed as a normal chat message. + if (!name) { + return '
    ' + timestamp + '' + BattleLog.parseMessage(message) + '
    '; + } + return '
    ' + timestamp + '' + clickableName + ': ' + BattleLog.parseMessage(message) + '
    '; + } + } }); var FormatPopup = this.FormatPopup = this.Popup.extend({ diff --git a/src/battle-animations-moves.ts b/src/battle-animations-moves.ts index 5a795bac44..4942241acb 100644 --- a/src/battle-animations-moves.ts +++ b/src/battle-animations-moves.ts @@ -3366,9 +3366,6 @@ const BattleMoveAnims: AnimTable = { }, 'accel'); }, prepareAnim: BattleOtherAnims.chargestatus.anim, - prepareMessage(pokemon) { - return pokemon.getName() + ' is absorbing power!'; - } }, magnetrise: { anim(scene, [attacker]) { @@ -3991,9 +3988,6 @@ const BattleMoveAnims: AnimTable = { attacker.anim({opacity: 0, time: 50}, 'linear'); scene.wait(200); }, - prepareMessage(pokemon) { - return pokemon.getName() + ' vanished instantly!'; - } }, bounce: { anim(scene, [attacker, defender]) { @@ -4074,9 +4068,6 @@ const BattleMoveAnims: AnimTable = { time: 300 }, 'linear'); }, - prepareMessage(pokemon) { - return pokemon.getName() + ' sprang up!'; - } }, dig: { anim(scene, [attacker, defender]) { @@ -4157,9 +4148,6 @@ const BattleMoveAnims: AnimTable = { time: 300 }, 'linear'); }, - prepareMessage(pokemon) { - return pokemon.getName() + ' burrowed its way under the ground!'; - } }, dive: { anim(scene, [attacker, defender]) { @@ -4238,9 +4226,6 @@ const BattleMoveAnims: AnimTable = { time: 300 }, 'swing'); }, - prepareMessage(pokemon) { - return pokemon.getName() + ' hid underwater!'; - } }, fly: { anim: BattleOtherAnims.flight.anim, @@ -4251,9 +4236,6 @@ const BattleMoveAnims: AnimTable = { time: 300 }, 'linear'); }, - prepareMessage(pokemon) { - return pokemon.getName() + ' flew up high!'; - } }, skydrop: { anim: BattleOtherAnims.contactattack.anim, @@ -4269,9 +4251,6 @@ const BattleMoveAnims: AnimTable = { time: 300 }, 'linear'); }, - prepareMessage(pokemon, pokemon2) { - return pokemon.getName() + ' took ' + pokemon2.getLowerName() + ' into the sky!'; - } }, skullbash: { anim: BattleOtherAnims.contactattack.anim, @@ -4281,9 +4260,6 @@ const BattleMoveAnims: AnimTable = { time: 300 }, 'linear'); }, - prepareMessage(pokemon) { - return pokemon.getName() + ' tucked in its head!'; - } }, skyattack: { anim: BattleOtherAnims.flight.anim, @@ -4293,9 +4269,6 @@ const BattleMoveAnims: AnimTable = { time: 300 }, 'linear'); }, - prepareMessage(pokemon) { - return pokemon.getName() + ' became cloaked in a harsh light!'; - } }, hiddenpower: { anim(scene, [attacker, defender]) { @@ -9171,9 +9144,6 @@ const BattleMoveAnims: AnimTable = { }, 'linear', 'explode'); }, prepareAnim: BattleOtherAnims.chargestatus.anim, - prepareMessage(pokemon) { - return pokemon.getName() + ' set a shell trap!'; - } }, flamecharge: { anim(scene, [attacker, defender]) { @@ -18806,9 +18776,6 @@ const BattleMoveAnims: AnimTable = { }, 'linear', 'explode'); }, prepareAnim: BattleOtherAnims.chargestatus.anim, - prepareMessage(pokemon) { - return pokemon.getName() + ' absorbed light!'; - } }, solarblade: { anim(scene, [attacker, defender]) { @@ -18932,9 +18899,6 @@ const BattleMoveAnims: AnimTable = { }, 'swing'); }, prepareAnim: BattleOtherAnims.chargestatus.anim, - prepareMessage(pokemon) { - return pokemon.getName() + ' absorbed light!'; - } }, lightofruin: { anim(scene, [attacker, defender]) { @@ -19294,9 +19258,6 @@ const BattleMoveAnims: AnimTable = { }, 'linear'); }, prepareAnim: BattleOtherAnims.selfstatus.anim, - prepareMessage(pokemon) { - return pokemon.getName() + ' became cloaked in a freezing light!'; - } }, iceburn: { anim(scene, [attacker, defender]) { @@ -19416,16 +19377,10 @@ const BattleMoveAnims: AnimTable = { }, 'linear'); }, prepareAnim: BattleOtherAnims.selfstatus.anim, - prepareMessage(pokemon) { - return pokemon.getName() + ' became cloaked in freezing air!'; - } }, razorwind: { anim: null!, prepareAnim: BattleOtherAnims.selfstatus.anim, - prepareMessage(pokemon) { - return pokemon.getName() + ' whipped up a whirlwind!'; - } }, overheat: { anim(scene, [attacker, defender]) { @@ -30711,7 +30666,7 @@ BattleMoveAnims['flatter'] = {anim:BattleMoveAnims['attract'].anim}; BattleMoveAnims['armthrust'] = {anim:BattleMoveAnims['smellingsalts'].anim, multihit:true}; -BattleMoveAnims['phantomforce'] = {anim:BattleMoveAnims['shadowforce'].anim, prepareAnim:BattleMoveAnims['shadowforce'].prepareAnim, prepareMessage:BattleMoveAnims['shadowforce'].prepareMessage}; +BattleMoveAnims['phantomforce'] = {anim:BattleMoveAnims['shadowforce'].anim, prepareAnim:BattleMoveAnims['shadowforce'].prepareAnim}; BattleMoveAnims['shadowstrike'] = {anim:BattleMoveAnims['shadowforce'].anim}; BattleMoveAnims['smackdown'] = {anim:BattleMoveAnims['rockblast'].anim}; diff --git a/src/battle-animations.ts b/src/battle-animations.ts index 14ea1f576f..7320f1fe2e 100644 --- a/src/battle-animations.ts +++ b/src/battle-animations.ts @@ -115,27 +115,25 @@ class BattleScene { activeCount = 1; numericId = 0; - $frame: JQuery; - $battle: JQuery = null!; - $logFrame: JQuery; - $options: JQuery = null!; - $logPreempt: JQuery = null!; - $log: JQuery = null!; - $terrain: JQuery = null!; - $weather: JQuery = null!; - $bgEffect: JQuery = null!; - $bg: JQuery = null!; - $sprite: JQuery = null!; - $sprites: [JQuery, JQuery] = [null!, null!]; - $spritesFront: [JQuery, JQuery] = [null!, null!]; - $stat: JQuery = null!; - $fx: JQuery = null!; - $leftbar: JQuery = null!; - $rightbar: JQuery = null!; - $turn: JQuery = null!; - $messagebar: JQuery = null!; - $delay: JQuery = null!; - $hiddenMessage: JQuery = null!; + $frame: JQuery; + $battle: JQuery = null!; + $options: JQuery = null!; + log: BattleLog; + $terrain: JQuery = null!; + $weather: JQuery = null!; + $bgEffect: JQuery = null!; + $bg: JQuery = null!; + $sprite: JQuery = null!; + $sprites: [JQuery, JQuery] = [null!, null!]; + $spritesFront: [JQuery, JQuery] = [null!, null!]; + $stat: JQuery = null!; + $fx: JQuery = null!; + $leftbar: JQuery = null!; + $rightbar: JQuery = null!; + $turn: JQuery = null!; + $messagebar: JQuery = null!; + $delay: JQuery = null!; + $hiddenMessage: JQuery = null!; sideConditions = [{}, {}] as [{[id: string]: Sprite[]}, {[id: string]: Sprite[]}]; @@ -146,7 +144,6 @@ class BattleScene { bgmNum = 0; preloadCache = {} as {[url: string]: HTMLImageElement}; - autoScrollOnResume = false; messagebarOpen = false; interruptionCount = 1; curWeather = ''; @@ -161,11 +158,11 @@ class BattleScene { /** jQuery objects that need to finish animating */ activeAnimations = $(); - constructor(battle: Battle, $frame: JQuery, $logFrame: JQuery) { + constructor(battle: Battle, $frame: JQuery, $logFrame: JQuery) { this.battle = battle; $frame.addClass('battle'); this.$frame = $frame; - this.$logFrame = $logFrame; + this.log = new BattleLog($logFrame[0] as HTMLDivElement, this); let numericId = 0; if (battle.id) { @@ -187,16 +184,10 @@ class BattleScene { ///////////// if (this.$options) { - this.$log.empty(); - this.$logPreempt.empty(); + this.log.reset(); } else { - this.$logFrame.empty(); this.$options = $('
    '); - this.$log = $('
    '); - this.$logPreempt = $('
    '); - this.$logFrame.append(this.$options); - this.$logFrame.append(this.$log); - this.$logFrame.append(this.$logPreempt); + $(this.log.elem).prepend(this.$options); } // Battle frame @@ -244,7 +235,7 @@ class BattleScene { this.$battle.append(this.$hiddenMessage); if (this.battle.ignoreNicks) { - this.$log.addClass('hidenicks'); + this.log.setHideNicks(true); this.$messagebar.addClass('hidenicks'); this.$hiddenMessage.addClass('hidenicks'); } @@ -258,6 +249,8 @@ class BattleScene { this.pokemonTimeOffset = 0; this.curTerrain = ''; this.curWeather = ''; + + this.log.battleParser!.perspective = this.battle.sidesSwitched ? 1 : 0; } animationOff() { @@ -265,7 +258,6 @@ class BattleScene { this.stopAnimation(); this.animating = false; - this.autoScrollOnResume = (this.$logFrame.scrollTop()! + 60 >= this.$log.height()! + this.$logPreempt.height()! - this.$options.height()! - this.$logFrame.height()!); this.$messagebar.empty().css({ opacity: 0, height: 0 @@ -289,9 +281,6 @@ class BattleScene { } this.updateWeather(true); this.resetTurn(); - if (this.autoScrollOnResume) { - this.$logFrame.scrollTop(this.$log.height()! + this.$logPreempt.height()!); - } this.resetSideConditions(); } pause() { @@ -474,7 +463,7 @@ class BattleScene { } as JQuery.PlainObject; } - waitFor(elem: JQuery) { + waitFor(elem: JQuery) { this.activeAnimations = this.activeAnimations.add(elem); } @@ -497,24 +486,12 @@ class BattleScene { // Messagebar and log ///////////////////////////////////////////////////////////////////// - log(html: string, preempt?: boolean) { - let willScroll = false; - if (this.animating) willScroll = (this.$logFrame.scrollTop()! + 60 >= this.$log.height()! + this.$logPreempt.height()! - this.$options.height()! - this.$logFrame.height()!); - if (preempt) { - this.$logPreempt.append(html); - } else { - this.$log.append(html); - } - if (willScroll) { - this.$logFrame.scrollTop(this.$log.height()! + this.$logPreempt.height()!); - } - } preemptCatchup() { - this.$log.append(this.$logPreempt.children().first()); + this.log.preemptCatchup(); } message(message: string, hiddenMessage?: string) { if (!this.messagebarOpen) { - this.log('
    '); + this.log.addSpacer(); if (this.animating) { this.$messagebar.empty(); this.$messagebar.css({ @@ -552,7 +529,14 @@ class BattleScene { this.waitFor($message); } this.messagebarOpen = true; - this.log('
    ' + message + (hiddenMessage ? hiddenMessage : '') + '
    '); + } + maybeCloseMessagebar(args: Args, kwArgs: KWArgs) { + if (this.log.battleParser!.sectionBreak(args, kwArgs)) { + if (!this.messagebarOpen) return false; + this.closeMessagebar(); + return true; + } + return false; } closeMessagebar() { if (this.messagebarOpen) { @@ -563,17 +547,9 @@ class BattleScene { }, this.battle.messageFadeTime / this.acceleration); this.waitFor(this.$messagebar); } + return true; } - } - unlink(userid: string, showRevealButton = false) { - if (Tools.prefs('nounlink')) return; - let $messages = $('.chatmessage-' + userid); - if (!$messages.length) return; - $messages.find('a').contents().unwrap(); - if (window.BattleRoom && showRevealButton) { - $messages.hide().addClass('revealed').find('button').parent().remove(); - this.log('
    '); - } + return false; } // General updating @@ -608,7 +584,6 @@ class BattleScene { const moveAnim = BattleMoveAnims[moveid]; if (!moveAnim.prepareAnim) return; moveAnim.prepareAnim(this, [attacker.sprite, defender.sprite]); - this.message('' + moveAnim.prepareMessage!(attacker, defender) + ''); } updateGen() { @@ -630,6 +605,31 @@ class BattleScene { } } + getDetailsText(pokemon: Pokemon) { + let name = pokemon.side && pokemon.side.n && (this.battle.ignoreOpponent || this.battle.ignoreNicks) ? pokemon.species : pokemon.name; + if (name !== pokemon.species) { + name += ' (' + pokemon.species + ')'; + } + if (pokemon === pokemon.side.active[0]) { + name += ' (active)'; + } else if (pokemon.fainted) { + name += ' (fainted)'; + } else { + let statustext = ''; + if (pokemon.hp !== pokemon.maxhp) { + statustext += pokemon.hpDisplay(); + } + if (pokemon.status) { + if (statustext) statustext += '|'; + statustext += pokemon.status; + } + if (statustext) { + name += ' (' + statustext + ')'; + } + } + return BattleLog.escapeHTML(name); + } + updateSidebar(side: Side) { if (!this.animating) return; let pokemonhtml = ''; @@ -648,9 +648,11 @@ class BattleScene { } else if (!poke) { pokemonhtml += ''; } else if (!poke.ident && this.battle.teamPreviewCount && this.battle.teamPreviewCount < side.pokemon.length) { - pokemonhtml += ''; + const details = this.getDetailsText(poke); + pokemonhtml += ''; } else { - pokemonhtml += ''; + const details = this.getDetailsText(poke); + pokemonhtml += ''; } if (i % 3 === 2) pokemonhtml += '

    '; } @@ -729,7 +731,9 @@ class BattleScene { } side.totalPokemon = side.pokemon.length; if (textBuf) { - this.log('
    ' + BattleLog.escapeHTML(side.name) + '\'s team: ' + BattleLog.escapeHTML(textBuf) + '
    '); + this.log.addDiv('chat battle-history', + '' + BattleLog.escapeHTML(side.name) + '\'s team: ' + BattleLog.escapeHTML(textBuf) + '' + ); } this.$sprites[siden].html(buf + buf2); @@ -1395,7 +1399,7 @@ class BattleScene { BattleSound.pauseBgm(); } destroy() { - if (this.$logFrame) this.$logFrame.empty(); + this.log.destroy(); if (this.$frame) this.$frame.empty(); this.soundStop(); this.battle = null!; @@ -1427,7 +1431,7 @@ interface InitScenePos { class Sprite { scene: BattleScene; - $el: JQuery = null!; + $el: JQuery = null!; sp: SpriteData; x: number; y: number; @@ -1493,10 +1497,10 @@ class PokemonSprite extends Sprite { cryurl: string | undefined = undefined; subsp: SpriteData | null = null; - $sub: JQuery | null = null; + $sub: JQuery | null = null; isSubActive = false; - $statbar: JQuery | null = null; + $statbar: JQuery | null = null; isBackSprite: boolean; isMissedPokemon = false; /** diff --git a/src/battle-dex-data.ts b/src/battle-dex-data.ts index 7f0892dc45..5535e8e144 100644 --- a/src/battle-dex-data.ts +++ b/src/battle-dex-data.ts @@ -141,7 +141,7 @@ const BattleStatNames = { // proper style spe: 'Spe' }; const BattleStats = { - atk: 'Attack', def: 'Defense', spa: 'Special Attack', spd: 'Special Defense', spe: 'Speed', accuracy: 'accuracy', evasion: 'evasiveness', spc: 'Special' + hp: 'HP', atk: 'Attack', def: 'Defense', spa: 'Special Attack', spd: 'Special Defense', spe: 'Speed', accuracy: 'accuracy', evasion: 'evasiveness', spc: 'Special' }; const baseSpeciesChart = [ diff --git a/src/battle-log.ts b/src/battle-log.ts index 4226b29b09..004cefeec4 100644 --- a/src/battle-log.ts +++ b/src/battle-log.ts @@ -1,11 +1,296 @@ /** * Battle log - * + * + * An exercise in minimalism! This is a dependency of the client, which + * requires IE9+ and uses Preact, and the replay player, which requires + * IE7+ and uses jQuery. Therefore, this has to be compatible with IE7+ + * and use the DOM directly! + * + * Special thanks to PPK for QuirksMode.org, one of the few resources + * available for how to do web development in these conditions. + * * @author Guangcong Luo * @license MIT */ class BattleLog { + elem: HTMLDivElement; + innerElem: HTMLDivElement; + scene: BattleScene | null = null; + preemptElem: HTMLDivElement = null!; + atBottom = true; + className: string; + battleParser: BattleTextParser | null = null; + /** + * -1 = spectator: "Red sent out Pikachu!" "Blue's Eevee used Tackle!" + * 0 = player 1: "Go! Pikachu!" "The opposing Eevee used Tackle!" + * 1 = player 2: "Red sent out Pikachu!" "Eevee used Tackle!" + */ + perspective: -1 | 0 | 1 = -1; + constructor(elem: HTMLDivElement, scene?: BattleScene) { + this.elem = elem; + + elem.setAttribute('role', 'log'); + elem.innerHTML = ''; + const innerElem = document.createElement('div'); + innerElem.className = 'inner'; + elem.appendChild(innerElem); + this.innerElem = innerElem; + this.className = elem.className; + + if (scene) { + this.scene = scene; + const preemptElem = document.createElement('div'); + preemptElem.className = 'inner-preempt'; + elem.appendChild(preemptElem); + this.preemptElem = preemptElem; + this.battleParser = new BattleTextParser(); + } + + elem.onscroll = this.onScroll; + } + onScroll = () => { + const distanceFromBottom = this.elem.scrollHeight - this.elem.scrollTop - this.elem.clientHeight; + this.atBottom = (distanceFromBottom < 30); + }; + reset() { + this.innerElem.innerHTML = ''; + this.atBottom = true; + } + destroy() { + this.elem.onscroll = null; + } + setHideNicks(hideNicks: boolean) { + this.elem.className = this.className + (hideNicks ? ' hidenicks' : ''); + } + add(args: Args, kwArgs?: KWArgs, preempt?: boolean) { + if (kwArgs && kwArgs.silent) return; + let divClass = 'chat'; + let divHTML = ''; + switch (args[0]) { + case 'chat': case 'c': case 'c:': + let name, message; + let battle = this.scene && this.scene.battle; + if (args[0] === 'c:') { + name = args[2]; + message = args[3]; + } else { + name = args[1]; + message = args[2]; + } + let rank = name.charAt(0); + if (battle && battle.ignoreSpects && (rank === ' ' || rank === '+')) return; + if (battle && battle.ignoreOpponent && (rank === '\u2605' || rank === '\u2606') && toUserid(name) !== app.user.get('userid')) return; + if (window.app && app.ignore && app.ignore[toUserid(name)] && (rank === ' ' || rank === '+' || rank === '\u2605' || rank === '\u2606')) return; + let isHighlighted = window.app && app.rooms && app.rooms[battle!.roomid].getHighlight(message); + [divClass, divHTML] = this.parseChatMessage(message, name, '', isHighlighted); + if (isHighlighted) { + let notifyTitle = "Mentioned by " + name + " in " + battle!.roomid; + app.rooms[battle!.roomid].notifyOnce(notifyTitle, "\"" + message + "\"", 'highlight'); + } + break; + + case 'join': case 'j': + divHTML = '' + BattleLog.escapeHTML(args[1]) + ' joined.'; + break; + + case 'leave': case 'l': + divHTML = '' + BattleLog.escapeHTML(args[1]) + ' left.'; + break; + + case 'chatmsg': case '': + divHTML = BattleLog.escapeHTML(args[1]); + break; + + case 'chatmsg-raw': case 'raw': case 'html': + divHTML = BattleLog.sanitizeHTML(args[1]); + break; + + case 'error': case 'inactive': case 'inactiveoff': + divClass = 'chat message-error'; + divHTML = BattleLog.escapeHTML(args[1]); + break; + + case 'bigerror': + this.message('
    ' + BattleLog.escapeHTML(args[1]).replace(/\|/g, '
    ') + '
    '); + return; + + case 'pm': + divHTML = '' + BattleLog.escapeHTML(args[1]) + ': (Private to ' + BattleLog.escapeHTML(args[3]) + ') ' + BattleLog.parseMessage(args[4]) + ''; + break; + + case 'askreg': + this.addDiv('chat', '
    Register an account to protect your ladder rating!
    '); + return; + + case 'unlink': + this.hideChatFrom(toId(args[2] || args[1])); + return; + + case 'debug': + divClass = 'debug'; + divHTML = '
    [DEBUG] ' + BattleLog.escapeHTML(args[1]) + '.
    '; + break; + + case 'seed': case 'choice': case ':': case 'timer': + case 'J': case 'L': case 'N': case 'n': case 'spectator': case 'spectatorleave': + return; + + default: + this.addBattleMessage(args, kwArgs); + return; + } + if (divHTML) this.addDiv(divClass, divHTML, preempt); + } + addBattleMessage(args: Args, kwArgs?: KWArgs) { + switch (args[0]) { + case 'warning': + this.message('Warning: ' + BattleLog.escapeHTML(args[1])); + this.message(`Bug? Report it to the replay viewer's Smogon thread`); + if (this.scene) this.scene.wait(1000); + return; + + case 'variation': + this.addDiv('', 'Variation: ' + BattleLog.escapeHTML(args[1]) + ''); + break; + + case 'rule': + const ruleArgs = args[1].split(': '); + this.addDiv('', '' + BattleLog.escapeHTML(ruleArgs[0]) + (ruleArgs[1] ? ':' : '') + ' ' + BattleLog.escapeHTML(ruleArgs[1] || '') + ''); + break; + + case 'rated': + this.addDiv('rated', '' + (BattleLog.escapeHTML(args[1]) || 'Rated battle') + ''); + break; + + case 'tier': + this.addDiv('', 'Format:
    ' + BattleLog.escapeHTML(args[1]) + ''); + break; + + case 'turn': + const h2elem = document.createElement('h2'); + h2elem.className = 'battle-history'; + let turnMessage = this.battleParser!.parseLine(args, {}).trim(); + if (!turnMessage.startsWith('==') || !turnMessage.endsWith('==')) { + throw new Error("Turn message must be a heading."); + } + turnMessage = turnMessage.slice(2, -2).trim(); + this.battleParser!.curLineSection = 'break'; + h2elem.innerHTML = BattleLog.escapeHTML(turnMessage); + this.addNode(h2elem); + break; + + default: + let line = null; + if (this.battleParser) { + line = this.battleParser.parseLine(args, kwArgs || {}, true); + } + if (line === null) { + this.addDiv('chat message-error', 'Unrecognized: |' + BattleLog.escapeHTML(args.join('|'))); + return; + } + if (!line) return; + this.message(...this.parseLogMessage(line)); + break; + } + } + /** + * To avoid trolling with nicknames, we can't just run this through + * parseMessage + */ + parseLogMessage(message: string): [string, string] { + const messages = message.split('\n').map(line => { + line = BattleLog.escapeHTML(line); + line = line.replace(/\*\*(.*)\*\*/, '$1'); + line = line.replace(/\|\|([^\|]*)\|\|([^\|]*)\|\|/, '$2'); + if (line.startsWith(' ')) line = '' + line.trim() + ''; + return line; + }); + return [ + messages.join('
    '), + messages.filter(message => !message.startsWith('[')).join('
    '), + ]; + } + message(message: string, sceneMessage = message) { + if (this.scene) this.scene.message(sceneMessage); + this.addDiv('battle-history', message); + } + addNode(node: HTMLElement, preempt?: boolean) { + (preempt ? this.preemptElem : this.innerElem).appendChild(node); + if (this.atBottom) { + this.elem.scrollTop = this.elem.scrollHeight; + } + } + addDiv(className: string, innerHTML: string, preempt?: boolean) { + const el = document.createElement('div'); + el.className = className; + el.innerHTML = innerHTML; + this.addNode(el); + } + addSpacer() { + this.addDiv('spacer battle-history', ''); + } + changeUhtml(id: string, html: string, forceAdd?: boolean) { + id = toId(id); + const classContains = ' uhtml-' + id + ' '; + let elements = [] as HTMLDivElement[]; + for (const node of this.innerElem.childNodes as any) { + if (node.className && (' ' + node.className + ' ').includes(classContains)) { + elements.push(node); + } + } + for (const node of this.preemptElem.childNodes as any) { + if (node.className && (' ' + node.className + ' ').includes(classContains)) { + elements.push(node); + } + } + if (html && elements.length && !forceAdd) { + for (const element of elements) { + element.innerHTML = BattleLog.sanitizeHTML(html); + } + return; + } + for (const element of elements) { + element.parentElement!.removeChild(element); + } + if (html) { + this.addDiv('notice uhtml-' + id, BattleLog.sanitizeHTML(html)); + } + } + hideChatFrom(userid: ID, showRevealButton = true) { + const classStart = 'chat chatmessage-' + userid + ' '; + let lastNode; + let count = 0; + for (const node of this.innerElem.childNodes as any) { + if (node.className && (node.className + ' ').startsWith(classStart)) { + node.style.display = 'none'; + node.className = 'revealed ' + node.className; + count++; + } + lastNode = node; + } + for (const node of this.preemptElem.childNodes as any) { + if (node.className && (node.className + ' ').startsWith(classStart)) { + node.style.display = 'none'; + node.className = 'revealed ' + node.className; + count++; + } + lastNode = node; + } + if (!count || !showRevealButton) return; + const button = document.createElement('button'); + button.name = 'toggleMessages'; + button.value = userid; + button.className = 'subtle'; + button.innerHTML = '(' + count + ' line' + (count > 1 ? 's' : '') + ' from ' + userid + ' hidden)'; + lastNode.appendChild(document.createTextNode(' ')); + lastNode.appendChild(button); + } + preemptCatchup() { + if (!this.preemptElem.firstChild) return; + this.innerElem.appendChild(this.preemptElem.firstChild); + } + static escapeFormat(formatid: string): string { let atIndex = formatid.indexOf('@@@'); if (atIndex >= 0) { @@ -77,16 +362,24 @@ class BattleLog { return this.colorCache[name]; } - static parseChatMessage(message: string, name: string, timestamp: string, isHighlighted?: boolean, $chatElem?: any) { - let showMe = !((Tools.prefs('chatformatting') || {}).hideme); + static prefs(name: string) { + // @ts-ignore + if (window.Storage && Storage.prefs) return Storage.prefs(name); + // @ts-ignore + if (window.PS) return PS.prefs[name]; + return undefined; + } + + parseChatMessage(message: string, name: string, timestamp: string, isHighlighted?: boolean) { + let showMe = !(BattleLog.prefs('chatformatting') || {}).hideme; let group = ' '; if (!/[A-Za-z0-9]/.test(name.charAt(0))) { // Backwards compatibility group = name.charAt(0); name = name.substr(1); } - let color = this.hashColor(toId(name)); - let clickableName = '' + this.escapeHTML(group) + '' + this.escapeHTML(name) + ''; + let color = BattleLog.hashColor(toId(name)); + let clickableName = '' + BattleLog.escapeHTML(group) + '' + BattleLog.escapeHTML(name) + ''; let hlClass = isHighlighted ? ' highlighted' : ''; let mineClass = (window.app && app.user && app.user.get('name') === name ? ' mine' : ''); @@ -104,99 +397,44 @@ class BattleLog { switch (cmd) { case 'me': - if (!showMe) return '
    ' + timestamp + '' + clickableName + ': /me' + this.parseMessage(' ' + target) + '
    '; - return '
    ' + timestamp + ' ' + clickableName + '' + this.parseMessage(' ' + target) + '
    '; + if (!showMe) return ['chat chatmessage-' + toId(name) + hlClass + mineClass, timestamp + '' + clickableName + ': /me' + BattleLog.parseMessage(' ' + target) + '']; + return ['chat chatmessage-' + toId(name) + hlClass + mineClass, timestamp + ' ' + clickableName + '' + BattleLog.parseMessage(' ' + target) + '']; case 'mee': - if (!showMe) return '
    ' + timestamp + '' + clickableName + ': /me' + this.parseMessage(' ' + target).slice(1) + '
    '; - return '
    ' + timestamp + ' ' + clickableName + '' + this.parseMessage(' ' + target).slice(1) + '
    '; + if (!showMe) return ['chat chatmessage-' + toId(name) + hlClass + mineClass, timestamp + '' + clickableName + ': /me' + BattleLog.parseMessage(' ' + target).slice(1) + '']; + return ['chat chatmessage-' + toId(name) + hlClass + mineClass, timestamp + ' ' + clickableName + '' + BattleLog.parseMessage(' ' + target).slice(1) + '']; case 'invite': let roomid = toRoomid(target); - return [ - '
    ' + timestamp + '' + clickableName + ' invited you to join the room "' + roomid + '"
    ', - '
    ' - ]; + return ['chat', timestamp + '' + clickableName + ' invited you to join the room "' + roomid + '"' + + '
    ']; case 'announce': - return '
    ' + timestamp + '' + clickableName + ': ' + this.parseMessage(target) + '
    '; + return ['chat chatmessage-' + toId(name) + hlClass + mineClass, timestamp + '' + clickableName + ': ' + BattleLog.parseMessage(target) + '']; case 'log': - return '
    ' + timestamp + '' + this.parseMessage(target) + '
    '; + return ['chat chatmessage-' + toId(name) + hlClass + mineClass, timestamp + '' + BattleLog.parseMessage(target) + '']; case 'data-pokemon': - let buf = '
  • '; - let template = Tools.getTemplate(target); - if (!template.abilities || !template.baseStats) return '[not supported in replays]'; - buf += '' + (template.tier || Tools.getTemplate(template.baseSpecies).tier) + ' '; - buf += ' '; - buf += '' + template.species + ' '; - buf += ''; - if (template.types) for (let i = 0; i < template.types.length; i++) { - buf += Tools.getTypeIcon(template.types[i]); - } - buf += ' '; - buf += ''; - if (template.abilities['1']) { - buf += '' + template.abilities['0'] + '
    ' + template.abilities['1'] + '
    '; - } else { - buf += '' + template.abilities['0'] + ''; - } - if (template.abilities['S']) { - buf += '' + template.abilities['H'] + '
    ' + template.abilities['S'] + '
    '; - } else if (template.abilities['H']) { - buf += '' + template.abilities['H'] + ''; - } else { - buf += ''; - } - buf += '
    '; - buf += ''; - buf += 'HP
    ' + template.baseStats.hp + '
    '; - buf += 'Atk
    ' + template.baseStats.atk + '
    '; - buf += 'Def
    ' + template.baseStats.def + '
    '; - buf += 'SpA
    ' + template.baseStats.spa + '
    '; - buf += 'SpD
    ' + template.baseStats.spd + '
    '; - buf += 'Spe
    ' + template.baseStats.spe + '
    '; - let bst = 0; - for (const i in template.baseStats) bst += template.baseStats[i as StatName]; - buf += 'BST
    ' + bst + '
    '; - buf += '
    '; - buf += '
  • '; - return '
      ' + buf + '
    '; case 'data-item': - if (!window.BattleSearch) return '[not supported in replays]'; - return '
      ' + BattleSearch.renderItemRow(Tools.getItem(target), 0, 0) + '
    '; case 'data-ability': - if (!window.BattleSearch) return '[not supported in replays]'; - return '
      ' + BattleSearch.renderAbilityRow(Tools.getAbility(target), 0, 0) + '
    '; case 'data-move': - if (!window.BattleSearch) return '[not supported in replays]'; - return '
      ' + BattleSearch.renderMoveRow(Tools.getMove(target), 0, 0) + '
    '; + return ['chat message-error', '[outdated code no longer supported]']; case 'text': - return '
    ' + this.parseMessage(target) + '
    '; + return ['chat', BattleLog.parseMessage(target)]; case 'error': - return '
    ' + this.escapeHTML(target) + '
    '; + return ['chat message-error', BattleLog.escapeHTML(target)]; case 'html': - return '
    ' + timestamp + '' + clickableName + ': ' + BattleLog.sanitizeHTML(target) + '
    '; + return ['chat chatmessage-' + toId(name) + hlClass + mineClass, timestamp + '' + clickableName + ': ' + BattleLog.sanitizeHTML(target) + '']; case 'uhtml': case 'uhtmlchange': let parts = target.split(','); - let $elements = $chatElem.find('div.uhtml-' + toId(parts[0])); - let html = parts.slice(1).join(','); - if (!html) { - $elements.remove(); - } else if (!$elements.length) { - $chatElem.append('
    ' + BattleLog.sanitizeHTML(html) + '
    '); - } else if (cmd === 'uhtmlchange') { - $elements.html(BattleLog.sanitizeHTML(html)); - } else { - $elements.remove(); - $chatElem.append('
    ' + BattleLog.sanitizeHTML(html) + '
    '); - } - return ''; + let html = parts.slice(1).join(',').trim(); + this.changeUhtml(parts[0], html, cmd === 'uhtml'); + return ['', '']; case 'raw': - return '
    ' + BattleLog.sanitizeHTML(target) + '
    '; + return ['chat', BattleLog.sanitizeHTML(target)]; default: // Not a command or unsupported. Parsed as a normal chat message. if (!name) { - return '
    ' + timestamp + '' + this.parseMessage(message) + '
    '; + return ['chat' + hlClass, timestamp + '' + BattleLog.parseMessage(message) + '']; } - return '
    ' + timestamp + '' + clickableName + ': ' + this.parseMessage(message) + '
    '; + return ['chat chatmessage-' + toId(name) + hlClass + mineClass, timestamp + '' + clickableName + ': ' + BattleLog.parseMessage(message) + '']; } } @@ -207,7 +445,7 @@ class BattleLog { if (str.substr(0, 3) === '<< ') return this.escapeHTML(str); str = formatText(str); - let options = Tools.prefs('chatformatting') || {}; + let options = BattleLog.prefs('chatformatting') || {}; if (options.hidelinks) { str = str.replace(/]*>/g, '').replace(/<\/a>/g, ''); @@ -484,3 +722,5 @@ class BattleLog { return 'data:text/plain;base64,' + encodeURIComponent(btoa(unescape(encodeURIComponent(this.createReplayFile(room))))); } } + +exports.BattleLog = BattleLog; diff --git a/src/battle-scene-stub.ts b/src/battle-scene-stub.ts index 0f2f947bfb..1ff858d3a3 100644 --- a/src/battle-scene-stub.ts +++ b/src/battle-scene-stub.ts @@ -7,12 +7,14 @@ class BattleSceneStub { timeOffset: number = NaN; interruptionCount: number = NaN; messagebarOpen: boolean = false; + log = {add: (args: Args, kwargs?: KWArgs) => {}} as BattleLog; abilityActivateAnim(pokemon: Pokemon, result: string): void { } addPokemonSprite(pokemon: Pokemon) { return null!; } addSideCondition(siden: number, id: ID, instant?: boolean | undefined): void { } animationOff(): void { } animationOn(): void { } + maybeCloseMessagebar(args: Args, kwArgs: KWArgs): boolean { return false; } closeMessagebar(): void { } damageAnim(pokemon: Pokemon, damage: string | number): void { } destroy(): void { } @@ -20,7 +22,6 @@ class BattleSceneStub { healAnim(pokemon: Pokemon, damage: string | number): void { } hideJoinButtons(): void { } incrementTurn(): void { } - log(html: string, preempt?: boolean | undefined): void { } message(message: string, hiddenMessage?: string | undefined): void { } pause(): void { } preemptCatchup(): void { } diff --git a/src/battle-text-parser.ts b/src/battle-text-parser.ts new file mode 100644 index 0000000000..c4dea59881 --- /dev/null +++ b/src/battle-text-parser.ts @@ -0,0 +1,902 @@ +declare const BattleText: {[id: string]: {[templateName: string]: string}}; + +type Args = [string, ...string[]]; +type KWArgs = {[kw: string]: string}; + +class BattleTextParser { + p1 = "Player 1"; + p2 = "Player 2"; + perspective: 0 | 1; + gen = 7; + curLineSection: 'break' | 'preMajor' | 'major' | 'postMajor' = 'break'; + lowercaseRegExp: RegExp | null | undefined = undefined; + + constructor(perspective: 0 | 1 = 0) { + this.perspective = perspective; + } + + fixLowercase(input: string) { + if (this.lowercaseRegExp === undefined) { + const prefixes = ['pokemon', 'opposingPokemon', 'team', 'opposingTeam'].map(templateId => { + const template = BattleText.default[templateId]; + if (template.charAt(0) === template.charAt(0).toUpperCase()) return ''; + const bracketIndex = template.indexOf('['); + if (bracketIndex >= 0) return template.slice(0, bracketIndex); + return template; + }).filter(prefix => prefix); + if (prefixes.length) { + let buf = `((?:^|\n)(?: | \\\(| \\\[)?)(` + + prefixes.map(BattleTextParser.escapeRegExp).join('|') + + `)`; + this.lowercaseRegExp = new RegExp(buf, 'g'); + } else { + this.lowercaseRegExp = null; + } + } + if (!this.lowercaseRegExp) return input; + return input.replace(this.lowercaseRegExp, (match, p1, p2) => ( + p1 + p2.charAt(0).toUpperCase() + p2.slice(1) + )); + } + + static escapeRegExp(input: string) { + return input.replace(/[\\^$.*+?()[\]{}|]/g, '\\$&'); + } + + pokemon(pokemon: string) { + if (!pokemon) return ''; + let side; + if (pokemon.startsWith('p1')) side = 0; + else if (pokemon.startsWith('p2')) side = 1; + else return '???pokemon:' + pokemon + '???'; + if (pokemon.charAt(3) === ':') pokemon = pokemon.slice(4).trim(); + else if (pokemon.charAt(2) === ':') pokemon = pokemon.slice(3).trim(); + else return '???pokemon:' + pokemon + '???'; + let template = BattleText.default[side === this.perspective ? 'pokemon' : 'opposingPokemon']; + return template.replace('[NICKNAME]', pokemon); + } + + pokemonName(pokemon: string) { + if (!pokemon) return ''; + if (!pokemon.startsWith('p1') && !pokemon.startsWith('p2')) return '???pokemon:' + pokemon + '???'; + if (pokemon.charAt(3) === ':') pokemon = pokemon.slice(4).trim(); + else if (pokemon.charAt(2) === ':') pokemon = pokemon.slice(3).trim(); + else return '???pokemon:' + pokemon + '???'; + return pokemon; + } + + pokemonFull(pokemon: string, details: string) { + if (pokemon.startsWith('p1')) {} + else if (pokemon.startsWith('p2')) {} + else return '???pokemon:' + pokemon + '???'; + let nickname; + if (pokemon.charAt(3) === ':') nickname = pokemon.slice(4).trim(); + else if (pokemon.charAt(2) === ':') nickname = pokemon.slice(3).trim(); + else return '???pokemon:' + pokemon + '???'; + + let species = details.split(',')[0]; + if (nickname === species) return [pokemon.slice(0, 2), `**${species}**`]; + return [pokemon.slice(0, 2), `${nickname} (**${species}**)`]; + } + + trainer(side: string) { + if (side === 'p1') return this.p1; + if (side === 'p2') return this.p2; + return '???side:' + side + '???'; + } + + team(side: string) { + if ((side === 'p1' && this.perspective === 0) || + (side === 'p2' && this.perspective === 1)) { + return BattleText.default.team; + } + return BattleText.default.opposingTeam; + } + + own(side: string) { + if (side === 'p1' && this.perspective === 0) return 'OWN'; + if (side === 'p2' && this.perspective === 1) return 'OWN'; + return ''; + } + + effectId(effect?: string) { + if (!effect) return ''; + if (effect.startsWith('item:') || effect.startsWith('move:')) { + effect = effect.slice(5); + } else if (effect.startsWith('ability:')) { + effect = effect.slice(8); + } + return toId(effect); + } + + effect(effect?: string) { + if (!effect) return ''; + if (effect.startsWith('item:') || effect.startsWith('move:')) { + effect = effect.slice(5); + } else if (effect.startsWith('ability:')) { + effect = effect.slice(8); + } + return effect.trim(); + } + + template(type: string, ...namespaces: (string | undefined)[]) { + for (const namespace of namespaces) { + if (!namespace) continue; + if (namespace === 'OWN') { + return BattleText.default[type + 'Own'] + '\n'; + } + if (namespace === 'NODEFAULT') { + return ''; + } + let id = this.effectId(namespace); + if (BattleText[id] && BattleText[id][type]) { + if (BattleText[id][type].charAt(1) === '.') type = BattleText[id][type].slice(2) as ID; + if (BattleText[id][type].charAt(0) === '#') id = BattleText[id][type].slice(1) as ID; + return BattleText[id][type] + '\n'; + } + } + if (!BattleText.default[type]) return ''; + return BattleText.default[type] + '\n'; + } + + maybeAbility(effect: string | undefined, holder: string) { + if (!effect) return ''; + if (!effect.startsWith('ability:')) return ''; + return this.ability(effect.slice(8).trim(), holder); + } + + ability(name: string | undefined, holder: string) { + if (!name) return ''; + return BattleText.default.abilityActivation.replace('[POKEMON]', this.pokemon(holder)).replace('[ABILITY]', this.effect(name)) + '\n'; + } + + lineSection(args: Args, kwArgs: KWArgs) { + const cmd = args[0]; + switch (cmd) { + case 'done' : case 'turn': + return 'break'; + case 'move' : case 'cant': case 'switch': case 'drag': case 'upkeep': case 'start': case '-mega': + return 'major'; + case 'switchout': case 'faint': + return 'preMajor'; + case '-zpower': + return 'postMajor'; + case '-damage': { + const id = this.effectId(kwArgs.from); + if (id === 'confusion') return 'major'; + } + case '-curestatus': { + const id = this.effectId(kwArgs.from); + if (id === 'naturalcure') return 'preMajor'; + } + case '-start': { + const id = this.effectId(kwArgs.from); + if (id === 'protean') return 'preMajor'; + } + case '-activate': { + const id = this.effectId(kwArgs.from); + if (id === 'confusion' || id === 'attract') return 'preMajor'; + } + } + return (cmd.charAt(0) === '-' ? 'postMajor' : ''); + } + + sectionBreak(args: Args, kwArgs: KWArgs) { + const prevSection = this.curLineSection; + const curSection = this.lineSection(args, kwArgs); + if (!curSection) return false; + this.curLineSection = curSection; + switch (curSection) { + case 'break': + if (prevSection !== 'break') return true; + return false; + case 'preMajor': + case 'major': + if (prevSection === 'postMajor' || prevSection === 'major') return true; + return false; + case 'postMajor': + return false; + } + } + + parseLine(args: Args, kwArgs: KWArgs, noSectionBreak?: boolean) { + let buf = !noSectionBreak && this.sectionBreak(args, kwArgs) ? '\n' : ''; + return buf + this.fixLowercase(this.parseLineInner(args, kwArgs) || ''); + } + + parseLineInner(args: Args, kwArgs: KWArgs) { + let cmd = args[0]; + switch (cmd) { + case 'player': { + const [, side, name] = args; + if (side === 'p1' && name) { + this.p1 = name; + } else if (side === 'p2' && name) { + this.p2 = name; + } + return ''; + } + + case 'gen': { + const [, number] = args; + this.gen = parseInt(number, 10); + return ''; + } + + case 'turn': { + const [, number] = args; + return this.template('turn').replace('[NUMBER]', number) + '\n'; + } + + case 'start': { + return this.template('startBattle').replace('[TRAINER]', this.p1).replace('[TRAINER]', this.p2); + } + + case 'win': case 'tie': { + const [, name] = args; + if (cmd === 'tie' || !name) { + return this.template('tieBattle').replace('[TRAINER]', this.p1).replace('[TRAINER]', this.p2); + } + return this.template('winBattle').replace('[TRAINER]', name); + } + + case 'switch': { + const [, pokemon, details] = args; + const [side, fullname] = this.pokemonFull(pokemon, details); + const template = this.template('switchIn', this.own(side)); + return template.replace('[TRAINER]', this.trainer(side)).replace('[FULLNAME]', fullname); + } + + case 'drag': { + const [, pokemon, details] = args; + const [side, fullname] = this.pokemonFull(pokemon, details); + const template = this.template('drag'); + return template.replace('[TRAINER]', this.trainer(side)).replace('[FULLNAME]', fullname); + } + + case 'detailschange': case '-transform': case '-formechange': { + const [, pokemon, arg2, arg3] = args; + let newSpecies = ''; + switch (cmd) { + case 'detailschange': newSpecies = arg2.split(',')[0].trim(); break; + case '-transform': newSpecies = arg3; break; + case '-formechange': newSpecies = arg2; break; + } + let newSpeciesId = toId(newSpecies); + let id = ''; + let templateName = 'transform'; + if (cmd !== '-transform') { + switch (newSpeciesId) { + case 'greninjaash': id = 'battlebond'; break; + case 'mimikyubusted': id = 'disguise'; break; + case 'zygardecomplete': id = 'powerconstruct'; break; + case 'necrozmaultra': id = 'ultranecroziumz'; break; + case 'darmanitanzen': id = 'zenmode'; break; + case 'darmanitan': id = 'zenmode'; templateName = 'transformEnd'; break; + case 'aegislashblade': id = 'stancechange'; break; + case 'aegislash': id = 'stancechange'; templateName = 'transformEnd'; break; + case 'wishiwashischool': id = 'schooling'; break; + case 'wishiwashi': id = 'schooling'; templateName = 'transformEnd'; break; + case 'miniormeteor': id = 'shieldsdown'; break; + case 'minior': id = 'shieldsdown'; templateName = 'transformEnd'; break; + } + } else if (newSpecies) { + id = 'transform'; + } + const template = this.template(templateName, id, kwArgs.msg ? '' : 'NODEFAULT'); + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[SPECIES]', newSpecies); + } + + case 'switchout': { + const [, pokemon] = args; + const side = pokemon.slice(0, 2); + const template = this.template('switchOut', kwArgs.from, this.own(side)); + return template.replace('[TRAINER]', this.trainer(side)).replace('[NICKNAME]', this.pokemonName(pokemon)); + } + + case 'faint': { + const [, pokemon] = args; + const template = this.template('faint'); + return template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case 'swap': { + const [, pokemon, target] = args; + if (!target || !isNaN(Number(target))) { + const template = this.template('swapCenter'); + return template.replace('[POKEMON]', this.pokemon(pokemon)); + } + const template = this.template('swap'); + return template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[TARGET]', this.pokemon(target)); + } + + case 'move': { + const [, pokemon, move] = args; + let line1 = ''; + if (kwArgs.zEffect) { + line1 = this.template('zEffect').replace('[POKEMON]', this.pokemon(pokemon)); + } + const template = this.template('move', kwArgs.from); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[MOVE]', move); + } + + case 'cant': { + let [, pokemon, effect, move] = args; + let id = this.effectId(effect); + switch (id) { + case 'damp': case 'dazzling': case 'queenlymajesty': + // thanks Marty + [pokemon, kwArgs.of] = [kwArgs.of, pokemon]; + break; + } + const template = this.template('cant', effect); + const line1 = this.maybeAbility(effect, kwArgs.of || pokemon); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[MOVE]', move); + } + + case 'faint': { + const [, pokemon] = args; + const template = this.template('faint'); + return template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case 'message': { + let [, message] = args; + return '' + message + '\n'; + } + + case '-start': { + let [, pokemon, effect, arg3] = args; + const line1 = this.maybeAbility(effect, pokemon) || this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + let id = this.effectId(effect); + if (id === 'typechange') { + const template = this.template('typeChange', kwArgs.from); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[TYPE]', arg3).replace('[SOURCE]', this.pokemon(kwArgs.of)); + } + if (id === 'typeadd') { + const template = this.template('typeAdd', kwArgs.from); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[TYPE]', arg3); + } + if (id.startsWith('stockpile')) { + const number = id.slice(9); + const template = this.template('start', 'stockpile'); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[NUMBER]', number); + } + if (id.startsWith('perish')) { + const number = id.slice(6); + const template = this.template('activate', 'perishsong'); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[NUMBER]', number); + } + let templateId = 'start'; + if (kwArgs.already) templateId = 'alreadyStarted'; + if (kwArgs.fatigue) templateId = 'startFromFatigue'; + if (kwArgs.zeffect) templateId = 'startFromZEffect'; + if (kwArgs.damage) templateId = 'activate'; + if (kwArgs.block) templateId = 'block'; + if (kwArgs.upkeep) templateId = 'activate'; + let template = ''; + if (templateId === 'start' && kwArgs.from && kwArgs.from.startsWith('item:')) { + template = this.template('startFromItem', effect); + } + if (!template) template = this.template(templateId, effect); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[EFFECT]', this.effect(kwArgs.from)).replace('[MOVE]', arg3).replace('[SOURCE]', this.pokemon(kwArgs.of)); + } + + case '-end': { + let [, pokemon, effect] = args; + const line1 = this.maybeAbility(effect, pokemon) || this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + let id = this.effectId(effect); + if (id === 'doomdesire' || id === 'futuresight') { + const template = this.template('activate', effect); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[TARGET]', this.pokemon(kwArgs.of)); + } + let templateId = 'end'; + let template = ''; + if (kwArgs.from && kwArgs.from.startsWith('item:')) { + template = this.template('endFromItem', effect); + } + if (!template) template = this.template(templateId, effect); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[EFFECT]', this.effect(kwArgs.from)).replace('[SOURCE]', this.pokemon(kwArgs.of)); + } + + case '-ability': { + let [, pokemon, ability, oldAbility, arg4] = args; + let line1 = ''; + if (oldAbility && (oldAbility.startsWith('p1') || oldAbility.startsWith('p2') || oldAbility === 'boost')) { + arg4 = oldAbility; + oldAbility = ''; + } + if (oldAbility) line1 += this.ability(oldAbility, pokemon); + line1 += this.ability(ability, pokemon); + if (kwArgs.fail) { + const template = this.template('block', ability); + return line1 + template; + } + if (kwArgs.from) { + const template = this.template('changeAbility', kwArgs.from); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[ABILITY]', this.effect(ability)).replace('[SOURCE]', this.pokemon(kwArgs.of)); + } + const id = this.effectId(ability); + if (id === 'unnerve') { + const template = this.template('start', ability); + return line1 + template.replace('[TEAM]', this.team(arg4 && arg4.slice(0, 2))); + } + let templateId = 'start'; + if (id === 'anticipation' || id === 'sturdy') templateId = 'activate'; + const template = this.template(templateId, ability, 'NODEFAULT'); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case '-endability': { + let [, pokemon, ability] = args; + if (ability) return this.ability(ability, pokemon); + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + const template = this.template('start', 'Gastro Acid'); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case '-item': { + let [, pokemon, item] = args; + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + const id = this.effectId(kwArgs.from); + if (['thief', 'covet', 'bestow'].includes(id)) { + const template = this.template('takeItem', kwArgs.from); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[ITEM]', this.effect(item)).replace('[SOURCE]', this.pokemon(kwArgs.of)); + } + if (id === 'frisk') { + const template = this.template(kwArgs.of && pokemon && kwArgs.of !== pokemon ? 'activate' : 'activateNoTarget', "Frisk"); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[ITEM]', this.effect(item)).replace('[TARGET]', this.pokemon(kwArgs.of)); + } + if (kwArgs.from) { + const template = this.template('addItem', kwArgs.from); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[ITEM]', this.effect(item)); + } + const template = this.template('start', item, 'NODEFAULT'); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case '-enditem': { + let [, pokemon, item, arg3] = args; + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + if (kwArgs.eat) { + const template = this.template('eatItem', kwArgs.from); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[ITEM]', this.effect(item)); + } + const id = this.effectId(kwArgs.from); + if (id === 'gem') { + const template = this.template('useGem', item); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[ITEM]', this.effect(item)).replace('[MOVE]', kwArgs.move); + } + if (id === 'stealeat') { + const template = this.template('removeItem', "Bug Bite"); + return line1 + template.replace('[SOURCE]', this.pokemon(kwArgs.of)).replace('[ITEM]', this.effect(item)); + } + if (kwArgs.from) { + const template = this.template('removeItem', kwArgs.from); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[ITEM]', this.effect(item)).replace('[SOURCE]', this.pokemon(kwArgs.of)); + } + const template = this.template('end', item, 'NODEFAULT'); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[TARGET]', this.pokemon(kwArgs.of)); + } + + case '-status': { + const [, pokemon, status] = args; + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + const template = this.template('start', status); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case '-curestatus': { + const [, pokemon, status] = args; + if (this.effectId(kwArgs.from) === 'naturalcure') { + const template = this.template('activate', kwArgs.from); + return template.replace('[POKEMON]', this.pokemon(pokemon)); + } + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + if (kwArgs.from && kwArgs.from.startsWith('item:')) { + const template = this.template('endFromItem', status); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[ITEM]', this.effect(kwArgs.from)); + } + if (kwArgs.thaw) { + const template = this.template('endFromMove', status); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[MOVE]', this.effect(kwArgs.from)); + } + const template = this.template('end', status); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case '-cureteam': { + return this.template('activate', kwArgs.from); + } + + case '-singleturn': case '-singlemove': { + const [, pokemon, effect] = args; + const line1 = this.maybeAbility(effect, kwArgs.of || pokemon) || this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + let id = this.effectId(effect); + if (id === 'instruct') { + const template = this.template('activate', effect); + return line1 + template.replace('[POKEMON]', this.pokemon(kwArgs.of)).replace('[TARGET]', this.pokemon(pokemon)); + } + const template = this.template('start', effect); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[SOURCE]', this.pokemon(kwArgs.of)); + } + + case '-sidestart': { + let [, side, effect] = args; + const template = this.template('start', effect); + return template.replace('[TEAM]', this.team(side)); + } + + case '-sideend': { + let [, side, effect] = args; + const template = this.template('end', effect); + return template.replace('[TEAM]', this.team(side)); + } + + case '-weather': { + const [, weather] = args; + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of); + if (!weather || weather === 'none') { + return this.template('end', kwArgs.from); + } + if (kwArgs.upkeep) { + return this.template('activate', weather); + } + if (!kwArgs.of) { + return this.template('start', weather); + } + const template = this.template('startFromAbility', weather); + return line1 + template.replace('[POKEMON]', this.pokemon(kwArgs.of)); + } + + case '-fieldstart': case '-fieldactivate': { + const [, effect] = args; + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of); + const templateId = cmd.slice(6); + const template = this.template(templateId, effect, 'NODEFAULT'); + return line1 + template.replace('[POKEMON]', this.pokemon(kwArgs.of)); + } + + case '-fieldend': { + let [, effect] = args; + return this.template('end', effect, 'NODEFAULT'); + } + + case '-sethp': { + let effect = kwArgs.from; + return this.template('activate', effect); + } + + case '-message': { + let [, message] = args; + return ' ' + message + '\n'; + } + + case '-hint': { + let [, message] = args; + return ' (' + message + ')\n'; + } + + case '-activate': { + let [, pokemon, effect, target, arg4, arg5] = args; + let id = this.effectId(effect); + if (id === 'celebrate') { + return this.template('activate', 'celebrate').replace('[TRAINER]', this.trainer(pokemon.slice(0, 2))); + } + if (!arg5 && (id === 'spite' || id === 'skillswap')) { + [target, arg4, arg5] = [pokemon, target, arg4]; + } else if (!arg4 && ['grudge', 'forewarn', 'magnitude', 'sketch', 'persistent', 'symbiosis', 'safetygoggles', 'matblock', 'safetygoggles'].includes(id)) { + [target, arg4] = [pokemon, target]; + } else if (!target && ['hyperspacefury', 'hyperspacehole', 'phantomforce', 'shadowforce', 'feint'].includes(id)) { + [pokemon, target] = [kwArgs.of, pokemon]; + if (!pokemon) pokemon = target; + } + if (!target) target = kwArgs.of || pokemon; + + let line1 = this.maybeAbility(effect, pokemon) || this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + if (id === 'wonderguard') { + return line1 + this.template('immune'); + } + + if (['bind', 'wrap', 'clamp', 'whirlpool', 'firespin', 'magmastorm', 'sandtomb', 'infestation', 'charge', 'fairylock', 'trapped'].includes(id)) { + const template = this.template('start', effect); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[SOURCE]', this.pokemon(kwArgs.of)); + } + if (id === 'lockon' || id === 'mindreader') { + const template = this.template('start', effect); + return line1 + template.replace('[POKEMON]', this.pokemon(kwArgs.of)).replace('[SOURCE]', this.pokemon(pokemon)); + } + if (kwArgs.block) { + return this.template('fail'); + } + if (['ingrain', 'quickguard', 'wideguard', 'craftyshield', 'matblock', 'protect', 'mist', 'safeguard', 'electricterrain', 'mistyterrain', 'psychicterrain', 'telepathy', 'stickyhold', 'suctioncups', 'aromaveil', 'flowerveil', 'sweetveil', 'disguise', 'safetygoggles', 'protectivepads'].includes(id)) { + const template = this.template('block', effect); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[MOVE]', arg4); + } + + let templateId = 'activate'; + if (id === 'forewarn' && pokemon === target) { + templateId = 'activateNoTarget'; + } + let template = this.template(templateId, effect, 'NODEFAULT'); + if (!template) { + template = this.template('activate'); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[EFFECT]', this.effect(effect)); + } + + if (id === 'brickbreak') { + template = template.replace('[TEAM]', this.team(target.slice(0, 2))); + } + if (id === 'spite' || id === 'grudge' || id === 'forewarn' || id === 'sketch') { + template = template.replace('[MOVE]', arg4).replace('[NUMBER]', arg5); + } + if (id === 'magnitude') { + template = template.replace('[NUMBER]', arg4); + } + if (id === 'symbiosis') { + template = template.replace('[ITEM]', arg4); + } + if (id === 'skillswap') { + line1 += this.ability(arg4, pokemon); + line1 += this.ability(arg5, target); + } + if (id === 'mummy') { + line1 += this.ability(arg4, target); + line1 += this.ability("Mummy", target); + template = this.template('changeAbility', "Mummy"); + } + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[TARGET]', this.pokemon(target)).replace('[SOURCE]', this.pokemon(kwArgs.of)); + } + + case '-prepare': { + const [, pokemon, effect, target] = args; + const template = this.template('prepare', effect); + return template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[TARGET]', this.pokemon(target)); + } + + case '-damage': { + let [, pokemon, newHealth, percentage] = args; + let template = this.template('damage', kwArgs.from, 'NODEFAULT'); + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + const id = this.effectId(kwArgs.from); + if (template) { + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + if (!kwArgs.from) { + template = this.template(percentage ? 'damagePercentage' : 'damage'); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[PERCENTAGE]', percentage); + } + if (kwArgs.from.startsWith('item:')) { + template = this.template('damageFromItem'); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[ITEM]', this.effect(kwArgs.from)); + } + if (kwArgs.partiallytrapped || id === 'bind' || id === 'wrap') { + template = this.template('damageFromPartialTrapping'); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[MOVE]', this.effect(kwArgs.from)); + } + + template = this.template('damage'); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case '-heal': { + let [, pokemon] = args; + let template = this.template('heal', kwArgs.from, 'NODEFAULT'); + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + if (template) { + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[SOURCE]', this.pokemon(kwArgs.of)); + } + + if (kwArgs.from && !kwArgs.from.startsWith('ability:')) { + template = this.template('healFromEffect'); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[EFFECT]', this.effect(kwArgs.from)); + } + + template = this.template('heal'); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case '-boost': case '-unboost': { + const [, pokemon, stat, number] = args; + const statName = BattleStats[stat as StatName] || "stats"; + const amount = parseInt(number); + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + let templateId = cmd.slice(1); + if (amount >= 3) templateId += '3'; + else if (amount >= 2) templateId += '2'; + else if (amount === 0) templateId += '0'; + if (amount && kwArgs.zeffect) { + templateId += (kwArgs.multiple ? 'MultipleFromZEffect' : 'FromZEffect'); + } else if (amount && kwArgs.from && kwArgs.from.startsWith('item:')) { + templateId += 'FromItem'; + } + const template = this.template(templateId, kwArgs.from); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[STAT]', statName); + } + + case '-setboost': { + const [, pokemon] = args; + const effect = kwArgs.from; + const line1 = this.maybeAbility(effect, kwArgs.of || pokemon); + const template = this.template('boost', effect); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case '-swapboost': { + const [, pokemon, target] = args; + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + const id = this.effectId(kwArgs.from); + let templateId = 'swapBoost'; + if (id === 'guardswap') templateId = 'swapDefensiveBoost'; + if (id === 'powerswap') templateId = 'swapOffensiveBoost'; + const template = this.template(templateId, kwArgs.from); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[TARGET]', this.pokemon(target)); + } + + case '-copyboost': { + const [, pokemon, target] = args; + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + const template = this.template('copyBoost', kwArgs.from); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[TARGET]', this.pokemon(target)); + } + + case '-clearboost': case '-clearpositiveboost': case '-clearnegativeboost': { + const [, pokemon, source] = args; + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + let templateId = 'clearBoost'; + if (kwArgs.zeffect) templateId = 'clearBoostFromZEffect'; + const template = this.template(templateId, kwArgs.from); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[SOURCE]', this.pokemon(source)); + } + + case '-invertboost': { + const [, pokemon] = args; + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + const template = this.template('invertBoost', kwArgs.from); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case '-clearallboost': { + return this.template('clearAllBoost', kwArgs.from); + } + + case '-crit': case '-supereffective': case '-resisted': { + const [, pokemon] = args; + let templateId = cmd.slice(1); + if (templateId === 'supereffective') templateId = 'superEffective'; + if (kwArgs.spread) templateId += 'Spread'; + const template = this.template(templateId); + return template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case '-fail': { + let [, pokemon, effect, stat] = args; + let id = this.effectId(effect); + let blocker = this.effectId(kwArgs.from); + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + let templateId = 'block'; + if (['desolateland', 'primordialsea'].includes(blocker) && + !['sunnyday', 'raindance', 'sandstorm', 'hail'].includes(id)) { + templateId = 'blockMove'; + } else if (blocker === 'uproar' && kwArgs.msg) { + templateId = 'blockSelf'; + } + let template = this.template(templateId, kwArgs.from); + if (template) { + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + if (id === 'unboost') { + template = this.template(stat ? 'failSingular' : 'fail', 'unboost'); + if (this.effectId(kwArgs.from) === 'flowerveil') { + template = this.template('block', kwArgs.from); + pokemon = kwArgs.of; + } + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[STAT]', stat); + } + + templateId = 'fail'; + if (['brn', 'frz', 'par', 'psn', 'slp', 'substitute'].includes(id)) { + templateId = 'alreadyStarted'; + } + if (kwArgs.heavy) templateId = 'failTooHeavy'; + if (kwArgs.weak) templateId = 'fail'; + if (kwArgs.forme) templateId = 'failWrongForme'; + template = this.template(templateId); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case '-immune': { + let [, pokemon, effect] = args; + const line1 = this.maybeAbility(effect, kwArgs.of || pokemon); + let template = this.template('block', effect); + if (!template) { + const templateId = kwArgs.ohko ? 'immuneOHKO' : 'immune'; + template = this.template(pokemon ? templateId : 'immuneNoPokemon', effect); + } + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case '-miss': { + const [, source, pokemon] = args; + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); + if (!pokemon) { + const template = this.template('missNoPokemon'); + return line1 + template.replace('[SOURCE]', this.pokemon(source)); + } + const template = this.template('miss'); + return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case '-center': case '-ohko': case '-combine': { + return this.template(cmd.slice(1)); + } + + case '-nothing': { + return this.template('activate', 'splash'); + } + + case '-notarget': { + return this.template('noTarget'); + } + + case '-mega': case '-primal': { + const [, pokemon, species, item] = args; + let id = ''; + if (species === 'Rayquaza') id = 'dragonascent'; + if (!id && cmd === '-mega' && this.gen < 7) cmd = '-megaGen6'; + let template = this.template(cmd.slice(1)); + const pokemonName = this.pokemon(pokemon); + if (cmd === '-mega') { + const template2 = this.template('transformMega'); + template += template2.replace('[POKEMON]', pokemonName).replace('[SPECIES]', species); + } + return template.replace('[POKEMON]', pokemonName).replace('[ITEM]', item); + } + + case '-zpower': { + const [, pokemon] = args; + const template = this.template('zPower'); + return template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case '-burst': { + const [, pokemon] = args; + const template = this.template('activate', "Ultranecrozium Z"); + return template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case '-zbroken': { + const [, pokemon] = args; + const template = this.template('zBroken'); + return template.replace('[POKEMON]', this.pokemon(pokemon)); + } + + case '-hitcount': { + const [, number] = args; + if (number === '1') { + return this.template('hitCountSingular'); + } + return this.template('hitCount').replace('[NUMBER]', number); + } + + case '-waiting': { + const [, pokemon, target] = args; + const template = this.template('activate', "Water Pledge"); + return template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[TARGET]', this.pokemon(target)); + } + + case '-anim': { + return ''; + } + + default: { + return null; + } + } + } +} + +exports.BattleTextParser = BattleTextParser; diff --git a/src/battle.ts b/src/battle.ts index fce14f6089..4c4e245aad 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -7,6 +7,22 @@ * - The client as a whole is AGPLv3 * - The battle replay/animation engine (battle-*.ts) by itself is MIT * + * Layout: + * + * - Battle + * - Side + * - Pokemon + * - BattleScene + * - BattleLog + * - BattleTextParser + * + * When a Battle receives a message, it splits the message into tokens + * and parses what happens, updating its own state, and then telling + * BattleScene to do any relevant animations. The tokens then get + * passed directly into BattleLog. If the message is an in-battle + * message, it'll be extracted by BattleTextParser, which adds it to + * both the battle log itself, as well as the messagebar. + * * @author Guangcong Luo * @license MIT */ @@ -303,7 +319,7 @@ class Pokemon { this.clearMovestatuses(); this.side.battle.scene.clearEffects(this); } - markMove(moveName: string, pp?: number, recursionSource?: string) { + rememberMove(moveName: string, pp?: number, recursionSource?: string) { if (recursionSource === this.ident) return; if (pp === undefined) pp = 1; moveName = Tools.getMove(moveName).name; @@ -312,7 +328,7 @@ class Pokemon { if (this.volatiles.transform) { // make sure there is no infinite recursion if both Pokemon are transformed into each other if (!recursionSource) recursionSource = this.ident; - this.volatiles.transform[1].markMove(moveName, 0, recursionSource); + this.volatiles.transform[1].rememberMove(moveName, 0, recursionSource); moveName = '*' + moveName; } for (let i = 0; i < this.moveTrack.length; i++) { @@ -324,69 +340,13 @@ class Pokemon { } this.moveTrack.push([moveName, pp]); } - markAbility(ability: string, isNotBase?: boolean) { + rememberAbility(ability: string, isNotBase?: boolean) { ability = Tools.getAbility(ability).name; this.ability = ability; if (!this.baseAbility && !isNotBase) { this.baseAbility = ability; } } - htmlName() { - return '' + BattleLog.escapeHTML(this.name) + ''; - } - getName(shortName?: boolean) { - if (this.side.n === 0) { - return this.htmlName(); - } else { - return (shortName ? "Opposing " : "The opposing ") + this.htmlName(); - } - } - getLowerName(shortName?: boolean) { - if (this.side.n === 0) { - return this.htmlName(); - } else { - return (shortName ? "opposing " : "the opposing ") + this.htmlName(); - } - } - getTitle() { - let titlestring = '(' + this.ability + ') '; - - for (let i = 0; i < this.moves.length; i++) { - if (i != 0) titlestring += ' / '; - titlestring += Tools.getMove(this.moves[i]).name; - } - return titlestring; - } - getFullName(plaintext?: boolean) { - let name = this.side && this.side.n && (this.side.battle.ignoreOpponent || this.side.battle.ignoreNicks) ? this.species : BattleLog.escapeHTML(this.name); - if (name !== this.species) { - if (plaintext) { - name += ' (' + this.species + ')'; - } else { - name = '' + name + ' (' + this.species + ')' + ''; - } - } - if (plaintext) { - if (this === this.side.active[0]) { - name += ' (active)'; - } else if (this.fainted) { - name += ' (fainted)'; - } else { - let statustext = ''; - if (this.hp !== this.maxhp) { - statustext += this.hpDisplay(); - } - if (this.status) { - if (statustext) statustext += '|'; - statustext += this.status; - } - if (statustext) { - name += ' (' + statustext + ')'; - } - } - } - return name; - } getBoost(boostStat: BoostStatName) { let boostStatTable = { atk: 'Atk', @@ -630,14 +590,6 @@ class Side { } if (this.battle.stagnateCallback) this.battle.stagnateCallback(this.battle); } - getTeamName() { - if (this === this.battle.mySide) return "Your team"; - return "The opposing team"; - } - getLowerTeamName() { - if (this === this.battle.mySide) return "your team"; - return "the opposing team"; - } addSideCondition(effect: Effect) { let condition = effect.id; if (this.sideConditions[condition]) { @@ -784,18 +736,11 @@ class Side { pokemon.copyVolatileFrom(this.lastPokemon); } - if (pokemon.side.n === 0) { - this.battle.message('Go! ' + pokemon.getFullName() + '!'); - } else { - this.battle.message('' + BattleLog.escapeHTML(pokemon.side.name) + ' sent out ' + pokemon.getFullName() + '!'); - } - this.battle.scene.animSummon(pokemon, slot); if (this.battle.switchCallback) this.battle.switchCallback(this.battle, this); } dragIn(pokemon: Pokemon, slot = pokemon.slot) { - this.battle.message('' + pokemon.getFullName() + ' was dragged out!'); let oldpokemon = this.active[slot]; if (oldpokemon === pokemon) return; this.lastPokemon = oldpokemon; @@ -849,13 +794,9 @@ class Side { pokemon.removeVolatile('formechange' as ID); } if (pokemon.lastMove === 'uturn' || pokemon.lastMove === 'voltswitch') { - this.battle.message('' + pokemon.getName() + ' went back to ' + BattleLog.escapeHTML(pokemon.side.name) + '!'); + this.battle.log(['switchout', pokemon.ident], {from: pokemon.lastMove}); } else if (pokemon.lastMove !== 'batonpass' && pokemon.lastMove !== 'zbatonpass') { - if (pokemon.side.n === 0) { - this.battle.message('' + pokemon.getName() + ', come back!'); - } else { - this.battle.message('' + BattleLog.escapeHTML(pokemon.side.name) + ' withdrew ' + pokemon.getFullName() + '!'); - } + this.battle.log(['switchout', pokemon.ident]); } pokemon.statusData.toxicTurns = 0; if (this.battle.gen === 5) pokemon.statusData.sleepTurns = 0; @@ -864,22 +805,10 @@ class Side { this.battle.scene.animUnsummon(pokemon); } - swapTo(pokemon: Pokemon, slot: number, kwargs: {[k: string]: string}) { + swapTo(pokemon: Pokemon, slot: number, kwArgs: {[k: string]: string}) { if (pokemon.slot === slot) return; let target = this.active[slot]; - if (!kwargs.silent) { - let fromeffect = Tools.getEffect(kwargs.from); - switch (fromeffect.id) { - case 'allyswitch': - this.battle.message('' + pokemon.getName() + ' and ' + target!.getLowerName() + ' switched places.'); - break; - default: - this.battle.message('' + pokemon.getName() + ' moved to the center!'); - break; - } - } - let oslot = pokemon.slot; pokemon.slot = slot; @@ -894,19 +823,10 @@ class Side { this.battle.scene.animSummon(pokemon, slot, true); if (target) this.battle.scene.animSummon(target, oslot, true); } - swapWith(pokemon: Pokemon, target: Pokemon, kwargs: {[k: string]: string}) { + swapWith(pokemon: Pokemon, target: Pokemon, kwArgs: {[k: string]: string}) { // method provided for backwards compatibility only if (pokemon === target) return; - if (!kwargs.silent) { - let fromeffect = Tools.getEffect(kwargs.from); - switch (fromeffect.id) { - case 'allyswitch': - this.battle.message('' + pokemon.getName() + ' and ' + target.getLowerName() + ' switched places.'); - break; - } - } - let oslot = pokemon.slot; let nslot = target.slot; @@ -926,12 +846,6 @@ class Side { this.lastPokemon = pokemon; this.active[slot] = null; - this.battle.message('' + pokemon.getName() + ' fainted!'); - if (window.Config && Config.server && Config.server.afd && !Config.server.afdFaint) { - this.battle.message('
    Needed that one alive? Buy Max Revive DLC, yours for only $9.99!
    CLICK HERE!
    '); - Config.server.afdFaint = true; - } - pokemon.fainted = true; pokemon.hp = 0; @@ -962,7 +876,7 @@ class Battle { // activity queue activityQueue = [] as string[]; preemptActivityQueue = [] as string[]; - minorQueue = [] as [string[], {[k: string]: string}][]; + waitForAnimations: true | false | 'simult' = true; activityStep = 0; fastForward = 0; fastForwardWillScroll = false; @@ -985,7 +899,6 @@ class Battle { messageFadeTime = 300; messageShownTime = 1; turnsSinceMoved = 0; - hasPreMoveMessage = false; turn = 0; /** @@ -1095,7 +1008,6 @@ class Battle { this.activeMoveIsSpread = null; this.activityStep = 0; this.fastForwardOff(); - this.minorQueue = []; this.resultWaiting = false; this.paused = true; if (this.playbackState !== Playback.Seeking) { @@ -1117,21 +1029,21 @@ class Battle { this.p2 = null!; } - message(message: string, hiddenMessage?: string) { - this.scene.message(message, hiddenMessage); + log(args: Args, kwArgs?: KWArgs, preempt?: boolean) { + this.scene.log.add(args, kwArgs, preempt); } switchSides(replay?: boolean) { if (this.ended) { - this.reset(true); this.setSidesSwitched(!this.sidesSwitched); + this.reset(true); this.fastForwardTo(-1); } else { let turn = this.turn; let paused = this.paused; + this.setSidesSwitched(!this.sidesSwitched); this.reset(true); this.paused = paused; - this.setSidesSwitched(!this.sidesSwitched); if (turn) this.fastForwardTo(turn); if (!paused) { this.play(); @@ -1153,8 +1065,6 @@ class Battle { this.sides[1] = this.yourSide; this.sides[0].n = 0; this.sides[1].n = 1; - this.sides[0].updateSprites(); - this.sides[1].updateSprites(); // nothing else should need updating - don't call this function after sending out pokemon } @@ -1163,16 +1073,15 @@ class Battle { // activities // start() { - this.scene.log('
    Battle between ' + BattleLog.escapeHTML(this.p1.name) + ' and ' + BattleLog.escapeHTML(this.p2.name) + ' started!
    '); + this.log(['start']); if (this.startCallback) this.startCallback(this); } winner(winner?: string) { - if (winner) this.message('' + BattleLog.escapeHTML(winner) + ' won the battle!'); - else this.message('Tie between ' + BattleLog.escapeHTML(this.p1.name) + ' and ' + BattleLog.escapeHTML(this.p2.name) + '!'); + this.log(['win', winner || '']); this.ended = true; } prematureEnd() { - this.message('This replay ends here.'); + this.log(['message', 'This replay ends here.']); this.ended = true; } endLastTurn() { @@ -1204,7 +1113,6 @@ class Battle { if (!this.fastForward) this.turnsSinceMoved++; this.scene.incrementTurn(); - this.scene.log('

    Turn ' + turnNum + '

    '); if (this.fastForward) { if (this.turnCallback) this.turnCallback(this); @@ -1231,55 +1139,9 @@ class Battle { } changeWeather(weatherName: string, poke?: Pokemon, isUpkeep?: boolean, ability?: Effect) { let weather = toId(weatherName); - let weatherTable = { - sunnyday: { - name: 'Sun', - startMessage: 'The sunlight turned harsh!', - abilityMessage: "'s Drought intensified the sun's rays!", - //upkeepMessage: 'The sunlight is strong!', - endMessage: "The sunlight faded." - }, - desolateland: { - name: "Intense Sun", - startMessage: "The sunlight turned extremely harsh!", - endMessage: "The harsh sunlight faded." - }, - raindance: { - name: 'Rain', - startMessage: 'It started to rain!', - abilityMessage: "'s Drizzle made it rain!", - //upkeepMessage: 'Rain continues to fall!', - endMessage: 'The rain stopped.' - }, - primordialsea: { - name: "Heavy Rain", - startMessage: "A heavy rain began to fall!", - endMessage: "The heavy rain has lifted!" - }, - sandstorm: { - name: 'Sandstorm', - startMessage: 'A sandstorm kicked up!', - abilityMessage: "'s Sand Stream whipped up a sandstorm!", - upkeepMessage: 'The sandstorm is raging.', - endMessage: 'The sandstorm subsided.' - }, - hail: { - name: 'Hail', - startMessage: 'It started to hail!', - abilityMessage: "'s Snow Warning whipped up a hailstorm!", - upkeepMessage: 'The hail is crashing down.', - endMessage: 'The hail stopped.' - }, - deltastream: { - name: 'Strong Winds', - startMessage: 'Mysterious strong winds are protecting Flying-type Pokémon!', - endMessage: 'The mysterious strong winds have dissipated!' - } - } as {[weatherid: string]: {name: string, startMessage: string, abilityMessage?: string, upkeepMessage?: string, endMessage: string}}; if (!weather || weather === 'none') { weather = '' as ID; } - let newWeather = weatherTable[weather]; if (isUpkeep) { if (this.weather && this.weatherTimeLeft) { this.weatherTimeLeft--; @@ -1288,37 +1150,24 @@ class Battle { if (!this.fastForward) { this.scene.upkeepWeather(); } - if (newWeather && newWeather.upkeepMessage) { - this.message('
    ' + newWeather.upkeepMessage + '
    '); - } return; } - if (newWeather) { + if (weather) { let isExtremeWeather = (weather === 'deltastream' || weather === 'desolateland' || weather === 'primordialsea'); if (poke) { if (ability) { - this.scene.abilityActivateAnim(poke, ability.name); - this.message('', "[" + poke.getName(true) + "'s " + ability.name + "!]"); - poke.markAbility(ability.name); - this.message('' + newWeather.startMessage + ''); - } else { - this.message('' + poke.getName() + newWeather.abilityMessage + ''); // for backwards compatibility + this.activateAbility(poke, ability.name); } this.weatherTimeLeft = (this.gen <= 5 || isExtremeWeather) ? 0 : 8; this.weatherMinTimeLeft = (this.gen <= 5 || isExtremeWeather) ? 0 : 5; } else if (isExtremeWeather) { - this.message('' + newWeather.startMessage + ''); this.weatherTimeLeft = 0; this.weatherMinTimeLeft = 0; } else { - this.message('' + newWeather.startMessage + ''); this.weatherTimeLeft = (this.gen <= 3 ? 5 : 8); this.weatherMinTimeLeft = (this.gen <= 3 ? 0 : 5); } } - if (this.weather && !newWeather) { - this.message('' + weatherTable[this.weather].endMessage + ''); - } this.weather = weather; this.scene.updateWeather(); } @@ -1337,8 +1186,8 @@ class Battle { } this.scene.updateWeather(); } - useMove(pokemon: Pokemon, move: Move, target: Pokemon | null, kwargs: {[k: string]: string}) { - let fromeffect = Tools.getEffect(kwargs.from); + useMove(pokemon: Pokemon, move: Move, target: Pokemon | null, kwArgs: {[k: string]: string}) { + let fromeffect = Tools.getEffect(kwArgs.from); pokemon.clearMovestatuses(); if (move.id === 'focuspunch') { pokemon.removeTurnstatus('focuspunch' as ID); @@ -1350,149 +1199,42 @@ class Battle { if (!target) { target = pokemon.side.foe.missedPokemon; } - if (!kwargs.silent) { - if (kwargs.zeffect) { - this.message('' + pokemon.getName() + ' unleashes its full-force Z-Move!', ''); - } - switch (fromeffect.id) { - case 'snatch': - break; - case 'magicbounce': - case 'magiccoat': - case 'rebound': - if (fromeffect.id === 'magiccoat') { - this.scene.resultAnim(pokemon, "Bounced", 'good'); - pokemon.addTurnstatus('magiccoat' as ID); - } else { - this.scene.abilityActivateAnim(pokemon, fromeffect.name); - this.message('', "[" + pokemon.getName(true) + "'s " + fromeffect.name + "!]"); - pokemon.markAbility(fromeffect.name); - } - this.message(pokemon.getName() + " bounced the " + move.name + " back!"); - break; - case 'metronome': - this.message('Waggling a finger let it use ' + move.name + '!'); - break; - case 'naturepower': - this.message('Nature Power turned into ' + move.name + '!'); - break; - case 'weatherball': - this.message('Breakneck Blitz turned into ' + move.name + ' due to the weather!'); - break; - case 'sleeptalk': - pokemon.markMove(move.name, 0); - this.message(pokemon.getName() + ' used ' + move.name + '!'); - break; - // Gen 1 - case 'bind': - case 'clamp': - case 'firespin': - case 'wrap': - this.message(pokemon.getName() + "'s attack continues!"); - break; - default: - // April Fool's 2014 - if (window.Config && Config.server && Config.server.afd && move.id === 'earthquake') { - if (!this.fastForward && window.$) { - $('body').css({ - position: 'absolute', - left: 0, - right: 0, - top: 0, - bottom: 0 - }).animate({ - left: -30, - right: 30 - }, 75).animate({ - left: 30, - right: -30 - }, 100).animate({ - left: -30, - right: 30 - }, 100).animate({ - left: 30, - right: -30 - }, 100).animate({ - left: 0, - right: 0 - }, 100, function () { - $(this).css({ - position: 'static' - }); - }); - } - this.message(pokemon.getName() + ' used Fissure!'); - this.message('Just kidding! It was Earthquake!'); - } else if (window.Config && Config.server && Config.server.afd && move.id === 'stealthrock') { - let srNames = ['Sneaky Pebbles', 'Sly Rubble', 'Subtle Sediment', 'Buried Bedrock', 'Camouflaged Cinnabar', 'Clandestine Cobblestones', 'Cloaked Clay', 'Concealed Ore', 'Covert Crags', 'Crafty Coal', 'Discreet Bricks', 'Disguised Debris', 'Espionage Pebbles', 'Furtive Fortress', 'Hush-Hush Hardware', 'Incognito Boulders', 'Invisible Quartz', 'Masked Minerals', 'Mischievous Masonry', 'Obscure Ornaments', 'Private Paragon', 'Secret Solitaire', 'Sheltered Sand', 'Surreptitious Sapphire', 'Undercover Ultramarine']; - this.message(pokemon.getName() + ' used ' + srNames[Math.floor(Math.random() * srNames.length)] + '!'); - } else if (window.Config && Config.server && Config.server.afd && move.id === 'extremespeed') { - let fastWords = ['H-Hayai', 'Masaka', 'Its fast']; - this.message(pokemon.getName() + ' used ' + move.name + '!'); - this.message('' + fastWords[Math.floor(Math.random() * fastWords.length)] + '!'); - } else if (window.Config && Config.server && Config.server.afd && move.id === 'aerialace') { - this.message(pokemon.getName() + ' used Tsubame Gaeshi!'); - // } else if (window.Config && Config.server && Config.server.afd && (move.id === 'metronome' || move.id === 'sleeptalk' || move.id === 'assist')) { - // this.message(pokemon.getName() + ' used ' + move.name + '!'); - // let buttons = ["A", "B", "START", "SELECT", "UP", "DOWN", "LEFT", "RIGHT", "DEMOCRACY", "ANARCHY"]; - // let people = ["Zarel", "The Immortal", "Diatom", "Nani Man", "shaymin", "apt-get", "sirDonovan", "Arcticblast", "Trickster"]; - // let button; - // for (let i = 0; i < 10; i++) { - // let name = people[Math.floor(Math.random() * people.length)]; - // if (!button) button = buttons[Math.floor(Math.random() * buttons.length)]; - // this.scene.log('
    ' + BattleLog.escapeHTML(name) + ': ' + button + '
    '); - // button = (name === 'Diatom' ? "thanks diatom" : null); - // } - } else { - this.message(pokemon.getName() + ' used ' + move.name + '!'); - } - if (!fromeffect.id || fromeffect.id === 'pursuit') { - let moveName = move.name; - if (move.isZ) { - pokemon.item = move.isZ; - let item = Tools.getItem(move.isZ); - if (item.zMoveFrom) moveName = item.zMoveFrom; - } else if (move.name.slice(0, 2) === 'Z-') { - moveName = moveName.slice(2); - move = Tools.getMove(moveName); - if (window.BattleItems) { - for (let item in BattleItems) { - if (BattleItems[item].zMoveType === move.type) pokemon.item = item; - } - } + if (fromeffect.id === 'sleeptalk') { + pokemon.rememberMove(move.name, 0); + } else if (!fromeffect.id || fromeffect.id === 'pursuit') { + let moveName = move.name; + if (move.isZ) { + pokemon.item = move.isZ; + let item = Tools.getItem(move.isZ); + if (item.zMoveFrom) moveName = item.zMoveFrom; + } else if (move.name.slice(0, 2) === 'Z-') { + moveName = moveName.slice(2); + move = Tools.getMove(moveName); + if (window.BattleItems) { + for (let item in BattleItems) { + if (BattleItems[item].zMoveType === move.type) pokemon.item = item; } - let pp = (target && target.side !== pokemon.side && toId(target.ability) === 'pressure' ? 2 : 1); - pokemon.markMove(moveName, pp); } - break; - } - if (window.Config && Config.server && Config.server.afd && move.id === 'taunt') { - let quotes = [ - "Yo mama so fat, she 4x resists Ice- and Fire-type attacks!", - "Yo mama so ugly, Captivate raises her opponent's Special Attack!", - "Yo mama so dumb, she lowers her Special Attack when she uses Nasty Plot!", - "Yo mama so dumb, she thought Sylveon would be Light Type!" - ]; - let quote = quotes[(this.p1.name.charCodeAt(2) + this.p2.name.charCodeAt(2) + this.turn) % quotes.length]; - this.message(pokemon.getName() + " said, \"" + quote + "\""); } + let pp = (target && target.side !== pokemon.side && toId(target.ability) === 'pressure' ? 2 : 1); + pokemon.rememberMove(moveName, pp); } - if (!this.fastForward && !kwargs.still) { + if (!this.fastForward && !kwArgs.still) { // skip - if (kwargs.miss && target.side) { + if (kwArgs.miss && target.side) { target = target.side.missedPokemon; } - if (kwargs.notarget || !target) { + if (kwArgs.notarget || !target) { target = pokemon.side.foe.missedPokemon; } - if (kwargs.prepare || kwargs.anim === 'prepare') { + if (kwArgs.prepare || kwArgs.anim === 'prepare') { this.scene.runPrepareAnim(move.id, pokemon, target); - } else if (!kwargs.notarget) { - let usedMove = kwargs.anim ? Tools.getMove(kwargs.anim) : move; - if (kwargs.spread) { - this.activeMoveIsSpread = kwargs.spread; + } else if (!kwArgs.notarget) { + let usedMove = kwArgs.anim ? Tools.getMove(kwArgs.anim) : move; + if (kwArgs.spread) { + this.activeMoveIsSpread = kwArgs.spread; let targets = [pokemon]; - let hitPokemon = kwargs.spread.split(','); + let hitPokemon = kwArgs.spread.split(','); if (hitPokemon[0] !== '.') { for (const target of hitPokemon) { targets.push(this.getPokemon(target + ': ?')!); @@ -1514,2557 +1256,1370 @@ class Battle { pokemon.side.wisher = pokemon; } } - cantUseMove(pokemon: Pokemon, effect: Effect, move: Move, kwargs: {[k: string]: string}) { + cantUseMove(pokemon: Pokemon, effect: Effect, move: Move, kwArgs: {[k: string]: string}) { pokemon.clearMovestatuses(); this.scene.updateStatbar(pokemon); if (effect.id in BattleStatusAnims) { this.scene.runStatusAnim(effect.id, [pokemon]); } - if (effect.effectType === 'Ability') { - this.scene.abilityActivateAnim(pokemon, effect.name); - this.message('', "[" + pokemon.getName(true) + "'s " + effect.name + "!]"); - pokemon.markAbility(effect.name); - } + this.activateAbility(pokemon, effect); + if (move.id) pokemon.rememberMove(move.name, 0); switch (effect.id) { - case 'taunt': - this.message('' + pokemon.getName() + ' can\'t use ' + move.name + ' after the taunt!'); - pokemon.markMove(move.name, 0); - break; - case 'gravity': - this.message('' + pokemon.getName() + ' can\'t use ' + move.name + ' because of gravity!'); - pokemon.markMove(move.name, 0); - break; - case 'healblock': - this.message('' + pokemon.getName() + ' can\'t use ' + move.name + ' because of Heal Block!'); - pokemon.markMove(move.name, 0); - break; - case 'imprison': - this.message('' + pokemon.getName() + ' can\'t use its sealed ' + move.name + '!'); - pokemon.markMove(move.name, 0); - break; - case 'throatchop': - this.message('The effects of Throat Chop prevent ' + pokemon.getName() + ' from using certain moves!'); - break; case 'par': this.scene.resultAnim(pokemon, 'Paralyzed', 'par'); - this.message('' + pokemon.getName() + ' is paralyzed! It can\'t move!'); break; case 'frz': this.scene.resultAnim(pokemon, 'Frozen', 'frz'); - this.message('' + pokemon.getName() + ' is frozen solid!'); break; case 'slp': this.scene.resultAnim(pokemon, 'Asleep', 'slp'); pokemon.statusData.sleepTurns++; - this.message('' + pokemon.getName() + ' is fast asleep.'); - break; - case 'skydrop': - this.message('Sky Drop won\'t let ' + pokemon.getLowerName() + ' go!'); - break; - case 'damp': - case 'dazzling': - case 'queenlymajesty': - let ofpoke = this.getPokemon(kwargs.of)!; - this.message(ofpoke.getName() + ' cannot use ' + move.name + '!'); break; case 'truant': this.scene.resultAnim(pokemon, 'Loafing around', 'neutral'); - this.message('' + pokemon.getName() + ' is loafing around!'); break; case 'recharge': this.scene.runOtherAnim('selfstatus' as ID, [pokemon]); this.scene.resultAnim(pokemon, 'Must recharge', 'neutral'); - this.message('' + pokemon.getName() + ' must recharge!'); break; case 'focuspunch': this.scene.resultAnim(pokemon, 'Lost focus', 'neutral'); - this.message(pokemon.getName() + ' lost its focus and couldn\'t move!'); pokemon.removeTurnstatus('focuspunch' as ID); break; case 'shelltrap': this.scene.resultAnim(pokemon, 'Trap failed', 'neutral'); - this.message(pokemon.getName() + '\'s shell trap didn\'t work!'); pokemon.removeTurnstatus('shelltrap' as ID); break; case 'flinch': this.scene.resultAnim(pokemon, 'Flinched', 'neutral'); - this.message(pokemon.getName() + ' flinched and couldn\'t move!'); pokemon.removeTurnstatus('focuspunch' as ID); break; case 'attract': this.scene.resultAnim(pokemon, 'Immobilized', 'neutral'); - this.message(pokemon.getName() + ' is immobilized by love!'); - break; - case 'nopp': - this.message(pokemon.getName() + ' used ' + move.name + '!'); - this.message('But there was no PP left for the move!'); - break; - default: - this.message('' + pokemon.getName() + (move.name ? ' can\'t use ' + move.name + '' : ' can\'t move') + '!'); break; } this.scene.animReset(pokemon); } - runMinor(args?: string[], kwargs?: {[k: string]: string}, preempt?: boolean, nextArgs?: string[], nextKwargs?: {[k: string]: string}) { - let actions = ''; - let minors = this.minorQueue; - if (args && kwargs && nextArgs && nextKwargs) { + + activateAbility(pokemon: Pokemon | null, effectOrName: Effect | string, isNotBase?: boolean) { + if (!pokemon || !effectOrName) return; + if (typeof effectOrName !== 'string') { + if (effectOrName.effectType !== 'Ability') return; + effectOrName = effectOrName.name; + } + this.scene.abilityActivateAnim(pokemon, effectOrName); + pokemon.rememberAbility(effectOrName, isNotBase); + } + + runMinor(args: Args, kwArgs: KWArgs, nextArgs?: Args, nextKwargs?: KWArgs) { + if (nextArgs && nextKwargs) { if (args[2] === 'Sturdy' && args[0] === '-activate') args[2] = 'ability: Sturdy'; - if (args[0] === '-crit' || args[0] === '-supereffective' || args[0] === '-resisted' || args[2] === 'ability: Sturdy') kwargs.then = '.'; - if (args[0] === '-damage' && !kwargs.from && args[1] !== nextArgs[1] && (nextArgs[0] === '-crit' || nextArgs[0] === '-supereffective' || nextArgs[0] === '-resisted' || (nextArgs[0] === '-damage' && !nextKwargs.from))) kwargs.then = '.'; - if (args[0] === '-damage' && nextArgs[0] === '-damage' && kwargs.from && kwargs.from === nextKwargs.from) kwargs.then = '.'; - if (args[0] === '-ability' && (args[2] === 'Intimidate' || args[3] === 'boost')) kwargs.then = '.'; - if (args[0] === '-unboost' && nextArgs[0] === '-unboost') kwargs.then = '.'; - if (args[0] === '-boost' && nextArgs[0] === '-boost') kwargs.then = '.'; - if (args[0] === '-damage' && kwargs.from === 'Leech Seed' && nextArgs[0] === '-heal' && nextKwargs.silent) kwargs.then = '.'; - minors.push([args, kwargs]); - if (kwargs.simult || kwargs.then) { - return; + if (args[0] === '-crit' || args[0] === '-supereffective' || args[0] === '-resisted' || args[2] === 'ability: Sturdy') kwArgs.then = '.'; + if (args[0] === '-damage' && !kwArgs.from && args[1] !== nextArgs[1] && (nextArgs[0] === '-crit' || nextArgs[0] === '-supereffective' || nextArgs[0] === '-resisted' || (nextArgs[0] === '-damage' && !nextKwargs.from))) kwArgs.then = '.'; + if (args[0] === '-damage' && nextArgs[0] === '-damage' && kwArgs.from && kwArgs.from === nextKwargs.from) kwArgs.then = '.'; + if (args[0] === '-ability' && (args[2] === 'Intimidate' || args[3] === 'boost')) kwArgs.then = '.'; + if (args[0] === '-unboost' && nextArgs[0] === '-unboost') kwArgs.then = '.'; + if (args[0] === '-boost' && nextArgs[0] === '-boost') kwArgs.then = '.'; + if (args[0] === '-damage' && kwArgs.from === 'Leech Seed' && nextArgs[0] === '-heal' && nextKwargs.silent) kwArgs.then = '.'; + if (args[0] === 'detailschange' && nextArgs[0] === '-mega') { + if (this.scene.closeMessagebar()) { + this.activityStep--; + return; + } + kwArgs.simult = '.'; } } - while (minors.length) { - let row = minors.shift()!; - args = row[0]; - kwargs = row[1]; - if (kwargs.simult) this.scene.timeOffset = 0; + if (kwArgs.then) this.waitForAnimations = false; + if (kwArgs.simult) this.waitForAnimations = 'simult'; - switch (args[0]) { - case '-center': { - actions += "Automatic center!"; - break; - } case '-damage': { - let poke = this.getPokemon(args[1])!; - let damage = poke.healthParse(args[2], true); - if (damage === null) break; - let range = poke.getDamageRange(damage); - - if (kwargs.silent) { - // do nothing - } else if (kwargs.from) { - let effect = Tools.getEffect(kwargs.from); - let ofpoke = this.getPokemon(kwargs.of); - if (effect.effectType === 'Ability' && ofpoke) { - this.scene.abilityActivateAnim(ofpoke, effect.name); - this.message('', "[" + ofpoke.getName(true) + "'s " + effect.name + "!]"); - ofpoke.markAbility(effect.name); - } else if (effect.effectType === 'Item') { - (ofpoke || poke).item = effect.name; - } - switch (effect.id) { - case 'stealthrock': - actions += "Pointed stones dug into " + poke.getLowerName() + "! "; - break; - case 'spikes': - actions += "" + poke.getName() + " is hurt by the spikes! "; - break; - case 'brn': - this.scene.runStatusAnim('brn' as ID, [poke]); - actions += "" + poke.getName() + " was hurt by its burn! "; - break; - case 'psn': - this.scene.runStatusAnim('psn' as ID, [poke]); - actions += "" + poke.getName() + " was hurt by poison! "; - break; - case 'lifeorb': - this.message('', '' + poke.getName() + ' lost some of its HP!'); - break; - case 'recoil': - actions += "" + poke.getName() + " is damaged by the recoil! "; - break; - case 'sandstorm': - actions += "" + poke.getName() + " is buffeted by the sandstorm! "; - break; - case 'hail': - actions += "" + poke.getName() + " is buffeted by the hail! "; - break; - case 'baddreams': - this.scene.runStatusAnim('cursed' as ID, [poke]); - actions += "" + poke.getName() + " is tormented!"; - break; - case 'curse': - this.scene.runStatusAnim('cursed' as ID, [poke]); - actions += "" + poke.getName() + " is afflicted by the curse! "; - break; - case 'nightmare': - actions += "" + poke.getName() + " is locked in a nightmare! "; - break; - case 'roughskin': - case 'ironbarbs': - case 'spikyshield': - actions += "" + poke.getName() + " was hurt! "; - break; - case 'innardsout': - case 'aftermath': - actions += "" + poke.getName() + " is hurt! "; - break; - case 'liquidooze': - actions += "" + poke.getName() + " sucked up the liquid ooze! "; - break; - case 'dryskin': - case 'solarpower': - break; - case 'confusion': - this.scene.runStatusAnim('confusedselfhit' as ID, [poke]); - actions += "It hurt itself in its confusion! "; - this.hasPreMoveMessage = false; - break; - case 'leechseed': - this.scene.runOtherAnim('leech' as ID, [ofpoke!, poke]); - actions += "" + poke.getName() + "'s health is sapped by Leech Seed! "; - break; - case 'flameburst': - actions += "The bursting flame hit " + poke.getLowerName() + "! "; - break; - case 'firepledge': - actions += "" + poke.getName() + " is hurt by the sea of fire! "; - break; - case 'jumpkick': - case 'highjumpkick': - actions += "" + poke.getName() + " kept going and crashed!"; - break; - case 'bind': - case 'wrap': - this.scene.runOtherAnim('bound' as ID, [poke]); - actions += "" + poke.getName() + ' is hurt by ' + effect.name + '!'; - break; - default: - if (ofpoke) { - actions += "" + poke.getName() + " is hurt by " + ofpoke.getLowerName() + "'s " + effect.name + "! "; - } else if (effect.effectType === 'Item') { - actions += "" + poke.getName() + " is hurt by its " + effect.name + "! "; - } else if (effect.effectType === 'Ability') { - actions += "" + poke.getName() + " is hurt by its " + effect.name + "! "; - } else if (kwargs.partiallytrapped) { - actions += "" + poke.getName() + ' is hurt by ' + effect.name + '! '; - } else { - actions += "" + poke.getName() + " lost some HP because of " + effect.name + "! "; - } - break; - } - } else { - let damageinfo = '' + poke.getFormattedRange(range, damage[1] === 100 ? 0 : 1, '–'); - if (damage[1] !== 100) { - let hover = '' + ((damage[0] < 0) ? '−' : '') + - Math.abs(damage[0]) + '/' + damage[1]; - if (damage[1] === 48) { // this is a hack - hover += ' pixels'; - } - damageinfo = '' + damageinfo + ''; - } - let hiddenactions = '' + poke.getName() + ' lost ' + damageinfo + ' of its health!
    '; - this.message(actions ? '' + actions + '' : '', hiddenactions); - actions = ''; - } - this.scene.damageAnim(poke, poke.getFormattedRange(range, 0, ' to ')); - break; - } case '-heal': { - let poke = this.getPokemon(args[1])!; - let damage = poke.healthParse(args[2], true, true); - if (damage === null) break; - let range = poke.getDamageRange(damage); - - if (kwargs.silent) { - // do nothing - } else if (kwargs.from) { - let effect = Tools.getEffect(kwargs.from); - let ofpoke = this.getPokemon(kwargs.of); - if (effect.effectType === 'Ability') { - this.scene.abilityActivateAnim(poke, effect.name); - this.message('', "[" + poke.getName(true) + "'s " + effect.name + "!]"); - poke.markAbility(effect.name); - } - switch (effect.id) { - case 'memento': - case 'partingshot': - actions += "" + poke.getName() + "'s HP was restored by the Z-Power!"; - break; - case 'ingrain': - actions += "" + poke.getName() + " absorbed nutrients with its roots!"; - break; - case 'aquaring': - actions += "A veil of water restored " + poke.getLowerName() + "'s HP!"; - break; - case 'healingwish': - actions += "The healing wish came true for " + poke.getLowerName() + "!"; - this.lastMove = 'healing-wish'; - this.scene.runResidualAnim('healingwish' as ID, poke); - poke.side.wisher = null; - break; - case 'lunardance': - actions += "" + poke.getName() + " became cloaked in mystical moonlight!"; - this.lastMove = 'healing-wish'; - this.scene.runResidualAnim('healingwish' as ID, poke); - for (let trackedMove of poke.moveTrack) { - trackedMove[1] = 0; - } - poke.side.wisher = null; - break; - case 'wish': - actions += "" + kwargs.wisher + "'s wish came true!"; - this.scene.runResidualAnim('wish' as ID, poke); - break; - case 'drain': - actions += ofpoke!.getName() + ' had its energy drained!'; - break; - case 'leftovers': - case 'shellbell': - case 'blacksludge': - poke.item = effect.name; - actions += "" + poke.getName() + " restored a little HP using its " + effect.name + "!"; - break; - default: - if (kwargs.absorb) { - actions += "" + poke.getName() + "'s " + effect.name + " absorbs the attack!"; - } else if (effect.id && effect.effectType !== 'Ability') { - actions += "" + poke.getName() + " restored HP using its " + effect.name + "!"; - } else { - actions += poke.getName() + ' restored its HP.'; - } - break; - } - } else if (kwargs.zeffect) { - actions += "" + poke.getName() + " restored its HP using its Z-Power!"; - } else { - actions += poke.getName() + ' restored its HP.'; - } - this.scene.runOtherAnim('heal' as ID, [poke]); - this.scene.healAnim(poke, poke.getFormattedRange(range, 0, ' to ')); - break; - } case '-sethp': { - let effect = Tools.getEffect(kwargs.from); - // let poke, ofpoke; - for (let k = 0; k < 2; k++) { - let cpoke = this.getPokemon(args[1 + 2 * k]); - if (cpoke) { - let damage = cpoke.healthParse(args[2 + 2 * k])!; - let range = cpoke.getDamageRange(damage); - let formattedRange = cpoke.getFormattedRange(range, 0, ' to '); - let diff = damage[0]; - if (diff > 0) { - this.scene.healAnim(cpoke, formattedRange); - } else { - this.scene.damageAnim(cpoke, formattedRange); - } - } - // if (k == 0) poke = cpoke; - // if (k == 1) ofpoke = cpoke; + switch (args[0]) { + case '-damage': { + let poke = this.getPokemon(args[1])!; + let damage = poke.healthParse(args[2], true); + if (damage === null) break; + let range = poke.getDamageRange(damage); + + if (kwArgs.from) { + let effect = Tools.getEffect(kwArgs.from); + let ofpoke = this.getPokemon(kwArgs.of); + this.activateAbility(ofpoke, effect); + if (effect.effectType === 'Item') { + (ofpoke || poke).item = effect.name; } switch (effect.id) { - case 'painsplit': - actions += 'The battlers shared their pain!'; + case 'brn': + this.scene.runStatusAnim('brn' as ID, [poke]); break; - } - - break; - - } case '-boost': { - let poke = this.getPokemon(args[1])!; - let stat = args[2] as BoostStatName; - if (this.gen === 1 && stat === 'spd') break; - if (this.gen === 1 && stat === 'spa') stat = 'spc'; - let amount = parseInt(args[3], 10); - if (amount === 0) { - actions += "" + poke.getName() + "'s " + BattleStats[stat] + " won't go any higher! "; - this.scene.resultAnim(poke, 'Highest ' + BattleStats[stat], 'good'); + case 'psn': + this.scene.runStatusAnim('psn' as ID, [poke]); break; - } - if (!poke.boosts[stat]) { - poke.boosts[stat] = 0; - } - poke.boosts[stat] += amount; - - let amountString = ''; - if (amount === 2) amountString = ' sharply'; - if (amount >= 3) amountString = ' drastically'; - if (kwargs.silent) { - // do nothing - } else if (kwargs.from) { - let effect = Tools.getEffect(kwargs.from); - let ofpoke = this.getPokemon(kwargs.of); - if (effect.effectType === 'Ability' && !(effect.id === 'weakarmor' && stat === 'spe')) { - this.scene.abilityActivateAnim(ofpoke || poke, effect.name); - this.message('', "[" + (ofpoke || poke).getName(true) + "'s " + effect.name + "!]"); - poke.markAbility(effect.name); - } - switch (effect.id) { - default: - if (effect.effectType === 'Ability') { - actions += "" + poke.getName() + "'s " + BattleStats[stat] + " rose" + amountString + "! "; - } - if (effect.effectType === 'Item') { - actions += "The " + effect.name + amountString + " raised " + poke.getLowerName() + "'s " + BattleStats[stat] + "! "; - } - break; - } - } else if (kwargs.zeffect) { - if (minors.length && minors[0][1].zeffect) { - actions += "" + poke.getName() + " boosted its stats" + amountString + " using its Z-Power! "; - for (let i = 0; i < minors.length; i++) { - minors[i][1].silent = '.'; - } - } else { - actions += "" + poke.getName() + " boosted its " + BattleStats[stat] + amountString + " using its Z-Power! "; - } - } else { - actions += "" + poke.getName() + "'s " + BattleStats[stat] + " rose" + amountString + "! "; - } - this.scene.resultAnim(poke, poke.getBoost(stat), 'good'); - break; - } case '-unboost': { - let poke = this.getPokemon(args[1])!; - let stat = args[2] as BoostStatName; - if (this.gen === 1 && stat === 'spd') break; - if (this.gen === 1 && stat === 'spa') stat = 'spc'; - let amount = parseInt(args[3], 10); - if (amount === 0) { - actions += "" + poke.getName() + "'s " + BattleStats[stat] + " won't go any lower! "; - this.scene.resultAnim(poke, 'Lowest ' + BattleStats[stat], 'bad'); + case 'baddreams': + this.scene.runStatusAnim('cursed' as ID, [poke]); + break; + case 'curse': + this.scene.runStatusAnim('cursed' as ID, [poke]); + break; + case 'confusion': + this.scene.runStatusAnim('confusedselfhit' as ID, [poke]); + break; + case 'leechseed': + this.scene.runOtherAnim('leech' as ID, [ofpoke!, poke]); + break; + case 'bind': + case 'wrap': + this.scene.runOtherAnim('bound' as ID, [poke]); break; } - if (!poke.boosts[stat]) { - poke.boosts[stat] = 0; - } - poke.boosts[stat] -= amount; - - let amountString = ''; - if (amount === 2) amountString = ' harshly'; - if (amount >= 3) amountString = ' severely'; - if (kwargs.silent) { - // do nothing - } else if (kwargs.from) { - let effect = Tools.getEffect(kwargs.from); - let ofpoke = this.getPokemon(kwargs.of); - if (effect.effectType === 'Ability') { - this.scene.abilityActivateAnim(ofpoke || poke, effect.name); - this.message('', "[" + (ofpoke || poke).getName(true) + "'s " + effect.name + "!]"); - poke.markAbility(effect.name); - } - switch (effect.id) { - default: - if (effect.effectType === 'Ability') { - actions += "" + poke.getName() + "'s " + BattleStats[stat] + " fell" + amountString + "! "; - } - if (effect.effectType === 'Item') { - actions += "The " + effect.name + amountString + " lowered " + poke.getLowerName() + "'s " + BattleStats[stat] + "! "; - } - break; - } - } else { - actions += "" + poke.getName() + "'s " + BattleStats[stat] + " fell" + amountString + "! "; - } - this.scene.resultAnim(poke, poke.getBoost(stat), 'bad'); - break; - } case '-setboost': { - let poke = this.getPokemon(args[1])!; - let stat = args[2] as BoostStatName; - let amount = parseInt(args[3], 10); - let effect = Tools.getEffect(kwargs.from); - // let ofpoke = this.getPokemon(kwargs.of); - poke.boosts[stat] = amount; - this.scene.resultAnim(poke, poke.getBoost(stat), (amount > 0 ? 'good' : 'bad')); - - if (kwargs.silent) { - // do nothing - } else if (kwargs.from) { - switch (effect.id) { - case 'bellydrum': - actions += '' + poke.getName() + ' cut its own HP and maximized its Attack!'; - break; - case 'angerpoint': - this.scene.runOtherAnim('anger' as ID, [poke]); - this.scene.abilityActivateAnim(poke, 'Anger Point'); - this.message('', "[" + poke.getName(true) + "'s Anger Point!]"); - poke.markAbility('Anger Point'); - actions += '' + poke.getName() + ' maxed its Attack!'; - break; + } else { + let damageinfo = '' + poke.getFormattedRange(range, damage[1] === 100 ? 0 : 1, '\u2013'); + if (damage[1] !== 100) { + let hover = '' + ((damage[0] < 0) ? '\u2212' : '') + + Math.abs(damage[0]) + '/' + damage[1]; + if (damage[1] === 48) { // this is a hack + hover += ' pixels'; } + // battle-log will convert this into + damageinfo = '||' + hover + '||' + damageinfo + '||'; } - break; - } case '-swapboost': { - let poke = this.getPokemon(args[1])!; - let poke2 = this.getPokemon(args[2])!; - let stats = args[3] ? args[3].split(', ') : ['atk', 'def', 'spa', 'spd', 'spe', 'accuracy', 'evasion']; - let effect = Tools.getEffect(kwargs.from); - for (let i = 0; i < stats.length; i++) { - let tmp = poke.boosts[stats[i]]; - poke.boosts[stats[i]] = poke2.boosts[stats[i]]; - if (!poke.boosts[stats[i]]) delete poke.boosts[stats[i]]; - poke2.boosts[stats[i]] = tmp; - if (!poke2.boosts[stats[i]]) delete poke2.boosts[stats[i]]; + args[3] = damageinfo; + } + this.scene.damageAnim(poke, poke.getFormattedRange(range, 0, ' to ')); + this.log(args, kwArgs); + break; + } + case '-heal': { + let poke = this.getPokemon(args[1])!; + let damage = poke.healthParse(args[2], true, true); + if (damage === null) break; + let range = poke.getDamageRange(damage); + + if (kwArgs.from) { + let effect = Tools.getEffect(kwArgs.from); + let ofpoke = this.getPokemon(kwArgs.of); + this.activateAbility(ofpoke || poke, effect); + if (effect.effectType === 'Item') { + poke.item = effect.name; } - this.scene.resultAnim(poke, 'Stats swapped', 'neutral'); - this.scene.resultAnim(poke2, 'Stats swapped', 'neutral'); - - if (kwargs.silent) { - // do nothing - } else if (effect.id) { - switch (effect.id) { - case 'guardswap': - actions += '' + poke.getName() + ' switched all changes to its Defense and Sp. Def with its target!'; - break; - case 'heartswap': - actions += '' + poke.getName() + ' switched stat changes with its target!'; - break; - case 'powerswap': - actions += '' + poke.getName() + ' switched all changes to its Attack and Sp. Atk with its target!'; - break; + switch (effect.id) { + case 'lunardance': + for (let trackedMove of poke.moveTrack) { + trackedMove[1] = 0; } + // falls through + case 'healingwish': + this.lastMove = 'healing-wish'; + this.scene.runResidualAnim('healingwish' as ID, poke); + poke.side.wisher = null; + break; + case 'wish': + this.scene.runResidualAnim('wish' as ID, poke); + break; } - break; - } case '-clearpositiveboost': { - let poke = this.getPokemon(args[1])!; - let ofpoke = this.getPokemon(args[2]); - let effect = Tools.getEffect(args[3]); - for (const stat in poke.boosts) { - if (poke.boosts[stat] > 0) delete poke.boosts[stat]; - } - this.scene.resultAnim(poke, 'Boosts lost', 'bad'); - - if (kwargs.silent) { - // do nothing - } else if (effect.id) { - switch (effect.id) { - case 'spectralthief': - // todo: update StealBoosts so it animates 1st on Spectral Thief - this.scene.runOtherAnim('spectralthiefboost' as ID, [ofpoke!, poke]); - actions += '' + ofpoke!.getName() + ' stole the target\'s boosted stats!'; - break; + } + this.scene.runOtherAnim('heal' as ID, [poke]); + this.scene.healAnim(poke, poke.getFormattedRange(range, 0, ' to ')); + this.log(args, kwArgs); + break; + } + case '-sethp': { + for (let k = 0; k < 2; k++) { + let cpoke = this.getPokemon(args[1 + 2 * k]); + if (cpoke) { + let damage = cpoke.healthParse(args[2 + 2 * k])!; + let range = cpoke.getDamageRange(damage); + let formattedRange = cpoke.getFormattedRange(range, 0, ' to '); + let diff = damage[0]; + if (diff > 0) { + this.scene.healAnim(cpoke, formattedRange); + } else { + this.scene.damageAnim(cpoke, formattedRange); } } + } + this.log(args, kwArgs); + break; + } + case '-boost': { + let poke = this.getPokemon(args[1])!; + let stat = args[2] as BoostStatName; + if (this.gen === 1 && stat === 'spd') break; + if (this.gen === 1 && stat === 'spa') stat = 'spc'; + let amount = parseInt(args[3], 10); + if (amount === 0) { + this.scene.resultAnim(poke, 'Highest ' + BattleStats[stat], 'neutral'); + this.log(args, kwArgs); break; - } case '-clearnegativeboost': { - let poke = this.getPokemon(args[1])!; - for (const stat in poke.boosts) { - if (poke.boosts[stat] < 0) delete poke.boosts[stat]; - } - this.scene.resultAnim(poke, 'Restored', 'good'); - - if (kwargs.silent) { - // do nothing - } else if (kwargs.zeffect) { - actions += '' + poke.getName() + ' returned its decreased stats to normal using its Z-Power!'; - break; - } - break; - } case '-copyboost': { - let poke = this.getPokemon(args[1])!; - let frompoke = this.getPokemon(args[2])!; - let stats = args[3] ? args[3].split(', ') : ['atk', 'def', 'spa', 'spd', 'spe', 'accuracy', 'evasion']; - // let effect = Tools.getEffect(kwargs.from); - for (let i = 0; i < stats.length; i++) { - poke.boosts[stats[i]] = frompoke.boosts[stats[i]]; - if (!poke.boosts[stats[i]]) delete poke.boosts[stats[i]]; - } - // poke.boosts = {...frompoke.boosts}; + } + if (!poke.boosts[stat]) { + poke.boosts[stat] = 0; + } + poke.boosts[stat] += amount; - if (kwargs.silent) { - // do nothing - } else { - this.scene.resultAnim(poke, 'Stats copied', 'neutral'); - actions += "" + poke.getName() + " copied " + frompoke.getLowerName() + "'s stat changes!"; + if (!kwArgs.silent && kwArgs.from) { + let effect = Tools.getEffect(kwArgs.from); + let ofpoke = this.getPokemon(kwArgs.of); + if (!(effect.id === 'weakarmor' && stat === 'spe')) { + this.activateAbility(ofpoke || poke, effect); } + } + this.scene.resultAnim(poke, poke.getBoost(stat), 'good'); + this.log(args, kwArgs); + break; + } + case '-unboost': { + let poke = this.getPokemon(args[1])!; + let stat = args[2] as BoostStatName; + if (this.gen === 1 && stat === 'spd') break; + if (this.gen === 1 && stat === 'spa') stat = 'spc'; + let amount = parseInt(args[3], 10); + if (amount === 0) { + this.scene.resultAnim(poke, 'Lowest ' + BattleStats[stat], 'bad'); + this.log(args, kwArgs); break; - } case '-clearboost': { - let poke = this.getPokemon(args[1])!; - poke.boosts = {}; - this.scene.resultAnim(poke, 'Stats reset', 'neutral'); + } + if (!poke.boosts[stat]) { + poke.boosts[stat] = 0; + } + poke.boosts[stat] -= amount; - if (kwargs.silent) { - // do nothing - } else { - actions += '' + poke.getName() + '\'s stat changes were removed!'; - } - break; - } case '-invertboost': { - let poke = this.getPokemon(args[1])!; - for (const stat in poke.boosts) { - poke.boosts[stat] = -poke.boosts[stat]; - } - this.scene.resultAnim(poke, 'Stats inverted', 'neutral'); + if (!kwArgs.silent && kwArgs.from) { + let effect = Tools.getEffect(kwArgs.from); + let ofpoke = this.getPokemon(kwArgs.of); + this.activateAbility(ofpoke || poke, effect); + } + this.scene.resultAnim(poke, poke.getBoost(stat), 'bad'); + this.log(args, kwArgs); + break; + } + case '-setboost': { + let poke = this.getPokemon(args[1])!; + let stat = args[2] as BoostStatName; + let amount = parseInt(args[3], 10); + poke.boosts[stat] = amount; + this.scene.resultAnim(poke, poke.getBoost(stat), (amount > 0 ? 'good' : 'bad')); + this.log(args, kwArgs); + break; + } + case '-swapboost': { + let poke = this.getPokemon(args[1])!; + let poke2 = this.getPokemon(args[2])!; + let stats = args[3] ? args[3].split(', ') : ['atk', 'def', 'spa', 'spd', 'spe', 'accuracy', 'evasion']; + let effect = Tools.getEffect(kwArgs.from); + for (let i = 0; i < stats.length; i++) { + let tmp = poke.boosts[stats[i]]; + poke.boosts[stats[i]] = poke2.boosts[stats[i]]; + if (!poke.boosts[stats[i]]) delete poke.boosts[stats[i]]; + poke2.boosts[stats[i]] = tmp; + if (!poke2.boosts[stats[i]]) delete poke2.boosts[stats[i]]; + } + this.scene.resultAnim(poke, 'Stats swapped', 'neutral'); + this.scene.resultAnim(poke2, 'Stats swapped', 'neutral'); - if (kwargs.silent) { - // do nothing - } else { - actions += '' + poke.getName() + '\'s stat changes were inverted!'; - } - break; - } case '-clearallboost': { - for (const side of this.sides) { - for (const active of side.active) { - if (active) { - active.boosts = {}; - this.scene.resultAnim(active, 'Stats reset', 'neutral'); - } - } - } + this.log(args, kwArgs); + break; + } + case '-clearpositiveboost': { + let poke = this.getPokemon(args[1])!; + let ofpoke = this.getPokemon(args[2]); + let effect = Tools.getEffect(args[3]); + for (const stat in poke.boosts) { + if (poke.boosts[stat] > 0) delete poke.boosts[stat]; + } + this.scene.resultAnim(poke, 'Boosts lost', 'bad'); - if (kwargs.silent) { - // do nothing - } else { - actions += 'All stat changes were eliminated!'; + if (effect.id) { + switch (effect.id) { + case 'spectralthief': + // todo: update StealBoosts so it animates 1st on Spectral Thief + this.scene.runOtherAnim('spectralthiefboost' as ID, [ofpoke!, poke]); + break; } - break; + } + this.log(args, kwArgs); + break; + } + case '-clearnegativeboost': { + let poke = this.getPokemon(args[1])!; + for (const stat in poke.boosts) { + if (poke.boosts[stat] < 0) delete poke.boosts[stat]; + } + this.scene.resultAnim(poke, 'Restored', 'good'); - } case '-crit': { - let poke = this.getPokemon(args[1]); - for (let j = 1; !poke && j < 10; j++) poke = this.getPokemon(minors[j][0][1]); - if (poke) this.scene.resultAnim(poke, 'Critical hit', 'bad'); - actions += "A critical hit" + (poke && this.activeMoveIsSpread ? " on " + poke.getLowerName() : "") + "! "; - if (window.Config && Config.server && Config.server.afd && !Config.server.afdCrit) { - actions += '
    Crit mattered? Buy Crit Insurance DLC, yours for only $4.99!
    CLICK HERE!
    '; - Config.server.afdCrit = true; - } - break; + this.log(args, kwArgs); + break; + } + case '-copyboost': { + let poke = this.getPokemon(args[1])!; + let frompoke = this.getPokemon(args[2])!; + let stats = args[3] ? args[3].split(', ') : ['atk', 'def', 'spa', 'spd', 'spe', 'accuracy', 'evasion']; + for (const stat of stats) { + poke.boosts[stat] = frompoke.boosts[stat]; + if (!poke.boosts[stat]) delete poke.boosts[stat]; + } - } case '-supereffective': { - let poke = this.getPokemon(args[1]); - for (let j = 1; !poke && j < 10; j++) poke = this.getPokemon(minors[j][0][1]); - if (poke) { - this.scene.resultAnim(poke, 'Super-effective', 'bad'); - if (window.Config && Config.server && Config.server.afd) { - this.scene.runOtherAnim('hitmark' as ID, [poke]); - } - } - actions += "It's super effective" + (poke && this.activeMoveIsSpread ? " on " + poke.getLowerName() : "") + "! "; - break; + this.log(args, kwArgs); + break; + } + case '-clearboost': { + let poke = this.getPokemon(args[1])!; + poke.boosts = {}; + this.scene.resultAnim(poke, 'Stats reset', 'neutral'); - } case '-resisted': { - let poke = this.getPokemon(args[1]); - for (let j = 1; !poke && j < 10; j++) poke = this.getPokemon(minors[j][0][1]); - if (poke) this.scene.resultAnim(poke, 'Resisted', 'neutral'); - actions += "It's not very effective" + (poke && this.activeMoveIsSpread ? " on " + poke.getLowerName() : "..") + ". "; - break; + this.log(args, kwArgs); + break; + } + case '-invertboost': { + let poke = this.getPokemon(args[1])!; + for (const stat in poke.boosts) { + poke.boosts[stat] = -poke.boosts[stat]; + } + this.scene.resultAnim(poke, 'Stats inverted', 'neutral'); - } case '-immune': { - let poke = this.getPokemon(args[1])!; - let effect = Tools.getEffect(args[2]); - let fromeffect = Tools.getEffect(kwargs.from); - if (fromeffect && fromeffect.effectType === 'Ability') { - let ofpoke = this.getPokemon(kwargs.of) || poke; - this.scene.abilityActivateAnim(ofpoke, fromeffect.name); - this.message('', "[" + ofpoke.getName(true) + "'s " + fromeffect.name + "!]"); - ofpoke.markAbility(fromeffect.name); - } - if (effect.id == 'confusion') { - actions += "" + poke.getName() + " doesn't become confused! "; - } else if (kwargs.msg) { - actions += "It doesn't affect " + poke.getLowerName() + "... "; - } else if (kwargs.ohko) { - actions += "" + poke.getName() + " is unaffected! "; - } else { - actions += "It had no effect! "; + this.log(args, kwArgs); + break; + } + case '-clearallboost': { + for (const side of this.sides) { + for (const active of side.active) { + if (active) { + active.boosts = {}; + this.scene.resultAnim(active, 'Stats reset', 'neutral'); + } } - this.scene.resultAnim(poke, 'Immune', 'neutral'); - break; + } - } case '-miss': { - let user = this.getPokemon(args[1])!; - let target = this.getPokemon(args[2]); - if (target) { - actions += "" + target.getName() + " avoided the attack!"; - this.scene.resultAnim(target, 'Missed', 'neutral'); - } else { - actions += "" + user.getName() + "'s attack missed!"; + this.log(args, kwArgs); + break; + } + case '-crit': { + let poke = this.getPokemon(args[1]); + if (poke) this.scene.resultAnim(poke, 'Critical hit', 'bad'); + if (this.activeMoveIsSpread) kwArgs.spread = '.'; + this.log(args, kwArgs); + break; + } + case '-supereffective': { + let poke = this.getPokemon(args[1]); + if (poke) { + this.scene.resultAnim(poke, 'Super-effective', 'bad'); + if (window.Config && Config.server && Config.server.afd) { + this.scene.runOtherAnim('hitmark' as ID, [poke]); } - break; - - } case '-fail': { - let poke = this.getPokemon(args[1])!; - let effect = Tools.getEffect(args[2]); - let fromeffect = Tools.getEffect(kwargs.from); - let ofpoke = this.getPokemon(kwargs.of); - if (poke) { + } + if (this.activeMoveIsSpread) kwArgs.spread = '.'; + this.log(args, kwArgs); + break; + } + case '-resisted': { + let poke = this.getPokemon(args[1]); + if (poke) this.scene.resultAnim(poke, 'Resisted', 'neutral'); + if (this.activeMoveIsSpread) kwArgs.spread = '.'; + this.log(args, kwArgs); + break; + } + case '-immune': { + let poke = this.getPokemon(args[1])!; + let effect = Tools.getEffect(args[2]); + let fromeffect = Tools.getEffect(kwArgs.from); + this.activateAbility(this.getPokemon(kwArgs.of) || poke, fromeffect); + this.log(args, kwArgs); + this.scene.resultAnim(poke, 'Immune', 'neutral'); + break; + } + case '-miss': { + let target = this.getPokemon(args[2]); + if (target) { + this.scene.resultAnim(target, 'Missed', 'neutral'); + } + this.log(args, kwArgs); + break; + } + case '-fail': { + let poke = this.getPokemon(args[1])!; + let effect = Tools.getEffect(args[2]); + let fromeffect = Tools.getEffect(kwArgs.from); + let ofpoke = this.getPokemon(kwArgs.of); + this.activateAbility(ofpoke || poke, fromeffect); + switch (effect.id) { + case 'brn': + this.scene.resultAnim(poke, 'Already burned', 'neutral'); + break; + case 'tox': + case 'psn': + this.scene.resultAnim(poke, 'Already poisoned', 'neutral'); + break; + case 'slp': + if (fromeffect.id === 'uproar') { this.scene.resultAnim(poke, 'Failed', 'neutral'); - } - // Sky Drop blocking moves takes priority over all other moves - if (fromeffect.id === 'skydrop') { - actions += "Sky Drop won't let " + poke.getLowerName() + " go!"; - break; - } - switch (effect.id) { - case 'brn': - this.scene.resultAnim(poke, 'Already burned', 'neutral'); - actions += "" + poke.getName() + " already has a burn."; - break; - case 'tox': - case 'psn': - this.scene.resultAnim(poke, 'Already poisoned', 'neutral'); - actions += "" + poke.getName() + " is already poisoned."; - break; - case 'slp': - if (fromeffect.id === 'uproar') { - this.scene.resultAnim(poke, 'Failed', 'neutral'); - if (kwargs.msg) { - actions += "But " + poke.getLowerName() + " can't sleep in an uproar!"; - } else { - actions += "But the uproar kept " + poke.getLowerName() + " awake!"; - } - } else { - this.scene.resultAnim(poke, 'Already asleep', 'neutral'); - actions += "" + poke.getName() + " is already asleep!"; - } - break; - case 'par': - this.scene.resultAnim(poke, 'Already paralyzed', 'neutral'); - actions += "" + poke.getName() + " is already paralyzed."; - break; - case 'frz': - this.scene.resultAnim(poke, 'Already frozen', 'neutral'); - actions += "" + poke.getName() + " is already frozen solid!"; - break; - case 'darkvoid': - case 'hyperspacefury': - if (kwargs.forme) { - actions += 'But ' + poke.getLowerName() + ' can\'t use it the way it is now!'; - } else { - actions += 'But ' + poke.getLowerName() + ' can\'t use the move!'; - } - break; - case 'magikarpsrevenge': - actions += 'But ' + poke.getLowerName() + ' can\'t use the move!'; - break; - case 'substitute': - if (kwargs.weak) { - actions += "But it does not have enough HP left to make a substitute!"; - } else { - actions += '' + poke.getName() + ' already has a substitute!'; - } - break; - case 'skydrop': - if (kwargs.heavy) { - actions += '' + poke.getName() + ' is too heavy to be lifted!'; - } else { - actions += "But it failed!"; - } - break; - case 'sunnyday': - case 'raindance': - case 'sandstorm': - case 'hail': - switch (fromeffect.id) { - case 'desolateland': - actions += "The extremely harsh sunlight was not lessened at all!"; - break; - case 'primordialsea': - actions += "There is no relief from this heavy rain!"; - break; - case 'deltastream': - actions += "The mysterious strong winds blow on regardless!"; - break; - default: - actions += "But it failed!"; - } - break; - case 'unboost': - if (fromeffect.effectType === 'Ability') { - this.scene.abilityActivateAnim(poke, fromeffect.name); - this.message('', "[" + poke.getName(true) + "'s " + fromeffect.name + "!]"); - poke.markAbility(fromeffect.name); - } else { - this.scene.resultAnim(poke, 'Stat drop blocked', 'neutral'); - } - switch (fromeffect.id) { - case 'flowerveil': - actions += '' + ofpoke!.getName() + ' surrounded itself with a veil of petals!'; - break; - default: - let stat = BattleLog.escapeHTML(args[3]); - actions += "" + poke.getName() + "'s " + (stat ? stat + " was" : "stats were") + " not lowered!"; - } - break; - default: - switch (fromeffect.id) { - case 'desolateland': - actions += "The Water-type attack evaporated in the harsh sunlight!"; - break; - case 'primordialsea': - actions += "The Fire-type attack fizzled out in the heavy rain!"; - break; - default: - actions += "But it failed!"; - } - break; - } - break; - - } case '-notarget': { - if (this.gen >= 5) { - actions += "But it failed!"; } else { - actions += "But there was no target..."; + this.scene.resultAnim(poke, 'Already asleep', 'neutral'); } break; - - } case '-ohko': { - actions += "It's a one-hit KO!"; + case 'par': + this.scene.resultAnim(poke, 'Already paralyzed', 'neutral'); break; - - } case '-hitcount': { - let hits = parseInt(args[2], 10); - actions += 'Hit ' + hits + (hits > 1 ? ' times!' : ' time!'); + case 'frz': + this.scene.resultAnim(poke, 'Already frozen', 'neutral'); break; - - } case '-nothing': { - actions += "But nothing happened! "; + case 'unboost': + this.scene.resultAnim(poke, 'Stat drop blocked', 'neutral'); break; - - } case '-waiting': { - let poke = this.getPokemon(args[1])!; - let ofpoke = this.getPokemon(args[2])!; - actions += "" + poke.getName() + " is waiting for " + ofpoke.getLowerName() + "'s move..."; + default: + if (poke) { + this.scene.resultAnim(poke, 'Failed', 'neutral'); + } break; + } + this.log(args, kwArgs); + break; + } + case '-center': case '-notarget': case '-ohko': case '-nothing': + case '-combine': case '-hitcount': case '-waiting': case '-zbroken': { + this.log(args, kwArgs); + break; + } + case '-zpower': { + let poke = this.getPokemon(args[1])!; + this.scene.runOtherAnim('zpower' as ID, [poke]); + this.log(args, kwArgs); + break; + } + case '-prepare': { + let poke = this.getPokemon(args[1])!; + let moveid = toId(args[2]); + let target = this.getPokemon(args[3]) || poke.side.foe.active[0] || poke; + this.scene.runPrepareAnim(moveid, poke, target); + this.log(args, kwArgs); + break; + } + case '-mustrecharge': { + let poke = this.getPokemon(args[1])!; + poke.addMovestatus('mustrecharge' as ID); + this.scene.updateStatbar(poke); + break; + } + case '-status': { + let poke = this.getPokemon(args[1])!; + let effect = Tools.getEffect(kwArgs.from); + let ofpoke = this.getPokemon(kwArgs.of) || poke; + poke.status = args[2] as StatusName; + poke.removeVolatile('yawn' as ID); + this.activateAbility(ofpoke || poke, effect); + if (effect.effectType === 'Item') { + ofpoke.item = effect.name; + } - } case '-combine': { - actions += "The two moves have become one! It's a combined move!"; + switch (args[2]) { + case 'brn': + this.scene.resultAnim(poke, 'Burned', 'brn'); + this.scene.runStatusAnim('brn' as ID, [poke]); break; - - } case '-zpower': { - if (!this.hasPreMoveMessage && this.waitForResult()) return; - let poke = this.getPokemon(args[1])!; - this.scene.runOtherAnim('zpower' as ID, [poke]); - actions += "" + poke.getName() + " surrounded itself with its Z-Power! "; - this.hasPreMoveMessage = true; + case 'tox': + this.scene.resultAnim(poke, 'Toxic poison', 'psn'); + this.scene.runStatusAnim('psn' as ID, [poke]); + poke.statusData.toxicTurns = (effect.name === "Toxic Orb" ? -1 : 0); break; - - } case '-zbroken': { - let poke = this.getPokemon(args[1])!; - actions += "" + poke.getName() + " couldn't fully protect itself and got hurt!"; + case 'psn': + this.scene.resultAnim(poke, 'Poisoned', 'psn'); + this.scene.runStatusAnim('psn' as ID, [poke]); break; - - } case '-prepare': { - let poke = this.getPokemon(args[1])!; - let moveid = toId(args[2]); - let target = this.getPokemon(args[3]) || poke.side.foe.active[0] || poke; - this.scene.runPrepareAnim(moveid, poke, target); + case 'slp': + this.scene.resultAnim(poke, 'Asleep', 'slp'); + if (effect.id === 'rest') { + poke.statusData.sleepTurns = 0; // for Gen 2 use through Sleep Talk + } break; - - } case '-mustrecharge': { - let poke = this.getPokemon(args[1])!; - poke.addMovestatus('mustrecharge' as ID); + case 'par': + this.scene.resultAnim(poke, 'Paralyzed', 'par'); + this.scene.runStatusAnim('par' as ID, [poke]); + break; + case 'frz': + this.scene.resultAnim(poke, 'Frozen', 'frz'); + this.scene.runStatusAnim('frz' as ID, [poke]); + break; + default: this.scene.updateStatbar(poke); break; + } + this.log(args, kwArgs); + break; + } + case '-curestatus': { + let poke = this.getPokemon(args[1])!; + let effect = Tools.getEffect(kwArgs.from); - } case '-status': { - let poke = this.getPokemon(args[1])!; - let effect = Tools.getEffect(kwargs.from); - let ofpoke = this.getPokemon(kwargs.of) || poke; - poke.status = args[2] as StatusName; - poke.removeVolatile('yawn' as ID); - let effectMessage = ""; - if (effect.effectType === 'Ability') { - this.scene.abilityActivateAnim(ofpoke, effect.name); - this.message('', "[" + ofpoke.getName(true) + "'s " + effect.name + "!]"); - ofpoke.markAbility(effect.name); - } else if (effect.effectType === 'Item') { - ofpoke.item = effect.name; - effectMessage = " by the " + effect.name; + if (effect.id) { + switch (effect.id) { + case 'flamewheel': + case 'flareblitz': + case 'fusionflare': + case 'sacredfire': + case 'scald': + case 'steameruption': + kwArgs.thaw = '.'; + break; } - + } + if (poke) { + poke.status = ''; switch (args[2]) { case 'brn': - this.scene.resultAnim(poke, 'Burned', 'brn'); - this.scene.runStatusAnim('brn' as ID, [poke]); - actions += "" + poke.getName() + " was burned" + effectMessage + "!"; + this.scene.resultAnim(poke, 'Burn cured', 'good'); break; case 'tox': - this.scene.resultAnim(poke, 'Toxic poison', 'psn'); - this.scene.runStatusAnim('psn' as ID, [poke]); - poke.statusData.toxicTurns = (effect.name === "Toxic Orb" ? -1 : 0); - actions += "" + poke.getName() + " was badly poisoned" + effectMessage + "!"; - break; case 'psn': - this.scene.resultAnim(poke, 'Poisoned', 'psn'); - this.scene.runStatusAnim('psn' as ID, [poke]); - actions += "" + poke.getName() + " was poisoned!"; + poke.statusData.toxicTurns = 0; + this.scene.resultAnim(poke, 'Poison cured', 'good'); break; case 'slp': - this.scene.resultAnim(poke, 'Asleep', 'slp'); - if (effect.id === 'rest') { - poke.statusData.sleepTurns = 0; // for Gen 2 use through Sleep Talk - actions += '' + poke.getName() + ' slept and became healthy!'; - } else { - actions += "" + poke.getName() + " fell asleep!"; - } + this.scene.resultAnim(poke, 'Woke up', 'good'); + poke.statusData.sleepTurns = 0; break; case 'par': - this.scene.resultAnim(poke, 'Paralyzed', 'par'); - this.scene.runStatusAnim('par' as ID, [poke]); - actions += "" + poke.getName() + " is paralyzed! It may be unable to move!"; + this.scene.resultAnim(poke, 'Paralysis cured', 'good'); break; case 'frz': - this.scene.resultAnim(poke, 'Frozen', 'frz'); - this.scene.runStatusAnim('frz' as ID, [poke]); - actions += "" + poke.getName() + " was frozen solid!"; + this.scene.resultAnim(poke, 'Thawed', 'good'); break; default: - this.scene.updateStatbar(poke); - break; - } - break; - - } case '-curestatus': { - let poke = this.getPokemon(args[1])!; - let effect = Tools.getEffect(kwargs.from); - let ofpoke = this.getPokemon(kwargs.of); - let pokeName, pokeSideN; - if (poke) { - poke.status = ''; - pokeName = poke.getName(); - pokeSideN = poke.side.n; - } else { - let parseIdResult = this.parsePokemonId(args[1]); - pokeName = parseIdResult.name; - pokeSideN = parseIdResult.siden; - } - if (args[2] === 'slp') poke.statusData.sleepTurns = 0; - if (effect.id === 'naturalcure' && !this.hasPreMoveMessage && this.waitForResult()) return; - - if (kwargs.silent) { - // do nothing - } else if (effect.id) { - switch (effect.id) { - case 'psychoshift': - actions += '' + pokeName + ' moved its status onto ' + ofpoke!.getLowerName() + '!'; - if (poke) this.scene.resultAnim(poke, 'Cured', 'good'); - break; - case 'flamewheel': - case 'flareblitz': - case 'fusionflare': - case 'sacredfire': - case 'scald': - case 'steameruption': - if (poke) this.scene.resultAnim(poke, 'Thawed', 'good'); - actions += "" + pokeName + "'s " + effect.name + " melted the ice!"; - break; - case 'naturalcure': - actions += "(" + pokeName + "'s Natural Cure activated!)"; - if (poke) poke.markAbility('Natural Cure'); - this.hasPreMoveMessage = true; - break; - default: - if (poke) this.scene.resultAnim(poke, 'Cured', 'good'); - actions += "" + pokeName + "'s " + effect.name + " heals its status!"; - break; - } - } else { - switch (args[2]) { - case 'brn': - if (poke) this.scene.resultAnim(poke, 'Burn cured', 'good'); - if (effect.effectType === 'Item') { - actions += "" + pokeName + "'s " + effect.name + " healed its burn!"; - break; - } - if (pokeSideN === 0) actions += "" + pokeName + "'s burn was healed."; - else actions += "" + pokeName + " healed its burn!"; - break; - case 'tox': - case 'psn': - if (poke) poke.statusData.toxicTurns = 0; - if (poke) this.scene.resultAnim(poke, 'Poison cured', 'good'); - if (effect.effectType === 'Item') { - actions += "" + pokeName + "'s " + effect.name + " cured its poison!"; - break; - } - actions += "" + pokeName + " was cured of its poisoning."; - break; - case 'slp': - if (poke) this.scene.resultAnim(poke, 'Woke up', 'good'); - if (poke) poke.statusData.sleepTurns = 0; - if (effect.effectType === 'Item') { - actions += "" + pokeName + "'s " + effect.name + " woke it up!"; - break; - } - actions += "" + pokeName + " woke up!"; - break; - case 'par': - if (poke) this.scene.resultAnim(poke, 'Paralysis cured', 'good'); - if (effect.effectType === 'Item') { - actions += "" + pokeName + "'s " + effect.name + " cured its paralysis!"; - break; - } - actions += "" + pokeName + " was cured of paralysis."; - break; - case 'frz': - if (poke) this.scene.resultAnim(poke, 'Thawed', 'good'); - if (effect.effectType === 'Item') { - actions += "" + pokeName + "'s " + effect.name + " defrosted it!"; - break; - } - actions += "" + pokeName + " thawed out!"; - break; - default: - if (poke) poke.removeVolatile('confusion' as ID); - if (poke) this.scene.resultAnim(poke, 'Cured', 'good'); - actions += "" + pokeName + "'s status cleared!"; - } + poke.removeVolatile('confusion' as ID); + this.scene.resultAnim(poke, 'Cured', 'good'); } - break; + } + this.log(args, kwArgs); + break; - } case '-cureteam': { // For old gens when the whole team was always cured - let poke = this.getPokemon(args[1])!; - for (const target of poke.side.pokemon) { - target.status = ''; - this.scene.updateStatbarIfExists(target); - } + } + case '-cureteam': { // For old gens when the whole team was always cured + let poke = this.getPokemon(args[1])!; + for (const target of poke.side.pokemon) { + target.status = ''; + this.scene.updateStatbarIfExists(target); + } - this.scene.resultAnim(poke, 'Team Cured', 'good'); - let effect = Tools.getEffect(kwargs.from); + this.scene.resultAnim(poke, 'Team Cured', 'good'); + this.log(args, kwArgs); + break; + } + case '-item': { + let poke = this.getPokemon(args[1])!; + let item = Tools.getItem(args[2]); + let effect = Tools.getEffect(kwArgs.from); + let ofpoke = this.getPokemon(kwArgs.of); + poke.item = item.name; + poke.itemEffect = ''; + poke.removeVolatile('airballoon' as ID); + if (item.id === 'airballoon') poke.addVolatile('airballoon' as ID); + + if (effect.id) { switch (effect.id) { - case 'aromatherapy': - actions += 'A soothing aroma wafted through the area!'; + case 'pickup': + this.activateAbility(poke, "Pickup"); + // falls through + case 'recycle': + poke.itemEffect = 'found'; + this.scene.resultAnim(poke, item.name, 'neutral'); + break; + case 'frisk': + this.activateAbility(ofpoke!, "Frisk"); + if (poke && poke !== ofpoke) { // used for gen 6 + poke.itemEffect = 'frisked'; + this.scene.resultAnim(poke, item.name, 'neutral'); + } break; - case 'healbell': - actions += 'A bell chimed!'; + case 'magician': + case 'pickpocket': + this.activateAbility(poke, effect.name); + // falls through + case 'thief': + case 'covet': + // simulate the removal of the item from the ofpoke + ofpoke!.item = ''; + ofpoke!.itemEffect = ''; + ofpoke!.prevItem = item.name; + ofpoke!.prevItemEffect = 'stolen'; + ofpoke!.addVolatile('itemremoved' as ID); + poke.itemEffect = 'stolen'; + this.scene.resultAnim(poke, item.name, 'neutral'); + this.scene.resultAnim(ofpoke!, 'Item Stolen', 'bad'); + break; + case 'harvest': + poke.itemEffect = 'harvested'; + this.activateAbility(poke, "Harvest"); + this.scene.resultAnim(poke, item.name, 'neutral'); + break; + case 'bestow': + poke.itemEffect = 'bestowed'; + this.scene.resultAnim(poke, item.name, 'neutral'); break; + case 'trick': + poke.itemEffect = 'tricked'; + // falls through default: - actions += "" + poke.getName() + "'s team was cured!"; break; } - break; - - } case '-item': { - let poke = this.getPokemon(args[1])!; - let item = Tools.getItem(args[2]); - let effect = Tools.getEffect(kwargs.from); - let ofpoke = this.getPokemon(kwargs.of); - poke.item = item.name; - poke.itemEffect = ''; - poke.removeVolatile('airballoon' as ID); - if (item.id === 'airballoon') poke.addVolatile('airballoon' as ID); - - if (effect.id) { - switch (effect.id) { - case 'pickup': - this.scene.abilityActivateAnim(poke, 'Pickup'); - this.message('', "[" + poke.getName(true) + "'s Pickup!]"); - poke.markAbility('Pickup'); - // falls through - case 'recycle': - poke.itemEffect = 'found'; - actions += '' + poke.getName() + ' found one ' + item.name + '!'; - this.scene.resultAnim(poke, item.name, 'neutral'); - break; - case 'frisk': - this.scene.abilityActivateAnim(ofpoke!, 'Frisk'); - this.message('', "[" + ofpoke!.getName(true) + "'s Frisk!]"); - ofpoke!.markAbility('Frisk'); - if (kwargs.identify) { // used for gen 6 - poke.itemEffect = 'frisked'; - actions += '' + ofpoke!.getName() + ' frisked ' + poke.getLowerName() + ' and found its ' + item.name + '!'; - this.scene.resultAnim(poke, item.name, 'neutral'); - } else { - actions += '' + ofpoke!.getName() + ' frisked its target and found one ' + item.name + '!'; - } - break; - case 'magician': - case 'pickpocket': - this.scene.abilityActivateAnim(poke, effect.name); - this.message('', "[" + poke.getName(true) + "'s " + effect.name + "!]"); - poke.markAbility(effect.name); - // falls through - case 'thief': - case 'covet': - // simulate the removal of the item from the ofpoke - ofpoke!.item = ''; - ofpoke!.itemEffect = ''; - ofpoke!.prevItem = item.name; - ofpoke!.prevItemEffect = 'stolen'; - ofpoke!.addVolatile('itemremoved' as ID); - poke.itemEffect = 'stolen'; - actions += '' + poke.getName() + ' stole ' + ofpoke!.getLowerName() + "'s " + item.name + "!"; - this.scene.resultAnim(poke, item.name, 'neutral'); - this.scene.resultAnim(ofpoke!, 'Item Stolen', 'bad'); - break; - case 'harvest': - poke.itemEffect = 'harvested'; - this.scene.abilityActivateAnim(poke, 'Harvest'); - this.message('', "[" + poke.getName(true) + "'s Harvest!]"); - poke.markAbility('Harvest'); - actions += '' + poke.getName() + ' harvested one ' + item.name + '!'; - this.scene.resultAnim(poke, item.name, 'neutral'); - break; - case 'bestow': - poke.itemEffect = 'bestowed'; - actions += '' + poke.getName() + ' received ' + item.name + ' from ' + ofpoke!.getLowerName() + '!'; - this.scene.resultAnim(poke, item.name, 'neutral'); - break; - case 'trick': - poke.itemEffect = 'tricked'; - // falls through - default: - actions += '' + poke.getName() + ' obtained one ' + item.name + '.'; - this.scene.resultAnim(poke, item.name, 'neutral'); - break; - } - } else { - switch (item.id) { - case 'airballoon': - this.scene.resultAnim(poke, 'Balloon', 'good'); - actions += "" + poke.getName() + " floats in the air with its Air Balloon!"; - break; - default: - actions += "" + poke.getName() + " has " + item.name + "!"; - break; - } - } - break; - - } case '-enditem': { - let poke = this.getPokemon(args[1])!; - let item = Tools.getItem(args[2]); - let effect = Tools.getEffect(kwargs.from); - let ofpoke = this.getPokemon(kwargs.of); - poke.item = ''; - poke.itemEffect = ''; - poke.prevItem = item.name; - poke.prevItemEffect = ''; - poke.removeVolatile('airballoon' as ID); - poke.addVolatile('itemremoved' as ID); - if (kwargs.silent) { - // do nothing - } else if (kwargs.eat) { - poke.prevItemEffect = 'eaten'; - this.scene.runOtherAnim('consume' as ID, [poke]); - actions += '' + poke.getName() + ' ate its ' + item.name + '!'; - this.lastMove = item.id; - } else if (kwargs.weaken) { - poke.prevItemEffect = 'eaten'; - actions += 'The ' + item.name + ' weakened the damage to ' + poke.getLowerName() + '!'; - this.lastMove = item.id; - } else if (effect.id) { - switch (effect.id) { - case 'fling': - poke.prevItemEffect = 'flung'; - actions += "" + poke.getName() + ' flung its ' + item.name + '!'; - break; - case 'knockoff': - poke.prevItemEffect = 'knocked off'; - actions += '' + ofpoke!.getName() + ' knocked off ' + poke.getLowerName() + '\'s ' + item.name + '!'; - this.scene.runOtherAnim('itemoff' as ID, [poke]); - this.scene.resultAnim(poke, 'Item knocked off', 'neutral'); - break; - case 'stealeat': - poke.prevItemEffect = 'stolen'; - actions += '' + ofpoke!.getName() + ' stole and ate its target\'s ' + item.name + '!'; - break; - case 'gem': - poke.prevItemEffect = 'consumed'; - actions += 'The ' + item.name + ' strengthened ' + Tools.getMove(kwargs.move).name + '\'s power!'; - break; - case 'incinerate': - poke.prevItemEffect = 'incinerated'; - actions += "" + poke.getName() + "'s " + item.name + " was burned up!"; - break; - default: - actions += "" + poke.getName() + ' lost its ' + item.name + '!'; - break; - } - } else { - switch (item.id) { - case 'airballoon': - poke.prevItemEffect = 'popped'; - poke.removeVolatile('airballoon' as ID); - this.scene.resultAnim(poke, 'Balloon popped', 'neutral'); - actions += "" + poke.getName() + "'s Air Balloon popped!"; - break; - case 'focussash': - poke.prevItemEffect = 'consumed'; - this.scene.resultAnim(poke, 'Sash', 'neutral'); - actions += "" + poke.getName() + ' hung on using its Focus Sash!'; - break; - case 'focusband': - this.scene.resultAnim(poke, 'Focus Band', 'neutral'); - actions += "" + poke.getName() + ' hung on using its Focus Band!'; - break; - case 'powerherb': - poke.prevItemEffect = 'consumed'; - actions += "" + poke.getName() + " became fully charged due to its Power Herb!"; - break; - case 'whiteherb': - poke.prevItemEffect = 'consumed'; - actions += "" + poke.getName() + " returned its status to normal using its White Herb!"; - break; - case 'ejectbutton': - poke.prevItemEffect = 'consumed'; - actions += "" + poke.getName() + " is switched out with the Eject Button!"; - break; - case 'redcard': - poke.prevItemEffect = 'held up'; - actions += "" + poke.getName() + " held up its Red Card against " + ofpoke!.getLowerName() + "!"; - break; - default: - poke.prevItemEffect = 'consumed'; - actions += "" + poke.getName() + "'s " + item.name + " activated!"; - break; - } - } - break; - - } case '-ability': { - let poke = this.getPokemon(args[1])!; - let ability = Tools.getAbility(args[2]); - let effect = Tools.getEffect(kwargs.from); - let ofpoke = this.getPokemon(kwargs.of); - poke.markAbility(ability.name, effect.id && !kwargs.fail); - - if (kwargs.silent) { - // do nothing - } else if (effect.id) { - switch (effect.id) { - case 'trace': - this.scene.abilityActivateAnim(poke, "Trace"); - this.scene.wait(500); - this.scene.abilityActivateAnim(poke, ability.name); - this.message('', "[" + poke.getName(true) + "'s Trace!]"); - if (!poke.baseAbility) poke.baseAbility = effect.name; - ofpoke!.markAbility(ability.name); - actions += '' + poke.getName() + ' traced ' + ofpoke!.getLowerName() + '\'s ' + ability.name + '!'; - break; - case 'powerofalchemy': - case 'receiver': - this.scene.abilityActivateAnim(poke, effect.name); - this.scene.wait(500); - this.scene.abilityActivateAnim(poke, ability.name); - this.message('', "[" + poke.getName(true) + "'s " + effect.name + "!]"); - if (!poke.baseAbility) poke.baseAbility = effect.name; - actions += '' + ofpoke!.getName() + '\'s ' + ability.name + ' was taken over!'; - break; - case 'roleplay': - this.scene.abilityActivateAnim(poke, ability.name); - actions += '' + poke.getName() + ' copied ' + ofpoke!.getLowerName() + '\'s ' + ability.name + ' Ability!'; - ofpoke!.markAbility(ability.name); - break; - case 'desolateland': - if (kwargs.fail) { - this.scene.abilityActivateAnim(poke, ability.name); - this.message('', "[" + poke.getName(true) + "'s " + ability.name + "!]"); - actions += "The extremely harsh sunlight was not lessened at all!"; - } - break; - case 'primordialsea': - if (kwargs.fail) { - this.scene.abilityActivateAnim(poke, ability.name); - this.message('', "[" + poke.getName(true) + "'s " + ability.name + "!]"); - actions += "There's no relief from this heavy rain!"; - } - break; - case 'deltastream': - if (kwargs.fail) { - this.scene.abilityActivateAnim(poke, ability.name); - this.message('', "[" + poke.getName(true) + "'s " + ability.name + "!]"); - actions += "The mysterious strong winds blow on regardless!"; - } - break; - default: - this.scene.abilityActivateAnim(poke, ability.name); - actions += "" + poke.getName() + " acquired " + ability.name + "!"; - break; - } - } else { - this.scene.abilityActivateAnim(poke, ability.name); - this.message('', "[" + poke.getName(true) + "'s " + ability.name + "!]"); - switch (ability.id) { - case 'airlock': - case 'cloudnine': - actions += "The effects of the weather disappeared."; - break; - case 'anticipation': - actions += "" + poke.getName() + " shuddered!"; - break; - case 'aurabreak': - actions += "" + poke.getName() + " reversed all other Pokémon's auras!"; - break; - case 'comatose': - actions += "" + poke.getName() + " is drowsing!"; - break; - case 'darkaura': - actions += "" + poke.getName() + " is radiating a dark aura!"; - break; - case 'fairyaura': - actions += "" + poke.getName() + " is radiating a fairy aura!"; - break; - case 'moldbreaker': - actions += "" + poke.getName() + " breaks the mold!"; - break; - case 'pressure': - actions += "" + poke.getName() + " is exerting its pressure!"; - break; - case 'sturdy': - actions += "" + poke.getName() + " endured the hit!"; - break; - case 'teravolt': - actions += "" + poke.getName() + " is radiating a bursting aura!"; - break; - case 'turboblaze': - actions += "" + poke.getName() + " is radiating a blazing aura!"; - break; - case 'unnerve': - actions += "" + this.getSide(args[3]).getTeamName() + " is too nervous to eat Berries!"; - break; - default: - // Do nothing - } - } - break; - - } case '-endability': { - let poke = this.getPokemon(args[1])!; - let ability = Tools.getAbility(args[2]); - // let effect = Tools.getEffect(kwargs.from); - poke.ability = '(suppressed)'; - - if (kwargs.silent) { - // do nothing - } else if (ability.exists) { - actions += "(" + poke.getName() + "'s " + ability.name + " was removed.)"; - this.scene.resultAnim(poke, ability.name + ' removed', 'bad'); - if (!poke.baseAbility) poke.baseAbility = ability.name; - } else { - actions += "" + poke.getName() + "\'s Ability was suppressed!"; - } - break; - - } case '-transform': { - let poke = this.getPokemon(args[1])!; - let tpoke = this.getPokemon(args[2])!; - let effect = Tools.getEffect(kwargs.from); - - if (!kwargs.silent && effect.effectType === 'Ability') { - this.scene.abilityActivateAnim(poke, effect.name); - this.message('', "[" + poke.getName(true) + "'s " + effect.name + "!]"); - poke.markAbility(effect.name); - } - - actions += '' + poke.getName() + ' transformed into ' + tpoke.species + '!'; - poke.boosts = {...tpoke.boosts}; - poke.copyTypesFrom(tpoke); - poke.weightkg = tpoke.weightkg; - poke.ability = tpoke.ability; - const species = (tpoke.volatiles.formechange ? tpoke.volatiles.formechange[1] : tpoke.species); - const pokemon = tpoke; - const shiny = tpoke.shiny; - const gender = tpoke.gender; - poke.addVolatile('transform' as ID, pokemon, shiny, gender); - poke.addVolatile('formechange' as ID, species); - for (const trackedMove of tpoke.moveTrack) { - poke.markMove(trackedMove[0], 0); - } - this.scene.animTransform(poke); - this.scene.resultAnim(poke, 'Transformed', 'good'); - break; - } case '-formechange': { - let poke = this.getPokemon(args[1])!; - let template = Tools.getTemplate(args[2]); - let fromeffect = Tools.getEffect(kwargs.from); - let isCustomAnim = false; - poke.removeVolatile('typeadd' as ID); - poke.removeVolatile('typechange' as ID); - if (this.gen >= 7) poke.removeVolatile('autotomize' as ID); - - if (kwargs.silent) { - // do nothing - } else { - if (fromeffect.effectType === 'Ability') { - this.scene.abilityActivateAnim(poke, fromeffect.name); - this.message('', "[" + poke.getName(true) + "'s " + fromeffect.name + "!]"); - poke.markAbility(fromeffect.name); - } - if (kwargs.msg) { - actions += "" + poke.getName() + " transformed!"; - if (toId(template.species) === 'shaymin') break; - } else if (toId(template.species) === 'darmanitanzen') { - actions += "Zen Mode triggered!"; - } else if (toId(template.species) === 'darmanitan') { - actions += "Zen Mode ended!"; - } else if (toId(template.species) === 'aegislashblade') { - actions += "Changed to Blade Forme!"; - } else if (toId(template.species) === 'aegislash') { - actions += "Changed to Shield Forme!"; - } else if (toId(template.species) === 'wishiwashischool') { - actions += "" + poke.getName() + " formed a school!"; - isCustomAnim = true; - } else if (toId(template.species) === 'wishiwashi') { - actions += "" + poke.getName() + " stopped schooling!"; - isCustomAnim = true; - } else if (toId(template.species) === 'miniormeteor') { - actions += "Shields Down deactivated!"; - } else if (toId(template.species) === 'minior') { - actions += "Shields Down activated!"; - } - } - poke.addVolatile('formechange' as ID, template.species); // the formechange volatile reminds us to revert the sprite change on switch-out - this.scene.animTransform(poke, isCustomAnim); - break; - } case '-mega': { - let poke = this.getPokemon(args[1])!; - let item = Tools.getItem(args[3]); - if (args[2] === 'Rayquaza') { - actions += "" + BattleLog.escapeHTML(poke.side.name) + "'s fervent wish has reached " + poke.getLowerName() + "!"; - } else { - poke.item = item.name; - actions += "" + poke.getName() + "'s " + item.name + " is reacting to " + (this.gen >= 7 ? "the Key Stone" : BattleLog.escapeHTML(poke.side.name) + "'s Mega Bracelet") + "!"; - } - actions += "
    " + poke.getName() + " has Mega Evolved into Mega " + args[2] + "!"; - break; - } case '-primal': { - let poke = this.getPokemon(args[1])!; - actions += "" + poke.getName() + "'s Primal Reversion! It reverted to its primal state!"; - break; - } case '-burst': { - let poke = this.getPokemon(args[1])!; - actions += "Bright light is about to burst out of " + poke.getLowerName() + "!"; - break; - - } case '-start': { - let poke = this.getPokemon(args[1])!; - let effect = Tools.getEffect(args[2]); - let ofpoke = this.getPokemon(kwargs.of); - let fromeffect = Tools.getEffect(kwargs.from); - if (fromeffect.id === 'protean' && !this.hasPreMoveMessage && this.waitForResult()) return; - - if (effect.effectType === 'Ability') { - this.scene.abilityActivateAnim(poke, effect.name); - this.message('', "[" + poke.getName(true) + "'s " + effect.name + "!]"); - poke.markAbility(effect.name); - } - if (kwargs.silent && effect.id !== 'typechange' && effect.id !== 'typeadd') { - // do nothing - } else { - switch (effect.id) { - case 'typechange': - const types = BattleLog.escapeHTML(args[3]); - poke.removeVolatile('typeadd' as ID); - poke.addVolatile('typechange' as ID, types); - if (kwargs.silent) { - this.scene.updateStatbar(poke); - break; - } - if (fromeffect.id) { - if (fromeffect.id === 'colorchange' || fromeffect.id === 'protean') { - this.scene.abilityActivateAnim(poke, fromeffect.name); - this.message('', "[" + poke.getName(true) + "'s " + fromeffect.name + "!]"); - poke.markAbility(fromeffect.name); - actions += "" + poke.getName() + " transformed into the " + types + " type!"; - this.hasPreMoveMessage = true; - } else if (fromeffect.id === 'reflecttype') { - poke.copyTypesFrom(ofpoke!); - if (!kwargs.silent) actions += "" + poke.getName() + "'s type became the same as " + ofpoke!.getLowerName() + "'s type!"; - } else if (fromeffect.id === 'burnup') { - actions += "" + poke.getName() + " burned itself out!"; - } else if (!kwargs.silent) { - actions += "" + poke.getName() + "'s " + fromeffect.name + " made it the " + types + " type!"; - } - } else { - actions += "" + poke.getName() + " transformed into the " + types + " type!"; - } - this.scene.resultAnim(poke, types.split('/').map(function (type) { - return '' + type + ''; - }).join(' '), 'neutral'); - break; - case 'typeadd': - const type = BattleLog.escapeHTML(args[3]); - poke.addVolatile('typeadd' as ID, type); - if (kwargs.silent) break; - actions += "" + type + " type was added to " + poke.getLowerName() + "!"; - this.scene.resultAnim(poke, '' + type + '', 'neutral'); - break; - case 'powertrick': - this.scene.resultAnim(poke, 'Power Trick', 'neutral'); - actions += "" + poke.getName() + " switched its Attack and Defense!"; - break; - case 'foresight': - case 'miracleeye': - this.scene.resultAnim(poke, 'Identified', 'bad'); - actions += "" + poke.getName() + " was identified!"; - break; - case 'telekinesis': - this.scene.resultAnim(poke, 'Telekinesis', 'neutral'); - actions += "" + poke.getName() + " was hurled into the air!"; - break; - case 'confusion': - if (kwargs.already) { - actions += "" + poke.getName() + " is already confused!"; - } else { - this.scene.runStatusAnim('confused' as ID, [poke]); - this.scene.resultAnim(poke, 'Confused', 'bad'); - if (kwargs.fatigue) { - actions += "" + poke.getName() + " became confused due to fatigue!"; - } else { - actions += "" + poke.getName() + " became confused!"; - } - } - break; - case 'leechseed': - this.scene.updateStatbar(poke); - actions += '' + poke.getName() + ' was seeded!'; - break; - case 'healblock': - this.scene.resultAnim(poke, 'Heal Block', 'bad'); - actions += "" + poke.getName() + " was prevented from healing!"; - break; - case 'mudsport': - this.scene.resultAnim(poke, 'Mud Sport', 'neutral'); - actions += "Electricity's power was weakened!"; - break; - case 'watersport': - this.scene.resultAnim(poke, 'Water Sport', 'neutral'); - actions += "Fire's power was weakened!"; - break; - case 'yawn': - this.scene.resultAnim(poke, 'Drowsy', 'slp'); - actions += "" + poke.getName() + ' grew drowsy!'; - break; - case 'flashfire': - actions += 'The power of ' + poke.getLowerName() + '\'s Fire-type moves rose!'; - break; - case 'taunt': - this.scene.resultAnim(poke, 'Taunted', 'bad'); - actions += '' + poke.getName() + ' fell for the taunt!'; - break; - case 'imprison': - this.scene.resultAnim(poke, 'Imprisoning', 'good'); - actions += "" + poke.getName() + " sealed any moves its target shares with it!"; - break; - case 'disable': - if (fromeffect.effectType === 'Ability') { - this.scene.abilityActivateAnim(ofpoke!, fromeffect.name); - this.message('', "[" + ofpoke!.getName(true) + "'s " + fromeffect.name + "!]"); - ofpoke!.markAbility(fromeffect.name); - } - this.scene.resultAnim(poke, 'Disabled', 'bad'); - actions += "" + poke.getName() + "'s " + BattleLog.escapeHTML(args[3]) + " was disabled!"; - break; - case 'embargo': - this.scene.resultAnim(poke, 'Embargo', 'bad'); - actions += "" + poke.getName() + " can't use items anymore!"; - break; - case 'torment': - this.scene.resultAnim(poke, 'Tormented', 'bad'); - actions += '' + poke.getName() + ' was subjected to torment!'; - break; - case 'ingrain': - this.scene.resultAnim(poke, 'Ingrained', 'good'); - actions += '' + poke.getName() + ' planted its roots!'; - break; - case 'aquaring': - this.scene.resultAnim(poke, 'Aqua Ring', 'good'); - actions += '' + poke.getName() + ' surrounded itself with a veil of water!'; - break; - case 'stockpile1': - this.scene.resultAnim(poke, 'Stockpile', 'good'); - actions += '' + poke.getName() + ' stockpiled 1!'; - break; - case 'stockpile2': - poke.removeVolatile('stockpile1' as ID); - this.scene.resultAnim(poke, 'Stockpile×2', 'good'); - actions += '' + poke.getName() + ' stockpiled 2!'; - break; - case 'stockpile3': - poke.removeVolatile('stockpile2' as ID); - this.scene.resultAnim(poke, 'Stockpile×3', 'good'); - actions += '' + poke.getName() + ' stockpiled 3!'; - break; - case 'perish0': - poke.removeVolatile('perish1' as ID); - actions += '' + poke.getName() + "'s perish count fell to 0."; - break; - case 'perish1': - poke.removeVolatile('perish2' as ID); - this.scene.resultAnim(poke, 'Perish next turn', 'bad'); - actions += '' + poke.getName() + "'s perish count fell to 1."; - break; - case 'perish2': - poke.removeVolatile('perish3' as ID); - this.scene.resultAnim(poke, 'Perish in 2', 'bad'); - actions += '' + poke.getName() + "'s perish count fell to 2."; - break; - case 'perish3': - this.scene.resultAnim(poke, 'Perish in 3', 'bad'); - actions += '' + poke.getName() + "'s perish count fell to 3."; - break; - case 'encore': - this.scene.resultAnim(poke, 'Encored', 'bad'); - actions += '' + poke.getName() + ' received an encore!'; - break; - case 'bide': - this.scene.resultAnim(poke, 'Bide', 'good'); - actions += "" + poke.getName() + " is storing energy!"; - break; - case 'slowstart': - actions += "" + poke.getName() + " can't get it going!"; - break; - case 'attract': - if (fromeffect.effectType === 'Ability') { - this.scene.abilityActivateAnim(ofpoke!, fromeffect.name); - this.message('', "[" + ofpoke!.getName(true) + "'s " + fromeffect.name + "!]"); - ofpoke!.markAbility(fromeffect.name); - } - this.scene.resultAnim(poke, 'Attracted', 'bad'); - if (fromeffect.effectType === 'Item') { - actions += "" + poke.getName() + " fell in love from the " + fromeffect.name + "!"; - } else { - actions += "" + poke.getName() + " fell in love!"; - } - break; - case 'autotomize': - this.scene.resultAnim(poke, 'Lightened', 'good'); - actions += "" + poke.getName() + " became nimble!"; - break; - case 'focusenergy': - this.scene.resultAnim(poke, '+Crit rate', 'good'); - if (fromeffect.effectType === 'Item') { - actions += "" + poke.getName() + " used the " + fromeffect.name + " to get pumped!"; - } else if (kwargs.zeffect) { - actions += "" + poke.getName() + " boosted its critical-hit ratio using its Z-Power!"; - } else { - actions += "" + poke.getName() + " is getting pumped!"; - } - break; - case 'curse': - this.scene.resultAnim(poke, 'Cursed', 'bad'); - actions += "" + ofpoke!.getName() + " cut its own HP and put a curse on " + poke.getLowerName() + "!"; - break; - case 'nightmare': - this.scene.resultAnim(poke, 'Nightmare', 'bad'); - actions += "" + poke.getName() + " began having a nightmare!"; - break; - case 'magnetrise': - this.scene.resultAnim(poke, 'Magnet Rise', 'good'); - actions += "" + poke.getName() + " levitated with electromagnetism!"; - break; - case 'smackdown': - this.scene.resultAnim(poke, 'Smacked Down', 'bad'); - actions += "" + poke.getName() + " fell straight down!"; - poke.removeVolatile('magnetrise' as ID); - poke.removeVolatile('telekinesis' as ID); - if (poke.lastMove === 'fly' || poke.lastMove === 'bounce') this.scene.animReset(poke); - break; - case 'substitute': - if (kwargs.damage) { - this.scene.resultAnim(poke, 'Damage', 'bad'); - actions += "The substitute took damage for " + poke.getLowerName() + "!"; - } else if (kwargs.block) { - this.scene.resultAnim(poke, 'Blocked', 'neutral'); - actions += 'But it failed!'; - } else if (kwargs.already) { - actions += '' + poke.getName() + ' already has a substitute!'; - } else { - actions += '' + poke.getName() + ' put in a substitute!'; - } - break; - case 'uproar': - if (kwargs.upkeep) { - actions += "" + poke.getName() + " is making an uproar!"; - } else { - actions += "" + poke.getName() + " caused an uproar!"; - } - break; - case 'doomdesire': - actions += '' + poke.getName() + ' chose Doom Desire as its destiny!'; - break; - case 'futuresight': - actions += '' + poke.getName() + ' foresaw an attack!'; - break; - case 'mimic': - actions += '' + poke.getName() + ' learned ' + BattleLog.escapeHTML(args[3]) + '!'; - break; - case 'laserfocus': - actions += '' + poke.getName() + ' concentrated intensely!'; - break; - case 'followme': - case 'ragepowder': // Deprecated, now uses -singleturn - actions += '' + poke.getName() + ' became the center of attention!'; - break; - case 'powder': // Deprecated, now uses -singleturn - actions += '' + poke.getName() + ' is covered in powder!'; - break; - - // Gen 1 - case 'lightscreen': - this.scene.resultAnim(poke, 'Light Screen', 'good'); - actions += '' + poke.getName() + '\'s protected against special attacks!'; - break; - case 'reflect': - this.scene.resultAnim(poke, 'Reflect', 'good'); - actions += '' + poke.getName() + ' gained armor!'; - break; - - default: - actions += "" + poke.getName() + "'s " + effect.name + " started!"; - } - } - poke.addVolatile(effect.id); - this.scene.updateStatbar(poke); - break; - } case '-end': { - let poke = this.getPokemon(args[1])!; - let effect = Tools.getEffect(args[2]); - let fromeffect = Tools.getEffect(kwargs.from); - poke.removeVolatile(effect.id); - - if (kwargs.silent) { - // do nothing - } else { - switch (effect.id) { - case 'powertrick': - this.scene.resultAnim(poke, 'Power Trick', 'neutral'); - actions += "" + poke.getName() + " switched its Attack and Defense!"; - break; - case 'telekinesis': - this.scene.resultAnim(poke, 'Telekinesis ended', 'neutral'); - actions += "" + poke.getName() + " was freed from the telekinesis!"; - break; - case 'skydrop': - if (kwargs.interrupt) { - this.scene.anim(poke, {time: 100}); - } - actions += "" + poke.getName() + " was freed from the Sky Drop!"; - break; - case 'confusion': - this.scene.resultAnim(poke, 'Confusion ended', 'good'); - if (!kwargs.silent) { - if (fromeffect.effectType === 'Item') { - actions += "" + poke.getName() + "'s " + fromeffect.name + " snapped it out of its confusion!"; - break; - } - if (poke.side.n === 0) actions += "" + poke.getName() + " snapped out of its confusion."; - else actions += "" + poke.getName() + " snapped out of confusion!"; - } - break; - case 'leechseed': - if (fromeffect.id === 'rapidspin') { - this.scene.resultAnim(poke, 'De-seeded', 'good'); - actions += "" + poke.getName() + " was freed from Leech Seed!"; - } - break; - case 'healblock': - this.scene.resultAnim(poke, 'Heal Block ended', 'good'); - actions += "" + poke.getName() + "'s Heal Block wore off!"; - break; - case 'attract': - this.scene.resultAnim(poke, 'Attract ended', 'good'); - if (fromeffect.id === 'oblivious') { - actions += '' + poke.getName() + " got over its infatuation."; - } - if (fromeffect.id === 'mentalherb') { - actions += "" + poke.getName() + " cured its infatuation status using its " + fromeffect.name + "!"; - } - break; - case 'taunt': - this.scene.resultAnim(poke, 'Taunt ended', 'good'); - actions += '' + poke.getName() + "'s taunt wore off!"; - break; - case 'disable': - this.scene.resultAnim(poke, 'Disable ended', 'good'); - actions += '' + poke.getName() + "'s move is no longer disabled!"; - break; - case 'embargo': - this.scene.resultAnim(poke, 'Embargo ended', 'good'); - actions += "" + poke.getName() + " can use items again!"; - break; - case 'torment': - this.scene.resultAnim(poke, 'Torment ended', 'good'); - actions += '' + poke.getName() + "'s torment wore off!"; - break; - case 'encore': - this.scene.resultAnim(poke, 'Encore ended', 'good'); - actions += '' + poke.getName() + "'s encore ended!"; - break; - case 'bide': - this.scene.runOtherAnim('bideunleash' as ID, [poke]); - actions += "" + poke.getName() + " unleashed its energy!"; - break; - case 'illusion': - this.scene.resultAnim(poke, 'Illusion ended', 'bad'); - actions += "" + poke.getName() + "'s illusion wore off!"; - poke.markAbility('Illusion'); - break; - case 'slowstart': - this.scene.resultAnim(poke, 'Slow Start ended', 'good'); - actions += "" + poke.getName() + " finally got its act together!"; - break; - case 'magnetrise': - if (poke.side.n === 0) actions += "" + poke.getName() + "'s electromagnetism wore off!"; - else actions += "The electromagnetism of " + poke.getLowerName() + " wore off!"; - break; - case 'perishsong': // for backwards compatibility - poke.removeVolatile('perish3' as ID); - break; - case 'substitute': - this.scene.resultAnim(poke, 'Faded', 'bad'); - actions += '' + poke.getName() + "'s substitute faded!"; - break; - case 'uproar': - actions += "" + poke.getName() + " calmed down."; - break; - case 'stockpile': - poke.removeVolatile('stockpile1' as ID); - poke.removeVolatile('stockpile2' as ID); - poke.removeVolatile('stockpile3' as ID); - actions += "" + poke.getName() + "'s stockpiled effect wore off!"; - break; - case 'bind': - case 'wrap': - case 'clamp': - case 'whirlpool': - case 'firespin': - case 'magmastorm': - case 'sandtomb': - case 'infestation': - actions += '' + poke.getName() + ' was freed from ' + effect.name + '!'; - break; - default: - if (effect.effectType === 'Move') { - if (effect.name === 'Doom Desire') { - this.scene.runOtherAnim('doomdesirehit' as ID, [poke]); - } - if (effect.name === 'Future Sight') { - this.scene.runOtherAnim('futuresighthit' as ID, [poke]); - } - actions += '' + poke.getName() + " took the " + effect.name + " attack!"; - } else { - actions += "" + poke.getName() + "'s " + effect.name + " ended!"; - } - } + } else { + switch (item.id) { + case 'airballoon': + this.scene.resultAnim(poke, 'Balloon', 'good'); + break; } - this.scene.updateStatbar(poke); - break; - } case '-singleturn': { - let poke = this.getPokemon(args[1])!; - let effect = Tools.getEffect(args[2]); - let ofpoke = this.getPokemon(kwargs.of); - // let fromeffect = Tools.getEffect(kwargs.from); - poke.addTurnstatus(effect.id); - + } + this.log(args, kwArgs); + break; + } + case '-enditem': { + let poke = this.getPokemon(args[1])!; + let item = Tools.getItem(args[2]); + let effect = Tools.getEffect(kwArgs.from); + let ofpoke = this.getPokemon(kwArgs.of); + poke.item = ''; + poke.itemEffect = ''; + poke.prevItem = item.name; + poke.prevItemEffect = ''; + poke.removeVolatile('airballoon' as ID); + poke.addVolatile('itemremoved' as ID); + if (kwArgs.eat) { + poke.prevItemEffect = 'eaten'; + this.scene.runOtherAnim('consume' as ID, [poke]); + this.lastMove = item.id; + } else if (kwArgs.weaken) { + poke.prevItemEffect = 'eaten'; + this.lastMove = item.id; + } else if (effect.id) { switch (effect.id) { - case 'roost': - this.scene.resultAnim(poke, 'Landed', 'neutral'); - //actions += '' + poke.getName() + ' landed on the ground!'; - break; - case 'quickguard': - this.scene.resultAnim(poke, 'Quick Guard', 'good'); - actions += "Quick Guard protected " + poke.side.getLowerTeamName() + "!"; + case 'fling': + poke.prevItemEffect = 'flung'; break; - case 'wideguard': - this.scene.resultAnim(poke, 'Wide Guard', 'good'); - actions += "Wide Guard protected " + poke.side.getLowerTeamName() + "!"; + case 'knockoff': + poke.prevItemEffect = 'knocked off'; + this.scene.runOtherAnim('itemoff' as ID, [poke]); + this.scene.resultAnim(poke, 'Item knocked off', 'neutral'); break; - case 'craftyshield': - this.scene.resultAnim(poke, 'Crafty Shield', 'good'); - actions += "Crafty Shield protected " + poke.side.getLowerTeamName() + "!"; + case 'stealeat': + poke.prevItemEffect = 'stolen'; break; - case 'matblock': - this.scene.resultAnim(poke, 'Mat Block', 'good'); - actions += '' + poke.getName() + ' intends to flip up a mat and block incoming attacks!'; + case 'gem': + poke.prevItemEffect = 'consumed'; break; - case 'protect': - this.scene.resultAnim(poke, 'Protected', 'good'); - actions += '' + poke.getName() + ' protected itself!'; + case 'incinerate': + poke.prevItemEffect = 'incinerated'; break; - case 'endure': - this.scene.resultAnim(poke, 'Enduring', 'good'); - actions += '' + poke.getName() + ' braced itself!'; - break; - case 'helpinghand': - this.scene.resultAnim(poke, 'Helping Hand', 'good'); - actions += '' + ofpoke!.getName() + " is ready to help " + poke.getLowerName() + "!"; - break; - case 'focuspunch': - this.scene.resultAnim(poke, 'Focusing', 'neutral'); - actions += '' + poke.getName() + ' is tightening its focus!'; - poke.markMove(effect.name, 0); - break; - case 'shelltrap': - this.scene.resultAnim(poke, 'Trap set', 'neutral'); - actions += '' + poke.getName() + ' set a shell trap!'; - poke.markMove(effect.name, 0); - break; - case 'snatch': - actions += '' + poke.getName() + ' waits for a target to make a move!'; - break; - case 'magiccoat': - actions += '' + poke.getName() + ' shrouded itself with Magic Coat!'; + } + } else { + switch (item.id) { + case 'airballoon': + poke.prevItemEffect = 'popped'; + poke.removeVolatile('airballoon' as ID); + this.scene.resultAnim(poke, 'Balloon popped', 'neutral'); break; - case 'electrify': - actions += '' + poke.getName() + '\'s moves have been electrified!'; + case 'focussash': + poke.prevItemEffect = 'consumed'; + this.scene.resultAnim(poke, 'Sash', 'neutral'); break; - case 'followme': - case 'ragepowder': - case 'spotlight': - if (kwargs.zeffect) { - actions += '' + poke.getName() + ' became the center of attention using its Z-Power!'; - } else { - actions += '' + poke.getName() + ' became the center of attention!'; - } - break; - case 'powder': - actions += '' + poke.getName() + ' is covered in powder!'; + case 'focusband': + this.scene.resultAnim(poke, 'Focus Band', 'neutral'); break; - case 'instruct': - actions += '' + poke.getName() + ' used the move instructed by ' + ofpoke!.getLowerName() + '!'; + case 'redcard': + poke.prevItemEffect = 'held up'; break; - case 'beakblast': - this.scene.runOtherAnim('bidecharge' as ID, [poke]); - this.scene.resultAnim(poke, 'Beak Blast', 'neutral'); - actions += '' + poke.getName() + ' started heating up its beak!'; + default: + poke.prevItemEffect = 'consumed'; break; } - this.scene.updateStatbar(poke); - break; - } case '-singlemove': { - let poke = this.getPokemon(args[1])!; - let effect = Tools.getEffect(args[2]); - // let ofpoke = this.getPokemon(kwargs.of); - // let fromeffect = Tools.getEffect(kwargs.from); - poke.addMovestatus(effect.id); - + } + this.log(args, kwArgs); + break; + } + case '-ability': { + let poke = this.getPokemon(args[1])!; + let ability = Tools.getAbility(args[2]); + let effect = Tools.getEffect(kwArgs.from); + let ofpoke = this.getPokemon(kwArgs.of); + poke.rememberAbility(ability.name, effect.id && !kwArgs.fail); + + if (kwArgs.silent) { + // do nothing + } else if (effect.id) { switch (effect.id) { - case 'grudge': - this.scene.resultAnim(poke, 'Grudge', 'neutral'); - actions += '' + poke.getName() + ' wants its target to bear a grudge!'; + case 'trace': + this.activateAbility(poke, "Trace"); + this.scene.wait(500); + this.activateAbility(poke, ability.name, true); + ofpoke!.rememberAbility(ability.name); + break; + case 'powerofalchemy': + case 'receiver': + this.activateAbility(poke, effect.name); + this.scene.wait(500); + this.activateAbility(poke, ability.name, true); + ofpoke!.rememberAbility(ability.name); + break; + case 'roleplay': + this.activateAbility(poke, ability.name, true); + ofpoke!.rememberAbility(ability.name); + break; + case 'desolateland': + case 'primordialsea': + case 'deltastream': + if (kwArgs.fail) { + this.activateAbility(poke, ability.name); + } break; - case 'destinybond': - this.scene.resultAnim(poke, 'Destiny Bond', 'neutral'); - actions += '' + poke.getName() + ' is hoping to take its attacker down with it!'; + default: + this.activateAbility(poke, ability.name); break; } - break; + } else { + this.activateAbility(poke, ability.name); + } + this.log(args, kwArgs); + break; + } + case '-endability': { + // deprecated; use |-start| for Gastro Acid + // and the third arg of |-ability| for Entrainment et al + let poke = this.getPokemon(args[1])!; + let ability = Tools.getAbility(args[2]); + poke.ability = '(suppressed)'; - } case '-activate': { - let poke = this.getPokemon(args[1])!; - let effect = Tools.getEffect(args[2]); - let ofpoke = this.getPokemon(kwargs.of); - if ((effect.id === 'confusion' || effect.id === 'attract') && !this.hasPreMoveMessage && this.waitForResult()) return; - if (effect.effectType === 'Ability') { - this.scene.abilityActivateAnim(poke, effect.name); - this.message('', "[" + poke.getName(true) + "'s " + effect.name + "!]"); - poke.markAbility(effect.name); + if (ability.id) { + if (!poke.baseAbility) poke.baseAbility = ability.name; + } + this.log(args, kwArgs); + break; + } + case 'detailschange': { + let poke = this.getPokemon(args[1])!; + poke.removeVolatile('formechange' as ID); + poke.removeVolatile('typeadd' as ID); + poke.removeVolatile('typechange' as ID); + + let newSpecies = args[2]; + let commaIndex = newSpecies.indexOf(','); + if (commaIndex !== -1) { + let level = newSpecies.substr(commaIndex + 1).trim(); + if (level.charAt(0) === 'L') { + poke.level = parseInt(level.substr(1), 10); } - switch (effect.id) { - case 'healreplacement': - actions += "" + poke.getName() + " will restore its replacement's HP using its Z-Power!"; - break; - case 'confusion': - actions += "" + poke.getName() + " is confused!"; - this.hasPreMoveMessage = true; - break; - case 'destinybond': - actions += '' + poke.getName() + ' took its attacker down with it!'; - break; - case 'snatch': - actions += "" + poke.getName() + " snatched " + ofpoke!.getLowerName() + "'s move!"; - break; - case 'grudge': - actions += "" + poke.getName() + "'s " + BattleLog.escapeHTML(args[3]) + " lost all of its PP due to the grudge!"; - poke.markMove(args[3], Infinity); - break; - case 'quickguard': - poke.addTurnstatus('quickguard' as ID); - this.scene.resultAnim(poke, 'Quick Guard', 'good'); - actions += "Quick Guard protected " + poke.getLowerName() + "!"; - break; - case 'wideguard': - poke.addTurnstatus('wideguard' as ID); - this.scene.resultAnim(poke, 'Wide Guard', 'good'); - actions += "Wide Guard protected " + poke.getLowerName() + "!"; - break; - case 'craftyshield': - poke.addTurnstatus('craftyshield' as ID); - this.scene.resultAnim(poke, 'Crafty Shield', 'good'); - actions += "Crafty Shield protected " + poke.getLowerName() + "!"; - break; - case 'protect': - poke.addTurnstatus('protect' as ID); - this.scene.resultAnim(poke, 'Protected', 'good'); - actions += '' + poke.getName() + ' protected itself!'; - break; - case 'substitute': - if (kwargs.damage) { - this.scene.resultAnim(poke, 'Damage', 'bad'); - actions += 'The substitute took damage for ' + poke.getLowerName() + '!'; - } else if (kwargs.block) { - this.scene.resultAnim(poke, 'Blocked', 'neutral'); - actions += '' + poke.getName() + "'s Substitute blocked " + Tools.getMove(kwargs.block || args[3]).name + '!'; - } - break; - case 'attract': - this.scene.runStatusAnim('attracted' as ID, [poke]); - actions += '' + poke.getName() + ' is in love with ' + ofpoke!.getLowerName() + '!'; - this.hasPreMoveMessage = true; - break; - case 'bide': - this.scene.runOtherAnim('bidecharge' as ID, [poke]); - actions += "" + poke.getName() + " is storing energy!"; - break; - case 'mist': - actions += "" + poke.getName() + " is protected by the mist!"; - break; - case 'safeguard': - actions += "" + poke.getName() + " is protected by Safeguard!"; - break; - case 'trapped': - actions += "" + poke.getName() + " can no longer escape!"; - break; - case 'stickyweb': - actions += '' + poke.getName() + ' was caught in a sticky web!'; - break; - case 'happyhour': - actions += 'Everyone is caught up in the happy atmosphere!'; - break; - case 'celebrate': - actions += 'Congratulations, ' + BattleLog.escapeHTML(poke.side.name) + '!'; - break; + newSpecies = args[2].substr(0, commaIndex); + } + let template = Tools.getTemplate(newSpecies); - // move activations - case 'aromatherapy': - this.scene.resultAnim(poke, 'Team Cured', 'good'); - actions += 'A soothing aroma wafted through the area!'; - break; - case 'healbell': - this.scene.resultAnim(poke, 'Team Cured', 'good'); - actions += 'A bell chimed!'; - break; - case 'trick': - case 'switcheroo': - actions += '' + poke.getName() + ' switched items with its target!'; - break; - case 'brickbreak': - actions += poke.getName() + " shattered " + ofpoke!.side.getTeamName() + " protections!"; - ofpoke!.side.removeSideCondition('Reflect'); - ofpoke!.side.removeSideCondition('LightScreen'); - break; - case 'beatup': - actions += "" + BattleLog.escapeHTML(kwargs.of) + "'s attack!"; - break; - case 'pursuit': - actions += "(" + poke.getName() + " is being withdrawn!)"; - break; - case 'hyperspacefury': - case 'hyperspacehole': - case 'phantomforce': - case 'shadowforce': - case 'feint': - this.scene.resultAnim(poke, 'Protection broken', 'bad'); - if (kwargs.broken) { - actions += "It broke through " + poke.getLowerName() + "'s protection!"; - } else { - actions += "" + poke.getName() + " fell for the feint!"; - } - poke.removeTurnstatus('protect' as ID); - for (const target of poke.side.pokemon) { - target.removeTurnstatus('wideguard' as ID); - target.removeTurnstatus('quickguard' as ID); - target.removeTurnstatus('craftyshield' as ID); - target.removeTurnstatus('matblock' as ID); - this.scene.updateStatbar(target); - } - break; - case 'spite': - let move = Tools.getMove(args[3]).name; - let pp = BattleLog.escapeHTML(args[4]); - actions += "It reduced the PP of " + poke.getLowerName() + "'s " + move + " by " + pp + "!"; - poke.markMove(move, Number(pp)); - break; - case 'gravity': - actions += "" + poke.getName() + " couldn't stay airborne because of gravity!"; - poke.removeVolatile('magnetrise' as ID); - poke.removeVolatile('telekinesis' as ID); - this.scene.anim(poke, {time: 100}); - break; - case 'magnitude': - actions += "Magnitude " + BattleLog.escapeHTML(args[3]) + "!"; - break; - case 'sketch': - actions += "" + poke.getName() + " sketched " + BattleLog.escapeHTML(args[3]) + "!"; - break; - case 'skillswap': - actions += "" + poke.getName() + " swapped Abilities with its target!"; - if (this.gen <= 4) break; - let pokeability = BattleLog.escapeHTML(args[3]) || ofpoke!.ability; - let ofpokeability = BattleLog.escapeHTML(args[4]) || poke.ability; - if (pokeability) { - poke.ability = pokeability; - if (!ofpoke!.baseAbility) ofpoke!.baseAbility = pokeability; - } - if (ofpokeability) { - ofpoke!.ability = ofpokeability; - if (!poke.baseAbility) poke.baseAbility = ofpokeability; - } - if (poke.side !== ofpoke!.side) { - this.scene.abilityActivateAnim(poke, pokeability); - this.scene.abilityActivateAnim(ofpoke!, ofpokeability); - actions += "
    " + poke.getName() + " acquired " + pokeability + "!"; - actions += "
    " + ofpoke!.getName() + " acquired " + ofpokeability + "!"; - } - break; - case 'charge': - actions += "" + poke.getName() + " began charging power!"; - break; - case 'struggle': - actions += "" + poke.getName() + " has no moves left!"; - break; - case 'bind': - actions += '' + poke.getName() + ' was squeezed by ' + ofpoke!.getLowerName() + '!'; - break; - case 'wrap': - actions += '' + poke.getName() + ' was wrapped by ' + ofpoke!.getLowerName() + '!'; - break; - case 'clamp': - actions += '' + ofpoke!.getName() + ' clamped down on ' + poke.getLowerName() + '!'; - break; - case 'whirlpool': - actions += '' + poke.getName() + ' became trapped in the vortex!'; - break; - case 'firespin': - actions += '' + poke.getName() + ' became trapped in the fiery vortex!'; - break; - case 'magmastorm': - actions += '' + poke.getName() + ' became trapped by swirling magma!'; - break; - case 'sandtomb': - actions += '' + poke.getName() + ' became trapped by the quicksand!'; - break; - case 'infestation': - actions += '' + poke.getName() + ' has been afflicted with an infestation by ' + ofpoke!.getLowerName() + '!'; - break; - case 'afteryou': - actions += '' + poke.getName() + ' took the kind offer!'; - break; - case 'quash': - actions += "" + poke.getName() + "'s move was postponed!"; - break; - case 'powersplit': - actions += '' + poke.getName() + ' shared its power with the target!'; - break; - case 'guardsplit': - actions += '' + poke.getName() + ' shared its guard with the target!'; - break; - case 'speedswap': - actions += '' + poke.getName() + ' switched Speed with its target!'; - break; - case 'ingrain': - actions += '' + poke.getName() + ' anchored itself with its roots!'; - break; - case 'matblock': - actions += '' + BattleLog.escapeHTML(args[3]) + ' was blocked by the kicked-up mat!'; - break; - case 'powder': - actions += 'When the flame touched the powder on the Pokémon, it exploded!'; - break; - case 'fairylock': - actions += 'No one will be able to run away during the next turn!'; - break; - case 'lockon': - case 'mindreader': - actions += '' + poke.getName() + ' took aim at ' + ofpoke!.getLowerName() + '!'; - break; - case 'endure': - actions += '' + poke.getName() + ' endured the hit!'; - break; - case 'electricterrain': - actions += '' + poke.getName() + ' surrounds itself with electrified terrain!'; - break; - case 'mistyterrain': - actions += '' + poke.getName() + ' surrounds itself with a protective mist!'; - break; - case 'psychicterrain': - actions += '' + poke.getName() + ' surrounds itself with psychic terrain!'; - break; + poke.species = newSpecies; + poke.ability = poke.baseAbility = (template.abilities ? template.abilities['0'] : ''); + poke.weightkg = template.weightkg; - // ability activations - case 'magicbounce': - case 'magiccoat': - case 'rebound': - break; - case 'wonderguard': // Deprecated, now uses -immune - this.scene.resultAnim(poke, 'Immune', 'neutral'); - actions += '' + poke.getName() + '\'s Wonder Guard evades the attack!'; - break; - case 'forewarn': - if (this.gen >= 5) { - actions += "It was alerted to " + ofpoke!.getLowerName() + "'s " + BattleLog.escapeHTML(args[3]) + "!"; - ofpoke!.markMove(args[3], 0); - } else { - actions += "" + poke.getName() + "'s Forewarn alerted it to " + BattleLog.escapeHTML(args[3]) + "!"; - let foeActive = [] as Pokemon[]; - for (const target of poke.side.foe.active) if (target) foeActive.push(target); - if (foeActive.length === 1) { - foeActive[0].markMove(args[3], 0); - } - } - break; - case 'mummy': - if (!args[3]) break; // if Mummy activated but failed, no ability will have been sent - let ability = Tools.getAbility(args[3]); - this.scene.abilityActivateAnim(ofpoke!, ability.name); - this.scene.wait(700); - this.message('', "[" + ofpoke!.getName(true) + "'s " + ability.name + "!]"); - ofpoke!.markAbility(ability.name); - this.scene.abilityActivateAnim(ofpoke!, 'Mummy'); - this.message('', "[" + ofpoke!.getName(true) + "'s Mummy!]"); - ofpoke!.markAbility('Mummy', true); - actions += "" + ofpoke!.getName() + "'s Ability became Mummy!"; - break; - case 'anticipation': // Deprecated, now uses -ability. This is for replay compatability - actions += "" + poke.getName() + " shuddered!"; - break; - case 'lightningrod': - case 'stormdrain': - actions += '' + poke.getName() + ' took the attack!'; - break; - case 'telepathy': - actions += "" + poke.getName() + " avoids attacks by its ally Pokémon!"; - break; - case 'stickyhold': - actions += "" + poke.getName() + "'s item cannot be removed!"; - break; - case 'suctioncups': - actions += '' + poke.getName() + ' anchors itself!'; - break; - case 'symbiosis': - actions += '' + poke.getName() + ' shared its ' + Tools.getItem(args[3]).name + ' with ' + ofpoke!.getLowerName() + '!'; - break; - case 'aromaveil': - actions += '' + ofpoke!.getName() + ' is protected by an aromatic veil!'; - break; - case 'flowerveil': - actions += '' + ofpoke!.getName() + ' surrounded itself with a veil of petals!'; - break; - case 'sweetveil': - actions += '' + ofpoke!.getName() + ' surrounded itself with a veil of sweetness!'; - break; - case 'battlebond': - actions += '' + poke.getName() + ' became fully charged due to its bond with its Trainer!'; - break; - case 'disguise': - actions += 'Its disguise served it as a decoy!'; - break; - case 'powerconstruct': - actions += 'You sense the presence of many!'; - break; - case 'persistent': // CAP - actions += '' + poke.getName() + ' extends ' + Tools.getMove(args[3]).name + ' by 2 turns!'; - break; + poke.details = args[2]; + poke.searchid = args[1].substr(0, 2) + args[1].substr(3) + '|' + args[2]; - // weather activations - case 'deltastream': - actions += "The mysterious strong winds weakened the attack!"; - break; + this.scene.animTransform(poke, true, true); + this.log(args, kwArgs); + break; + } + case '-transform': { + let poke = this.getPokemon(args[1])!; + let tpoke = this.getPokemon(args[2])!; + let effect = Tools.getEffect(kwArgs.from); - // item activations - case 'custapberry': - case 'quickclaw': - //actions += '' + poke.getName() + ' is already preparing its next move!'; - actions += '' + poke.getName() + '\'s ' + effect.name + ' let it move first!'; - break; - case 'leppaberry': - case 'mysteryberry': - actions += '' + poke.getName() + " restored PP to its " + BattleLog.escapeHTML(args[3]) + " move using " + effect.name + "!"; - poke.markMove(args[3], effect.id === 'leppaberry' ? -10 : -5); - break; - case 'focusband': - poke.item = 'Focus Band'; - actions += '' + poke.getName() + " hung on using its Focus Band!"; - break; - case 'safetygoggles': - poke.item = 'Safety Goggles'; - actions += '' + poke.getName() + " is not affected by " + BattleLog.escapeHTML(args[3]) + " thanks to its Safety Goggles!"; - break; - case 'protectivepads': - poke.item = 'Protective Pads'; - actions += '' + poke.getName() + " protected itself with the Protective Pads!"; - break; - default: - if (kwargs.broken) { // for custom moves that break protection - this.scene.resultAnim(poke, 'Protection broken', 'bad'); - actions += "It broke through " + poke.getLowerName() + "'s protection!"; - } else if (effect.effectType !== 'Ability') { - actions += "" + poke.getName() + "'s " + effect.name + " activated!"; - } - } - break; + if (!kwArgs.silent) { + this.activateAbility(poke, effect); + } - } case '-sidestart': { - let side = this.getSide(args[1]); - let effect = Tools.getEffect(args[2]); - side.addSideCondition(effect); + poke.boosts = {...tpoke.boosts}; + poke.copyTypesFrom(tpoke); + poke.weightkg = tpoke.weightkg; + poke.ability = tpoke.ability; + const species = (tpoke.volatiles.formechange ? tpoke.volatiles.formechange[1] : tpoke.species); + const pokemon = tpoke; + const shiny = tpoke.shiny; + const gender = tpoke.gender; + poke.addVolatile('transform' as ID, pokemon, shiny, gender); + poke.addVolatile('formechange' as ID, species); + for (const trackedMove of tpoke.moveTrack) { + poke.rememberMove(trackedMove[0], 0); + } + this.scene.animTransform(poke); + this.scene.resultAnim(poke, 'Transformed', 'good'); + this.log(['-transform', args[1], args[2], tpoke.species], kwArgs); + break; + } + case '-formechange': { + let poke = this.getPokemon(args[1])!; + let template = Tools.getTemplate(args[2]); + let fromeffect = Tools.getEffect(kwArgs.from); + let isCustomAnim = false; + poke.removeVolatile('typeadd' as ID); + poke.removeVolatile('typechange' as ID); + if (this.gen >= 7) poke.removeVolatile('autotomize' as ID); - switch (effect.id) { - case 'stealthrock': - actions += "Pointed stones float in the air around " + side.getLowerTeamName() + "!"; - break; - case 'spikes': - actions += "Spikes were scattered on the ground all around " + side.getLowerTeamName() + "!"; - break; - case 'toxicspikes': - actions += "Poison spikes were scattered on the ground all around " + side.getLowerTeamName() + "!"; - break; - case 'stickyweb': - actions += "A sticky web spreads out on the ground around " + side.getLowerTeamName() + "!"; - break; - case 'tailwind': - actions += "The Tailwind blew from behind " + side.getLowerTeamName() + "!"; - this.scene.updateWeather(); - break; - case 'auroraveil': - actions += "Aurora Veil made " + side.getLowerTeamName() + " stronger against physical and special moves!"; - this.scene.updateWeather(); - break; - case 'reflect': - actions += "Reflect made " + side.getLowerTeamName() + " stronger against physical moves!"; - this.scene.updateWeather(); - break; - case 'lightscreen': - actions += "Light Screen made " + side.getLowerTeamName() + " stronger against special moves!"; - this.scene.updateWeather(); - break; - case 'safeguard': - actions += "" + side.getTeamName() + " cloaked itself in a mystical veil!"; - this.scene.updateWeather(); - break; - case 'mist': - actions += "" + side.getTeamName() + " became shrouded in mist!"; - this.scene.updateWeather(); - break; - case 'luckychant': - actions += 'Lucky Chant shielded ' + side.getLowerTeamName() + ' from critical hits!'; - break; - case 'firepledge': - actions += "A sea of fire enveloped " + side.getLowerTeamName() + "!"; - break; - case 'waterpledge': - actions += "A rainbow appeared in the sky on " + side.getLowerTeamName() + "'s side!"; - break; - case 'grasspledge': - actions += "A swamp enveloped " + side.getLowerTeamName() + "!"; - break; - default: - actions += "" + effect.name + " started!"; + if (!kwArgs.silent) { + this.activateAbility(poke, fromeffect); + } + poke.addVolatile('formechange' as ID, template.species); // the formechange volatile reminds us to revert the sprite change on switch-out + this.scene.animTransform(poke, isCustomAnim); + this.log(args, kwArgs); + break; + } + case '-mega': { + let poke = this.getPokemon(args[1])!; + let item = Tools.getItem(args[3]); + if (args[3]) { + poke.item = item.name; + } + this.log(args, kwArgs); + break; + } + case '-primal': case '-burst': { + this.log(args, kwArgs); + break; + } + case '-start': { + let poke = this.getPokemon(args[1])!; + let effect = Tools.getEffect(args[2]); + let ofpoke = this.getPokemon(kwArgs.of); + let fromeffect = Tools.getEffect(kwArgs.from); + + this.activateAbility(poke, effect); + this.activateAbility(ofpoke || poke, fromeffect); + switch (effect.id) { + case 'typechange': + const types = BattleLog.escapeHTML(args[3]); + poke.removeVolatile('typeadd' as ID); + poke.addVolatile('typechange' as ID, types); + if (kwArgs.silent) { + this.scene.updateStatbar(poke); break; } + this.scene.resultAnim(poke, types.split('/').map(function (type) { + return '' + type + ''; + }).join(' '), 'neutral'); break; - } case '-sideend': { - let side = this.getSide(args[1]); - let effect = Tools.getEffect(args[2]); - // let from = Tools.getEffect(kwargs.from); - // let ofpoke = this.getPokemon(kwargs.of); - side.removeSideCondition(effect.name); - - switch (effect.id) { - case 'stealthrock': - actions += "The pointed stones disappeared from around " + side.getLowerTeamName() + "!"; - break; - case 'spikes': - actions += "The spikes disappeared from the ground around " + side.getLowerTeamName() + "!"; - break; - case 'toxicspikes': - actions += "The poison spikes disappeared from the ground around " + side.getLowerTeamName() + "!"; - break; - case 'stickyweb': - actions += "The sticky web has disappeared from the ground around " + side.getLowerTeamName() + "!"; - break; - case 'tailwind': - actions += "" + side.getTeamName() + "'s Tailwind petered out!"; - break; - case 'auroraveil': - actions += "" + side.getTeamName() + "'s Aurora Veil wore off!"; - break; - case 'reflect': - actions += "" + side.getTeamName() + "'s Reflect wore off!"; - break; - case 'lightscreen': - actions += "" + side.getTeamName() + "'s Light Screen wore off!"; - break; - case 'safeguard': - actions += "" + side.getTeamName() + " is no longer protected by Safeguard!"; - break; - case 'mist': - actions += "" + side.getTeamName() + " is no longer protected by mist!"; - break; - case 'luckychant': - actions += "" + side.getTeamName() + "'s Lucky Chant wore off!"; - break; - case 'firepledge': - actions += "The sea of fire around " + side.getLowerTeamName() + " disappeared!"; - break; - case 'waterpledge': - actions += "The rainbow on " + side.getLowerTeamName() + "'s side disappeared!"; - break; - case 'grasspledge': - actions += "The swamp around " + side.getLowerTeamName() + " disappeared!"; - break; - default: - actions += "" + effect.name + " ended!"; - break; + case 'typeadd': + const type = BattleLog.escapeHTML(args[3]); + poke.addVolatile('typeadd' as ID, type); + if (kwArgs.silent) break; + this.scene.resultAnim(poke, '' + type + '', 'neutral'); + break; + case 'powertrick': + this.scene.resultAnim(poke, 'Power Trick', 'neutral'); + break; + case 'foresight': + case 'miracleeye': + this.scene.resultAnim(poke, 'Identified', 'bad'); + break; + case 'telekinesis': + this.scene.resultAnim(poke, 'Telekinesis', 'neutral'); + break; + case 'confusion': + if (!kwArgs.already) { + this.scene.runStatusAnim('confused' as ID, [poke]); + this.scene.resultAnim(poke, 'Confused', 'bad'); + } + break; + case 'leechseed': + this.scene.updateStatbar(poke); + break; + case 'healblock': + this.scene.resultAnim(poke, 'Heal Block', 'bad'); + break; + case 'yawn': + this.scene.resultAnim(poke, 'Drowsy', 'slp'); + break; + case 'taunt': + this.scene.resultAnim(poke, 'Taunted', 'bad'); + break; + case 'imprison': + this.scene.resultAnim(poke, 'Imprisoning', 'good'); + case 'disable': + this.scene.resultAnim(poke, 'Disabled', 'bad'); + break; + case 'embargo': + this.scene.resultAnim(poke, 'Embargo', 'bad'); + break; + case 'torment': + this.scene.resultAnim(poke, 'Tormented', 'bad'); + break; + case 'ingrain': + this.scene.resultAnim(poke, 'Ingrained', 'good'); + break; + case 'aquaring': + this.scene.resultAnim(poke, 'Aqua Ring', 'good'); + break; + case 'stockpile1': + this.scene.resultAnim(poke, 'Stockpile', 'good'); + break; + case 'stockpile2': + poke.removeVolatile('stockpile1' as ID); + this.scene.resultAnim(poke, 'Stockpile×2', 'good'); + break; + case 'stockpile3': + poke.removeVolatile('stockpile2' as ID); + this.scene.resultAnim(poke, 'Stockpile×3', 'good'); + break; + case 'perish0': + poke.removeVolatile('perish1' as ID); + break; + case 'perish1': + poke.removeVolatile('perish2' as ID); + this.scene.resultAnim(poke, 'Perish next turn', 'bad'); + break; + case 'perish2': + poke.removeVolatile('perish3' as ID); + this.scene.resultAnim(poke, 'Perish in 2', 'bad'); + break; + case 'perish3': + this.scene.resultAnim(poke, 'Perish in 3', 'bad'); + break; + case 'encore': + this.scene.resultAnim(poke, 'Encored', 'bad'); + break; + case 'bide': + this.scene.resultAnim(poke, 'Bide', 'good'); + break; + case 'attract': + this.scene.resultAnim(poke, 'Attracted', 'bad'); + break; + case 'autotomize': + this.scene.resultAnim(poke, 'Lightened', 'good'); + break; + case 'focusenergy': + this.scene.resultAnim(poke, '+Crit rate', 'good'); + break; + case 'curse': + this.scene.resultAnim(poke, 'Cursed', 'bad'); + break; + case 'nightmare': + this.scene.resultAnim(poke, 'Nightmare', 'bad'); + break; + case 'magnetrise': + this.scene.resultAnim(poke, 'Magnet Rise', 'good'); + break; + case 'smackdown': + this.scene.resultAnim(poke, 'Smacked Down', 'bad'); + poke.removeVolatile('magnetrise' as ID); + poke.removeVolatile('telekinesis' as ID); + if (poke.lastMove === 'fly' || poke.lastMove === 'bounce') this.scene.animReset(poke); + break; + case 'substitute': + if (kwArgs.damage) { + this.scene.resultAnim(poke, 'Damage', 'bad'); + } else if (kwArgs.block) { + this.scene.resultAnim(poke, 'Blocked', 'neutral'); } break; - } case '-weather': { - let effect = Tools.getEffect(args[1]); - let poke = this.getPokemon(kwargs.of) || undefined; - let ability = Tools.getEffect(kwargs.from); - this.changeWeather(effect.name, poke, !!kwargs.upkeep, ability); + // Gen 1 + case 'lightscreen': + this.scene.resultAnim(poke, 'Light Screen', 'good'); break; + case 'reflect': + this.scene.resultAnim(poke, 'Reflect', 'good'); + break; + } + poke.addVolatile(effect.id); + this.scene.updateStatbar(poke); + this.log(args, kwArgs); + break; + } + case '-end': { + let poke = this.getPokemon(args[1])!; + let effect = Tools.getEffect(args[2]); + let fromeffect = Tools.getEffect(kwArgs.from); + poke.removeVolatile(effect.id); - } case '-fieldstart': { - let effect = Tools.getEffect(args[1]); - let poke = this.getPokemon(kwargs.of); - let fromeffect = Tools.getEffect(kwargs.from); - if (fromeffect && fromeffect.effectType === 'Ability') { - this.scene.abilityActivateAnim(poke!, fromeffect.name); - this.message('', "[" + poke!.getName(true) + "'s " + fromeffect.name + "!]"); - poke!.markAbility(fromeffect.name); - } - let maxTimeLeft = 0; - if (effect.id in {'electricterrain': 1, 'grassyterrain': 1, 'mistyterrain': 1, 'psychicterrain': 1}) { - for (let i = this.pseudoWeather.length - 1; i >= 0; i--) { - let pwName = this.pseudoWeather[i][0]; - if (pwName === 'Electric Terrain' || pwName === 'Grassy Terrain' || pwName === 'Misty Terrain' || pwName === 'Psychic Terrain') { - this.pseudoWeather.splice(i, 1); - continue; - } - } - if (this.gen > 6) maxTimeLeft = 8; - } - this.addPseudoWeather(effect.name, 5, maxTimeLeft); - + if (kwArgs.silent) { + // do nothing + } else { switch (effect.id) { - case 'wonderroom': - actions += "It created a bizarre area in which Defense and Sp. Def stats are swapped!"; + case 'powertrick': + this.scene.resultAnim(poke, 'Power Trick', 'neutral'); break; - case 'magicroom': - actions += "It created a bizarre area in which Pokémon's held items lose their effects!"; + case 'telekinesis': + this.scene.resultAnim(poke, 'Telekinesis ended', 'neutral'); break; - case 'gravity': - if (!this.fastForward) { - for (const side of this.sides) for (const active of side.active) { - if (active) { - this.scene.runOtherAnim('gravity' as ID, [active]); - } - } + case 'skydrop': + if (kwArgs.interrupt) { + this.scene.anim(poke, {time: 100}); } - actions += "Gravity intensified!"; - break; - case 'mudsport': - actions += "Electricity's power was weakened!"; - break; - case 'watersport': - actions += "Fire's power was weakened!"; break; - case 'grassyterrain': - actions += "Grass grew to cover the battlefield!"; + case 'confusion': + this.scene.resultAnim(poke, 'Confusion ended', 'good'); break; - case 'mistyterrain': - actions += "Mist swirls around the battlefield!"; + case 'leechseed': + if (fromeffect.id === 'rapidspin') { + this.scene.resultAnim(poke, 'De-seeded', 'good'); + } break; - case 'electricterrain': - actions += "An electric current runs across the battlefield!"; + case 'healblock': + this.scene.resultAnim(poke, 'Heal Block ended', 'good'); break; - case 'psychicterrain': - actions += "The battlefield got weird!"; + case 'attract': + this.scene.resultAnim(poke, 'Attract ended', 'good'); break; - case 'trickroom': - if (poke) { - actions += "" + poke.getName() + ' twisted the dimensions!'; - break; - } - // falls through - default: - actions += effect.name + " started!"; + case 'taunt': + this.scene.resultAnim(poke, 'Taunt ended', 'good'); break; - } - break; - - } case '-fieldend': { - let effect = Tools.getEffect(args[1]); - // let poke = this.getPokemon(kwargs.of); - this.removePseudoWeather(effect.name); - - switch (effect.id) { - case 'trickroom': - actions += 'The twisted dimensions returned to normal!'; + case 'disable': + this.scene.resultAnim(poke, 'Disable ended', 'good'); break; - case 'wonderroom': - actions += 'Wonder Room wore off, and Defense and Sp. Def stats returned to normal!'; + case 'embargo': + this.scene.resultAnim(poke, 'Embargo ended', 'good'); break; - case 'magicroom': - actions += "Magic Room wore off, and held items' effects returned to normal!"; + case 'torment': + this.scene.resultAnim(poke, 'Torment ended', 'good'); break; - case 'gravity': - actions += 'Gravity returned to normal!'; + case 'encore': + this.scene.resultAnim(poke, 'Encore ended', 'good'); break; - case 'mudsport': - actions += 'The effects of Mud Sport have faded.'; + case 'bide': + this.scene.runOtherAnim('bideunleash' as ID, [poke]); break; - case 'watersport': - actions += 'The effects of Water Sport have faded.'; + case 'illusion': + this.scene.resultAnim(poke, 'Illusion ended', 'bad'); + poke.rememberAbility('Illusion'); break; - case 'grassyterrain': - actions += "The grass disappeared from the battlefield."; + case 'slowstart': + this.scene.resultAnim(poke, 'Slow Start ended', 'good'); break; - case 'mistyterrain': - actions += "The mist disappeared from the battlefield."; + case 'perishsong': // for backwards compatibility + poke.removeVolatile('perish3' as ID); break; - case 'electricterrain': - actions += "The electricity disappeared from the battlefield."; + case 'substitute': + this.scene.resultAnim(poke, 'Faded', 'bad'); break; - case 'psychicterrain': - actions += "The weirdness disappeared from the battlefield!"; + case 'stockpile': + poke.removeVolatile('stockpile1' as ID); + poke.removeVolatile('stockpile2' as ID); + poke.removeVolatile('stockpile3' as ID); break; default: - actions += effect.name + " ended!"; - break; + if (effect.effectType === 'Move') { + if (effect.name === 'Doom Desire') { + this.scene.runOtherAnim('doomdesirehit' as ID, [poke]); + } + if (effect.name === 'Future Sight') { + this.scene.runOtherAnim('futuresighthit' as ID, [poke]); + } + } } + } + this.scene.updateStatbar(poke); + this.log(args, kwArgs); + break; + } + case '-singleturn': { + let poke = this.getPokemon(args[1])!; + let effect = Tools.getEffect(args[2]); + let ofpoke = this.getPokemon(kwArgs.of); + // let fromeffect = Tools.getEffect(kwArgs.from); + poke.addTurnstatus(effect.id); + + switch (effect.id) { + case 'roost': + this.scene.resultAnim(poke, 'Landed', 'neutral'); + break; + case 'quickguard': + this.scene.resultAnim(poke, 'Quick Guard', 'good'); + break; + case 'wideguard': + this.scene.resultAnim(poke, 'Wide Guard', 'good'); + break; + case 'craftyshield': + this.scene.resultAnim(poke, 'Crafty Shield', 'good'); + break; + case 'matblock': + this.scene.resultAnim(poke, 'Mat Block', 'good'); + break; + case 'protect': + this.scene.resultAnim(poke, 'Protected', 'good'); break; + case 'endure': + this.scene.resultAnim(poke, 'Enduring', 'good'); + break; + case 'helpinghand': + this.scene.resultAnim(poke, 'Helping Hand', 'good'); + break; + case 'focuspunch': + this.scene.resultAnim(poke, 'Focusing', 'neutral'); + poke.rememberMove(effect.name, 0); + break; + case 'shelltrap': + this.scene.resultAnim(poke, 'Trap set', 'neutral'); + poke.rememberMove(effect.name, 0); + break; + case 'beakblast': + this.scene.runOtherAnim('bidecharge' as ID, [poke]); + this.scene.resultAnim(poke, 'Beak Blast', 'neutral'); + break; + } + this.scene.updateStatbar(poke); + this.log(args, kwArgs); + break; + } + case '-singlemove': { + let poke = this.getPokemon(args[1])!; + let effect = Tools.getEffect(args[2]); + // let ofpoke = this.getPokemon(kwArgs.of); + // let fromeffect = Tools.getEffect(kwArgs.from); + poke.addMovestatus(effect.id); - } case '-fieldactivate': { - let effect = Tools.getEffect(args[1]); - switch (effect.id) { - case 'perishsong': - actions += 'All Pokémon that heard the song will faint in three turns!'; - this.scene.updateStatbars(); - break; - case 'payday': - actions += 'Coins were scattered everywhere!'; - break; - case 'iondeluge': - actions += 'A deluge of ions showers the battlefield!'; - break; - default: - actions += '' + effect.name + ' hit!'; - break; + switch (effect.id) { + case 'grudge': + this.scene.resultAnim(poke, 'Grudge', 'neutral'); + break; + case 'destinybond': + this.scene.resultAnim(poke, 'Destiny Bond', 'neutral'); + break; + } + this.log(args, kwArgs); + break; + } + case '-activate': { + let poke = this.getPokemon(args[1])!; + let effect = Tools.getEffect(args[2]); + let ofpoke = this.getPokemon(kwArgs.of); + this.activateAbility(poke, effect); + switch (effect.id) { + case 'grudge': + poke.rememberMove(args[3], Infinity); + break; + case 'quickguard': + poke.addTurnstatus('quickguard' as ID); + this.scene.resultAnim(poke, 'Quick Guard', 'good'); + break; + case 'wideguard': + poke.addTurnstatus('wideguard' as ID); + this.scene.resultAnim(poke, 'Wide Guard', 'good'); + break; + case 'craftyshield': + poke.addTurnstatus('craftyshield' as ID); + this.scene.resultAnim(poke, 'Crafty Shield', 'good'); + break; + case 'protect': + poke.addTurnstatus('protect' as ID); + this.scene.resultAnim(poke, 'Protected', 'good'); + break; + case 'substitute': + if (kwArgs.damage) { + this.scene.resultAnim(poke, 'Damage', 'bad'); + } else if (kwArgs.block) { + this.scene.resultAnim(poke, 'Blocked', 'neutral'); } break; + case 'attract': + this.scene.runStatusAnim('attracted' as ID, [poke]); + break; + case 'bide': + this.scene.runOtherAnim('bidecharge' as ID, [poke]); + break; - } case '-message': { - actions += BattleLog.escapeHTML(args[1]); + // move activations + case 'aromatherapy': + this.scene.resultAnim(poke, 'Team Cured', 'good'); + break; + case 'healbell': + this.scene.resultAnim(poke, 'Team Cured', 'good'); + break; + case 'brickbreak': + ofpoke!.side.removeSideCondition('Reflect'); + ofpoke!.side.removeSideCondition('LightScreen'); + break; + case 'hyperspacefury': + case 'hyperspacehole': + case 'phantomforce': + case 'shadowforce': + case 'feint': + this.scene.resultAnim(poke, 'Protection broken', 'bad'); + poke.removeTurnstatus('protect' as ID); + for (const target of poke.side.pokemon) { + target.removeTurnstatus('wideguard' as ID); + target.removeTurnstatus('quickguard' as ID); + target.removeTurnstatus('craftyshield' as ID); + target.removeTurnstatus('matblock' as ID); + this.scene.updateStatbar(target); + } + break; + case 'spite': + let move = Tools.getMove(args[3]).name; + let pp = BattleLog.escapeHTML(args[4]); + poke.rememberMove(move, Number(pp)); + break; + case 'gravity': + poke.removeVolatile('magnetrise' as ID); + poke.removeVolatile('telekinesis' as ID); + this.scene.anim(poke, {time: 100}); + break; + case 'skillswap': + if (this.gen <= 4) break; + let pokeability = BattleLog.escapeHTML(args[3]) || ofpoke!.ability; + let ofpokeability = BattleLog.escapeHTML(args[4]) || poke.ability; + if (pokeability) { + poke.ability = pokeability; + if (!ofpoke!.baseAbility) ofpoke!.baseAbility = pokeability; + } + if (ofpokeability) { + ofpoke!.ability = ofpokeability; + if (!poke.baseAbility) poke.baseAbility = ofpokeability; + } + if (poke.side !== ofpoke!.side) { + this.activateAbility(poke, pokeability, true); + this.activateAbility(ofpoke, ofpokeability, true); + } break; - } case '-anim': { - let poke = this.getPokemon(args[1])!; - let move = Tools.getMove(args[2]); - if (this.checkActive(poke)) return; - let poke2 = this.getPokemon(args[3]); - this.scene.beforeMove(poke); - kwargs.silent = '.'; - this.useMove(poke, move, poke2, kwargs); - this.scene.afterMove(poke); + // ability activations + case 'wonderguard': // Deprecated, now uses -immune + this.scene.resultAnim(poke, 'Immune', 'neutral'); + break; + case 'forewarn': + if (ofpoke) { + ofpoke.rememberMove(args[3], 0); + } else { + let foeActive = [] as Pokemon[]; + for (const target of poke.side.foe.active) if (target) foeActive.push(target); + if (foeActive.length === 1) { + foeActive[0].rememberMove(args[3], 0); + } + } + break; + case 'mummy': + if (!args[3]) break; // if Mummy activated but failed, no ability will have been sent + let ability = Tools.getAbility(args[3]); + this.activateAbility(ofpoke, ability.name); + this.activateAbility(poke, "Mummy"); + this.scene.wait(700); + this.activateAbility(ofpoke, "Mummy", true); break; - } case '-hint': { - this.message('', '(' + BattleLog.escapeHTML(args[1]) + ')'); + // item activations + case 'leppaberry': + case 'mysteryberry': + poke.rememberMove(args[3], effect.id === 'leppaberry' ? -10 : -5); + break; + case 'focusband': + poke.item = 'Focus Band'; + break; + case 'safetygoggles': + poke.item = 'Safety Goggles'; + break; + case 'protectivepads': + poke.item = 'Protective Pads'; + break; + default: + if (kwArgs.broken) { // for custom moves that break protection + this.scene.resultAnim(poke, 'Protection broken', 'bad'); + } + } + this.log(args, kwArgs); + break; + } + case '-sidestart': { + let side = this.getSide(args[1]); + let effect = Tools.getEffect(args[2]); + side.addSideCondition(effect); + + switch (effect.id) { + case 'tailwind': + case 'auroraveil': + case 'reflect': + case 'lightscreen': + case 'safeguard': + case 'mist': + this.scene.updateWeather(); break; + } + this.log(args, kwArgs); + break; + } + case '-sideend': { + let side = this.getSide(args[1]); + let effect = Tools.getEffect(args[2]); + // let from = Tools.getEffect(kwArgs.from); + // let ofpoke = this.getPokemon(kwArgs.of); + side.removeSideCondition(effect.name); + this.log(args, kwArgs); + break; + } + case '-weather': { + let effect = Tools.getEffect(args[1]); + let poke = this.getPokemon(kwArgs.of) || undefined; + let ability = Tools.getEffect(kwArgs.from); + if (!effect.id || effect.id === 'none') { + kwArgs.from = this.weather; + } + this.changeWeather(effect.name, poke, !!kwArgs.upkeep, ability); + this.log(args, kwArgs); + break; + } + case '-fieldstart': { + let effect = Tools.getEffect(args[1]); + let poke = this.getPokemon(kwArgs.of); + let fromeffect = Tools.getEffect(kwArgs.from); + this.activateAbility(poke, fromeffect); + let maxTimeLeft = 0; + if (effect.id in {'electricterrain': 1, 'grassyterrain': 1, 'mistyterrain': 1, 'psychicterrain': 1}) { + for (let i = this.pseudoWeather.length - 1; i >= 0; i--) { + let pwName = this.pseudoWeather[i][0]; + if (pwName === 'Electric Terrain' || pwName === 'Grassy Terrain' || pwName === 'Misty Terrain' || pwName === 'Psychic Terrain') { + this.pseudoWeather.splice(i, 1); + continue; + } + } + if (this.gen > 6) maxTimeLeft = 8; + } + this.addPseudoWeather(effect.name, 5, maxTimeLeft); - } default: { - if (this.errorCallback) this.errorCallback(this); + switch (effect.id) { + case 'gravity': + if (!this.fastForward) { + for (const side of this.sides) for (const active of side.active) { + if (active) { + this.scene.runOtherAnim('gravity' as ID, [active]); + } + } + } + break; + } + this.log(args, kwArgs); + break; + } + case '-fieldend': { + let effect = Tools.getEffect(args[1]); + // let poke = this.getPokemon(kwArgs.of); + this.removePseudoWeather(effect.name); + this.log(args, kwArgs); + break; + } + case '-fieldactivate': { + let effect = Tools.getEffect(args[1]); + switch (effect.id) { + case 'perishsong': + this.scene.updateStatbars(); break; - }} - if (actions && actions.slice(-1) !== '>') actions += '
    '; + } + this.log(args, kwArgs); + break; + } + case '-anim': { + let poke = this.getPokemon(args[1])!; + let move = Tools.getMove(args[2]); + if (this.checkActive(poke)) return; + let poke2 = this.getPokemon(args[3]); + this.scene.beforeMove(poke); + kwArgs.silent = '.'; + this.useMove(poke, move, poke2, kwArgs); + this.scene.afterMove(poke); + break; } - if (actions) { - if (actions.slice(-6) === '
    ') actions = actions.slice(0, -6); - this.message('' + actions + '', ''); + case '-hint': case '-message': { + this.log(args, kwArgs); + break; } + default: { + if (this.errorCallback) this.errorCallback(this); + break; + }} } /* parseSpriteData(name) { @@ -4350,34 +2905,35 @@ class Battle { this.preemptActivityQueue.push(command); this.add(command); } - runMajor(args: string[], kwargs: {[k: string]: string}, preempt?: boolean) { + runMajor(args: Args, kwArgs: KWArgs, preempt?: boolean) { switch (args[0]) { case 'start': { this.scene.teamPreviewEnd(); this.mySide.active[0] = null; this.yourSide.active[0] = null; - if (this.waitForResult()) return; this.start(); break; - } case 'upkeep': { + } + case 'upkeep': { this.usesUpkeep = true; this.updatePseudoWeatherLeft(); this.updateToxicTurns(); break; - } case 'turn': { - if (this.endPrevAction()) return; + } + case 'turn': { this.setTurn(args[1]); + this.log(args); break; - } case 'tier': { - if (!args[1]) args[1] = ''; - for (let i in kwargs) args[1] += '[' + i + '] ' + kwargs[i]; - this.scene.log('
    Format:
    ' + BattleLog.escapeHTML(args[1]) + '
    '); + } + case 'tier': { this.tier = args[1]; if (this.tier.slice(-13) === 'Random Battle') { this.speciesClause = true; } + this.log(args); break; - } case 'gametype': { + } + case 'gametype': { this.gameType = args[1] as any; switch (args[1]) { default: @@ -4396,60 +2952,19 @@ class Battle { } this.scene.updateGen(); break; - } case 'variation': { - this.scene.log('
    Variation: ' + BattleLog.escapeHTML(args[1]) + '
    '); - break; - } case 'rule': { - let ruleArgs = args[1].split(': '); - this.scene.log('
    ' + BattleLog.escapeHTML(ruleArgs[0]) + (ruleArgs[1] ? ':' : '') + ' ' + BattleLog.escapeHTML(ruleArgs[1] || '') + '
    '); - if (ruleArgs[0] === 'Species Clause') this.speciesClause = true; + } + case 'rule': { + let ruleName = args[1].split(': ')[0]; + if (ruleName === 'Species Clause') this.speciesClause = true; + this.log(args); break; - } case 'rated': { + } + case 'rated': { this.rated = true; - this.scene.log('
    ' + (BattleLog.escapeHTML(args[1]) || 'Rated battle') + '
    '); - break; - } case ':': { - break; - } case 'chat': case 'c': case 'c:': { - let pipeIndex = args[1].indexOf('|'); - if (args[0] === 'c:') { - args[1] = args[1].slice(pipeIndex + 1); - pipeIndex = args[1].indexOf('|'); - } - let name = args[1].slice(0, pipeIndex); - let rank = name.charAt(0); - if (this.ignoreSpects && (rank === ' ' || rank === '+')) break; - if (this.ignoreOpponent && (rank === '\u2605' || rank === '\u2606') && toUserid(name) !== app.user.get('userid')) break; - if (window.app && app.ignore && app.ignore[toUserid(name)] && (rank === ' ' || rank === '+' || rank === '\u2605' || rank === '\u2606')) break; - let message = args[1].slice(pipeIndex + 1); - let isHighlighted = window.app && app.rooms && app.rooms[this.roomid].getHighlight(message); - let parsedMessage = BattleLog.parseChatMessage(message, name, '', isHighlighted); - if (!Array.isArray(parsedMessage)) parsedMessage = [parsedMessage]; - for (let i = 0; i < parsedMessage.length; i++) { - if (!parsedMessage[i]) continue; - this.scene.log(parsedMessage[i], preempt); - } - if (isHighlighted) { - let notifyTitle = "Mentioned by " + name + " in " + this.roomid; - app.rooms[this.roomid].notifyOnce(notifyTitle, "\"" + message + "\"", 'highlight'); - } - break; - } case 'chatmsg': { - this.scene.log('
    ' + BattleLog.escapeHTML(args[1]) + '
    ', preempt); - break; - } case 'chatmsg-raw': case 'raw': case 'html': { - this.scene.log('
    ' + BattleLog.sanitizeHTML(args[1]) + '
    ', preempt); - break; - } case 'error': { - this.scene.log('
    ' + BattleLog.escapeHTML(args[1]) + '
    ', preempt); - break; - } case 'pm': { - this.scene.log('
    ' + BattleLog.escapeHTML(args[1]) + ': (Private to ' + BattleLog.escapeHTML(args[3]) + ') ' + BattleLog.parseMessage(args[4]) + ''); - break; - } case 'askreg': { - this.scene.log('
    Register an account to protect your ladder rating!
    '); + this.log(args); break; - } case 'inactive': { + } + case 'inactive': { if (!this.kickingInactive) this.kickingInactive = true; if (args[1].slice(0, 11) === "Time left: ") { this.kickingInactive = parseInt(args[1].slice(11), 10) || true; @@ -4469,15 +2984,15 @@ class Battle { this.kickingInactive = parseInt(args[1].slice(hasIndex + 5), 10) || true; } } - this.scene.log('
    ' + BattleLog.escapeHTML(args[1]) + '
    ', preempt); + this.log(args, undefined, preempt); break; - } case 'inactiveoff': { + } + case 'inactiveoff': { this.kickingInactive = false; - this.scene.log('
    ' + BattleLog.escapeHTML(args[1]) + '
    ', preempt); + this.log(args, undefined, preempt); break; - } case 'timer': { - break; - } case 'join': case 'j': { + } + case 'join': case 'j': { if (this.roomid) { let room = app.rooms[this.roomid]; let user = args[1]; @@ -4490,10 +3005,11 @@ class Battle { room.userList.updateNoUsersOnline(); } if (!this.ignoreSpects) { - this.scene.log('
    ' + BattleLog.escapeHTML(args[1]) + ' joined.
    ', preempt); + this.log(args, undefined, preempt); } break; - } case 'leave': case 'l': { + } + case 'leave': case 'l': { if (this.roomid) { let room = app.rooms[this.roomid]; let user = args[1]; @@ -4505,85 +3021,52 @@ class Battle { room.userList.updateNoUsersOnline(); } if (!this.ignoreSpects) { - this.scene.log('
    ' + BattleLog.escapeHTML(args[1]) + ' left.
    ', preempt); + this.log(args, undefined, preempt); } break; - } case 'J': case 'L': case 'N': case 'n': case 'spectator': case 'spectatorleave': { - break; - } case 'player': { + } + case 'player': { let side = this.getSide(args[1]); side.setName(args[2]); if (args[3]) side.setAvatar(args[3]); this.scene.updateSidebar(side); if (this.joinButtons) this.scene.hideJoinButtons(); + this.log(args); break; - } case 'teamsize': { + } + case 'teamsize': { let side = this.getSide(args[1]); side.totalPokemon = parseInt(args[2], 10); this.scene.updateSidebar(side); break; - } case 'win': { - this.winner(args[1]); - break; - } case 'tie': { - this.winner(); + } + case 'win': case 'tie': { + this.winner(args[0] === 'tie' ? undefined : args[1]); break; - } case 'prematureend': { + } + case 'prematureend': { this.prematureEnd(); break; - } case 'clearpoke': { + } + case 'clearpoke': { this.p1.clearPokemon(); this.p2.clearPokemon(); break; - } case 'poke': { + } + case 'poke': { let pokemon = this.getPokemon('new: ' + args[1], args[2])!; if (args[3] === 'item') { pokemon.item = '(exists)'; } break; - } case 'detailschange': { - let poke = this.getPokemon(args[1])!; - poke.removeVolatile('formechange' as ID); - poke.removeVolatile('typeadd' as ID); - poke.removeVolatile('typechange' as ID); - - let newSpecies = args[2]; - let commaIndex = newSpecies.indexOf(','); - if (commaIndex !== -1) { - let level = newSpecies.substr(commaIndex + 1).trim(); - if (level.charAt(0) === 'L') { - poke.level = parseInt(level.substr(1), 10); - } - newSpecies = args[2].substr(0, commaIndex); - } - let template = Tools.getTemplate(newSpecies); - - poke.species = newSpecies; - poke.ability = poke.baseAbility = (template.abilities ? template.abilities['0'] : ''); - poke.weightkg = template.weightkg; - - poke.details = args[2]; - poke.searchid = args[1].substr(0, 2) + args[1].substr(3) + '|' + args[2]; - - this.scene.animTransform(poke, true, true); - if (toId(newSpecies) === 'greninjaash') { - this.message('' + poke.getName() + ' became Ash-Greninja!'); - } else if (toId(newSpecies) === 'mimikyubusted') { - this.message('' + poke.getName() + "'s disguise was busted!"); - } else if (toId(newSpecies) === 'zygardecomplete') { - this.message('' + poke.getName() + ' transformed into its Complete Forme!'); - } else if (toId(newSpecies) === 'necrozmaultra') { - this.message('' + poke.getName() + ' regained its true power through Ultra Burst!'); - } - break; - } case 'teampreview': { + } + case 'teampreview': { this.teamPreviewCount = parseInt(args[1], 10); this.scene.teamPreview(); break; - } case 'switch': case 'drag': case 'replace': { + } + case 'switch': case 'drag': case 'replace': { this.endLastTurn(); - if (!this.hasPreMoveMessage && this.waitForResult()) return; - this.hasPreMoveMessage = false; let poke = this.getPokemon('switchin: ' + args[1], args[2])!; let slot = poke.slot; poke.healthParse(args[3]); @@ -4598,90 +3081,113 @@ class Battle { } else { poke.side.dragIn(poke); } + this.log(args, kwArgs); break; - } case 'faint': { - if (this.waitForResult()) return; + } + case 'faint': { let poke = this.getPokemon(args[1])!; poke.side.faint(poke); + this.log(args, kwArgs); break; - } case 'swap': { + } + case 'swap': { if (isNaN(Number(args[2]))) { let poke = this.getPokemon(args[1])!; - poke.side.swapWith(poke, this.getPokemon(args[2])!, kwargs); + poke.side.swapWith(poke, this.getPokemon(args[2])!, kwArgs); } else { let poke = this.getPokemon(args[1])!; - poke.side.swapTo(poke, parseInt(args[2], 10), kwargs); + poke.side.swapTo(poke, parseInt(args[2], 10), kwArgs); } + this.log(args, kwArgs); break; - } case 'move': { + } + case 'move': { this.endLastTurn(); - if ((!kwargs.from || kwargs.from === 'lockedmove') && !this.hasPreMoveMessage && this.waitForResult()) return; - this.hasPreMoveMessage = false; this.resetTurnsSinceMoved(); let poke = this.getPokemon(args[1])!; let move = Tools.getMove(args[2]); if (this.checkActive(poke)) return; let poke2 = this.getPokemon(args[3]); this.scene.beforeMove(poke); - this.useMove(poke, move, poke2, kwargs); + this.useMove(poke, move, poke2, kwArgs); + this.log(args, kwArgs); this.scene.afterMove(poke); break; - } case 'cant': { + } + case 'cant': { this.endLastTurn(); this.resetTurnsSinceMoved(); - if (!this.hasPreMoveMessage && this.waitForResult()) return; - this.hasPreMoveMessage = false; let poke = this.getPokemon(args[1])!; let effect = Tools.getEffect(args[2]); let move = Tools.getMove(args[3]); - this.cantUseMove(poke, effect, move, kwargs); - break; - } case 'message': { - this.message(BattleLog.escapeHTML(args[1])); - break; - } case 'bigerror': { - this.message('
    ' + BattleLog.escapeHTML(args[1]).replace(/\|/g, '
    ') + '
    '); - break; - } case 'done': case '': { - if (this.ended || this.endPrevAction()) return; + this.cantUseMove(poke, effect, move, kwArgs); break; - } case 'warning': { - this.message('Warning: ' + BattleLog.escapeHTML(args[1])); - this.message('Bug? Report it to the replay viewer\'s Smogon thread'); - this.scene.wait(1000); - break; - } case 'gen': { + } + case 'gen': { this.gen = parseInt(args[1], 10); this.scene.updateGen(); + this.log(args); break; - } case 'callback': { - args.shift(); - if (this.customCallback) this.customCallback(this, args[0], args, kwargs); - break; - } case 'debug': { - args.shift(); - const name = args.join(' '); - this.scene.log('
    [DEBUG] ' + BattleLog.escapeHTML(name) + '.
    ', preempt); - break; - } case 'seed': case 'choice': { - break; - } case 'unlink': { - let user = toId(args[2]) || toId(args[1]); - this.scene.unlink(user, !!args[2]); + } + case 'callback': { + if (this.customCallback) this.customCallback(this, args[1], args.slice(1), kwArgs); break; - } case 'fieldhtml': { + } + case 'fieldhtml': { this.playbackState = Playback.Seeking; // force seeking to prevent controls etc this.scene.setFrameHTML(BattleLog.sanitizeHTML(args[1])); break; - } case 'controlshtml': { + } + case 'controlshtml': { this.scene.setControlsHTML(BattleLog.sanitizeHTML(args[1])); break; - } default: { - this.scene.log('
    Unknown command: ' + BattleLog.escapeHTML(args[0]) + '
    '); - if (this.errorCallback) this.errorCallback(this); + } + default: { + this.log(args, kwArgs); break; }} } + static lineParse(str: string): {args: Args, kwArgs: KWArgs} { + if (!str.startsWith('|')) { + return {args: ['', str], kwArgs: {}}; + } + if (str === '|') { + return {args: ['done'], kwArgs: {}}; + } + const index = str.indexOf('|', 1); + const cmd = str.slice(1, index); + switch (cmd) { + case 'chatmsg': case 'chatmsg-raw': case 'raw': case 'error': case 'html': + case 'inactive': case 'inactiveoff': case 'warning': + case 'fieldhtml': case 'controlshtml': case 'bigerror': + case 'debug': case 'tier': + return {args: [cmd, str.slice(index + 1)], kwArgs: {}}; + case 'c': case 'chat': + // three parts + const index2a = str.indexOf('|', index + 1); + return {args: [cmd, str.slice(index + 1, index2a), str.slice(index2a + 1)], kwArgs: {}}; + case 'c:': + // four parts + const index2b = str.indexOf('|', index + 1); + const index3b = str.indexOf('|', index2b + 1); + return {args: + [cmd, str.slice(index + 1, index2b), str.slice(index2b + 1, index3b), str.slice(index3b + 1)], + kwArgs: {}}; + } + let args = str.slice(1).split('|') as [string, ...string[]]; + let kwArgs = {} as {[k: string]: string}; + while (args.length) { + const lastArg = args[args.length - 1]; + if (lastArg.charAt(0) !== '[') break; + const bracketPos = lastArg.indexOf(']'); + if (bracketPos <= 0) break; + // default to '.' so it evaluates to boolean true + kwArgs[lastArg.slice(1, bracketPos)] = lastArg.slice(bracketPos + 1).trim() || '.'; + args.pop(); + } + return {args, kwArgs}; + } + run(str: string, preempt?: boolean) { if (this.preemptActivityQueue.length && str === this.preemptActivityQueue[0]) { this.preemptActivityQueue.shift(); @@ -4689,78 +3195,45 @@ class Battle { return; } if (!str) return; - if (str.charAt(0) !== '|' || str.substr(0, 2) === '||') { - if (str.charAt(0) === '|') str = str.substr(2); - this.scene.log('
    ' + BattleLog.escapeHTML(str) + '
    ', preempt); + const {args, kwArgs} = Battle.lineParse(str); + + if (this.scene.maybeCloseMessagebar(args, kwArgs)) { + this.activityStep--; + this.activeMoveIsSpread = null; return; } - let args = ['done']; - let kwargs = {} as {[k: string]: string}; - if (str !== '|') { - args = str.substr(1).split('|'); - } - switch (args[0]) { - case 'c': case 'c:': case 'chat': - case 'chatmsg': case 'chatmsg-raw': case 'raw': case 'error': case 'html': - case 'inactive': case 'inactiveoff': case 'warning': - case 'fieldhtml': case 'controlshtml': case 'bigerror': - // chat is preserved untouched - args = [args[0], str.slice(args[0].length + 2)]; - break; - default: - // parse kwargs - while (args.length) { - let argstr = args[args.length - 1]; - if (argstr.substr(0, 1) !== '[') break; - let bracketPos = argstr.indexOf(']'); - if (bracketPos <= 0) break; - // default to '.' so it evaluates to boolean true - kwargs[argstr.substr(1, bracketPos - 1)] = (argstr.substr(bracketPos + 1).trim() || '.'); - args.pop(); - } - } // parse the next line if it's a minor: runMinor needs it parsed to determine when to merge minors - let nextLine = ''; - let nextArgs = ['']; - let nextKwargs = {} as {[k: string]: string}; - nextLine = this.activityQueue[this.activityStep + 1] || ''; + let nextArgs = [''] as Args; + let nextKwargs = {} as KWArgs; + const nextLine = this.activityQueue[this.activityStep + 1] || ''; if (nextLine && nextLine.substr(0, 2) === '|-') { - nextLine = nextLine.substr(1).trim(); - nextArgs = nextLine.split('|'); - while (nextArgs[nextArgs.length - 1] && nextArgs[nextArgs.length - 1].substr(0, 1) === '[') { - let bracketPos = nextArgs[nextArgs.length - 1].indexOf(']'); - if (bracketPos <= 0) break; - let argstr = nextArgs.pop()!; - // default to '.' so it evaluates to boolean true - nextKwargs[argstr.substr(1, bracketPos - 1)] = (argstr.substr(bracketPos + 1).trim() || '.'); - } + ({args: nextArgs, kwArgs: nextKwargs} = Battle.lineParse(nextLine)); } if (this.debug) { - if (args[0].substr(0, 1) === '-') { - this.runMinor(args, kwargs, preempt, nextArgs, nextKwargs); + if (args[0].charAt(0) === '-' || args[0] === 'detailschange') { + this.runMinor(args, kwArgs, nextArgs, nextKwargs); } else { - this.runMajor(args, kwargs, preempt); + this.runMajor(args, kwArgs, preempt); } } else { try { - if (args[0].substr(0, 1) === '-') { - this.runMinor(args, kwargs, preempt, nextArgs, nextKwargs); + if (args[0].charAt(0) === '-' || args[0] === 'detailschange') { + this.runMinor(args, kwArgs, nextArgs, nextKwargs); } else { - this.runMajor(args, kwargs, preempt); + this.runMajor(args, kwArgs, preempt); } } catch (e) { - this.scene.log('
    Error parsing: ' + BattleLog.escapeHTML(str) + ' (' + BattleLog.escapeHTML('' + e) + ')
    ', preempt); + this.log(['majorerror', 'Error parsing: ' + str + ' (' + e + ')']); if (e.stack) { - let stack = BattleLog.escapeHTML('' + e.stack).split('\n'); - for (let i = 0; i < stack.length; i++) { - if (/\brun\b/.test(stack[i])) { - stack.length = i; + let stack = ('' + e.stack).split('\n'); + for (const line of stack) { + if (/\brun\b/.test(line)) { break; } + this.log(['error', line]); } - this.scene.log('
    ' + stack.join('
    ') + '
    ', preempt); } if (this.errorCallback) this.errorCallback(this); } @@ -4773,22 +3246,6 @@ class Battle { } } } - endPrevAction() { - this.hasPreMoveMessage = false; - if (this.minorQueue.length) { - this.runMinor(); - this.activityStep--; - return true; - } - if (this.resultWaiting || this.scene.messagebarOpen) { - this.scene.closeMessagebar(); - this.activityStep--; - this.resultWaiting = false; - this.activeMoveIsSpread = null; - return true; - } - return false; - } checkActive(poke: Pokemon) { if (!poke.side.active[poke.slot]) { // SOMEONE jumped in in the middle of a replay. <_< @@ -4796,11 +3253,6 @@ class Battle { } return false; } - waitForResult() { - if (this.endPrevAction()) return true; - this.resultWaiting = true; - return false; - } pause() { this.paused = true; @@ -4851,6 +3303,7 @@ class Battle { this.scene.startAnimations(); let animations; while (!animations) { + this.waitForAnimations = true; if (this.activityStep >= this.activityQueue.length) { this.fastForwardOff(); if (this.ended) { @@ -4864,7 +3317,11 @@ class Battle { if (this.paused && !this.fastForward) return; this.run(this.activityQueue[this.activityStep]); this.activityStep++; - animations = this.scene.finishAnimations(); + if (this.waitForAnimations === true) { + animations = this.scene.finishAnimations(); + } else if (this.waitForAnimations === 'simult') { + this.scene.timeOffset = 0; + } } if (this.playbackState === Playback.Paused) return; From aa2eecb7cc04d5820988094fa352703b2b04ab2b Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Wed, 14 Nov 2018 16:09:54 -0600 Subject: [PATCH 0054/1782] Add script for testing the new battle parser (Run `./test/parse` and pipe protocol messages to stdin.) --- test/parse | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100755 test/parse diff --git a/test/parse b/test/parse new file mode 100755 index 0000000000..8a4b03229f --- /dev/null +++ b/test/parse @@ -0,0 +1,27 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const path = require('path'); + +process.chdir(path.resolve(__dirname, '..')); + +window = global; +eval('' + fs.readFileSync(`js/battle-dex.js`)); +eval('' + fs.readFileSync(`js/battle-dex-data.js`)); +eval('' + fs.readFileSync(`js/battle.js`)); +eval('' + fs.readFileSync(`data/text.js`)); +eval('' + fs.readFileSync(`js/battle-text-parser.js`)); + +const parser = new BattleTextParser(); + +const readline = require('readline'); +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + terminal: false +}); + +rl.on('line', line => { + const {args, kwArgs} = Battle.lineParse(line); + process.stdout.write(parser.parseLine(args, kwArgs) || ''); +}); From 7d619fb8ea01e9b9d5864eada7e4281efb70452e Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Wed, 14 Nov 2018 18:51:44 -0600 Subject: [PATCH 0055/1782] Remove weather ability-start messages These _are_ real messages from Gen 3, but since it's not like we otherwise accurately simulate Gen 3 messages, it's a bit weird to keep these around. --- data/text.js | 4 ---- src/battle-text-parser.ts | 9 +++------ 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/data/text.js b/data/text.js index d76ff5358a..5b318bf7aa 100644 --- a/data/text.js +++ b/data/text.js @@ -205,7 +205,6 @@ var BattleText = exports.BattleText = { sandstorm: { weatherName: "Sandstorm", start: " A sandstorm kicked up!", - startFromAbility: " [POKEMON]'s Sand Stream whipped up a sandstorm!", end: " The sandstorm subsided.", activate: " The sandstorm is raging.", damage: " [POKEMON] is buffeted by the sandstorm!", @@ -213,21 +212,18 @@ var BattleText = exports.BattleText = { sunnyday: { weatherName: "Sun", start: " The sunlight turned harsh!", - startFromAbility: " [POKEMON]'s Drought intensified the sun's rays!", end: " The sunlight faded.", activate: " (The sunlight is strong!)", }, raindance: { weatherName: "Rain", start: " It started to rain!", - startFromAbility: " [POKEMON]'s Drizzle made it rain!", end: " The rain stopped.", activate: " (Rain continues to fall!)", }, hail: { weatherName: "Hail", start: " It started to hail!", - startFromAbility: " [POKEMON]'s Snow Warning whipped up a hailstorm!", end: " The hail stopped.", activate: " The hail is crashing down.", damage: " [POKEMON] is buffeted by the hail!", diff --git a/src/battle-text-parser.ts b/src/battle-text-parser.ts index c4dea59881..b61d5daa1f 100644 --- a/src/battle-text-parser.ts +++ b/src/battle-text-parser.ts @@ -536,18 +536,15 @@ class BattleTextParser { case '-weather': { const [, weather] = args; - const line1 = this.maybeAbility(kwArgs.from, kwArgs.of); if (!weather || weather === 'none') { return this.template('end', kwArgs.from); } if (kwArgs.upkeep) { return this.template('activate', weather); } - if (!kwArgs.of) { - return this.template('start', weather); - } - const template = this.template('startFromAbility', weather); - return line1 + template.replace('[POKEMON]', this.pokemon(kwArgs.of)); + const line1 = this.maybeAbility(kwArgs.from, kwArgs.of); + const template = this.template('start', weather, 'NODEFAULT'); + return line1 + template; } case '-fieldstart': case '-fieldactivate': { From 3bd4ff0eb006bee5c6714572b0941cfd7dbe5855 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Wed, 14 Nov 2018 18:53:57 -0600 Subject: [PATCH 0056/1782] Add default start messages Default start messages do two things: 1. Remind us that we don't have a real message coded for an effect. 2. Support showing any kind of start message by default for custom modded games. (It's of course still an option to pass `[silent]` and then add a custom message with `|-message|`.) --- data/text.js | 9 ++++++--- src/battle-text-parser.ts | 27 ++++++++++++++++++--------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/data/text.js b/data/text.js index 5b318bf7aa..686a73d51e 100644 --- a/data/text.js +++ b/data/text.js @@ -43,9 +43,13 @@ var BattleText = exports.BattleText = { typeChangeFromEffect: " [POKEMON]'s [EFFECT] made it the [TYPE] type!", typeAdd: " [TYPE] type was added to [POKEMON]!", - start: " ([POKEMON]'s [EFFECT] started!)", + start: " ([EFFECT] started on [POKEMON]!)", end: " [POKEMON] was freed from [EFFECT]!", - activate: " ([POKEMON]'s [EFFECT] activated!)", + activate: " ([EFFECT] activated!)", + startTeamEffect: " ([EFFECT] started on [TEAM]!)", + endTeamEffect: " ([EFFECT] ended on [TEAM]!)", + startFieldEffect: " ([EFFECT] started!)", + endFieldEffect: " ([EFFECT] ended!)", changeAbility: " [POKEMON] acquired [ABILITY]!", addItem: " [POKEMON] obtained one [ITEM].", // Trick, Switcheroo @@ -165,7 +169,6 @@ var BattleText = exports.BattleText = { confusion: { start: " [POKEMON] became confused!", startFromFatigue: " [POKEMON] became confused due to fatigue!", - // end: " [POKEMON] snapped out of confusion!", // PO artifact? end: " [POKEMON] snapped out of its confusion!", endFromItem: " [POKEMON]'s [ITEM] snapped it out of its confusion!", alreadyStarted: " [POKEMON] is already confused!", diff --git a/src/battle-text-parser.ts b/src/battle-text-parser.ts index b61d5daa1f..391171ddfe 100644 --- a/src/battle-text-parser.ts +++ b/src/battle-text-parser.ts @@ -129,9 +129,10 @@ class BattleTextParser { return ''; } let id = this.effectId(namespace); - if (BattleText[id] && BattleText[id][type]) { + if (BattleText[id] && type in BattleText[id]) { if (BattleText[id][type].charAt(1) === '.') type = BattleText[id][type].slice(2) as ID; if (BattleText[id][type].charAt(0) === '#') id = BattleText[id][type].slice(1) as ID; + if (!BattleText[id][type]) return ''; return BattleText[id][type] + '\n'; } } @@ -502,7 +503,8 @@ class BattleTextParser { const template = this.template('endFromMove', status); return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[MOVE]', this.effect(kwArgs.from)); } - const template = this.template('end', status); + let template = this.template('end', status, 'NODEFAULT'); + if (!template) template = this.template('end').replace('[EFFECT]', status); return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)); } @@ -518,19 +520,22 @@ class BattleTextParser { const template = this.template('activate', effect); return line1 + template.replace('[POKEMON]', this.pokemon(kwArgs.of)).replace('[TARGET]', this.pokemon(pokemon)); } - const template = this.template('start', effect); + let template = this.template('start', effect, 'NODEFAULT'); + if (!template) template = this.template('start').replace('[EFFECT]', this.effect(effect)); return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[SOURCE]', this.pokemon(kwArgs.of)); } case '-sidestart': { let [, side, effect] = args; - const template = this.template('start', effect); + let template = this.template('start', effect, 'NODEFAULT'); + if (!template) template = this.template('startTeamEffect').replace('[EFFECT]', this.effect(effect)); return template.replace('[TEAM]', this.team(side)); } case '-sideend': { let [, side, effect] = args; - const template = this.template('end', effect); + let template = this.template('end', effect, 'NODEFAULT'); + if (!template) template = this.template('endTeamEffect').replace('[EFFECT]', this.effect(effect)); return template.replace('[TEAM]', this.team(side)); } @@ -543,7 +548,8 @@ class BattleTextParser { return this.template('activate', weather); } const line1 = this.maybeAbility(kwArgs.from, kwArgs.of); - const template = this.template('start', weather, 'NODEFAULT'); + let template = this.template('start', weather, 'NODEFAULT'); + if (!template) template = this.template('startFieldEffect').replace('[EFFECT]', this.effect(weather)); return line1 + template; } @@ -551,13 +557,16 @@ class BattleTextParser { const [, effect] = args; const line1 = this.maybeAbility(kwArgs.from, kwArgs.of); const templateId = cmd.slice(6); - const template = this.template(templateId, effect, 'NODEFAULT'); + let template = this.template(templateId, effect, 'NODEFAULT'); + if (!template) template = this.template('startFieldEffect').replace('[EFFECT]', this.effect(effect)); return line1 + template.replace('[POKEMON]', this.pokemon(kwArgs.of)); } case '-fieldend': { let [, effect] = args; - return this.template('end', effect, 'NODEFAULT'); + let template = this.template('end', effect, 'NODEFAULT'); + if (!template) template = this.template('endFieldEffect').replace('[EFFECT]', this.effect(effect)); + return template; } case '-sethp': { @@ -619,7 +628,7 @@ class BattleTextParser { let template = this.template(templateId, effect, 'NODEFAULT'); if (!template) { template = this.template('activate'); - return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[EFFECT]', this.effect(effect)); + return line1 + template.replace('[EFFECT]', this.effect(effect)); } if (id === 'brickbreak') { From f75d85fdaf557bf54bbca26a1d02c359b314d567 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Wed, 14 Nov 2018 21:42:19 -0600 Subject: [PATCH 0057/1782] Reimplement "ignore nicknames" without CSS Honestly, the CSS solution was really cool. It was just incompatible with the new system. It also had enough other flaws (like, bad accessibility) that I don't feel _too_ bad about ripping it out. The new version is less code, anyway, although it does have the flaw of needing to replay the battle if you turn nicknames on or off. Fortunately, that should be a rare enough occurrence not to be a big deal. --- js/client-battle.js | 35 ++--------------------------------- src/battle-animations.ts | 17 +++++++++++------ src/battle-log.ts | 3 --- src/battle-text-parser.ts | 33 ++++++++++++--------------------- src/battle.ts | 8 +++++--- style/battle.css | 9 --------- 6 files changed, 30 insertions(+), 75 deletions(-) diff --git a/js/client-battle.js b/js/client-battle.js index 5549e52a19..2de868c64b 100644 --- a/js/client-battle.js +++ b/js/client-battle.js @@ -1378,43 +1378,12 @@ this.battle.ignoreNicks = !!e.currentTarget.checked; Tools.prefs('ignorenicks', this.battle.ignoreNicks); this.battle.add('Nicknames ' + (this.battle.ignoreNicks ? '' : 'no longer ') + 'ignored.'); - this.toggleNicknames(this.battle.mySide); - this.toggleNicknames(this.battle.yourSide); - - var $log = $('.battle-log .inner'); - var $message = $('.battle .message'); - if (this.battle.ignoreNicks) { - $log.addClass('hidenicks'); - $message.addClass('hidenicks'); - } else { - $log.removeClass('hidenicks'); - $message.removeClass('hidenicks'); - } + this.battle.resetToCurrentTurn(); }, toggleIgnoreOpponent: function (e) { this.battle.ignoreOpponent = !!e.currentTarget.checked; this.battle.add('Opponent ' + (this.battle.ignoreOpponent ? '' : 'no longer ') + 'ignored.'); - var $log = $('.battle-log .inner'); - var $message = $('.battle .message'); - var $messages = $log.find('.chatmessage-' + this.battle.yourSide.id); - if (!$messages.length) return; - if (this.battle.ignoreOpponent) { - $messages.hide(); - $log.addClass('hidenicks'); - $message.addClass('hidenicks'); - } else { - $messages.show(); - $log.removeClass('hidenicks'); - $message.removeClass('hidenicks'); - } - }, - toggleNicknames: function (side) { - for (var i = 0; i < side.active.length; i++) { - if (!side.active[i]) continue; - side.active[i].statbarElem.html(side.getStatbarHTML(side.active[i], true)); - side.updateStatbar(side.active[i], true, true); - } - side.updateSidebar(); + this.battle.resetToCurrentTurn(); }, toggleRightPanelBattles: function (e) { Tools.prefs('rightpanelbattles', !!e.currentTarget.checked); diff --git a/src/battle-animations.ts b/src/battle-animations.ts index 7320f1fe2e..f0c82b890e 100644 --- a/src/battle-animations.ts +++ b/src/battle-animations.ts @@ -163,6 +163,17 @@ class BattleScene { $frame.addClass('battle'); this.$frame = $frame; this.log = new BattleLog($logFrame[0] as HTMLDivElement, this); + this.log.battleParser!.pokemonName = (pokemonId: string) => { + if (!pokemonId) return ''; + if (battle.ignoreNicks || battle.ignoreOpponent) { + const pokemon = battle.getPokemon(pokemonId); + if (pokemon) return pokemon.species; + } + if (!pokemonId.startsWith('p1') && !pokemonId.startsWith('p2')) return '???pokemon:' + pokemonId + '???'; + if (pokemonId.charAt(3) === ':') return pokemonId.slice(4).trim(); + else if (pokemonId.charAt(2) === ':') return pokemonId.slice(3).trim(); + return '???pokemon:' + pokemonId + '???'; + }; let numericId = 0; if (battle.id) { @@ -234,12 +245,6 @@ class BattleScene { this.$battle.append(this.$delay); this.$battle.append(this.$hiddenMessage); - if (this.battle.ignoreNicks) { - this.log.setHideNicks(true); - this.$messagebar.addClass('hidenicks'); - this.$hiddenMessage.addClass('hidenicks'); - } - if (!this.animating) { this.$battle.append('
    seeking...
    '); } diff --git a/src/battle-log.ts b/src/battle-log.ts index 004cefeec4..6326673292 100644 --- a/src/battle-log.ts +++ b/src/battle-log.ts @@ -60,9 +60,6 @@ class BattleLog { destroy() { this.elem.onscroll = null; } - setHideNicks(hideNicks: boolean) { - this.elem.className = this.className + (hideNicks ? ' hidenicks' : ''); - } add(args: Args, kwArgs?: KWArgs, preempt?: boolean) { if (kwArgs && kwArgs.silent) return; let divClass = 'chat'; diff --git a/src/battle-text-parser.ts b/src/battle-text-parser.ts index 391171ddfe..114e09ead5 100644 --- a/src/battle-text-parser.ts +++ b/src/battle-text-parser.ts @@ -43,38 +43,29 @@ class BattleTextParser { return input.replace(/[\\^$.*+?()[\]{}|]/g, '\\$&'); } + pokemonName = (pokemon: string) => { + if (!pokemon) return ''; + if (!pokemon.startsWith('p1') && !pokemon.startsWith('p2')) return '???pokemon:' + pokemon + '???'; + if (pokemon.charAt(3) === ':') return pokemon.slice(4).trim(); + else if (pokemon.charAt(2) === ':') return pokemon.slice(3).trim(); + return '???pokemon:' + pokemon + '???'; + }; + pokemon(pokemon: string) { if (!pokemon) return ''; let side; if (pokemon.startsWith('p1')) side = 0; else if (pokemon.startsWith('p2')) side = 1; else return '???pokemon:' + pokemon + '???'; - if (pokemon.charAt(3) === ':') pokemon = pokemon.slice(4).trim(); - else if (pokemon.charAt(2) === ':') pokemon = pokemon.slice(3).trim(); - else return '???pokemon:' + pokemon + '???'; + const name = this.pokemonName(pokemon); let template = BattleText.default[side === this.perspective ? 'pokemon' : 'opposingPokemon']; - return template.replace('[NICKNAME]', pokemon); - } - - pokemonName(pokemon: string) { - if (!pokemon) return ''; - if (!pokemon.startsWith('p1') && !pokemon.startsWith('p2')) return '???pokemon:' + pokemon + '???'; - if (pokemon.charAt(3) === ':') pokemon = pokemon.slice(4).trim(); - else if (pokemon.charAt(2) === ':') pokemon = pokemon.slice(3).trim(); - else return '???pokemon:' + pokemon + '???'; - return pokemon; + return template.replace('[NICKNAME]', name); } pokemonFull(pokemon: string, details: string) { - if (pokemon.startsWith('p1')) {} - else if (pokemon.startsWith('p2')) {} - else return '???pokemon:' + pokemon + '???'; - let nickname; - if (pokemon.charAt(3) === ':') nickname = pokemon.slice(4).trim(); - else if (pokemon.charAt(2) === ':') nickname = pokemon.slice(3).trim(); - else return '???pokemon:' + pokemon + '???'; + const nickname = this.pokemonName(pokemon); - let species = details.split(',')[0]; + const species = details.split(',')[0]; if (nickname === species) return [pokemon.slice(0, 2), `**${species}**`]; return [pokemon.slice(0, 2), `${nickname} (**${species}**)`]; } diff --git a/src/battle.ts b/src/battle.ts index 4c4e245aad..f612f93c9d 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -1033,15 +1033,13 @@ class Battle { this.scene.log.add(args, kwArgs, preempt); } - switchSides(replay?: boolean) { + resetToCurrentTurn() { if (this.ended) { - this.setSidesSwitched(!this.sidesSwitched); this.reset(true); this.fastForwardTo(-1); } else { let turn = this.turn; let paused = this.paused; - this.setSidesSwitched(!this.sidesSwitched); this.reset(true); this.paused = paused; if (turn) this.fastForwardTo(turn); @@ -1052,6 +1050,10 @@ class Battle { } } } + switchSides() { + this.setSidesSwitched(!this.sidesSwitched); + this.resetToCurrentTurn(); + } setSidesSwitched(sidesSwitched: boolean) { this.sidesSwitched = sidesSwitched; if (this.sidesSwitched) { diff --git a/style/battle.css b/style/battle.css index e5f63b2670..ba03df766b 100644 --- a/style/battle.css +++ b/style/battle.css @@ -952,12 +952,3 @@ button.subtle { button.subtle:hover { text-decoration: underline; } -.hidenicks span.battle-nickname, -.hidenicks span.battle-nickname-foe { - font-size: 0; -} -.hidenicks span.battle-nickname::before, -.hidenicks span.battle-nickname-foe::before{ - content: attr(title); - font-size: 9pt; -} From 80684f698c20792023d202d173365105074e62e9 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Wed, 14 Nov 2018 22:04:49 -0600 Subject: [PATCH 0058/1782] Drop BattleLog dependency from headless Battles Mostly, this involves removing `BattleLog.escapeHTML` from `battle.ts`. All previous use-cases have been replaced with something like `Tools.sanitizeName`. Technically, the dependency remains for `|controlshtml|` and `|fieldhtml|`, but these will be dropped for BattleRoom/GameRoom separation, to be done in the Preact rewrite. --- src/battle-animations.ts | 6 ++++++ src/battle-scene-stub.ts | 1 + src/battle.ts | 19 +++++++++---------- test/battle-test.mocha.js | 1 - 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/battle-animations.ts b/src/battle-animations.ts index f0c82b890e..97f56551ec 100644 --- a/src/battle-animations.ts +++ b/src/battle-animations.ts @@ -1200,6 +1200,12 @@ class BattleScene { } } + typeAnim(pokemon: Pokemon, types: string) { + const result = BattleLog.escapeHTML(types).split('/').map(type => + '' + type + '' + ).join(' '); + this.resultAnim(pokemon, types, 'neutral'); + } resultAnim(pokemon: Pokemon, result: string, type: 'bad' | 'good' | 'neutral' | StatusName) { if (!this.animating) return; let $effect = $('
    ' + result + '
    '); diff --git a/src/battle-scene-stub.ts b/src/battle-scene-stub.ts index 1ff858d3a3..cdec3f1c5f 100644 --- a/src/battle-scene-stub.ts +++ b/src/battle-scene-stub.ts @@ -28,6 +28,7 @@ class BattleSceneStub { removeSideCondition(siden: number, id: ID): void { } reset(): void { } resultAnim(pokemon: Pokemon, result: string, type: "bad" | "good" | "neutral" | "par" | "psn" | "frz" | "slp" | "brn"): void { } + typeAnim(pokemon: Pokemon, types: string): void { } resume(): void { } runMoveAnim(moveid: ID, participants: Pokemon[]): void { } runOtherAnim(moveid: ID, participants: Pokemon[]): void { } diff --git a/src/battle.ts b/src/battle.ts index f612f93c9d..cb3749e87b 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -2086,22 +2086,20 @@ class Battle { this.activateAbility(ofpoke || poke, fromeffect); switch (effect.id) { case 'typechange': - const types = BattleLog.escapeHTML(args[3]); + const types = Tools.sanitizeName(args[3]); poke.removeVolatile('typeadd' as ID); poke.addVolatile('typechange' as ID, types); if (kwArgs.silent) { this.scene.updateStatbar(poke); break; } - this.scene.resultAnim(poke, types.split('/').map(function (type) { - return '' + type + ''; - }).join(' '), 'neutral'); + this.scene.typeAnim(poke, types); break; case 'typeadd': - const type = BattleLog.escapeHTML(args[3]); + const type = Tools.sanitizeName(args[3]); poke.addVolatile('typeadd' as ID, type); if (kwArgs.silent) break; - this.scene.resultAnim(poke, '' + type + '', 'neutral'); + this.scene.typeAnim(poke, type); break; case 'powertrick': this.scene.resultAnim(poke, 'Power Trick', 'neutral'); @@ -2444,8 +2442,9 @@ class Battle { break; case 'spite': let move = Tools.getMove(args[3]).name; - let pp = BattleLog.escapeHTML(args[4]); - poke.rememberMove(move, Number(pp)); + let pp = Number(args[4]); + if (isNaN(pp)) pp = 4; + poke.rememberMove(move, pp); break; case 'gravity': poke.removeVolatile('magnetrise' as ID); @@ -2454,8 +2453,8 @@ class Battle { break; case 'skillswap': if (this.gen <= 4) break; - let pokeability = BattleLog.escapeHTML(args[3]) || ofpoke!.ability; - let ofpokeability = BattleLog.escapeHTML(args[4]) || poke.ability; + let pokeability = Tools.sanitizeName(args[3]) || ofpoke!.ability; + let ofpokeability = Tools.sanitizeName(args[4]) || poke.ability; if (pokeability) { poke.ability = pokeability; if (!ofpoke!.baseAbility) ofpoke!.baseAbility = pokeability; diff --git a/test/battle-test.mocha.js b/test/battle-test.mocha.js index f3c62d686b..964be32373 100644 --- a/test/battle-test.mocha.js +++ b/test/battle-test.mocha.js @@ -8,7 +8,6 @@ window = global; // Without making these modules, the best we can do is directly include them into this workspace. eval('' + fs.readFileSync(`js/battle-scene-stub.js`)); -eval('' + fs.readFileSync(`js/battle-log.js`)); eval('' + fs.readFileSync(`js/battle-dex.js`)); eval('' + fs.readFileSync(`js/battle-dex-data.js`)); eval('' + fs.readFileSync(`js/battle.js`)); From 38b66272f2bbf5c0d91d2f1793b4ff860dd9d798 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Thu, 15 Nov 2018 15:35:28 -0600 Subject: [PATCH 0059/1782] Fix issues identified by LGTM Out of 12 issues found: 3 bugs: - duplicate property - caught a bug in Gen 1 Light Screen - duplicate property - caught a bug in Gen 1 Reflect - unused variable - caught a bug in type animations 7 harmless but good for code quality: - unused variable - harmless but good for code quality - unused variable - harmless but good for code quality - unused variable - harmless but good for code quality - unused variable - harmless but good for code quality - duplicate case - harmless but important for code quality - unused variable - harmless but good for code quality - unused variable - harmless but important for code quality 2 not-bugs that had to be worked around: - unused variable - used for an `eval` trick, had to use a workaround - unused variable - used for readable destructuring I think on balance, LGTM does more good than bad. Catching bugs early is worth some amount of hassle. (Also like half these problems are problems tslint could catch if I actually bothered to set it up...) --- data/text.js | 6 +++--- src/battle-animations.ts | 5 ++--- src/battle-text-parser.ts | 11 +++-------- src/battle.ts | 19 ++++++------------- test/parse | 13 ++++++++----- 5 files changed, 22 insertions(+), 32 deletions(-) diff --git a/data/text.js b/data/text.js index 686a73d51e..c1f2aae7c8 100644 --- a/data/text.js +++ b/data/text.js @@ -1,4 +1,4 @@ -var BattleText = exports.BattleText = { +exports.BattleText = { default: { startBattle: "Battle started between [TRAINER] and [TRAINER]!", winBattle: "**[TRAINER]** won the battle!", @@ -552,7 +552,7 @@ var BattleText = exports.BattleText = { start: " Light Screen made [TEAM] stronger against special moves!", end: " [TEAM]'s Light Screen wore off!", // gen 1 - start: " [POKEMON]'s protected against special attacks!", + startGen1: " [POKEMON]'s protected against special attacks!", }, lockon: { start: " [SOURCE] took aim at [POKEMON]!", @@ -672,7 +672,7 @@ var BattleText = exports.BattleText = { start: " Reflect made [TEAM] stronger against physical moves!", end: " [TEAM]'s Reflect wore off!", // gen 1 - start: " [POKEMON] gained armor!", + startGen1: " [POKEMON] gained armor!", }, reflecttype: { typeChange: " [POKEMON]'s type became the same as [SOURCE]'s type!", diff --git a/src/battle-animations.ts b/src/battle-animations.ts index 97f56551ec..08ffc18301 100644 --- a/src/battle-animations.ts +++ b/src/battle-animations.ts @@ -494,7 +494,7 @@ class BattleScene { preemptCatchup() { this.log.preemptCatchup(); } - message(message: string, hiddenMessage?: string) { + message(message: string) { if (!this.messagebarOpen) { this.log.addSpacer(); if (this.animating) { @@ -510,7 +510,6 @@ class BattleScene { } } if (this.battle.hardcoreMode && message.slice(0, 8) === '(') { - hiddenMessage = message + hiddenMessage; message = ''; } if (message && this.animating) { @@ -1204,7 +1203,7 @@ class BattleScene { const result = BattleLog.escapeHTML(types).split('/').map(type => '' + type + '' ).join(' '); - this.resultAnim(pokemon, types, 'neutral'); + this.resultAnim(pokemon, result, 'neutral'); } resultAnim(pokemon: Pokemon, result: string, type: 'bad' | 'good' | 'neutral' | StatusName) { if (!this.animating) return; diff --git a/src/battle-text-parser.ts b/src/battle-text-parser.ts index 114e09ead5..febfa859b9 100644 --- a/src/battle-text-parser.ts +++ b/src/battle-text-parser.ts @@ -327,12 +327,6 @@ class BattleTextParser { return line1 + template.replace('[POKEMON]', this.pokemon(pokemon)).replace('[MOVE]', move); } - case 'faint': { - const [, pokemon] = args; - const template = this.template('faint'); - return template.replace('[POKEMON]', this.pokemon(pokemon)); - } - case 'message': { let [, message] = args; return '' + message + '\n'; @@ -367,6 +361,7 @@ class BattleTextParser { if (kwArgs.damage) templateId = 'activate'; if (kwArgs.block) templateId = 'block'; if (kwArgs.upkeep) templateId = 'activate'; + if (id === 'reflect' || id === 'lightscreen') templateId = 'startGen1'; let template = ''; if (templateId === 'start' && kwArgs.from && kwArgs.from.startsWith('item:')) { template = this.template('startFromItem', effect); @@ -449,7 +444,7 @@ class BattleTextParser { } case '-enditem': { - let [, pokemon, item, arg3] = args; + let [, pokemon, item] = args; const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); if (kwArgs.eat) { const template = this.template('eatItem', kwArgs.from); @@ -653,7 +648,7 @@ class BattleTextParser { } case '-damage': { - let [, pokemon, newHealth, percentage] = args; + let [, pokemon, , percentage] = args; let template = this.template('damage', kwArgs.from, 'NODEFAULT'); const line1 = this.maybeAbility(kwArgs.from, kwArgs.of || pokemon); const id = this.effectId(kwArgs.from); diff --git a/src/battle.ts b/src/battle.ts index cb3749e87b..bac1db7ecb 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -1506,13 +1506,12 @@ class Battle { let poke = this.getPokemon(args[1])!; let poke2 = this.getPokemon(args[2])!; let stats = args[3] ? args[3].split(', ') : ['atk', 'def', 'spa', 'spd', 'spe', 'accuracy', 'evasion']; - let effect = Tools.getEffect(kwArgs.from); - for (let i = 0; i < stats.length; i++) { - let tmp = poke.boosts[stats[i]]; - poke.boosts[stats[i]] = poke2.boosts[stats[i]]; - if (!poke.boosts[stats[i]]) delete poke.boosts[stats[i]]; - poke2.boosts[stats[i]] = tmp; - if (!poke2.boosts[stats[i]]) delete poke2.boosts[stats[i]]; + for (const stat of stats) { + let tmp = poke.boosts[stat]; + poke.boosts[stat] = poke2.boosts[stat]; + if (!poke.boosts[stat]) delete poke.boosts[stat]; + poke2.boosts[stat] = tmp; + if (!poke2.boosts[stat]) delete poke2.boosts[stat]; } this.scene.resultAnim(poke, 'Stats swapped', 'neutral'); this.scene.resultAnim(poke2, 'Stats swapped', 'neutral'); @@ -1621,7 +1620,6 @@ class Battle { } case '-immune': { let poke = this.getPokemon(args[1])!; - let effect = Tools.getEffect(args[2]); let fromeffect = Tools.getEffect(kwArgs.from); this.activateAbility(this.getPokemon(kwArgs.of) || poke, fromeffect); this.log(args, kwArgs); @@ -1874,7 +1872,6 @@ class Battle { let poke = this.getPokemon(args[1])!; let item = Tools.getItem(args[2]); let effect = Tools.getEffect(kwArgs.from); - let ofpoke = this.getPokemon(kwArgs.of); poke.item = ''; poke.itemEffect = ''; poke.prevItem = item.name; @@ -2311,8 +2308,6 @@ class Battle { case '-singleturn': { let poke = this.getPokemon(args[1])!; let effect = Tools.getEffect(args[2]); - let ofpoke = this.getPokemon(kwArgs.of); - // let fromeffect = Tools.getEffect(kwArgs.from); poke.addTurnstatus(effect.id); switch (effect.id) { @@ -2360,8 +2355,6 @@ class Battle { case '-singlemove': { let poke = this.getPokemon(args[1])!; let effect = Tools.getEffect(args[2]); - // let ofpoke = this.getPokemon(kwArgs.of); - // let fromeffect = Tools.getEffect(kwArgs.from); poke.addMovestatus(effect.id); switch (effect.id) { diff --git a/test/parse b/test/parse index 8a4b03229f..2862eb37fa 100755 --- a/test/parse +++ b/test/parse @@ -6,11 +6,14 @@ const path = require('path'); process.chdir(path.resolve(__dirname, '..')); window = global; -eval('' + fs.readFileSync(`js/battle-dex.js`)); -eval('' + fs.readFileSync(`js/battle-dex-data.js`)); -eval('' + fs.readFileSync(`js/battle.js`)); -eval('' + fs.readFileSync(`data/text.js`)); -eval('' + fs.readFileSync(`js/battle-text-parser.js`)); +{ + let exports = global; + eval('' + fs.readFileSync(`js/battle-dex.js`)); + eval('' + fs.readFileSync(`js/battle-dex-data.js`)); + eval('' + fs.readFileSync(`js/battle.js`)); + eval('' + fs.readFileSync(`data/text.js`)); + eval('' + fs.readFileSync(`js/battle-text-parser.js`)); +} const parser = new BattleTextParser(); From f8ce20970f59fff37d9e6c835f29aeda58f9daee Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Thu, 15 Nov 2018 19:00:15 -0600 Subject: [PATCH 0060/1782] Fix other infinite loop in Transform This hasn't come up yet, but we might as well handle it before it comes up. Also slightly refactor `rememberMove`. --- src/battle.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/battle.ts b/src/battle.ts index bac1db7ecb..0df42e599b 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -319,9 +319,8 @@ class Pokemon { this.clearMovestatuses(); this.side.battle.scene.clearEffects(this); } - rememberMove(moveName: string, pp?: number, recursionSource?: string) { + rememberMove(moveName: string, pp = 1, recursionSource?: string) { if (recursionSource === this.ident) return; - if (pp === undefined) pp = 1; moveName = Tools.getMove(moveName).name; if (moveName.charAt(0) === '*') return; if (moveName === 'Struggle') return; @@ -331,10 +330,10 @@ class Pokemon { this.volatiles.transform[1].rememberMove(moveName, 0, recursionSource); moveName = '*' + moveName; } - for (let i = 0; i < this.moveTrack.length; i++) { - if (moveName === this.moveTrack[i][0]) { - this.moveTrack[i][1] += pp; - if (this.moveTrack[i][1] < 0) this.moveTrack[i][1] = 0; + for (const entry of this.moveTrack) { + if (moveName === entry[0]) { + entry[1] += pp; + if (entry[1] < 0) entry[1] = 0; return; } } @@ -2020,6 +2019,7 @@ class Battle { let poke = this.getPokemon(args[1])!; let tpoke = this.getPokemon(args[2])!; let effect = Tools.getEffect(kwArgs.from); + if (poke === tpoke) throw new Error("Transforming into self"); if (!kwArgs.silent) { this.activateAbility(poke, effect); From 8669bae196012654c7691f775d78b45e9f107a43 Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Thu, 15 Nov 2018 22:35:33 -0600 Subject: [PATCH 0061/1782] Add tslint Probably the most controversial change here is that I have a max line length limit, currently set to 140 columns. Lines that set up a string buffer, lines involving regexes, and the text parser's replace chains are excluded from the limit. PS has otherwise been moving towards a line length limit, it just hasn't been linter-enforced yet. I worry about contributors being annoyed by it, especially since it's not like it's handled automatically by Prettier or something. Oh well, it's set to "warning" so Travis won't yell about it. --- package.json | 1 + src/battle-animations-moves.ts | 10736 +++++++++++++++---------------- src/battle-animations.ts | 1520 +++-- src/battle-dex-data.ts | 62 +- src/battle-dex.ts | 131 +- src/battle-log.ts | 100 +- src/battle-scene-stub.ts | 2 +- src/battle-text-parser.ts | 40 +- src/battle.ts | 183 +- tslint.json | 54 + 10 files changed, 6469 insertions(+), 6360 deletions(-) create mode 100644 tslint.json diff --git a/package.json b/package.json index edd14dcd93..8a5a04b2ff 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "eslint": "^4.11.0", "mocha": "^5.2.0", "preact": "^8.3.1", + "tslint": "^5.11.0", "typescript": "^3.1.3" }, "private": true diff --git a/src/battle-animations-moves.ts b/src/battle-animations-moves.ts index 4942241acb..7f40e23d21 100644 --- a/src/battle-animations-moves.ts +++ b/src/battle-animations-moves.ts @@ -18,7 +18,7 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 30, z: attacker.z, scale: 0.4, - opacity: 1 + opacity: 1, }, { x: attacker.x + 30, y: attacker.y + 35, @@ -26,7 +26,7 @@ const BattleMoveAnims: AnimTable = { xscale: 0.3, yscale: 0.6, opacity: 1, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('pointer', { x: attacker.x + 30, @@ -36,7 +36,7 @@ const BattleMoveAnims: AnimTable = { xscale: 0.3, yscale: 0.6, opacity: 1, - time: 400 + time: 400, }, { x: attacker.x + 60, y: attacker.y + 30, @@ -44,7 +44,7 @@ const BattleMoveAnims: AnimTable = { xscale: 0.4, yscale: 0.4, opacity: 0, - time: 900 + time: 900, }, 'linear'); scene.showEffect('angry', { @@ -53,11 +53,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.5, - time: 200 + time: 200, }, { scale: 1, opacity: 1, - time: 500 + time: 500, }, 'ballistic2Under', 'fade'); scene.showEffect('angry', { x: defender.x - 20, @@ -65,11 +65,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.5, - time: 300 + time: 300, }, { scale: 1, opacity: 1, - time: 600 + time: 600, }, 'ballistic2Under', 'fade'); scene.showEffect('angry', { x: defender.x, @@ -77,13 +77,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.5, - time: 400 + time: 400, }, { scale: 1, opacity: 1, - time: 700 + time: 700, }, 'ballistic2Under', 'fade'); - } + }, }, instruct: { anim(scene, [attacker, defender]) { @@ -93,7 +93,7 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 30, z: attacker.z, scale: 0.4, - opacity: 1 + opacity: 1, }, { x: attacker.x + 30, y: attacker.y + 35, @@ -101,7 +101,7 @@ const BattleMoveAnims: AnimTable = { xscale: 0.3, yscale: 0.6, opacity: 1, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('pointer', { x: attacker.x + 30, @@ -111,7 +111,7 @@ const BattleMoveAnims: AnimTable = { xscale: 0.3, yscale: 0.6, opacity: 1, - time: 400 + time: 400, }, { x: attacker.x + 60, y: attacker.y + 30, @@ -119,7 +119,7 @@ const BattleMoveAnims: AnimTable = { xscale: 0.4, yscale: 0.4, opacity: 0, - time: 900 + time: 900, }, 'linear'); scene.showEffect('poisonwisp', { x: attacker.x + 60, @@ -127,13 +127,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.1, - time: 700 + time: 700, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.3, - time: 1000 + time: 1000, }, 'ballistic', 'explode'); scene.showEffect('wisp', { x: attacker.x + 60, @@ -141,15 +141,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.3, - time: 700 + time: 700, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.6, - time: 1000 + time: 1000, }, 'ballistic', 'explode'); - } + }, }, quash: { anim(scene, [attacker, defender]) { @@ -157,25 +157,25 @@ const BattleMoveAnims: AnimTable = { x: defender.x, y: defender.y + 80, z: defender.behind(-30), - time: 400 + time: 400, }, 'ballistic'); attacker.anim({ x: defender.x, y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(450); defender.anim({ y: defender.y - 15, yscale: 0.5, - time: 300 + time: 300, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'decel'); scene.showEffect('rightchop', { @@ -184,14 +184,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.1, - time: 400 + time: 400, }, { y: defender.y, scale: 0.25, opacity: 1, - time: 700 + time: 700, }, 'decel', 'explode'); - } + }, }, swagger: { anim(scene, [attacker, defender]) { @@ -203,11 +203,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.5, - time: 0 + time: 0, }, { scale: 1, opacity: 1, - time: 300 + time: 300, }, 'ballistic2Under', 'fade'); scene.showEffect('angry', { x: defender.x - 20, @@ -215,11 +215,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.5, - time: 100 + time: 100, }, { scale: 1, opacity: 1, - time: 400 + time: 400, }, 'ballistic2Under', 'fade'); scene.showEffect('angry', { x: defender.x, @@ -227,13 +227,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.5, - time: 200 + time: 200, }, { scale: 1, opacity: 1, - time: 500 + time: 500, }, 'ballistic2Under', 'fade'); - } + }, }, swordsdance: { anim(scene, [attacker, defender]) { @@ -243,24 +243,24 @@ const BattleMoveAnims: AnimTable = { y: defender.y, z: defender.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { x: defender.x - 50, scale: 1, opacity: 0.4, - time: 200 + time: 200, }, 'ballistic2', 'fade'); scene.showEffect('sword', { x: defender.x - 50, y: defender.y, z: defender.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { x: defender.x + 50, scale: 1, opacity: 0.4, - time: 200 + time: 200, }, 'ballistic2back', 'fade'); scene.showEffect('sword', { x: defender.x + 50, @@ -268,12 +268,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 200 + time: 200, }, { x: defender.x - 50, scale: 1, opacity: 0.4, - time: 400 + time: 400, }, 'ballistic2', 'fade'); scene.showEffect('sword', { x: defender.x - 50, @@ -281,12 +281,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 200 + time: 200, }, { x: defender.x + 50, scale: 1, opacity: 0.4, - time: 400 + time: 400, }, 'ballistic2back', 'fade'); scene.showEffect('sword', { x: defender.x + 50, @@ -294,12 +294,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 400 + time: 400, }, { x: defender.x - 50, scale: 1, opacity: 0.4, - time: 600 + time: 600, }, 'ballistic2', 'fade'); scene.showEffect('sword', { x: defender.x - 50, @@ -307,14 +307,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 400 + time: 400, }, { x: defender.x + 50, scale: 1, opacity: 0.4, - time: 600 + time: 600, }, 'ballistic2Back', 'fade'); - } + }, }, quiverdance: { anim(scene, [attacker]) { @@ -326,11 +326,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 0 + time: 0, }, { y: attacker.y + 60, opacity: 0, - time: 400 + time: 400, }, 'accel'); scene.showEffect('wisp', { x: attacker.x - 40, @@ -338,11 +338,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 200 + time: 200, }, { y: attacker.y + 60, opacity: 0, - time: 600 + time: 600, }, 'accel'); scene.showEffect('wisp', { x: attacker.x, @@ -350,13 +350,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 400 + time: 400, }, { y: attacker.y + 60, opacity: 0, - time: 800 + time: 800, }, 'accel'); - } + }, }, dragondance: { anim(scene, [attacker]) { @@ -367,13 +367,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 0 + time: 0, }, { x: attacker.x - 50, y: attacker.y - 50, scale: 2, opacity: 0, - time: 300 + time: 300, }, 'ballistic'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -381,13 +381,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 150 + time: 150, }, { x: attacker.x + 60, y: attacker.y - 50, scale: 2, opacity: 0, - time: 450 + time: 450, }, 'ballistic'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -395,15 +395,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 300 + time: 300, }, { x: attacker.x + 10, y: attacker.y - 60, scale: 2, opacity: 0, - time: 600 + time: 600, }, 'ballistic'); - } + }, }, agility: { anim(scene, [attacker]) { @@ -420,24 +420,24 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, opacity: 0.5, - time: 800 + time: 800, }, { x: attacker.x - 30, opacity: 0, - time: 1300 + time: 1300, }, 'decel'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.5, - time: 800 + time: 800, }, { x: attacker.x + 30, opacity: 0, - time: 1200 + time: 1200, }, 'decel'); - } + }, }, doubleteam: { anim(scene, [attacker, defender]) { @@ -446,27 +446,27 @@ const BattleMoveAnims: AnimTable = { x: defender.x, y: attacker.y, z: attacker.z, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x - 60, y: defender.y, z: defender.z, opacity: 0, - time: 500 + time: 500, }, 'decel'); scene.showEffect(attacker.sp, { x: defender.x, y: attacker.y, z: attacker.z, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x + 60, y: defender.y, z: defender.z, opacity: 0, - time: 500 + time: 500, }, 'decel'); - } + }, }, metronome: { anim(scene, [attacker]) { @@ -475,7 +475,7 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 30, z: attacker.z, scale: 0.4, - opacity: 1 + opacity: 1, }, { x: attacker.x + 40, y: attacker.y + 35, @@ -483,7 +483,7 @@ const BattleMoveAnims: AnimTable = { xscale: 0.3, yscale: 0.6, opacity: 1, - time: 200 + time: 200, }, 'decel', 'fade'); scene.showEffect('pointer', { x: attacker.x + 40, @@ -493,7 +493,7 @@ const BattleMoveAnims: AnimTable = { xscale: 0.3, yscale: 0.6, opacity: 1, - time: 200 + time: 200, }, { x: attacker.x + 30, y: attacker.y + 30, @@ -501,12 +501,12 @@ const BattleMoveAnims: AnimTable = { xscale: 0.4, yscale: 0.4, opacity: 0, - time: 400 + time: 400, }, 'decel'); - } + }, }, teeterdance: { - anim: BattleOtherAnims.shake.anim + anim: BattleOtherAnims.shake.anim, }, splash: { anim(scene, [attacker]) { @@ -516,12 +516,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.1, - time: 150 + time: 150, }, { x: attacker.x + 40, y: attacker.y + 60, z: attacker.z, - opacity: 0.3 + opacity: 0.3, }, 'ballistic', 'fade'); scene.showEffect('waterwisp', { x: attacker.x - 20, @@ -529,12 +529,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.1, - time: 300 + time: 300, }, { x: attacker.x - 40, y: attacker.y + 60, z: attacker.z, - opacity: 0.3 + opacity: 0.3, }, 'ballistic', 'fade'); scene.showEffect('waterwisp', { x: attacker.x + 20, @@ -542,43 +542,43 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.1, - time: 450 + time: 450, }, { x: attacker.x + 60, y: attacker.y + 40, z: attacker.z, - opacity: 0.3 + opacity: 0.3, }, 'ballistic', 'fade'); attacker.anim({ y: attacker.y + 15, - time: 150 + time: 150, }, 'decel'); attacker.anim({ - time: 150 + time: 150, }, 'accel'); attacker.anim({ y: attacker.y + 15, - time: 150 + time: 150, }, 'decel'); attacker.anim({ - time: 150 + time: 150, }, 'accel'); attacker.anim({ y: attacker.y + 15, - time: 150 + time: 150, }, 'decel'); attacker.anim({ - time: 150 + time: 150, }, 'accel'); - } + }, }, encore: { anim(scene, [attacker, defender]) { attacker.anim({x: attacker.x - 10, time: 100}); attacker.anim({x: attacker.x + 10, time: 200}); attacker.anim({x: attacker.x, time: 100}); - } + }, }, attract: { anim(scene, [attacker, defender]) { @@ -589,11 +589,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.5, - time: 0 + time: 0, }, { scale: 1, opacity: 1, - time: 300 + time: 300, }, 'ballistic2Under', 'fade'); scene.showEffect('heart', { x: defender.x - 20, @@ -601,11 +601,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.5, - time: 100 + time: 100, }, { scale: 1, opacity: 1, - time: 400 + time: 400, }, 'ballistic2Under', 'fade'); scene.showEffect('heart', { x: defender.x, @@ -613,59 +613,59 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.5, - time: 200 + time: 200, }, { scale: 1, opacity: 1, - time: 500 + time: 500, }, 'ballistic2Under', 'fade'); - } + }, }, raindance: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, sunnyday: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, hail: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, sandstorm: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, gravity: { anim() { // do not give Gravity an animation, // it'll conflict with the gravity animation in BattleOtherAnims // this one prevents the wisp from showing up - } + }, }, trickroom: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, magicroom: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, wonderroom: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, afteryou: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, allyswitch: { anim() { // do not give Ally Switch an animation, // it'll conflict with the animation of the switch itself - } + }, }, babydolleyes: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, faketears: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, tearfullook: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, featherdance: { anim(scene, [attacker, defender]) { @@ -676,14 +676,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 1, - time: 0 + time: 0, }, { x: defender.x + 50, y: defender.y, z: defender.z, scale: 0.5, opacity: 0.4, - time: 600 + time: 600, }, 'ballistic2Under', 'fade'); scene.showEffect('feather', { x: attacker.x, @@ -691,14 +691,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 1, - time: 100 + time: 100, }, { x: defender.x - 50, y: defender.y, z: defender.z, scale: 0.5, opacity: 0.4, - time: 700 + time: 700, }, 'ballistic2Under', 'fade'); scene.showEffect('feather', { x: attacker.x, @@ -706,14 +706,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 1, - time: 200 + time: 200, }, { x: defender.x + 25, y: defender.y, z: defender.z, scale: 0.5, opacity: 0.4, - time: 800 + time: 800, }, 'ballistic2Under', 'fade'); scene.showEffect('feather', { x: attacker.x, @@ -721,14 +721,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 1, - time: 300 + time: 300, }, { x: defender.x - 25, y: defender.y, z: defender.z, scale: 0.5, opacity: 0.4, - time: 900 + time: 900, }, 'ballistic2Under', 'fade'); scene.showEffect('feather', { @@ -737,14 +737,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 400 + time: 400, }, { x: defender.x + 5, y: defender.y - 20, z: defender.z, scale: 0.1, opacity: 0.4, - time: 700 + time: 700, }, 'ballistic2Under', 'fade'); scene.showEffect('feather', { x: defender.x - 50, @@ -752,14 +752,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 500 + time: 500, }, { x: defender.x - 10, y: defender.y - 20, z: defender.z, scale: 0.1, opacity: 0.4, - time: 800 + time: 800, }, 'ballistic2Under', 'fade'); scene.showEffect('feather', { x: defender.x + 25, @@ -767,14 +767,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 600 + time: 600, }, { x: defender.x, y: defender.y - 20, z: defender.z, scale: 0.1, opacity: 0.4, - time: 900 + time: 900, }, 'ballistic2Under', 'fade'); scene.showEffect('feather', { x: defender.x - 25, @@ -782,16 +782,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 700 + time: 700, }, { x: defender.x, y: defender.y - 20, z: defender.z, scale: 0.1, opacity: 0.4, - time: 1000 + time: 1000, }, 'ballistic2Under', 'fade'); - } + }, }, followme: { anim(scene, [attacker]) { @@ -802,16 +802,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 1, - time: 100 + time: 100, }, { y: attacker.y + 60, opacity: 1, - time: 550 + time: 550, }, 'decel', 'fade'); - } + }, }, foresight: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, mimic: { anim(scene, [attacker, defender]) { @@ -819,11 +819,11 @@ const BattleMoveAnims: AnimTable = { x: defender.x, y: defender.y, z: defender.z, - opacity: 0.5 + opacity: 0.5, }, { scale: 0.2, opacity: 0, - time: 300 + time: 300, }, 'accel'); scene.showEffect('electroball', { x: defender.x, @@ -831,59 +831,59 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.7, opacity: 0.5, - time: 300 + time: 300, }, { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.4, opacity: 0.2, - time: 600 + time: 600, }, 'accel', 'fade'); - } + }, }, sketch: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, odorsleuth: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, celebrate: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, playnice: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, tailwhip: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, leer: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, kinesis: { anim(scene, [attacker]) { scene.backgroundEffect('#AA44BB', 450, 0.6, 450); scene.backgroundEffect('#AA44FF', 250, 0.6, 800); BattleOtherAnims.dance.anim(scene, [attacker]); - } + }, }, electricterrain: { anim(scene, [attacker]) { scene.backgroundEffect('#FFFF00', 1000, 0.3); BattleOtherAnims.dance.anim(scene, [attacker]); - } + }, }, grassyterrain: { anim(scene, [attacker]) { scene.backgroundEffect('#9AB440', 1000, 0.3); BattleOtherAnims.dance.anim(scene, [attacker]); - } + }, }, mistyterrain: { anim(scene, [attacker]) { scene.backgroundEffect('#FF99FF', 1000, 0.3); BattleOtherAnims.dance.anim(scene, [attacker]); - } + }, }, topsyturvy: { anim(scene, [attacker, defender]) { @@ -893,14 +893,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 400 + time: 400, }, { x: defender.x - 50, y: defender.y, z: defender.z, scale: 0.4, opacity: 0.4, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x - 50, @@ -908,14 +908,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 400 + time: 400, }, { x: defender.x + 50, y: defender.y, z: defender.z, scale: 0.4, opacity: 0.4, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x + 50, @@ -923,14 +923,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 600 + time: 600, }, { x: defender.x - 50, y: defender.y, z: defender.z, scale: 0.4, opacity: 0.4, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x - 50, @@ -938,16 +938,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 600 + time: 600, }, { x: defender.x + 50, y: defender.y, z: defender.z, scale: 0.4, opacity: 0.4, - time: 800 + time: 800, }, 'linear', 'fade'); - } + }, }, embargo: { anim(scene, [attacker, defender]) { @@ -957,14 +957,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 400 + time: 400, }, { x: defender.x - 50, y: defender.y, z: defender.z, scale: 0.4, opacity: 0.4, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x - 50, @@ -972,14 +972,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 400 + time: 400, }, { x: defender.x + 50, y: defender.y, z: defender.z, scale: 0.4, opacity: 0.4, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x + 50, @@ -987,14 +987,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 600 + time: 600, }, { x: defender.x - 50, y: defender.y, z: defender.z, scale: 0.4, opacity: 0.4, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x - 50, @@ -1002,16 +1002,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 600 + time: 600, }, { x: defender.x + 50, y: defender.y, z: defender.z, scale: 0.4, opacity: 0.4, - time: 800 + time: 800, }, 'linear', 'fade'); - } + }, }, healblock: { anim(scene, [attacker, defender]) { @@ -1021,14 +1021,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 400 + time: 400, }, { x: defender.x - 50, y: defender.y, z: defender.z, scale: 0.4, opacity: 0.4, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x - 50, @@ -1036,14 +1036,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 400 + time: 400, }, { x: defender.x + 50, y: defender.y, z: defender.z, scale: 0.4, opacity: 0.4, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x + 50, @@ -1051,14 +1051,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 600 + time: 600, }, { x: defender.x - 50, y: defender.y, z: defender.z, scale: 0.4, opacity: 0.4, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x - 50, @@ -1066,16 +1066,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 600 + time: 600, }, { x: defender.x + 50, y: defender.y, z: defender.z, scale: 0.4, opacity: 0.4, - time: 800 + time: 800, }, 'linear', 'fade'); - } + }, }, flash: { anim(scene, [attacker]) { @@ -1085,13 +1085,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 10, z: attacker.z, scale: 0.1, - opacity: 0.8 + opacity: 0.8, }, { scale: 15, opacity: 0.8, - time: 500 + time: 500, }, 'linear', 'fade'); - } + }, }, tailwind: { anim(scene, [attacker]) { @@ -1100,12 +1100,12 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.behind(40), scale: 0.3, - opacity: 1 + opacity: 1, }, { z: attacker.behind(-40), scale: 2, opacity: 0.2, - time: 300 + time: 300, }, 'linear', 'fade'); scene.showEffect('iceball', { x: attacker.x, @@ -1113,12 +1113,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(40), scale: 0.3, opacity: 1, - time: 200 + time: 200, }, { z: attacker.behind(-40), scale: 2, opacity: 0.2, - time: 500 + time: 500, }, 'linear', 'fade'); scene.showEffect('iceball', { x: attacker.x, @@ -1126,14 +1126,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(40), scale: 0.3, opacity: 1, - time: 400 + time: 400, }, { z: attacker.behind(-40), scale: 2, opacity: 0.2, - time: 700 + time: 700, }, 'linear', 'fade'); - } + }, }, aerialace: { anim(scene, [attacker, defender]) { @@ -1143,11 +1143,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 0.6, - time: 260 + time: 260, }, { scale: 2, opacity: 0, - time: 560 + time: 560, }, 'accel', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -1155,11 +1155,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 260 + time: 260, }, { scale: 2, opacity: 0, - time: 560 + time: 560, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -1167,59 +1167,59 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 310 + time: 310, }, { scale: 2, opacity: 0, - time: 610 + time: 610, }, 'linear'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 50 + time: 50, }, { x: defender.x - 60, y: defender.y + 60, z: defender.behind(-40), - time: 250 + time: 250, }, 'ballistic', 'fade'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 100 + time: 100, }, { x: defender.leftof(20), y: defender.y, z: defender.behind(-40), - time: 300 + time: 300, }, 'ballistic2Under', 'fade'); scene.showEffect(attacker.sp, { x: defender.x - 60, y: defender.y + 60, z: defender.behind(-40), opacity: 0.5, - time: 250 + time: 250, }, { x: defender.leftof(-5), y: defender.y - 5, z: defender.behind(20), - time: 350 + time: 350, }, 'ballistic', 'fade'); scene.showEffect(attacker.sp, { x: defender.leftof(20), y: defender.y, z: defender.behind(-40), opacity: 0.5, - time: 300 + time: 300, }, { x: defender.leftof(-5), y: defender.y - 5, z: defender.behind(20), - time: 400 + time: 400, }, 'ballistic2', 'fade'); attacker.anim({ @@ -1227,48 +1227,48 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 60, z: defender.behind(-80), time: 200, - opacity: 0.5 + opacity: 0.5, }, 'ballistic'); attacker.anim({ x: defender.leftof(-5), y: defender.y - 5, z: defender.behind(20), time: 100, - opacity: 0.5 + opacity: 0.5, }); attacker.anim({ x: defender.x, y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2'); defender.delay(260); defender.anim({ z: defender.behind(30), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, bravebird: { - anim: BattleOtherAnims.flight.anim + anim: BattleOtherAnims.flight.anim, }, acrobatics: { - anim: BattleOtherAnims.flight.anim + anim: BattleOtherAnims.flight.anim, }, flyingpress: { - anim: BattleOtherAnims.flight.anim + anim: BattleOtherAnims.flight.anim, }, steelwing: { - anim: BattleOtherAnims.flight.anim + anim: BattleOtherAnims.flight.anim, }, wingattack: { - anim: BattleOtherAnims.flight.anim + anim: BattleOtherAnims.flight.anim, }, dragonbreath: { anim(scene, [attacker, defender]) { @@ -1277,13 +1277,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0.5 + opacity: 0.5, }, { x: defender.x, y: defender.y, z: defender.behind(40), scale: 1, - opacity: 0.2 + opacity: 0.2, }, 'decel'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -1291,13 +1291,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.5, - time: 50 + time: 50, }, { x: defender.x, y: defender.y, z: defender.behind(40), scale: 1, - opacity: 0.2 + opacity: 0.2, }, 'decel'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -1305,34 +1305,34 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.5, - time: 100 + time: 100, }, { x: defender.x, y: defender.y, z: defender.behind(40), scale: 1, - opacity: 0.2 + opacity: 0.2, }, 'decel'); - } + }, }, dragonpulse: { anim(scene, [attacker, defender]) { - var xstep = (defender.x - attacker.x) / 5; - var ystep = (defender.y - attacker.y) / 5; - var zstep = (defender.z - attacker.z) / 5; + let xstep = (defender.x - attacker.x) / 5; + let ystep = (defender.y - attacker.y) / 5; + let zstep = (defender.z - attacker.z) / 5; - for (var i = 0; i < 5; i++) { + for (let i = 0; i < 5; i++) { scene.showEffect('wisp', { x: attacker.x + xstep * (i + 1), y: attacker.y + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 1, opacity: 1, - time: 20 * i + time: 20 * i, }, { scale: 2, opacity: 0, - time: 40 * i + 600 + time: 40 * i + 600, }, 'linear'); scene.showEffect('poisonwisp', { x: attacker.x + xstep * (i + 1), @@ -1340,11 +1340,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z + zstep * (i + 1), scale: 0.5, opacity: 0.3, - time: 20 * i + time: 20 * i, }, { scale: 2, opacity: 0, - time: 40 * i + 600 + time: 40 * i + 600, }, 'linear'); } scene.showEffect('shadowball', { @@ -1352,11 +1352,11 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.behind(-15), scale: 0.5, - opacity: 0.6 + opacity: 0.6, }, { scale: 0.6, opacity: 0.2, - time: 400 + time: 400, }, 'linear', 'fade'); scene.showEffect('shadowball', { @@ -1365,13 +1365,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.1, - time: 0 + time: 0, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('shadowball', { x: attacker.x, @@ -1379,13 +1379,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.1, - time: 100 + time: 100, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1, - time: 300 + time: 300, }, 'linear', 'explode'); scene.showEffect('shadowball', { x: attacker.x, @@ -1393,13 +1393,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.1, - time: 200 + time: 200, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('shadowball', { x: attacker.x, @@ -1407,15 +1407,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.1, - time: 300 + time: 300, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1, - time: 500 + time: 500, }, 'linear', 'explode'); - } + }, }, focusblast: { anim(scene, [attacker, defender]) { @@ -1425,11 +1425,11 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.behind(-30), scale: 3, - opacity: 0.3 + opacity: 0.3, }, { scale: 0.6, opacity: 1, - time: 300 + time: 300, }, 'decel', 'fade'); scene.showEffect('electroball', { x: attacker.x, @@ -1437,11 +1437,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-30), scale: 3, opacity: 0.3, - time: 100 + time: 100, }, { scale: 0.8, opacity: 0.6, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('electroball', { x: attacker.x, @@ -1449,25 +1449,25 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-30), scale: 0.6, opacity: 0.8, - time: 400 + time: 400, }, { x: defender.x, y: defender.y, z: defender.behind(20), scale: 1, opacity: 0.8, - time: 800 + time: 800, }, 'accel', 'explode'); defender.delay(800); defender.anim({ z: defender.behind(10), - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, aurasphere: { anim(scene, [attacker, defender]) { @@ -1480,14 +1480,14 @@ const BattleMoveAnims: AnimTable = { scale: 0.5, xscale: 3, opacity: 0, - time: 0 + time: 0, }, { x: attacker.x, y: attacker.y, scale: 0.8, xscale: 0.8, opacity: 0.8, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('wisp', { x: attacker.x - 60, @@ -1496,14 +1496,14 @@ const BattleMoveAnims: AnimTable = { scale: 0.5, yscale: 3, opacity: 0, - time: 50 + time: 50, }, { x: attacker.x, y: attacker.y, scale: 1.5, yscale: 1.5, opacity: 0.8, - time: 450 + time: 450, }, 'decel', 'fade'); scene.showEffect('iceball', { @@ -1512,11 +1512,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0, opacity: 0, - time: 0 + time: 0, }, { scale: 0.8, opacity: 0.5, - time: 650 + time: 650, }, 'decel', 'fade'); scene.showEffect('wisp', { x: attacker.x, @@ -1524,11 +1524,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0, opacity: 0, - time: 0 + time: 0, }, { scale: 1.5, opacity: 0.8, - time: 650 + time: 650, }, 'decel', 'fade'); scene.showEffect('iceball', { x: attacker.x, @@ -1536,12 +1536,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0.8, opacity: 0.8, - time: 600 + time: 600, }, { x: defender.x, y: defender.y, z: defender.z, - time: 800 + time: 800, }, 'accel', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -1549,12 +1549,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 1, opacity: 0.8, - time: 600 + time: 600, }, { x: defender.x, y: defender.y, z: defender.z, - time: 800 + time: 800, }, 'accel', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -1562,23 +1562,23 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 1, opacity: 0.8, - time: 600 + time: 600, }, { x: defender.x, y: defender.y, z: defender.z, - time: 825 + time: 825, }, 'accel', 'explode'); defender.delay(800); defender.anim({ z: defender.behind(10), - time: 175 + time: 175, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, technoblast: { anim(scene, [attacker, defender]) { @@ -1587,12 +1587,12 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.behind(-30), scale: 3, - opacity: 0.3 + opacity: 0.3, }, { z: attacker.behind(-30), scale: 0.6, opacity: 1, - time: 300 + time: 300, }, 'decel', 'fade'); scene.showEffect('iceball', { x: attacker.x, @@ -1600,12 +1600,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-30), scale: 3, opacity: 0.3, - time: 100 + time: 100, }, { z: attacker.behind(-30), scale: 0.8, opacity: 0.6, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('iceball', { x: attacker.x, @@ -1613,25 +1613,25 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-30), scale: 0.6, opacity: 0.8, - time: 400 + time: 400, }, { x: defender.x, y: defender.y, z: defender.behind(20), scale: 1, opacity: 0.8, - time: 800 + time: 800, }, 'accel', 'explode'); defender.delay(800); defender.anim({ z: defender.behind(5), - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, painsplit: { anim(scene, [attacker, defender]) { @@ -1641,11 +1641,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 0 + time: 0, }, { scale: 3, opacity: 0, - time: 300 + time: 300, }, 'linear'); scene.showEffect('wisp', { x: attacker.x, @@ -1653,11 +1653,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 200 + time: 200, }, { scale: 3, opacity: 0, - time: 500 + time: 500, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -1665,11 +1665,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 0 + time: 0, }, { scale: 3, opacity: 0, - time: 300 + time: 300, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -1677,25 +1677,25 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 200 + time: 200, }, { scale: 3, opacity: 0, - time: 500 + time: 500, }, 'linear'); - } + }, }, flail: { - anim: BattleOtherAnims.xattack.anim + anim: BattleOtherAnims.xattack.anim, }, uturn: { - anim: BattleOtherAnims.spinattack.anim + anim: BattleOtherAnims.spinattack.anim, }, rapidspin: { - anim: BattleOtherAnims.spinattack.anim + anim: BattleOtherAnims.spinattack.anim, }, gyroball: { - anim: BattleOtherAnims.spinattack.anim + anim: BattleOtherAnims.spinattack.anim, }, voltswitch: { anim(scene, [attacker, defender]) { @@ -1704,12 +1704,12 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: defender.behind(-130), opacity: 0.8, - time: 275 + time: 275, }, { x: defender.x, y: defender.y, z: defender.z, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('electroball', { x: defender.x, @@ -1717,11 +1717,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(10), opacity: 0.7, scale: 0, - time: 500 + time: 500, }, { scale: 4, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('electroball', { x: defender.x, @@ -1729,36 +1729,36 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.7, scale: 0, - time: 700 + time: 700, }, { scale: 4, opacity: 0, - time: 1000 + time: 1000, }, 'linear'); attacker.anim({ z: attacker.behind(15), - time: 200 + time: 200, }, 'decel'); attacker.anim({ z: defender.behind(-170), - time: 100 + time: 100, }, 'accel'); attacker.anim({ z: attacker.z, - time: 300 + time: 300, }, 'swing'); defender.delay(500); defender.anim({ x: defender.leftof(5), y: defender.y, z: defender.behind(15), - time: 50 + time: 50, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, thunderwave: { anim(scene, [attacker, defender]) { @@ -1768,11 +1768,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.2, - time: 0 + time: 0, }, { scale: 8, opacity: 0.1, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('electroball', { x: attacker.x, @@ -1780,11 +1780,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.2, - time: 200 + time: 200, }, { scale: 8, opacity: 0.1, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('electroball', { x: defender.x, @@ -1792,13 +1792,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 0.2, - time: 500 + time: 500, }, { scale: 4, opacity: 0.1, - time: 800 + time: 800, }, 'linear', 'fade'); - } + }, }, shockwave: { anim(scene, [attacker, defender]) { @@ -1809,12 +1809,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 5, opacity: 0.6, - time: 0 + time: 0, }, { scale: 3, xscale: 10, opacity: 0.1, - time: 600 + time: 600, }, 'decel', 'fade'); scene.showEffect('electroball', { x: attacker.x, @@ -1823,12 +1823,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 5, opacity: 0.6, - time: 300 + time: 300, }, { scale: 3, xscale: 10, opacity: 0.1, - time: 700 + time: 700, }, 'decel', 'fade'); scene.showEffect('electroball', { x: defender.x, @@ -1836,14 +1836,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.3, scale: 0, - time: 250 + time: 250, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2, opacity: 0, - time: 550 + time: 550, }, 'linear'); scene.showEffect('electroball', { x: defender.x, @@ -1851,16 +1851,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.3, scale: 0, - time: 500 + time: 500, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2, opacity: 0, - time: 800 + time: 800, }, 'linear'); - } + }, }, discharge: { anim(scene, [attacker, defender]) { @@ -1870,11 +1870,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.2, - time: 0 + time: 0, }, { scale: 8, opacity: 0.1, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('electroball', { x: attacker.x, @@ -1882,11 +1882,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.2, - time: 150 + time: 150, }, { scale: 8, opacity: 0.1, - time: 750 + time: 750, }, 'linear', 'fade'); scene.showEffect('electroball', { x: attacker.x, @@ -1894,13 +1894,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.2, - time: 300 + time: 300, }, { scale: 8, opacity: 0.1, - time: 900 + time: 900, }, 'linear', 'fade'); - } + }, }, bugbuzz: { anim(scene, [attacker, defender]) { @@ -1910,11 +1910,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.3, - time: 0 + time: 0, }, { scale: 8, opacity: 0.07, - time: 400 + time: 400, }, 'linear', 'fade'); scene.showEffect('energyball', { x: attacker.x, @@ -1922,11 +1922,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.3, - time: 100 + time: 100, }, { scale: 8, opacity: 0.07, - time: 500 + time: 500, }, 'linear', 'fade'); scene.showEffect('energyball', { x: attacker.x, @@ -1934,11 +1934,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.3, - time: 200 + time: 200, }, { scale: 8, opacity: 0.07, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('energyball', { x: defender.x, @@ -1946,13 +1946,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 0.3, - time: 500 + time: 500, }, { scale: 2, opacity: 0.1, - time: 800 + time: 800, }, 'linear', 'fade'); - } + }, }, explosion: { anim(scene, [attacker]) { @@ -1961,10 +1961,10 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0, - opacity: 0.6 + opacity: 0.6, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('fireball', { x: attacker.x - 40, @@ -1972,10 +1972,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.6, - time: 150 + time: 150, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('fireball', { x: attacker.x + 10, @@ -1983,99 +1983,99 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.6, - time: 300 + time: 300, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'decel'); attacker.delay(450).anim({ scale: 4, time: 400, - opacity: 0 + opacity: 0, }, 'linear'); - } + }, }, auroraveil: { - anim() {} + anim() {}, }, reflect: { - anim() {} + anim() {}, }, safeguard: { - anim() {} + anim() {}, }, lightscreen: { - anim() {} + anim() {}, }, mist: { anim(scene, [attacker, defender]) { - var xf = [1, -1, 1, -1]; - var yf = [1, -1, -1, 1]; - var xf2 = [1, 0, -1, 0]; - var yf2 = [0, 1, 0, -1]; + let xf = [1, -1, 1, -1]; + let yf = [1, -1, -1, 1]; + let xf2 = [1, 0, -1, 0]; + let yf2 = [0, 1, 0, -1]; - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { scene.showEffect('waterwisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 0.7 + opacity: 0.7, }, { x: attacker.x + 120 * xf[i], y: attacker.y, z: attacker.z + 68 * yf[i], scale: 1, opacity: 0, - time: 800 + time: 800, }, 'decel', 'fade'); scene.showEffect('waterwisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 0.7 + opacity: 0.7, }, { x: attacker.x + 113 * xf2[i], y: attacker.y, z: attacker.z + 97 * yf2[i], scale: 1, opacity: 0, - time: 800 + time: 800, }, 'decel', 'fade'); scene.showEffect('wisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.7 + opacity: 0.7, }, { x: attacker.x + 120 * xf[i], y: attacker.y, z: attacker.z + 68 * yf[i], scale: 1.5, opacity: 0, - time: 800 + time: 800, }, 'decel', 'fade'); scene.showEffect('wisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.7 + opacity: 0.7, }, { x: attacker.x + 113 * xf2[i], y: attacker.y, z: attacker.z + 97 * yf2[i], scale: 1.5, opacity: 0, - time: 800 + time: 800, }, 'decel', 'fade'); } - } + }, }, transform: { - anim() {} + anim() {}, }, bellydrum: { anim(scene, [attacker]) { @@ -2084,11 +2084,11 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.6, - opacity: 1 + opacity: 1, }, { z: attacker.behind(5), scale: 0.4, - time: 100 + time: 100, }, 'linear', 'fade'); scene.showEffect('rightchop', { x: attacker.x + 20, @@ -2096,11 +2096,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 1, - time: 150 + time: 150, }, { z: attacker.behind(5), scale: 0.4, - time: 250 + time: 250, }, 'linear', 'fade'); scene.showEffect('leftchop', { x: attacker.x - 20, @@ -2108,11 +2108,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 1, - time: 350 + time: 350, }, { z: attacker.behind(5), scale: 0.4, - time: 450 + time: 450, }, 'linear', 'fade'); scene.showEffect('rightchop', { x: attacker.x + 20, @@ -2120,11 +2120,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 1, - time: 500 + time: 500, }, { z: attacker.behind(5), scale: 0.4, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('impact', { x: attacker.x - 20, @@ -2132,11 +2132,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(5), scale: 0.75, opacity: 0.3, - time: 100 + time: 100, }, { scale: 1, opacity: 0, - time: 300 + time: 300, }, 'linear'); scene.showEffect('impact', { x: attacker.x + 20, @@ -2144,11 +2144,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(5), scale: 0.75, opacity: 0.3, - time: 250 + time: 250, }, { scale: 1, opacity: 0, - time: 550 + time: 550, }, 'linear'); scene.showEffect('impact', { x: attacker.x - 20, @@ -2156,11 +2156,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(5), scale: 0.75, opacity: 0.3, - time: 400 + time: 400, }, { scale: 1, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('impact', { x: attacker.x + 20, @@ -2168,34 +2168,34 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(5), scale: 0.75, opacity: 0.3, - time: 550 + time: 550, }, { scale: 1, opacity: 0, - time: 800 + time: 800, }, 'linear'); - } + }, }, aromatherapy: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, healbell: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, magiccoat: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, protect: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, detect: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, kingsshield: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, spikyshield: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, banefulbunker: { anim(scene, [attacker]) { @@ -2207,57 +2207,57 @@ const BattleMoveAnims: AnimTable = { scale: 0.5, xscale: 0.25, yscale: 0.75, - opacity: 0.5 + opacity: 0.5, }, { scale: 2, xscale: 3.5, opacity: 0.1, - time: 500 + time: 500, }, 'decel', 'fade'); scene.showEffect('shadowball', { x: attacker.x, y: attacker.y - 15, z: attacker.z, opacity: 0.5, - scale: 1.5 + scale: 1.5, }, { scale: 1.8, opacity: 0.1, - time: 500 + time: 500, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x, y: attacker.y - 15, z: attacker.z, opacity: 1, - scale: 3 + scale: 3, }, { scale: 1.8, opacity: 0.5, - time: 500 + time: 500, }, 'decel', 'fade'); - } + }, }, craftyshield: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, matblock: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, quickguard: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, wideguard: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, endure: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, bide: { - anim: BattleOtherAnims.bidecharge.anim + anim: BattleOtherAnims.bidecharge.anim, }, focusenergy: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, rockpolish: { anim(scene, [attacker]) { @@ -2266,10 +2266,10 @@ const BattleMoveAnims: AnimTable = { y: attacker.y - 10, z: attacker.z, scale: 0.7, - opacity: 0.3 + opacity: 0.3, }, { opacity: 0, - time: 300 + time: 300, }, 'decel'); scene.showEffect('rightslash', { x: attacker.x + 20, @@ -2277,10 +2277,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.7, opacity: 0.3, - time: 100 + time: 100, }, { opacity: 0, - time: 400 + time: 400, }, 'decel'); scene.showEffect('leftslash', { x: attacker.x - 5, @@ -2288,10 +2288,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.7, opacity: 0.3, - time: 200 + time: 200, }, { opacity: 0, - time: 500 + time: 500, }, 'decel'); scene.showEffect('rightslash', { x: attacker.x + 5, @@ -2299,10 +2299,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.7, opacity: 0.3, - time: 200 + time: 200, }, { opacity: 0, - time: 500 + time: 500, }, 'decel'); scene.showEffect('shine', { @@ -2310,10 +2310,10 @@ const BattleMoveAnims: AnimTable = { y: attacker.y - 10, z: attacker.z, scale: 0.3, - opacity: 0.6 + opacity: 0.6, }, { opacity: 0, - time: 300 + time: 300, }, 'decel'); scene.showEffect('shine', { x: attacker.x + 20, @@ -2321,10 +2321,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.6, - time: 100 + time: 100, }, { opacity: 0, - time: 400 + time: 400, }, 'decel'); scene.showEffect('shine', { x: attacker.x - 5, @@ -2332,10 +2332,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.6, - time: 200 + time: 200, }, { opacity: 0, - time: 500 + time: 500, }, 'decel'); scene.showEffect('shine', { x: attacker.x + 5, @@ -2343,10 +2343,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.6, - time: 300 + time: 300, }, { opacity: 0, - time: 600 + time: 600, }, 'accel'); scene.showEffect('shine', { @@ -2355,11 +2355,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 0 + time: 0, }, { y: attacker.y + 40, opacity: 0, - time: 400 + time: 400, }, 'accel'); scene.showEffect('shine', { x: attacker.x - 20, @@ -2367,11 +2367,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 200 + time: 200, }, { y: attacker.y + 40, opacity: 0, - time: 600 + time: 600, }, 'accel'); scene.showEffect('shine', { x: attacker.x, @@ -2379,22 +2379,22 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 400 + time: 400, }, { y: attacker.y + 40, opacity: 0, - time: 800 + time: 800, }, 'accel'); - } + }, }, harden: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, defensecurl: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, irondefense: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, rest: { anim(scene, [attacker]) { @@ -2403,14 +2403,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 20, z: attacker.z, scale: 0.5, - opacity: 0.1 + opacity: 0.1, }, { x: attacker.x, y: attacker.y + 20, z: attacker.behind(-50), scale: 1.5, opacity: 1, - time: 400 + time: 400, }, 'ballistic2Under', 'fade'); scene.showEffect('wisp', { x: attacker.x, @@ -2418,19 +2418,19 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.1, - time: 200 + time: 200, }, { x: attacker.x, y: attacker.y + 20, z: attacker.behind(-50), scale: 1.5, opacity: 1, - time: 600 + time: 600, }, 'ballistic2Under', 'fade'); - } + }, }, howl: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, acupressure: { anim(scene, [attacker]) { @@ -2439,11 +2439,11 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 0.1 + opacity: 0.1, }, { scale: 0.25, opacity: 1, - time: 300 + time: 300, }, 'linear', 'explode'); scene.showEffect('lightning', { @@ -2452,16 +2452,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 300 + time: 300, }, { scale: 0.8, opacity: 0, - time: 600 + time: 600, }, 'linear'); - } + }, }, curse: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, autotomize: { anim(scene, [attacker]) { @@ -2472,11 +2472,11 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 0.5, - time: 100 + time: 100, }, { xscale: 6, opacity: 0, - time: 1000 + time: 1000, }, 'linear', 'fade'); scene.showEffect('wisp', { x: attacker.x, @@ -2484,11 +2484,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2, opacity: 1, - time: 100 + time: 100, }, { y: attacker.y - 50, opacity: 0, - time: 1000 + time: 1000, }, 'accel', 'fade'); scene.showEffect('wisp', { x: attacker.x, @@ -2496,12 +2496,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 100 + time: 100, }, { x: attacker.x + 40, y: attacker.y + 60, opacity: 0, - time: 500 + time: 500, }, 'accel'); scene.showEffect('wisp', { x: attacker.x, @@ -2509,12 +2509,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 200 + time: 200, }, { x: attacker.x + 40, y: attacker.y + 60, opacity: 0, - time: 600 + time: 600, }, 'accel'); scene.showEffect('wisp', { x: attacker.x, @@ -2522,11 +2522,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 400 + time: 400, }, { y: attacker.y + 60, opacity: 0, - time: 800 + time: 800, }, 'accel'); attacker.anim({x: attacker.x - 5, time: 75}); @@ -2540,7 +2540,7 @@ const BattleMoveAnims: AnimTable = { attacker.anim({x: attacker.x - 10, time: 50}); attacker.anim({x: attacker.x + 10, time: 150}); attacker.anim({x: attacker.x, time: 150}); - } + }, }, shiftgear: { anim(scene, [attacker]) { @@ -2550,11 +2550,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0, - time: 100 + time: 100, }, { x: attacker.x + 20, opacity: 1, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('gear', { x: attacker.x - 50, @@ -2562,11 +2562,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0, - time: 100 + time: 100, }, { x: attacker.x - 20, opacity: 1, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('gear', { x: attacker.x + 50, @@ -2574,11 +2574,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0, - time: 250 + time: 250, }, { x: attacker.x + 20, opacity: 1, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('gear', { x: attacker.x - 50, @@ -2586,11 +2586,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0, - time: 250 + time: 250, }, { x: attacker.x - 20, opacity: 1, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('gear', { x: attacker.x + 50, @@ -2598,11 +2598,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0, - time: 400 + time: 400, }, { x: attacker.x + 20, opacity: 1, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('gear', { x: attacker.x - 50, @@ -2610,11 +2610,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0, - time: 400 + time: 400, }, { x: attacker.x - 20, opacity: 1, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('shine', { x: attacker.x - 10, @@ -2622,10 +2622,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.6, - time: 100 + time: 100, }, { opacity: 0, - time: 300 + time: 300, }, 'decel'); scene.showEffect('shine', { x: attacker.x + 20, @@ -2633,10 +2633,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.6, - time: 100 + time: 100, }, { opacity: 0, - time: 400 + time: 400, }, 'decel'); scene.showEffect('shine', { x: attacker.x - 5, @@ -2644,10 +2644,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.6, - time: 200 + time: 200, }, { opacity: 0, - time: 500 + time: 500, }, 'decel'); scene.showEffect('shine', { x: attacker.x + 5, @@ -2655,10 +2655,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.6, - time: 300 + time: 300, }, { opacity: 0, - time: 600 + time: 600, }, 'accel'); scene.showEffect('shine', { x: attacker.x + 20, @@ -2666,11 +2666,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 100 + time: 100, }, { y: attacker.y + 40, opacity: 0, - time: 400 + time: 400, }, 'accel'); scene.showEffect('shine', { x: attacker.x - 20, @@ -2678,11 +2678,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 200 + time: 200, }, { y: attacker.y + 40, opacity: 0, - time: 600 + time: 600, }, 'accel'); scene.showEffect('shine', { x: attacker.x, @@ -2690,39 +2690,39 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 400 + time: 400, }, { y: attacker.y + 40, opacity: 0, - time: 800 + time: 800, }, 'accel'); attacker.delay(100); attacker.anim({ y: attacker.y + 2.5, yscale: 1.5, - time: 100 + time: 100, }, 'linear'); attacker.anim({ - time: 100 + time: 100, }, 'linear'); attacker.anim({ y: attacker.y + 2.5, yscale: 1.5, - time: 100 + time: 100, }, 'linear'); attacker.anim({ - time: 100 + time: 100, }, 'linear'); attacker.anim({ y: attacker.y + 2.5, yscale: 1.5, - time: 100 + time: 100, }, 'linear'); attacker.anim({ - time: 100 + time: 100, }, 'linear'); - } + }, }, bulkup: { anim(scene, [attacker]) { @@ -2732,26 +2732,26 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.1, - time: 500 + time: 500, }, { x: attacker.leftof(-30), y: attacker.y + 20, z: attacker.behind(-50), scale: 1, opacity: 0.3, - time: 800 + time: 800, }, 'ballistic2Under', 'fade'); attacker.anim({ y: attacker.y + 4, scale: 1.15, - time: 200 + time: 200, }, 'linear'); attacker.delay(300); attacker.anim({ - time: 200 + time: 200, }, 'decel'); - } + }, }, shellsmash: { anim(scene, [attacker]) { @@ -2761,11 +2761,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.5, - time: 0 + time: 0, }, { scale: 0.8, opacity: 0.8, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('impact', { x: attacker.x + 40, @@ -2773,11 +2773,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.7, opacity: 0.4, - time: 400 + time: 400, }, { scale: 1.2, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('impact', { x: attacker.x - 40, @@ -2785,11 +2785,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.7, opacity: 0.4, - time: 450 + time: 450, }, { scale: 1.2, opacity: 0, - time: 650 + time: 650, }, 'linear'); scene.showEffect('impact', { x: attacker.x + 10, @@ -2797,17 +2797,17 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.7, opacity: 0.4, - time: 560 + time: 560, }, { scale: 1.2, opacity: 0, - time: 700 + time: 700, }, 'linear'); attacker.anim({ scale: 0.4, opacity: 0, - time: 400 + time: 400, }, 'linear'); attacker.delay(75); attacker.anim({x: attacker.x - 20, time: 75}); @@ -2817,16 +2817,16 @@ const BattleMoveAnims: AnimTable = { attacker.anim({x: attacker.x - 20, time: 100}); attacker.anim({x: attacker.x + 20, time: 100}); attacker.anim({x: attacker.x, time: 75}); - } + }, }, stockpile: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, swallow: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, ingrain: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, aquaring: { anim(scene, [attacker]) { @@ -2836,13 +2836,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2, opacity: 0.2, - time: 0 + time: 0, }, { scale: 1.5, opacity: 0.5, - time: 400 + time: 400, }, 'linear', 'fade'); - } + }, }, coil: { anim(scene, [attacker]) { @@ -2853,12 +2853,12 @@ const BattleMoveAnims: AnimTable = { scale: 0.7, xscale: 2, opacity: 0.6, - time: 0 + time: 0, }, { scale: 0.4, xscale: 1, opacity: 0.1, - time: 500 + time: 500, }, 'decel', 'fade'); scene.showEffect('iceball', { x: attacker.x, @@ -2867,12 +2867,12 @@ const BattleMoveAnims: AnimTable = { scale: 0.7, xscale: 2, opacity: 0.6, - time: 50 + time: 50, }, { scale: 0.4, xscale: 1, opacity: 0.1, - time: 550 + time: 550, }, 'decel', 'fade'); scene.showEffect('iceball', { x: attacker.x, @@ -2881,24 +2881,24 @@ const BattleMoveAnims: AnimTable = { scale: 0.7, xscale: 2, opacity: 0.6, - time: 100 + time: 100, }, { scale: 0.4, xscale: 1, opacity: 0.1, - time: 600 + time: 600, }, 'decel', 'fade'); attacker.anim({ y: attacker.y + 5, yscale: 1.1, - time: 300 + time: 300, }, 'swing'); attacker.delay(400); attacker.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, conversion: { anim(scene, [attacker]) { @@ -2907,19 +2907,19 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 2, - opacity: 0.3 + opacity: 0.3, }, { scale: 1, opacity: 0, - time: 600 + time: 600, }, 'decel'); - } + }, }, powertrick: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, ragepowder: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, refresh: { anim(scene, [attacker]) { @@ -2928,64 +2928,64 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 0.5 + opacity: 0.5, }, { scale: 1.5, opacity: 0, - time: 500 + time: 500, }, 'linear', 'fade'); scene.showEffect('rainbow', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { scale: 2, opacity: 0, - time: 500 + time: 500, }, 'linear', 'fade'); - } + }, }, recycle: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, doomdesire: { anim(scene) { scene.backgroundEffect('#000000', 300, 0.2); scene.backgroundEffect('#000000', 300, 0.3, 200); - } + }, }, teleport: { anim(scene, [attacker]) { scene.backgroundEffect('#000000', 1000, 0.3); attacker.anim({ xscale: 0.3, - time: 200 + time: 200, }, 'linear'); attacker.anim({ y: attacker.y + 200, xscale: 0.1, yscale: 2, opacity: 0.5, - time: 300 + time: 300, }, 'accel'); attacker.delay(500); attacker.anim({opacity: 0, time: 0}); attacker.anim({opacity: 1, time: 300}); - } + }, }, cottonguard: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, defendorder: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, meditate: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, sharpen: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, withdraw: { anim(scene, [attacker]) { @@ -2995,21 +2995,21 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.5, - time: 0 + time: 0, }, { scale: 0.8, opacity: 0.8, - time: 400 + time: 400, }, 'linear', 'fade'); attacker.anim({ scale: 0.4, opacity: 0, - time: 400 + time: 400, }, 'linear'); attacker.delay(75); attacker.anim({x: attacker.x, time: 75}); - } + }, }, roost: { anim(scene, [attacker, defender]) { @@ -3019,13 +3019,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 0 + time: 0, }, { x: defender.x + 5, y: defender.y - 20, scale: 0.1, opacity: 0.4, - time: 300 + time: 300, }, 'ballistic2Under', 'fade'); scene.showEffect('feather', { x: defender.x - 50, @@ -3033,13 +3033,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 100 + time: 100, }, { x: defender.x - 10, y: defender.y - 20, scale: 0.1, opacity: 0.4, - time: 400 + time: 400, }, 'ballistic2Under', 'fade'); scene.showEffect('feather', { x: defender.x + 25, @@ -3047,12 +3047,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 200 + time: 200, }, { y: defender.y - 20, scale: 0.1, opacity: 0.4, - time: 500 + time: 500, }, 'ballistic2Under', 'fade'); scene.showEffect('feather', { x: defender.x - 25, @@ -3060,14 +3060,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 300 + time: 300, }, { y: defender.y - 20, scale: 0.1, opacity: 0.4, - time: 600 + time: 600, }, 'ballistic2Under', 'fade'); - } + }, }, softboiled: { anim(scene, [attacker]) { @@ -3078,12 +3078,12 @@ const BattleMoveAnims: AnimTable = { scale: 0.75, yscale: 1, opacity: 0.2, - time: 0 + time: 0, }, { scale: 0.5, yscale: 0.75, opacity: 0.5, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -3092,23 +3092,23 @@ const BattleMoveAnims: AnimTable = { scale: 1, yscale: 1.5, opacity: 0.2, - time: 0 + time: 0, }, { scale: 0.6, yscale: 0.75, opacity: 0.8, - time: 400 + time: 400, }, 'linear', 'explode'); - } + }, }, milkdrink: { - anim: BattleOtherAnims.consume.anim + anim: BattleOtherAnims.consume.anim, }, happyhour: { - anim: BattleOtherAnims.selfstatus.anim + anim: BattleOtherAnims.selfstatus.anim, }, snatch: { - anim: BattleOtherAnims.dance.anim + anim: BattleOtherAnims.dance.anim, }, acidarmor: { anim(scene, [attacker]) { @@ -3118,11 +3118,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2, opacity: 0.2, - time: 0 + time: 0, }, { scale: 0, opacity: 1, - time: 300 + time: 300, }, 'linear'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -3130,16 +3130,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2, opacity: 0.2, - time: 200 + time: 200, }, { scale: 0, opacity: 1, - time: 500 + time: 500, }, 'linear'); - } + }, }, barrier: { - anim: BattleOtherAnims.lightstatus.anim + anim: BattleOtherAnims.lightstatus.anim, }, morningsun: { anim(scene, [attacker, defender]) { @@ -3150,11 +3150,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 0.8, - time: 200 + time: 200, }, { y: attacker.y + 130, opacity: 0, - time: 600 + time: 600, }, 'accel', 'fade'); scene.showEffect('electroball', { x: attacker.x - 40, @@ -3162,11 +3162,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 0.8, - time: 300 + time: 300, }, { y: attacker.y + 130, opacity: 0, - time: 700 + time: 700, }, 'accel', 'fade'); scene.showEffect('electroball', { x: attacker.x + 20, @@ -3174,11 +3174,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 0.8, - time: 400 + time: 400, }, { y: attacker.y + 130, opacity: 0, - time: 800 + time: 800, }, 'accel', 'fade'); scene.showEffect('wisp', { x: attacker.x - 20, @@ -3186,13 +3186,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 0.8, - time: 500 + time: 500, }, { y: attacker.y + 130, opacity: 0, - time: 900 + time: 900, }, 'accel', 'fade'); - } + }, }, moonlight: { anim(scene, [attacker]) { @@ -3203,11 +3203,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 0.8, - time: 200 + time: 200, }, { y: attacker.y + 130, opacity: 0, - time: 600 + time: 600, }, 'accel', 'fade'); scene.showEffect('wisp', { x: attacker.x - 40, @@ -3215,11 +3215,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 0.8, - time: 300 + time: 300, }, { y: attacker.y + 130, opacity: 0, - time: 700 + time: 700, }, 'accel', 'fade'); scene.showEffect('wisp', { x: attacker.x + 20, @@ -3227,11 +3227,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 0.8, - time: 400 + time: 400, }, { y: attacker.y + 130, opacity: 0, - time: 800 + time: 800, }, 'accel', 'fade'); scene.showEffect('shine', { x: attacker.x - 20, @@ -3239,11 +3239,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 0.8, - time: 500 + time: 500, }, { y: attacker.y + 130, opacity: 0, - time: 900 + time: 900, }, 'accel', 'fade'); scene.showEffect('wisp', { @@ -3251,20 +3251,20 @@ const BattleMoveAnims: AnimTable = { y: +175, z: +50, scale: 1.5, - opacity: 1 + opacity: 1, }, { - time: 700 + time: 700, }, 'accel', 'fade'); scene.showEffect('iceball', { x: 0, y: +175, z: +50, scale: 0.5, - opacity: 0.8 + opacity: 0.8, }, { - time: 700 + time: 700, }, 'accel', 'fade'); - } + }, }, cosmicpower: { anim(scene, [attacker]) { @@ -3275,11 +3275,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 0 + time: 0, }, { y: attacker.y + 60, opacity: 0, - time: 400 + time: 400, }, 'accel'); scene.showEffect('wisp', { x: attacker.x - 40, @@ -3287,11 +3287,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 200 + time: 200, }, { y: attacker.y + 60, opacity: 0, - time: 600 + time: 600, }, 'accel'); scene.showEffect('wisp', { x: attacker.x, @@ -3299,19 +3299,19 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 400 + time: 400, }, { y: attacker.y + 60, opacity: 0, - time: 800 + time: 800, }, 'accel'); - } + }, }, charge: { - anim: BattleOtherAnims.lightstatus.anim + anim: BattleOtherAnims.lightstatus.anim, }, luckychant: { - anim: BattleOtherAnims.lightstatus.anim + anim: BattleOtherAnims.lightstatus.anim, }, geomancy: { anim(scene, [attacker]) { @@ -3322,11 +3322,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 1, - time: 0 + time: 0, }, { scale: 2, opacity: 0, - time: 500 + time: 500, }, 'decel', 'fade'); scene.showEffect('mistball', { x: attacker.x + 40, @@ -3334,11 +3334,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 1, - time: 0 + time: 0, }, { y: attacker.y + 130, opacity: 0, - time: 400 + time: 400, }, 'accel'); scene.showEffect('electroball', { x: attacker.x - 40, @@ -3346,11 +3346,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 1, - time: 200 + time: 200, }, { y: attacker.y + 130, opacity: 0, - time: 600 + time: 600, }, 'accel'); scene.showEffect('energyball', { x: attacker.x, @@ -3358,11 +3358,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 1, - time: 400 + time: 400, }, { y: attacker.y + 130, opacity: 0, - time: 800 + time: 800, }, 'accel'); }, prepareAnim: BattleOtherAnims.chargestatus.anim, @@ -3375,11 +3375,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 1, - time: 0 + time: 0, }, { y: attacker.y + 130, opacity: 0, - time: 400 + time: 400, }, 'accel'); scene.showEffect('wisp', { x: attacker.x - 40, @@ -3387,11 +3387,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 1, - time: 200 + time: 200, }, { y: attacker.y + 130, opacity: 0, - time: 600 + time: 600, }, 'accel'); scene.showEffect('wisp', { x: attacker.x, @@ -3399,16 +3399,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 1, - time: 400 + time: 400, }, { y: attacker.y + 130, opacity: 0, - time: 800 + time: 800, }, 'accel'); - } + }, }, substitute: { - anim() {} + anim() {}, }, batonpass: { anim(scene, [attacker]) { @@ -3417,13 +3417,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 1 + opacity: 1, }, { x: attacker.x, y: attacker.y + 100, z: attacker.z, opacity: 0.1, - time: 200 + time: 200, }, 'accel'); scene.showEffect('wisp', { x: attacker.x, @@ -3431,13 +3431,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.1, - time: 200 + time: 200, }, { scale: 4, opacity: 1, - time: 400 + time: 400, }, 'linear', 'explode'); - } + }, }, calmmind: { anim(scene, [attacker]) { @@ -3447,11 +3447,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2, opacity: 0.1, - time: 0 + time: 0, }, { scale: 0, opacity: 0.5, - time: 400 + time: 400, }, 'linear'); scene.showEffect('shadowball', { x: attacker.x, @@ -3459,13 +3459,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2, opacity: 0.1, - time: 200 + time: 200, }, { scale: 0, opacity: 0.5, - time: 600 + time: 600, }, 'linear'); - } + }, }, nastyplot: { anim(scene, [attacker]) { @@ -3477,11 +3477,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2, opacity: 1, - time: 0 + time: 0, }, { scale: 1, opacity: 0, - time: 500 + time: 500, }, 'linear'); scene.showEffect('wisp', { x: attacker.x - 20, @@ -3489,11 +3489,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2, opacity: 1, - time: 50 + time: 50, }, { scale: 1, opacity: 0, - time: 500 + time: 500, }, 'linear'); scene.showEffect('wisp', { x: attacker.x, @@ -3501,11 +3501,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2, opacity: 1, - time: 100 + time: 100, }, { scale: 1, opacity: 0, - time: 500 + time: 500, }, 'linear'); scene.showEffect('electroball', { x: attacker.x, @@ -3513,13 +3513,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 1, - time: 300 + time: 300, }, { x: attacker.x, y: attacker.y + 40, z: attacker.z, scale: 0.25, - time: 750 + time: 750, }, 'decel', 'fade'); scene.showEffect('electroball', { x: attacker.x, @@ -3529,15 +3529,15 @@ const BattleMoveAnims: AnimTable = { xscale: 0.25, yscale: 0.75, opacity: 1, - time: 300 + time: 300, }, { x: attacker.x, y: attacker.y + 80, z: attacker.z, scale: 0.25, - time: 750 + time: 750, }, 'decel', 'fade'); - } + }, }, minimize: { anim(scene, [attacker]) { @@ -3546,35 +3546,35 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, opacity: 0.3, - time: 0 + time: 0, }, { y: attacker.y - 20, scale: 0.75, opacity: 0, - time: 400 + time: 400, }, 'accel'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 200 + time: 200, }, { y: attacker.y - 25, scale: 0.5, opacity: 0, - time: 600 + time: 600, }, 'accel'); attacker.anim({ y: attacker.y - 30, scale: 0.25, - time: 600 + time: 600, }, 'linear'); attacker.anim({ - time: 300 + time: 300, }, 'accel'); - } + }, }, growth: { anim(scene, [attacker]) { @@ -3583,34 +3583,34 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, opacity: 0.3, - time: 0 + time: 0, }, { y: attacker.y + 20, scale: 2, opacity: 0, - time: 400 + time: 400, }, 'accel'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 200 + time: 200, }, { y: attacker.y + 20, scale: 2, opacity: 0, - time: 600 + time: 600, }, 'accel'); attacker.anim({ scale: 1.25, - time: 600 + time: 600, }, 'linear'); attacker.anim({ - time: 300 + time: 300, }, 'accel'); - } + }, }, tailglow: { anim(scene, [attacker]) { @@ -3620,13 +3620,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2, opacity: 0.2, - time: 0 + time: 0, }, { scale: 1, opacity: 0.5, - time: 400 + time: 400, }, 'linear', 'explode'); - } + }, }, trick: { anim(scene, [attacker, defender]) { @@ -3634,69 +3634,69 @@ const BattleMoveAnims: AnimTable = { x: attacker.x, y: attacker.y, z: attacker.z, - time: 0 + time: 0, }, { x: defender.x, y: defender.y - 30, z: defender.z, - time: 300 + time: 300, }, 'ballistic2', 'fade'); scene.showEffect('pokeball', { x: defender.x, y: defender.y, z: defender.z, - time: 0 + time: 0, }, { x: attacker.x, y: attacker.y - 30, z: attacker.z, - time: 300 + time: 300, }, 'ballistic2Under', 'fade'); scene.showEffect('pokeball', { x: defender.x, y: defender.y - 30, z: defender.z, - time: 300 + time: 300, }, { x: attacker.x - 50, y: attacker.y, z: attacker.z, - time: 600 + time: 600, }, 'ballistic2', 'fade'); scene.showEffect('pokeball', { x: attacker.x, y: attacker.y - 30, z: attacker.z, - time: 300 + time: 300, }, { x: defender.x - 50, y: defender.y, z: defender.z, - time: 600 + time: 600, }, 'ballistic2Under', 'fade'); scene.showEffect('pokeball', { x: attacker.x - 50, y: attacker.y, z: attacker.z, - time: 600 + time: 600, }, { x: defender.x, y: defender.y, z: defender.z, - time: 900 + time: 900, }, 'ballistic2', 'explode'); scene.showEffect('pokeball', { x: defender.x - 50, y: defender.y, z: defender.z, - time: 600 + time: 600, }, { x: attacker.x, y: attacker.y, z: attacker.z, - time: 900 + time: 900, }, 'ballistic2Under', 'explode'); - } + }, }, switcheroo: { anim(scene, [attacker, defender]) { @@ -3704,69 +3704,69 @@ const BattleMoveAnims: AnimTable = { x: attacker.x, y: attacker.y, z: attacker.z, - time: 0 + time: 0, }, { x: defender.x, y: defender.y - 30, z: defender.z, - time: 300 + time: 300, }, 'ballistic2', 'fade'); scene.showEffect('pokeball', { x: defender.x, y: defender.y, z: defender.z, - time: 0 + time: 0, }, { x: attacker.x, y: attacker.y - 30, z: attacker.z, - time: 300 + time: 300, }, 'ballistic2Under', 'fade'); scene.showEffect('pokeball', { x: defender.x, y: defender.y - 30, z: defender.z, - time: 300 + time: 300, }, { x: attacker.x - 50, y: attacker.y, z: attacker.z, - time: 600 + time: 600, }, 'ballistic2', 'fade'); scene.showEffect('pokeball', { x: attacker.x, y: attacker.y - 30, z: attacker.z, - time: 300 + time: 300, }, { x: defender.x - 50, y: defender.y, z: defender.z, - time: 600 + time: 600, }, 'ballistic2Under', 'fade'); scene.showEffect('pokeball', { x: attacker.x - 50, y: attacker.y, z: attacker.z, - time: 600 + time: 600, }, { x: defender.x, y: defender.y, z: defender.z, - time: 900 + time: 900, }, 'ballistic2', 'explode'); scene.showEffect('pokeball', { x: defender.x - 50, y: defender.y, z: defender.z, - time: 600 + time: 600, }, { x: attacker.x, y: attacker.y, z: attacker.z, - time: 900 + time: 900, }, 'ballistic2Under', 'explode'); - } + }, }, skillswap: { anim(scene, [attacker, defender]) { @@ -3776,14 +3776,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 1, - time: 0 + time: 0, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.5, opacity: 0, - time: 400 + time: 400, }, 'ballistic2Under'); scene.showEffect('wisp', { x: attacker.x, @@ -3791,14 +3791,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 1, - time: 200 + time: 200, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.5, opacity: 0, - time: 600 + time: 600, }, 'ballistic2Under'); scene.showEffect('wisp', { x: defender.x, @@ -3806,14 +3806,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 200 + time: 200, }, { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.5, opacity: 0, - time: 600 + time: 600, }, 'ballistic'); scene.showEffect('wisp', { x: defender.x, @@ -3821,19 +3821,19 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 400 + time: 400, }, { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.5, opacity: 0, - time: 800 + time: 800, }, 'ballistic'); - } + }, }, recover: { - anim: BattleOtherAnims.chargestatus.anim + anim: BattleOtherAnims.chargestatus.anim, }, shadowforce: { anim(scene, [attacker, defender]) { @@ -3844,11 +3844,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 400 + time: 400, }, { scale: 3, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('shadowball', { x: defender.x, @@ -3856,15 +3856,15 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 500 + time: 500, }, { scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); attacker.anim({ opacity: 0, - time: 100 + time: 100, }, 'linear'); scene.showEffect('poisonwisp', { x: defender.x, @@ -3872,13 +3872,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 1, - time: 450 + time: 450, }, { x: defender.x, y: defender.y - 100, scale: 2, opacity: 0, - time: 950 + time: 950, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x, @@ -3886,13 +3886,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 1, - time: 450 + time: 450, }, { x: defender.x - 60, y: defender.y + 80, scale: 2, opacity: 0, - time: 950 + time: 950, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x, @@ -3900,13 +3900,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 1, - time: 450 + time: 450, }, { x: defender.x + 60, y: defender.y + 80, scale: 2, opacity: 0, - time: 950 + time: 950, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x, @@ -3914,13 +3914,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 1, - time: 450 + time: 450, }, { x: defender.x - 90, y: defender.y - 40, scale: 2, opacity: 0, - time: 950 + time: 950, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x, @@ -3928,13 +3928,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 1, - time: 450 + time: 450, }, { x: defender.x + 90, y: defender.y - 40, scale: 2, opacity: 0, - time: 950 + time: 950, }, 'linear', 'fade'); attacker.anim({ @@ -3942,37 +3942,37 @@ const BattleMoveAnims: AnimTable = { y: defender.y, z: defender.behind(-120), opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), opacity: 1, - time: 350 + time: 350, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), opacity: 0, - time: 300 + time: 300, }, 'linear'); attacker.anim({ opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ time: 300, - opacity: 1 + opacity: 1, }, 'linear'); defender.delay(380); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); }, prepareAnim(scene, [attacker]) { @@ -3997,11 +3997,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 350 + time: 350, }, { scale: 3, opacity: 0, - time: 500 + time: 500, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -4009,63 +4009,63 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 450 + time: 450, }, { scale: 3, opacity: 0, - time: 600 + time: 600, }, 'linear'); attacker.anim({ y: attacker.y + 80, opacity: 0, - time: 100 + time: 100, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y + 80, z: defender.z, opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y + 10, z: defender.z, opacity: 1, - time: 350 + time: 350, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y + 80, z: defender.z, opacity: 0, - time: 300 + time: 300, }, 'linear'); attacker.anim({ x: attacker.x, y: attacker.y + 80, z: defender.z, opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ time: 300, - opacity: 1 + opacity: 1, }, 'linear'); defender.delay(380); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); }, prepareAnim(scene, [attacker]) { attacker.anim({ opacity: 0.2, y: attacker.y + 80, - time: 300 + time: 300, }, 'linear'); }, }, @@ -4077,11 +4077,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 350 + time: 350, }, { scale: 3, opacity: 0, - time: 500 + time: 500, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -4089,63 +4089,63 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 450 + time: 450, }, { scale: 3, opacity: 0, - time: 600 + time: 600, }, 'linear'); attacker.anim({ y: attacker.y - 80, opacity: 0, - time: 100 + time: 100, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y - 80, z: defender.z, opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y + 10, z: defender.z, opacity: 1, - time: 350 + time: 350, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y - 80, z: defender.z, opacity: 0, - time: 300 + time: 300, }, 'linear'); attacker.anim({ x: attacker.x, y: attacker.y - 80, z: defender.z, opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ time: 300, - opacity: 1 + opacity: 1, }, 'linear'); defender.delay(380); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); }, prepareAnim(scene, [attacker]) { attacker.anim({ opacity: 0.2, y: attacker.y - 80, - time: 300 + time: 300, }, 'linear'); }, }, @@ -4157,11 +4157,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 350 + time: 350, }, { scale: 3, opacity: 0, - time: 500 + time: 500, }, 'linear'); scene.showEffect('waterwisp', { x: defender.x, @@ -4169,61 +4169,61 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 450 + time: 450, }, { scale: 3, opacity: 0, - time: 600 + time: 600, }, 'linear'); attacker.anim({ y: attacker.y - 80, opacity: 0, - time: 100 + time: 100, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y - 80, z: defender.z, opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y + 10, z: defender.z, opacity: 1, - time: 350 + time: 350, }, 'decel'); attacker.anim({ x: defender.x, y: defender.y - 80, z: defender.z, opacity: 0, - time: 300 + time: 300, }, 'accel'); attacker.anim({ y: attacker.y - 80, opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ time: 300, - opacity: 1 + opacity: 1, }, 'decel'); defender.delay(380); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); }, prepareAnim(scene, [attacker]) { attacker.anim({ opacity: 0.2, y: attacker.y - 80, - time: 300 + time: 300, }, 'swing'); }, }, @@ -4233,7 +4233,7 @@ const BattleMoveAnims: AnimTable = { attacker.anim({ opacity: 0.2, y: attacker.y + 80, - time: 300 + time: 300, }, 'linear'); }, }, @@ -4243,12 +4243,12 @@ const BattleMoveAnims: AnimTable = { attacker.anim({ opacity: 0.2, y: attacker.y + 80, - time: 300 + time: 300, }, 'linear'); defender.anim({ opacity: 0.2, y: defender.y + 80, - time: 300 + time: 300, }, 'linear'); }, }, @@ -4257,7 +4257,7 @@ const BattleMoveAnims: AnimTable = { prepareAnim(scene, [attacker]) { attacker.anim({ opacity: 0.8, - time: 300 + time: 300, }, 'linear'); }, }, @@ -4266,162 +4266,162 @@ const BattleMoveAnims: AnimTable = { prepareAnim(scene, [attacker]) { attacker.anim({ opacity: 0.8, - time: 300 + time: 300, }, 'linear'); }, }, hiddenpower: { anim(scene, [attacker, defender]) { - var xf = [1, -1, 1, -1]; - var yf = [1, -1, -1, 1]; - var xf2 = [1, 0, -1, 0]; - var yf2 = [0, 1, 0, -1]; + let xf = [1, -1, 1, -1]; + let yf = [1, -1, -1, 1]; + let xf2 = [1, 0, -1, 0]; + let yf2 = [0, 1, 0, -1]; - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { scene.showEffect('electroball', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { x: attacker.x + 240 * xf[i], y: attacker.y, z: attacker.z + 137 * yf[i], scale: 1, opacity: 0.5, - time: 800 + time: 800, }, 'accel', 'fade'); scene.showEffect('electroball', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { x: attacker.x + 339 * xf2[i], y: attacker.y, z: attacker.z + 194 * yf2[i], scale: 1, opacity: 0.5, - time: 800 + time: 800, }, 'accel', 'fade'); } - } + }, }, storedpower: { anim(scene, [attacker, defender]) { - var xf = [1, -1, 1, -1]; - var yf = [1, -1, -1, 1]; - var xf2 = [1, 0, -1, 0]; - var yf2 = [0, 1, 0, -1]; + let xf = [1, -1, 1, -1]; + let yf = [1, -1, -1, 1]; + let xf2 = [1, 0, -1, 0]; + let yf2 = [0, 1, 0, -1]; - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { scene.showEffect('poisonwisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { x: attacker.x + 240 * xf[i], y: attacker.y, z: attacker.z + 137 * yf[i], scale: 1, opacity: 0.5, - time: 800 + time: 800, }, 'accel'); scene.showEffect('poisonwisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { x: attacker.x + 339 * xf2[i], y: attacker.y, z: attacker.z + 194 * yf2[i], scale: 1, opacity: 0.5, - time: 800 + time: 800, }, 'accel'); } - } + }, }, haze: { anim(scene, [attacker, defender]) { - var xf = [1, -1, 1, -1]; - var yf = [1, -1, -1, 1]; - var xf2 = [1, 0, -1, 0]; - var yf2 = [0, 1, 0, -1]; + let xf = [1, -1, 1, -1]; + let yf = [1, -1, -1, 1]; + let xf2 = [1, 0, -1, 0]; + let yf2 = [0, 1, 0, -1]; scene.backgroundEffect('#000000', 1000, 0.3); - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { scene.showEffect('blackwisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { x: attacker.x + 120 * xf[i], y: attacker.y, z: attacker.z + 68 * yf[i], scale: 1, opacity: 0, - time: 800 + time: 800, }, 'decel', 'fade'); scene.showEffect('blackwisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { x: attacker.x + 113 * xf2[i], y: attacker.y, z: attacker.z + 97 * yf2[i], scale: 1, opacity: 0, - time: 800 + time: 800, }, 'decel', 'fade'); scene.showEffect('blackwisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { x: attacker.x + 120 * xf[i], y: attacker.y, z: attacker.z + 68 * yf[i], scale: 1, opacity: 0, - time: 800 + time: 800, }, 'decel', 'fade'); scene.showEffect('blackwisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { x: attacker.x + 113 * xf2[i], y: attacker.y, z: attacker.z + 97 * yf2[i], scale: 1, opacity: 0, - time: 800 + time: 800, }, 'decel', 'fade'); } - } + }, }, seedflare: { anim(scene, [attacker, defender]) { - var xf = [1, -1, 1, -1]; - var yf = [1, -1, -1, 1]; - var xf2 = [1, 0, -1, 0]; - var yf2 = [0, 1, 0, -1]; + let xf = [1, -1, 1, -1]; + let yf = [1, -1, -1, 1]; + let xf2 = [1, 0, -1, 0]; + let yf2 = [0, 1, 0, -1]; scene.showEffect('energyball', { x: attacker.x, @@ -4429,43 +4429,43 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.4, - time: 0 + time: 0, }, { scale: 8, opacity: 0.1, - time: 600 + time: 600, }, 'linear', 'fade'); - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { scene.showEffect('wisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.2, - opacity: 1 + opacity: 1, }, { x: attacker.x + 240 * xf[i], y: attacker.y, z: attacker.z + 137 * yf[i], scale: 0.3, opacity: 0.5, - time: 800 + time: 800, }, 'accel'); scene.showEffect('wisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.2, - opacity: 1 + opacity: 1, }, { x: attacker.x + 339 * xf2[i], y: attacker.y, z: attacker.z + 194 * yf2[i], scale: 0.3, opacity: 0.5, - time: 800 + time: 800, }, 'accel'); } - } + }, }, powerwhip: { anim(scene, [attacker, defender]) { @@ -4475,14 +4475,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 420 + time: 420, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('energyball', { x: defender.x, @@ -4490,14 +4490,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 520 + time: 520, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('leaf1', { x: defender.x, @@ -4505,13 +4505,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 500 + time: 500, }, { x: defender.x, y: defender.y - 60, scale: 1.5, opacity: 0, - time: 1100 + time: 1100, }, 'linear', 'fade'); scene.showEffect('leaf2', { x: defender.x, @@ -4519,13 +4519,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 500 + time: 500, }, { x: defender.x + 60, y: defender.y, scale: 1.5, opacity: 0, - time: 1100 + time: 1100, }, 'linear', 'fade'); scene.showEffect('leaf2', { x: defender.x, @@ -4533,13 +4533,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 500 + time: 500, }, { x: defender.x, y: defender.y + 60, scale: 1.5, opacity: 0, - time: 1100 + time: 1100, }, 'linear', 'fade'); scene.showEffect('leaf1', { x: defender.x, @@ -4547,16 +4547,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 500 + time: 500, }, { x: defender.x - 60, y: defender.y, scale: 1.5, opacity: 0, - time: 1100 + time: 1100, }, 'linear', 'fade'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, woodhammer: { anim(scene, [attacker, defender]) { @@ -4566,14 +4566,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 420 + time: 420, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('energyball', { x: defender.x, @@ -4581,14 +4581,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 520 + time: 520, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('leaf1', { x: defender.x, @@ -4596,14 +4596,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 500 + time: 500, }, { x: defender.x, y: defender.y + 10, z: defender.z, scale: 2, opacity: 0.4, - time: 700 + time: 700, }, 'decel', 'fade'); scene.showEffect('leaf2', { x: defender.x - 40, @@ -4611,14 +4611,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 600 + time: 600, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 2, opacity: 0.4, - time: 800 + time: 800, }, 'decel', 'fade'); scene.showEffect('leaf2', { x: defender.x + 40, @@ -4626,41 +4626,41 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 700 + time: 700, }, { x: defender.x + 40, y: defender.y, z: defender.z, scale: 2, opacity: 0.4, - time: 900 + time: 900, }, 'decel', 'fade'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, crushclaw: { - anim: BattleOtherAnims.clawattack.anim + anim: BattleOtherAnims.clawattack.anim, }, falseswipe: { - anim: BattleOtherAnims.slashattack.anim + anim: BattleOtherAnims.slashattack.anim, }, dragonclaw: { - anim: BattleOtherAnims.clawattack.anim + anim: BattleOtherAnims.clawattack.anim, }, metalclaw: { - anim: BattleOtherAnims.clawattack.anim + anim: BattleOtherAnims.clawattack.anim, }, furycutter: { - anim: BattleOtherAnims.slashattack.anim + anim: BattleOtherAnims.slashattack.anim, }, scratch: { - anim: BattleOtherAnims.slashattack.anim + anim: BattleOtherAnims.slashattack.anim, }, cut: { - anim: BattleOtherAnims.slashattack.anim + anim: BattleOtherAnims.slashattack.anim, }, slash: { - anim: BattleOtherAnims.slashattack.anim + anim: BattleOtherAnims.slashattack.anim, }, nightslash: { anim(scene, [attacker, defender]) { @@ -4671,11 +4671,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 500 + time: 500, }, { scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('rightslash', { x: defender.x - 5, @@ -4683,20 +4683,20 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 600 + time: 600, }, { scale: 3, opacity: 0, - time: 900 + time: 900, }, 'linear', 'fade'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, shadowclaw: { anim(scene, [attacker, defender]) { scene.backgroundEffect('#000000', 700, 0.3); BattleOtherAnims.clawattack.anim(scene, [attacker, defender]); - } + }, }, multiattack: { anim(scene, [attacker, defender]) { @@ -4706,11 +4706,11 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.5 + opacity: 0.5, }, { scale: 2, opacity: 0, - time: 300 + time: 300, }, 'decel'); scene.showEffect('rightslash', { x: defender.x + 5, @@ -4718,11 +4718,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 800 + time: 800, }, { scale: 3, opacity: 0, - time: 1100 + time: 1100, }, 'linear', 'fade'); scene.showEffect('rightslash', { x: defender.x - 5, @@ -4730,22 +4730,22 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 800 + time: 800, }, { scale: 3, opacity: 0, - time: 1100 + time: 1100, }, 'linear', 'fade'); attacker.delay(300); defender.delay(300); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, holdback: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, knockdown: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, seismictoss: { anim(scene, [attacker, defender]) { @@ -4756,75 +4756,75 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 400 + time: 400, }, { scale: 3, opacity: 0, - time: 600 + time: 600, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), - time: 350 + time: 350, }, 'ballistic2Under'); attacker.anim({ x: defender.x, y: defender.y + 10, z: defender.behind(5), - time: 50 + time: 50, }, 'ballistic2Under'); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(380); defender.anim({ y: defender.y + 100, z: defender.behind(5), opacity: 0.5, - time: 300 + time: 300, }, 'decel'); defender.anim({ - time: 250 + time: 250, }, 'accel'); defender.anim({ x: defender.x, y: defender.y - 35, yscale: 0.25, - time: 50 + time: 50, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); scene.wait(1000); - } + }, }, peck: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, drillpeck: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, irontail: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, bite: { anim(scene, [attacker, defender]) { BattleOtherAnims.bite.anim(scene, [attacker, defender]); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, superfang: { anim(scene, [attacker, defender]) { BattleOtherAnims.bite.anim(scene, [attacker, defender]); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, bugbite: { anim(scene, [attacker, defender]) { BattleOtherAnims.bite.anim(scene, [attacker, defender]); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, crunch: { anim(scene, [attacker, defender]) { @@ -4835,11 +4835,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.65, opacity: 0, - time: 370 + time: 370, }, { y: defender.y + 20, opacity: 1, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('bottombite', { x: defender.x, @@ -4847,14 +4847,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.65, opacity: 0, - time: 370 + time: 370, }, { y: defender.y - 20, opacity: 1, - time: 500 + time: 500, }, 'linear', 'explode'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, pursuit: { anim(scene, [attacker, defender]) { @@ -4864,11 +4864,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(15), scale: 0, opacity: 0.2, - time: 600 + time: 600, }, { scale: 1.5, opacity: 0, - time: 1000 + time: 1000, }, 'linear'); attacker.delay(300); @@ -4876,34 +4876,34 @@ const BattleMoveAnims: AnimTable = { x: defender.leftof(20), y: defender.y, z: defender.behind(-20), - time: 300 + time: 300, }, 'ballistic2Under'); attacker.anim({ x: defender.leftof(5), y: defender.y, z: defender.behind(15), - time: 50 + time: 50, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2'); defender.anim({ x: defender.x, y: defender.y, z: defender.behind(15), - time: 600 + time: 600, }, 'accel'); defender.delay(25); defender.anim({ x: defender.x, y: defender.y, z: defender.behind(30), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 400 + time: 400, }, 'swing'); - } + }, }, blazekick: { anim(scene, [attacker, defender]) { @@ -4913,14 +4913,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('fireball', { x: defender.x, @@ -4928,19 +4928,19 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 500 + time: 500, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); BattleOtherAnims.kick.anim(scene, [attacker, defender]); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, lowkick: { anim(scene, [attacker, defender]) { @@ -4950,41 +4950,41 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(15), scale: 1, opacity: 1, - time: 400 + time: 400, }, { x: defender.x - 50, z: defender.behind(20), scale: 1.7, opacity: 0, - time: 650 + time: 650, }, 'linear'); attacker.anim({ x: defender.leftof(20), y: defender.y, z: defender.behind(-20), - time: 400 + time: 400, }, 'ballistic2Under'); attacker.anim({ x: defender.x, y: defender.y, z: defender.z, - time: 50 + time: 50, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2'); defender.delay(425); defender.anim({ x: defender.leftof(-15), y: defender.y, z: defender.behind(20), - time: 50 + time: 50, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, stomp: { anim(scene, [attacker, defender]) { @@ -4994,65 +4994,65 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-15), scale: 1.5, opacity: 0.8, - time: 400 + time: 400, }, { y: defender.y - 10, z: defender.z, scale: 1, opacity: 1, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('wisp', { x: defender.x, y: defender.y - 30, z: defender.z, scale: 1, - time: 500 + time: 500, }, { x: defender.x + 70, scale: 0.8, opacity: 0.3, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, y: defender.y - 30, z: defender.z, scale: 1, - time: 500 + time: 500, }, { x: defender.x - 70, scale: 0.8, opacity: 0.3, - time: 800 + time: 800, }, 'linear', 'fade'); attacker.anim({ x: defender.x, y: defender.y + 80, z: defender.behind(-30), - time: 400 + time: 400, }, 'ballistic'); attacker.anim({ x: defender.x, y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ - time: 600 + time: 600, }, 'ballistic2Back'); defender.delay(450); defender.anim({ y: defender.y - 30, z: defender.behind(20), yscale: 0.5, - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, tropkick: { anim(scene, [attacker, defender]) { @@ -5064,14 +5064,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 420 + time: 420, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('energyball', { x: defender.x, @@ -5079,14 +5079,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 520 + time: 520, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('petal', { @@ -5095,14 +5095,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.8, - time: 550 + time: 550, }, { x: defender.x + 60, y: defender.y - 20, z: defender.z, scale: 1, opacity: 0.5, - time: 825 + time: 825, }, 'decel', 'explode'); scene.showEffect('petal', { x: defender.x, @@ -5110,14 +5110,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.8, - time: 575 + time: 575, }, { x: defender.x - 50, y: defender.y - 20, z: defender.z, scale: 1, opacity: 0.5, - time: 850 + time: 850, }, 'decel', 'explode'); scene.showEffect('petal', { x: defender.x, @@ -5125,14 +5125,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.8, - time: 600 + time: 600, }, { x: defender.x - 60, y: defender.y + 20, z: defender.z, scale: 1, opacity: 0.5, - time: 875 + time: 875, }, 'decel', 'explode'); scene.showEffect('petal', { x: defender.x, @@ -5140,14 +5140,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.8, - time: 625 + time: 625, }, { x: defender.x + 50, y: defender.y + 30, z: defender.z, scale: 1, opacity: 0.5, - time: 900 + time: 900, }, 'decel', 'explode'); scene.showEffect('petal', { x: defender.x, @@ -5155,23 +5155,23 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.8, - time: 650 + time: 650, }, { x: defender.x - 10, y: defender.y + 60, z: defender.z, scale: 1, opacity: 0.5, - time: 925 + time: 925, }, 'decel', 'explode'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, jumpkick: { anim(scene, [attacker, defender]) { BattleOtherAnims.kick.anim(scene, [attacker, defender]); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, highjumpkick: { anim(scene, [attacker, defender]) { @@ -5180,22 +5180,22 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 170, z: attacker.behind(-35), opacity: 0.3, - time: 25 + time: 25, }, { x: defender.x, y: defender.y, - z: defender.behind(0) + z: defender.behind(0), }, 'ballistic', 'fade'); scene.showEffect(attacker.sp, { x: defender.leftof(-10), y: attacker.y + 170, z: attacker.behind(-35), opacity: 0.3, - time: 75 + time: 75, }, { x: defender.x, y: defender.y, - z: defender.behind(0) + z: defender.behind(0), }, 'ballistic', 'fade'); scene.showEffect('foot', { x: defender.x, @@ -5203,14 +5203,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 500 + time: 500, }, { x: defender.x, y: defender.y + 10, z: defender.behind(15), scale: 2, opacity: 0, - time: 900 + time: 900, }, 'linear'); scene.showEffect('shadowball', { x: defender.x, @@ -5218,39 +5218,39 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.7, - time: 500 + time: 500, }, { scale: 3, opacity: 0, - time: 750 + time: 750, }, 'linear', 'fade'); attacker.anim({ x: defender.x, y: defender.y + 170, z: defender.behind(-30), - time: 400 + time: 400, }, 'ballistic'); attacker.anim({ x: defender.x, y: defender.y + 5, z: defender.z, - time: 200 + time: 200, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(500); defender.anim({ y: defender.y - 5, z: defender.behind(40), yscale: 0.9, - time: 300 + time: 300, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, ironhead: { anim(scene, [attacker, defender]) { @@ -5260,14 +5260,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.2, - time: 450 + time: 450, }, { scale: 2, opacity: 0, - time: 700 + time: 700, }, 'linear'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, heartstamp: { anim(scene, [attacker, defender]) { @@ -5277,26 +5277,26 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 0.5, - time: 450 + time: 450, }, { scale: 4, opacity: 0, - time: 700 + time: 700, }, 'linear'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, slam: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, dragontail: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, reversal: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, punishment: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, forcepalm: { anim(scene, [attacker, defender]) { @@ -5306,12 +5306,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z - 10, scale: 0.6, opacity: 0.1, - time: 350 + time: 350, }, { x: defender.x + 20, scale: 0.5, opacity: 1, - time: 500 + time: 500, }, 'linear', 'fade'); scene.showEffect('rightchop', { x: defender.x + 20, @@ -5319,11 +5319,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z - 10, scale: 0.5, opacity: 1, - time: 500 + time: 500, }, { x: defender.x - 15, opacity: 0, - time: 800 + time: 800, }, 'decel', 'fade'); scene.showEffect('rightchop', { x: defender.x + 20, @@ -5331,39 +5331,39 @@ const BattleMoveAnims: AnimTable = { z: defender.z - 10, scale: 0.5, opacity: 0.3, - time: 575 + time: 575, }, { x: defender.x - 15, opacity: 0, - time: 850 + time: 850, }, 'decel', 'fade'); attacker.anim({ x: defender.leftof(20), y: defender.y, z: defender.behind(-20), - time: 400 + time: 400, }, 'ballistic2Under'); attacker.anim({ x: defender.x, y: defender.y, z: defender.z, - time: 50 + time: 50, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2'); defender.delay(425); defender.anim({ x: defender.leftof(-15), y: defender.y, z: defender.behind(15), - time: 50 + time: 50, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, circlethrow: { anim(scene, [attacker, defender]) { @@ -5373,13 +5373,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), z: defender.behind(20), scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -5387,13 +5387,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 500 + time: 500, }, { x: defender.leftof(-20), z: defender.behind(20), scale: 0.6, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('rightchop', { x: defender.x, @@ -5401,49 +5401,49 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), z: defender.behind(20), scale: 1, opacity: 0, - time: 800 + time: 800, }, 'linear'); attacker.anim({ x: defender.leftof(20), y: defender.y, z: defender.behind(-20), - time: 400 + time: 400, }, 'ballistic2Under'); attacker.anim({ x: defender.x, y: defender.y, z: defender.z, - time: 50 + time: 50, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2'); defender.delay(425); defender.anim({ x: defender.leftof(-15), y: defender.y, z: defender.behind(15), - time: 50 + time: 50, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, knockoff: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, assurance: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, chipaway: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, bodyslam: { anim(scene, [attacker, defender]) { @@ -5452,52 +5452,52 @@ const BattleMoveAnims: AnimTable = { y: defender.y - 30, z: defender.z, scale: 1, - time: 500 + time: 500, }, { x: defender.x + 70, scale: 0.8, opacity: 0.3, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, y: defender.y - 30, z: defender.z, scale: 1, - time: 500 + time: 500, }, { x: defender.x - 70, scale: 0.8, opacity: 0.3, - time: 800 + time: 800, }, 'linear', 'fade'); attacker.anim({ x: defender.x, y: defender.y + 80, z: defender.behind(-30), - time: 400 + time: 400, }, 'ballistic'); attacker.anim({ x: defender.x, y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ - time: 600 + time: 600, }, 'ballistic2Back'); defender.delay(450); defender.anim({ y: defender.y - 30, z: defender.behind(20), yscale: 0.5, - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, heavyslam: { anim(scene, [attacker, defender]) { @@ -5507,72 +5507,72 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 450 + time: 450, }, { scale: 2, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('wisp', { x: defender.x, y: defender.y - 30, z: defender.z, scale: 1, - time: 500 + time: 500, }, { x: defender.x + 70, scale: 0.8, opacity: 0.3, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, y: defender.y - 30, z: defender.z, scale: 1, - time: 500 + time: 500, }, { x: defender.x - 70, scale: 0.8, opacity: 0.3, - time: 800 + time: 800, }, 'linear', 'fade'); attacker.anim({ x: defender.x, y: defender.y + 80, z: defender.behind(-30), - time: 400 + time: 400, }, 'ballistic'); attacker.anim({ x: defender.x, y: defender.y + 5, z: defender.behind(20), - time: 100 + time: 100, }); attacker.anim({ - time: 600 + time: 600, }, 'ballistic2Back'); defender.delay(450); defender.anim({ y: defender.y - 30, z: defender.behind(20), yscale: 0.5, - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, steamroller: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, pound: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, clamp: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, wakeupslap: { anim(scene, [attacker, defender]) { @@ -5582,13 +5582,13 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-10), scale: 0.6, opacity: 1, - time: 400 + time: 400, }, { x: defender.x - 10, y: defender.y - 10, xscale: 0, opacity: 0.5, - time: 512.5 + time: 512.5, }, 'linear', 'fade'); scene.showEffect('leftchop', { x: defender.x, @@ -5597,16 +5597,16 @@ const BattleMoveAnims: AnimTable = { scale: 0.6, xscale: 0, opacity: 1, - time: 512.5 + time: 512.5, }, { x: defender.x - 30, y: defender.y, xscale: 0.6, opacity: 0, - time: 625 + time: 625, }, 'linear', 'fade'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, smellingsalts: { anim(scene, [attacker, defender]) { @@ -5616,14 +5616,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -5631,14 +5631,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 500 + time: 500, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('rightchop', { x: defender.x, @@ -5646,41 +5646,41 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 0.9, opacity: 0, - time: 800 + time: 800, }, 'linear'); attacker.anim({ x: defender.leftof(20), y: defender.y, z: defender.behind(-20), - time: 400 + time: 400, }, 'ballistic2Under'); attacker.anim({ x: defender.x, y: defender.y, z: defender.z, - time: 50 + time: 50, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2'); defender.delay(425); defender.anim({ x: defender.leftof(-15), y: defender.y, z: defender.behind(15), - time: 50 + time: 50, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, karatechop: { anim(scene, [attacker, defender]) { @@ -5690,14 +5690,14 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-10), scale: 0.6, opacity: 1, - time: 475 + time: 475, }, { y: defender.y - 20, opacity: 0.5, - time: 550 + time: 550, }, 'linear', 'fade'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, crosschop: { anim(scene, [attacker, defender]) { @@ -5707,11 +5707,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 425 + time: 425, }, { scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('leftslash', { x: defender.x + 10, @@ -5719,11 +5719,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 425 + time: 425, }, { scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('leftchop', { @@ -5732,13 +5732,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.75, opacity: 1, - time: 400 + time: 400, }, { x: defender.x - 60, y: defender.y - 70, scale: 0.5, opacity: 0, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('rightchop', { x: defender.x - 60, @@ -5746,25 +5746,25 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.75, opacity: 1, - time: 400 + time: 400, }, { x: defender.x + 60, y: defender.y - 70, scale: 0.5, opacity: 0, - time: 600 + time: 600, }, 'linear', 'fade'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, lick: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, vicegrip: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, headbutt: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, block: { anim(scene, [attacker, defender]) { @@ -5773,24 +5773,24 @@ const BattleMoveAnims: AnimTable = { y: defender.y, z: defender.z, scale: 2, - opacity: 0.5 + opacity: 0.5, }, { scale: 1, opacity: 1, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('leftslash', { x: defender.x, y: defender.y, z: defender.z, scale: 2, - opacity: 0.5 + opacity: 0.5, }, { scale: 1, opacity: 1, - time: 400 + time: 400, }, 'linear', 'explode'); - } + }, }, xscissor: { anim(scene, [attacker, defender]) { @@ -5798,43 +5798,43 @@ const BattleMoveAnims: AnimTable = { x: defender.leftof(-30), y: defender.y + 80, z: defender.behind(-30), - time: 300 + time: 300, }, 'ballistic'); attacker.anim({ x: defender.leftof(30), y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ x: defender.leftof(30), y: defender.y + 80, z: defender.behind(-30), - time: 200 + time: 200, }, 'ballisticUp'); attacker.anim({ x: defender.leftof(-30), y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(450); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 200 + time: 200, }, 'swing'); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); scene.showEffect('rightslash', { @@ -5843,11 +5843,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 425 + time: 425, }, { scale: 2, opacity: 0.5, - time: 725 + time: 725, }, 'linear', 'fade'); scene.showEffect('rightslash', { x: defender.x, @@ -5855,11 +5855,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 625 + time: 625, }, { scale: 3, opacity: 0, - time: 1000 + time: 1000, }, 'linear', 'fade'); scene.showEffect('leftslash', { x: defender.x, @@ -5867,13 +5867,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 625 + time: 625, }, { scale: 3, opacity: 0, - time: 1000 + time: 1000, }, 'linear', 'fade'); - } + }, }, crosspoison: { anim(scene, [attacker, defender]) { @@ -5881,43 +5881,43 @@ const BattleMoveAnims: AnimTable = { x: defender.leftof(-30), y: defender.y + 80, z: defender.behind(-30), - time: 300 + time: 300, }, 'ballistic'); attacker.anim({ x: defender.leftof(30), y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ x: defender.leftof(30), y: defender.y + 80, z: defender.behind(-30), - time: 200 + time: 200, }, 'ballisticUp'); attacker.anim({ x: defender.leftof(-30), y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(450); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 200 + time: 200, }, 'swing'); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); scene.showEffect('rightslash', { @@ -5926,11 +5926,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 425 + time: 425, }, { scale: 2, opacity: 0.5, - time: 725 + time: 725, }, 'linear', 'fade'); scene.showEffect('rightslash', { x: defender.x, @@ -5938,11 +5938,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 625 + time: 625, }, { scale: 3, opacity: 0, - time: 1000 + time: 1000, }, 'linear', 'fade'); scene.showEffect('leftslash', { x: defender.x, @@ -5950,11 +5950,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 625 + time: 625, }, { scale: 3, opacity: 0, - time: 1000 + time: 1000, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { @@ -5963,13 +5963,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 450 + time: 450, }, { x: defender.x + 30, y: defender.y + 10, scale: 1, opacity: 0.5, - time: 750 + time: 750, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: defender.x, @@ -5977,13 +5977,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 550 + time: 550, }, { x: defender.x - 30, y: defender.y - 40, scale: 1, opacity: 0.5, - time: 850 + time: 850, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: defender.x, @@ -5991,23 +5991,23 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 650 + time: 650, }, { x: defender.x - 10, y: defender.y + 40, scale: 1, opacity: 0.5, - time: 950 + time: 950, }, 'decel', 'fade'); - } + }, }, facade: { - anim: BattleOtherAnims.xattack.anim + anim: BattleOtherAnims.xattack.anim, }, guillotine: { - anim: BattleOtherAnims.xattack.anim + anim: BattleOtherAnims.xattack.anim, }, - 'return': { + return: { anim(scene, [attacker, defender]) { scene.showEffect('heart', { x: attacker.x - 10, @@ -6015,11 +6015,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 1, - time: 0 + time: 0, }, { scale: 3, opacity: 0, - time: 300 + time: 300, }, 'ballistic2Under', 'fade'); attacker.delay(300); @@ -6027,43 +6027,43 @@ const BattleMoveAnims: AnimTable = { x: defender.leftof(-30), y: defender.y + 80, z: defender.behind(-30), - time: 300 + time: 300, }, 'ballistic'); attacker.anim({ x: defender.leftof(30), y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ x: defender.leftof(30), y: defender.y + 80, z: defender.behind(-30), - time: 200 + time: 200, }, 'ballisticUp'); attacker.anim({ x: defender.leftof(-30), y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(750); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 200 + time: 200, }, 'swing'); defender.anim({ z: defender.behind(15), - time: 300 + time: 300, }, 'decel'); defender.anim({ - time: 300 + time: 300, }, 'swing'); scene.showEffect('foot', { @@ -6072,14 +6072,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 650 + time: 650, }, { x: defender.x - 15, y: defender.y + 10, z: defender.behind(15), scale: 2, opacity: 0, - time: 950 + time: 950, }, 'linear'); scene.showEffect('fist', { x: defender.x - 5, @@ -6087,14 +6087,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 675 + time: 675, }, { x: defender.x - 10, y: defender.y - 10, z: defender.z, scale: 1, opacity: 1, - time: 875 + time: 875, }, 'linear', 'explode'); scene.showEffect('fist', { x: defender.x + 10, @@ -6102,14 +6102,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 700 + time: 700, }, { x: defender.x + 20, y: defender.y + 20, z: defender.z, scale: 1, opacity: 1, - time: 900 + time: 900, }, 'linear', 'explode'); scene.showEffect('fist', { x: defender.x + 20, @@ -6117,14 +6117,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 725 + time: 725, }, { x: defender.x + 30, y: defender.y - 25, z: defender.z, scale: 1, opacity: 1, - time: 925 + time: 925, }, 'linear', 'explode'); scene.showEffect('foot', { x: defender.x, @@ -6132,16 +6132,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 1000 + time: 1000, }, { x: defender.x, y: defender.y + 10, z: defender.behind(15), scale: 2, opacity: 0, - time: 1300 + time: 1300, }, 'linear'); - } + }, }, leafblade: { anim(scene, [attacker, defender]) { @@ -6152,11 +6152,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.5, - time: 450 + time: 450, }, { scale: 2, opacity: 0.2, - time: 750 + time: 750, }, 'linear', 'fade'); scene.showEffect('energyball', { x: defender.x, @@ -6164,11 +6164,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.5, - time: 750 + time: 750, }, { scale: 2, opacity: 0.2, - time: 1050 + time: 1050, }, 'linear', 'fade'); scene.showEffect('leaf1', { x: defender.x - 35, @@ -6176,11 +6176,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.7, - time: 450 + time: 450, }, { scale: 3, opacity: 0, - time: 750 + time: 750, }, 'linear'); scene.showEffect('leaf2', { x: defender.x + 35, @@ -6188,11 +6188,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.8, opacity: 0.7, - time: 550 + time: 550, }, { scale: 3.5, opacity: 0, - time: 850 + time: 850, }, 'linear'); scene.showEffect('leftslash', { x: defender.x - 10, @@ -6200,11 +6200,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 0.6, - time: 450 + time: 450, }, { scale: 2, opacity: 0, - time: 800 + time: 800, }, 'accel', 'fade'); scene.showEffect('leaf1', { x: defender.x - 35, @@ -6212,11 +6212,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.7, - time: 750 + time: 750, }, { scale: 3, opacity: 0, - time: 1050 + time: 1050, }, 'linear'); scene.showEffect('leaf2', { x: defender.x + 35, @@ -6224,11 +6224,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.8, opacity: 0.7, - time: 800 + time: 800, }, { scale: 3.5, opacity: 0, - time: 1190 + time: 1190, }, 'linear'); scene.showEffect('rightslash', { x: defender.x - 10, @@ -6236,13 +6236,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 0.6, - time: 750 + time: 750, }, { scale: 2, opacity: 0, - time: 1100 + time: 1100, }, 'accel', 'fade'); - } + }, }, thrash: { anim(scene, [attacker, defender]) { @@ -6252,11 +6252,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 1, - time: 0 + time: 0, }, { scale: 3, opacity: 0, - time: 300 + time: 300, }, 'ballistic2Under', 'fade'); attacker.delay(300); @@ -6264,43 +6264,43 @@ const BattleMoveAnims: AnimTable = { x: defender.leftof(-30), y: defender.y + 80, z: defender.behind(-30), - time: 300 + time: 300, }, 'ballistic'); attacker.anim({ x: defender.leftof(30), y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ x: defender.leftof(30), y: defender.y + 80, z: defender.behind(-30), - time: 200 + time: 200, }, 'ballisticUp'); attacker.anim({ x: defender.leftof(-30), y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(750); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 200 + time: 200, }, 'swing'); defender.anim({ z: defender.behind(15), - time: 300 + time: 300, }, 'decel'); defender.anim({ - time: 300 + time: 300, }, 'swing'); scene.showEffect('foot', { @@ -6309,14 +6309,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 650 + time: 650, }, { x: defender.x - 15, y: defender.y + 10, z: defender.behind(15), scale: 2, opacity: 0, - time: 950 + time: 950, }, 'linear'); scene.showEffect('fist', { x: defender.x - 5, @@ -6324,14 +6324,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 675 + time: 675, }, { x: defender.x - 10, y: defender.y - 10, z: defender.z, scale: 1, opacity: 1, - time: 875 + time: 875, }, 'linear', 'explode'); scene.showEffect('fist', { x: defender.x + 10, @@ -6339,14 +6339,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 700 + time: 700, }, { x: defender.x + 20, y: defender.y + 20, z: defender.z, scale: 1, opacity: 1, - time: 900 + time: 900, }, 'linear', 'explode'); scene.showEffect('fist', { x: defender.x + 20, @@ -6354,14 +6354,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 725 + time: 725, }, { x: defender.x + 30, y: defender.y - 25, z: defender.z, scale: 1, opacity: 1, - time: 925 + time: 925, }, 'linear', 'explode'); scene.showEffect('foot', { x: defender.x, @@ -6369,19 +6369,19 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 1000 + time: 1000, }, { x: defender.x, y: defender.y + 10, z: defender.behind(15), scale: 2, opacity: 0, - time: 1300 + time: 1300, }, 'linear'); - } + }, }, pluck: { - anim: BattleOtherAnims.xattack.anim + anim: BattleOtherAnims.xattack.anim, }, bind: { anim(scene, [attacker, defender]) { @@ -6392,12 +6392,12 @@ const BattleMoveAnims: AnimTable = { scale: 0.7, xscale: 2, opacity: 0.3, - time: 500 + time: 500, }, { scale: 0.4, xscale: 1, opacity: 0.1, - time: 1100 + time: 1100, }, 'decel', 'fade'); scene.showEffect('iceball', { x: defender.x, @@ -6406,12 +6406,12 @@ const BattleMoveAnims: AnimTable = { scale: 0.7, xscale: 2, opacity: 0.3, - time: 550 + time: 550, }, { scale: 0.4, xscale: 1, opacity: 0.1, - time: 1150 + time: 1150, }, 'decel', 'fade'); scene.showEffect('iceball', { x: defender.x, @@ -6420,49 +6420,49 @@ const BattleMoveAnims: AnimTable = { scale: 0.7, xscale: 2, opacity: 0.3, - time: 600 + time: 600, }, { scale: 0.4, xscale: 1, opacity: 0.1, - time: 1200 + time: 1200, }, 'decel', 'fade'); attacker.anim({ x: defender.leftof(-30), y: defender.y + 80, z: defender.behind(-30), - time: 400 + time: 400, }, 'ballistic'); attacker.anim({ x: defender.leftof(30), y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ x: defender.leftof(30), y: defender.y + 80, z: defender.behind(-30), - time: 200 + time: 200, }, 'ballisticUp'); attacker.anim({ x: defender.leftof(-30), y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(450); defender.anim({ y: defender.y + 15, z: defender.behind(10), yscale: 1.3, - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 200 + time: 200, }, 'swing'); defender.delay(25); defender.anim({ @@ -6470,24 +6470,21 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 15, z: defender.behind(5), yscale: 1.3, - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 200 + time: 200, }, 'swing'); - } + }, }, dualchop: { anim: BattleOtherAnims.xattack.anim, - multihit: true }, doublehit: { anim: BattleOtherAnims.xattack.anim, - multihit: true }, doubleslap: { anim: BattleOtherAnims.xattack.anim, - multihit: true }, closecombat: { anim(scene, [attacker, defender]) { @@ -6495,43 +6492,43 @@ const BattleMoveAnims: AnimTable = { x: defender.leftof(-30), y: defender.y + 80, z: defender.behind(-30), - time: 350 + time: 350, }, 'ballistic'); attacker.anim({ x: defender.leftof(30), y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ x: defender.leftof(30), y: defender.y + 80, z: defender.behind(-30), - time: 150 + time: 150, }, 'ballisticUp'); attacker.anim({ x: defender.leftof(-30), y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(450); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 200 + time: 200, }, 'swing'); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); scene.showEffect('fist', { @@ -6540,14 +6537,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 425 + time: 425, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1, opacity: 1, - time: 525 + time: 525, }, 'linear', 'explode'); scene.showEffect('fist', { x: defender.x - 10, @@ -6555,14 +6552,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 450 + time: 450, }, { x: defender.x - 20, y: defender.y + 30, z: defender.z, scale: 1, opacity: 1, - time: 550 + time: 550, }, 'linear', 'explode'); scene.showEffect('fist', { x: defender.x + 30, @@ -6570,14 +6567,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 475 + time: 475, }, { x: defender.x + 35, y: defender.y - 30, z: defender.z, scale: 1, opacity: 1, - time: 575 + time: 575, }, 'linear', 'explode'); scene.showEffect('fist', { x: defender.x - 30, @@ -6585,14 +6582,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 575 + time: 575, }, { x: defender.x - 35, y: defender.y - 30, z: defender.z, scale: 1, opacity: 1, - time: 775 + time: 775, }, 'linear', 'explode'); scene.showEffect('fist', { x: defender.x, @@ -6600,14 +6597,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 600 + time: 600, }, { x: defender.x + 10, y: defender.y - 15, z: defender.z, scale: 1, opacity: 1, - time: 750 + time: 750, }, 'linear', 'explode'); scene.showEffect('fist', { x: defender.x, @@ -6615,14 +6612,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 650 + time: 650, }, { x: defender.x - 10, y: defender.y + 15, z: defender.z, scale: 1, opacity: 1, - time: 800 + time: 800, }, 'linear', 'explode'); scene.showEffect('impact', { @@ -6631,11 +6628,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.4, - time: 525 + time: 525, }, { scale: 3, opacity: 0, - time: 825 + time: 825, }, 'linear'); scene.showEffect('impact', { x: defender.x, @@ -6643,13 +6640,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.4, - time: 750 + time: 750, }, { scale: 3, opacity: 0, - time: 1050 + time: 1050, }, 'linear'); - } + }, }, doublekick: { anim(scene, [attacker, defender]) { @@ -6659,14 +6656,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 450 + time: 450, }, { x: defender.leftof(20), y: defender.y, z: defender.behind(20), scale: 2, opacity: 0, - time: 750 + time: 750, }, 'linear'); scene.showEffect('foot', { x: defender.x, @@ -6674,18 +6671,17 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 750 + time: 750, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 2, opacity: 0, - time: 1050 + time: 1050, }, 'linear'); BattleOtherAnims.xattack.anim(scene, [attacker, defender]); }, - multihit: true }, endeavor: { anim(scene, [attacker, defender]) { @@ -6695,14 +6691,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 2, opacity: 0, - time: 450 + time: 450, }, { x: defender.leftof(20), y: defender.y, z: defender.behind(20), scale: 0, opacity: 1, - time: 750 + time: 750, }, 'linear', 'fade'); scene.showEffect('shadowball', { x: defender.x, @@ -6710,17 +6706,17 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 2, opacity: 0, - time: 750 + time: 750, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 0, opacity: 1, - time: 1050 + time: 1050, }, 'linear', 'fade'); BattleOtherAnims.xattack.anim(scene, [attacker, defender]); - } + }, }, playrough: { anim(scene, [attacker, defender]) { @@ -6730,14 +6726,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 425 + time: 425, }, { x: defender.x - 15, y: defender.y - 10, z: defender.behind(15), scale: 2, opacity: 0, - time: 725 + time: 725, }, 'linear'); scene.showEffect('mudwisp', { x: defender.x - 5, @@ -6745,14 +6741,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 450 + time: 450, }, { x: defender.x - 10, y: defender.y - 10, z: defender.z, scale: 1, opacity: 0.8, - time: 550 + time: 550, }, 'linear', 'explode'); scene.showEffect('mudwisp', { x: defender.x + 10, @@ -6760,14 +6756,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 575 + time: 575, }, { x: defender.x + 20, y: defender.y + 20, z: defender.z, scale: 1, opacity: 0.8, - time: 675 + time: 675, }, 'linear', 'explode'); scene.showEffect('mudwisp', { x: defender.x + 20, @@ -6775,14 +6771,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 600 + time: 600, }, { x: defender.x + 30, y: defender.y - 25, z: defender.z, scale: 1, opacity: 0.8, - time: 700 + time: 700, }, 'linear', 'explode'); scene.showEffect('foot', { x: defender.x, @@ -6790,14 +6786,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 750 + time: 750, }, { x: defender.x, y: defender.y + 10, z: defender.behind(15), scale: 2, opacity: 0, - time: 1100 + time: 1100, }, 'linear'); scene.showEffect('heart', { @@ -6806,14 +6802,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 450 + time: 450, }, { x: defender.x - 20, y: defender.y + 30, z: defender.z, scale: 1, opacity: 1, - time: 550 + time: 550, }, 'linear', 'explode'); scene.showEffect('heart', { x: defender.x - 30, @@ -6821,14 +6817,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 675 + time: 675, }, { x: defender.x - 35, y: defender.y - 30, z: defender.z, scale: 1, opacity: 1, - time: 775 + time: 775, }, 'linear', 'explode'); scene.showEffect('heart', { x: defender.x, @@ -6836,14 +6832,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 750 + time: 750, }, { x: defender.x - 10, y: defender.y + 15, z: defender.z, scale: 1, opacity: 1, - time: 900 + time: 900, }, 'linear', 'explode'); scene.showEffect('mistball', { @@ -6852,14 +6848,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 450 + time: 450, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2, opacity: 0.2, - time: 750 + time: 750, }, 'linear', 'fade'); scene.showEffect('mistball', { x: defender.x, @@ -6867,62 +6863,62 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 750 + time: 750, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2, opacity: 0.2, - time: 1050 + time: 1050, }, 'linear', 'fade'); attacker.anim({ x: defender.leftof(-30), y: defender.y + 80, z: defender.behind(-30), - time: 350 + time: 350, }, 'ballistic'); attacker.anim({ x: defender.leftof(30), y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ x: defender.leftof(30), y: defender.y + 80, z: defender.behind(-30), - time: 150 + time: 150, }, 'ballisticUp'); attacker.anim({ x: defender.leftof(-30), y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(450); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 200 + time: 200, }, 'swing'); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, strength: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, hammerarm: { anim(scene, [attacker, defender]) { @@ -6932,13 +6928,13 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-15), scale: 1.2, opacity: 0.8, - time: 400 + time: 400, }, { y: defender.y - 10, z: defender.z, scale: 1.6, opacity: 1, - time: 500 + time: 500, }, 'accel', 'explode'); scene.showEffect('shadowball', { x: defender.x, @@ -6946,63 +6942,63 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 450 + time: 450, }, { scale: 2, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('wisp', { x: defender.x, y: defender.y - 30, z: defender.z, scale: 1, - time: 500 + time: 500, }, { x: defender.x + 70, scale: 0.8, opacity: 0.3, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, y: defender.y - 30, z: defender.z, scale: 1, - time: 500 + time: 500, }, { x: defender.x - 70, scale: 0.8, opacity: 0.3, - time: 800 + time: 800, }, 'linear', 'fade'); attacker.anim({ x: defender.x, y: defender.y + 80, z: defender.behind(-30), - time: 400 + time: 400, }, 'ballistic'); attacker.anim({ x: defender.x, y: defender.y + 5, z: defender.behind(20), - time: 100 + time: 100, }); attacker.anim({ - time: 600 + time: 600, }, 'ballistic2Back'); defender.delay(450); defender.anim({ y: defender.y - 30, z: defender.behind(20), yscale: 0.5, - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, icehammer: { anim(scene, [attacker, defender]) { @@ -7013,13 +7009,13 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-15), scale: 1.2, opacity: 0.8, - time: 400 + time: 400, }, { y: defender.y - 10, z: defender.z, scale: 1.6, opacity: 1, - time: 500 + time: 500, }, 'accel', 'explode'); scene.showEffect('iceball', { x: defender.x, @@ -7027,35 +7023,35 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 450 + time: 450, }, { scale: 2, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('wisp', { x: defender.x, y: defender.y - 30, z: defender.z, scale: 1, - time: 500 + time: 500, }, { x: defender.x + 70, scale: 0.8, opacity: 0.3, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, y: defender.y - 30, z: defender.z, scale: 1, - time: 500 + time: 500, }, { x: defender.x - 70, scale: 0.8, opacity: 0.3, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('icicle', { @@ -7065,7 +7061,7 @@ const BattleMoveAnims: AnimTable = { scale: 0, yscale: 1, opacity: 1, - time: 450 + time: 450, }, { x: defender.leftof(-20), y: defender.y, @@ -7073,7 +7069,7 @@ const BattleMoveAnims: AnimTable = { scale: 3, yscale: 4, opacity: 0, - time: 750 + time: 750, }, 'linear'); scene.showEffect('icicle', { x: defender.x, @@ -7082,7 +7078,7 @@ const BattleMoveAnims: AnimTable = { scale: 0, yscale: 1, opacity: 1, - time: 550 + time: 550, }, { x: defender.leftof(-20), y: defender.y, @@ -7090,35 +7086,35 @@ const BattleMoveAnims: AnimTable = { scale: 3, yscale: 4, opacity: 0, - time: 850 + time: 850, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y + 80, z: defender.behind(-30), - time: 400 + time: 400, }, 'ballistic'); attacker.anim({ x: defender.x, y: defender.y + 5, z: defender.behind(20), - time: 100 + time: 100, }); attacker.anim({ - time: 600 + time: 600, }, 'ballistic2Back'); defender.delay(450); defender.anim({ y: defender.y - 30, z: defender.behind(20), yscale: 0.5, - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, skyuppercut: { anim(scene, [attacker, defender]) { @@ -7128,11 +7124,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 400 + time: 400, }, { scale: 3, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('fist1', { x: defender.leftof(-20), @@ -7140,53 +7136,53 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(20), scale: 1.2, opacity: 0.8, - time: 400 + time: 400, }, { y: defender.y + 80, opacity: 1, - time: 500 + time: 500, }, 'decel', 'explode'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), - time: 350 + time: 350, }, 'ballistic2Under'); attacker.anim({ x: defender.x, y: defender.y + 80, z: defender.behind(5), - time: 300 + time: 300, }, 'decel'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), - time: 250 + time: 250, }, 'accel'); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(380); defender.anim({ y: defender.y + 100, z: defender.behind(5), opacity: 0.5, - time: 300 + time: 300, }, 'decel'); defender.anim({ - time: 250 + time: 250, }, 'accel'); defender.anim({ x: defender.x, y: defender.y - 30, yscale: 0.25, - time: 50 + time: 50, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, meteormash: { anim(scene, [attacker, defender]) { @@ -7196,24 +7192,24 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.behind(-25), opacity: 0.3, - time: 25 + time: 25, }, { x: defender.x, z: defender.behind(-5), opacity: 0, - time: 425 + time: 425, }, 'ballistic2Under'); scene.showEffect(attacker.sp, { x: attacker.leftof(20), y: attacker.y, z: attacker.behind(-25), opacity: 0.3, - time: 50 + time: 50, }, { x: defender.x, z: defender.behind(-5), opacity: 0, - time: 450 + time: 450, }, 'ballistic2Under'); scene.showEffect('shadowball', { @@ -7222,11 +7218,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.7, - time: 450 + time: 450, }, { scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear', 'fade'); scene.showEffect('wisp', { @@ -7235,12 +7231,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.7, - time: 500 + time: 500, }, { y: defender.y + 100, scale: 1, opacity: 0, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -7248,13 +7244,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.7, - time: 500 + time: 500, }, { x: defender.x - 60, y: defender.y - 80, scale: 1, opacity: 0, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -7262,13 +7258,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.7, - time: 500 + time: 500, }, { x: defender.x + 60, y: defender.y - 80, scale: 1, opacity: 0, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -7276,13 +7272,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.7, - time: 500 + time: 500, }, { x: defender.x - 90, y: defender.y + 40, scale: 1, opacity: 0, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -7290,16 +7286,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.7, - time: 500 + time: 500, }, { x: defender.x + 90, y: defender.y + 40, scale: 1, opacity: 0, - time: 800 + time: 800, }, 'linear', 'fade'); BattleOtherAnims.punchattack.anim(scene, [attacker, defender]); - } + }, }, shadowpunch: { anim(scene, [attacker, defender]) { @@ -7310,14 +7306,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -7325,14 +7321,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 500 + time: 500, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('fist', { x: defender.x, @@ -7340,14 +7336,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 2, opacity: 0, - time: 800 + time: 800, }, 'linear'); attacker.anim({ @@ -7355,46 +7351,46 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.behind(-20), opacity: 0, - time: 200 + time: 200, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-120), opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(5), opacity: 1, - time: 200 + time: 200, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-25), opacity: 0, - time: 300 + time: 300, }, 'linear'); attacker.anim({ opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ time: 300, - opacity: 1 + opacity: 1, }, 'linear'); defender.delay(400); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, focuspunch: { anim(scene, [attacker, defender]) { @@ -7405,11 +7401,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.4, - time: 300 + time: 300, }, { scale: 4, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('impact', { x: defender.x, @@ -7417,11 +7413,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.4, - time: 500 + time: 500, }, { scale: 4, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('fist', { x: defender.x, @@ -7429,14 +7425,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 300 + time: 300, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 2, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect(attacker.sp, { @@ -7444,43 +7440,43 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, opacity: 0.3, - time: 50 + time: 50, }, { x: defender.x, y: defender.y, z: defender.behind(-5), - time: 350 + time: 350, }, 'accel', 'fade'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 100 + time: 100, }, { x: defender.x, y: defender.y, z: defender.behind(-5), - time: 400 + time: 400, }, 'accel', 'fade'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), - time: 300 + time: 300, }, 'accel'); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(280); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, drainpunch: { anim(scene, [attacker, defender]) { @@ -7490,13 +7486,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 1, - time: 600 + time: 600, }, { x: attacker.x, y: attacker.y, z: attacker.z, time: 900, - opacity: 0 + opacity: 0, }, 'ballistic2'); scene.showEffect('electroball', { x: defender.x, @@ -7504,13 +7500,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 1, - time: 650 + time: 650, }, { x: attacker.x, y: attacker.y, z: attacker.z, time: 950, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('electroball', { x: defender.x, @@ -7518,16 +7514,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 1, - time: 700 + time: 700, }, { x: attacker.x, y: attacker.y, z: attacker.z, time: 1000, - opacity: 0 + opacity: 0, }, 'ballistic2Under'); BattleOtherAnims.punchattack.anim(scene, [attacker, defender]); - } + }, }, dynamicpunch: { anim(scene, [attacker, defender]) { @@ -7538,10 +7534,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 350 + time: 350, }, { scale: 7, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('fireball', { x: defender.x - 40, @@ -7549,10 +7545,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 500 + time: 500, }, { scale: 7, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('fireball', { x: defender.x + 10, @@ -7560,32 +7556,31 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 650 + time: 650, }, { scale: 7, - opacity: 0 + opacity: 0, }, 'decel'); BattleOtherAnims.punchattack.anim(scene, [attacker, defender]); - } + }, }, cometpunch: { anim: BattleOtherAnims.punchattack.anim, - multihit: true }, megapunch: { - anim: BattleOtherAnims.punchattack.anim + anim: BattleOtherAnims.punchattack.anim, }, poweruppunch: { - anim: BattleOtherAnims.punchattack.anim + anim: BattleOtherAnims.punchattack.anim, }, dizzypunch: { - anim: BattleOtherAnims.punchattack.anim + anim: BattleOtherAnims.punchattack.anim, }, needlearm: { - anim: BattleOtherAnims.punchattack.anim + anim: BattleOtherAnims.punchattack.anim, }, rocksmash: { - anim: BattleOtherAnims.punchattack.anim + anim: BattleOtherAnims.punchattack.anim, }, hornleech: { anim(scene, [attacker, defender]) { @@ -7595,14 +7590,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -7610,14 +7605,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 500 + time: 500, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('energyball', { x: defender.x, @@ -7625,13 +7620,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 1, - time: 600 + time: 600, }, { x: attacker.x, y: attacker.y, z: attacker.z, time: 900, - opacity: 0 + opacity: 0, }, 'ballistic2'); scene.showEffect('energyball', { x: defender.x, @@ -7639,13 +7634,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 1, - time: 650 + time: 650, }, { x: attacker.x, y: attacker.y, z: attacker.z, time: 950, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('energyball', { x: defender.x, @@ -7653,55 +7648,55 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 1, - time: 700 + time: 700, }, { x: attacker.x, y: attacker.y, z: attacker.z, time: 1000, - opacity: 0 + opacity: 0, }, 'ballistic2Under'); attacker.anim({ x: defender.leftof(20), y: defender.y, z: defender.behind(-20), - time: 400 + time: 400, }, 'ballistic2Under'); attacker.anim({ x: defender.x, y: defender.y, z: defender.z, - time: 50 + time: 50, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2'); defender.delay(425); defender.anim({ x: defender.leftof(-15), y: defender.y, z: defender.behind(15), - time: 50 + time: 50, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, absorb: { - anim: BattleOtherAnims.drain.anim + anim: BattleOtherAnims.drain.anim, }, megadrain: { anim(scene, [attacker, defender]) { scene.backgroundEffect('#9AB440', 900, 0.2); BattleOtherAnims.drain.anim(scene, [attacker, defender]); - } + }, }, gigadrain: { anim(scene, [attacker, defender]) { scene.backgroundEffect('#9AB440', 900, 0.5); BattleOtherAnims.drain.anim(scene, [attacker, defender]); - } + }, }, leechlife: { anim(scene, [attacker, defender]) { @@ -7712,14 +7707,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(50), scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('electroball', { x: defender.x, @@ -7727,13 +7722,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 1, - time: 600 + time: 600, }, { x: attacker.x, y: attacker.y, z: attacker.z, time: 900, - opacity: 0 + opacity: 0, }, 'ballistic2'); scene.showEffect('electroball', { x: defender.x, @@ -7741,13 +7736,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 1, - time: 650 + time: 650, }, { x: attacker.x, y: attacker.y, z: attacker.z, time: 950, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('electroball', { x: defender.x, @@ -7755,40 +7750,40 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 1, - time: 700 + time: 700, }, { x: attacker.x, y: attacker.y, z: attacker.z, time: 1000, - opacity: 0 + opacity: 0, }, 'ballistic2Under'); attacker.anim({ x: defender.leftof(20), y: defender.y, z: defender.behind(-20), - time: 400 + time: 400, }, 'ballistic2Under'); attacker.anim({ x: defender.x, y: defender.y, z: defender.z, - time: 50 + time: 50, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2'); defender.delay(425); defender.anim({ x: defender.leftof(-20), y: defender.y, z: defender.behind(20), - time: 50 + time: 50, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, extremespeed: { anim(scene, [attacker, defender]) { @@ -7798,13 +7793,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.5, opacity: 0.6, - time: 600 + time: 600, }, { x: attacker.x + 20, z: attacker.behind(-50), scale: 0.8, opacity: 0, - time: 1000 + time: 1000, }, 'linear', 'fade'); scene.showEffect('wisp', { x: attacker.x, @@ -7812,13 +7807,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.5, opacity: 0.6, - time: 600 + time: 600, }, { x: attacker.x - 20, z: attacker.behind(-50), scale: 0.8, opacity: 0, - time: 1000 + time: 1000, }, 'linear', 'fade'); scene.showEffect('impact', { @@ -7827,11 +7822,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 0.7, opacity: 0.7, - time: 375 + time: 375, }, { scale: 1.2, opacity: 0, - time: 650 + time: 650, }, 'linear'); scene.showEffect('impact', { x: defender.x + 25, @@ -7839,11 +7834,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 0.7, opacity: 0.7, - time: 500 + time: 500, }, { scale: 1.2, opacity: 0, - time: 775 + time: 775, }, 'linear'); scene.showEffect('impact', { x: defender.x - 25, @@ -7851,11 +7846,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 0.7, opacity: 0.7, - time: 600 + time: 600, }, { scale: 1, opacity: 0, - time: 850 + time: 850, }, 'linear'); scene.showEffect('impact', { x: defender.x + 2, @@ -7863,11 +7858,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 1, opacity: 0.7, - time: 600 + time: 600, }, { scale: 1.5, opacity: 0, - time: 975 + time: 975, }, 'linear'); scene.showEffect(attacker.sp, { @@ -7875,32 +7870,32 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, opacity: 0.5, - time: 0 + time: 0, }, { opacity: 0, - time: 350 + time: 350, }, 'accel', 'fade'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.8, - time: 400 + time: 400, }, { z: attacker.behind(-100), opacity: 0, - time: 475 + time: 475, }, 'accel'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.8, - time: 450 + time: 450, }, { z: attacker.behind(-100), opacity: 0, - time: 525 + time: 525, }, 'accel'); attacker.anim({opacity: 0, time: 50}, 'linear'); @@ -7914,47 +7909,47 @@ const BattleMoveAnims: AnimTable = { attacker.anim({ z: attacker.behind(-100), opacity: 0, - time: 75 + time: 75, }, 'accel'); attacker.anim({ z: attacker.behind(70), opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.delay(600); attacker.anim({ opacity: 1, - time: 500 + time: 500, }, 'decel'); defender.delay(375); defender.anim({ x: defender.leftof(5), z: defender.behind(20), - time: 50 + time: 50, }); defender.anim({ - time: 75 + time: 75, }); defender.anim({ z: defender.behind(20), - time: 75 + time: 75, }); defender.anim({ - time: 75 + time: 75, }); defender.anim({ x: defender.leftof(10), z: defender.behind(30), - time: 250 + time: 250, }, 'decel'); defender.anim({ - time: 350 + time: 350, }, 'swing'); - } + }, }, quickattack: { - anim: BattleOtherAnims.fastattack.anim + anim: BattleOtherAnims.fastattack.anim, }, suckerpunch: { anim(scene, [attacker, defender]) { @@ -7965,19 +7960,19 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 0, opacity: 0.3, - time: 260 + time: 260, }, { scale: 1.25, opacity: 0, - time: 500 + time: 500, }, 'linear'); - } + }, }, astonish: { - anim: BattleOtherAnims.fastattack.anim + anim: BattleOtherAnims.fastattack.anim, }, rollout: { - anim: BattleOtherAnims.fastattack.anim + anim: BattleOtherAnims.fastattack.anim, }, accelerock: { anim(scene, [attacker, defender]) { @@ -7988,12 +7983,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.3, opacity: 1, - time: 260 + time: 260, }, { x: defender.x + 50, y: defender.y + 10, opacity: 0, - time: 500 + time: 500, }, 'accel'); scene.showEffect('rock3', { x: defender.x - 30, @@ -8001,12 +7996,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.3, opacity: 1, - time: 260 + time: 260, }, { x: defender.x - 50, y: defender.y - 20, opacity: 0, - time: 500 + time: 500, }, 'accel'); scene.showEffect('rock3', { x: defender.x + 15, @@ -8014,12 +8009,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.3, opacity: 1, - time: 360 + time: 360, }, { x: defender.x + 35, y: defender.y + 30, opacity: 0, - time: 600 + time: 600, }, 'accel'); scene.showEffect('rock3', { x: defender.x - 15, @@ -8027,12 +8022,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.3, opacity: 1, - time: 360 + time: 360, }, { x: defender.x - 35, y: defender.y - 40, opacity: 0, - time: 600 + time: 600, }, 'accel'); scene.showEffect('impact', { @@ -8041,13 +8036,13 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 1, opacity: 0.3, - time: 260 + time: 260, }, { scale: 1.25, opacity: 0, - time: 500 + time: 500, }, 'linear'); - } + }, }, bulletpunch: { anim(scene, [attacker, defender]) { @@ -8058,12 +8053,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 260 + time: 260, }, { z: defender.behind(20), scale: 2, opacity: 0, - time: 500 + time: 500, }, 'linear'); scene.showEffect('impact', { x: defender.x, @@ -8071,13 +8066,13 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 1, opacity: 0.3, - time: 260 + time: 260, }, { scale: 1.25, opacity: 0, - time: 500 + time: 500, }, 'linear'); - } + }, }, machpunch: { anim(scene, [attacker, defender]) { @@ -8088,16 +8083,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 260 + time: 260, }, { x: defender.x, y: defender.y, z: defender.behind(20), scale: 2, opacity: 0, - time: 500 + time: 500, }, 'linear'); - } + }, }, vacuumwave: { anim(scene, [attacker, defender]) { @@ -8106,30 +8101,30 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 1 + opacity: 1, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1, - time: 200 + time: 200, }, 'accel', 'fade'); - } + }, }, assist: { - anim() {} + anim() {}, }, mirrormove: { - anim() {} + anim() {}, }, naturepower: { - anim() {} + anim() {}, }, copycat: { - anim() {} + anim() {}, }, sleeptalk: { - anim() {} + anim() {}, }, megahorn: { anim(scene, [attacker, defender]) { @@ -8140,11 +8135,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 300 + time: 300, }, { scale: 3, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -8152,30 +8147,30 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 500 + time: 500, }, { scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), - time: 300 + time: 300, }, 'accel'); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(280); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, firepunch: { anim(scene, [attacker, defender]) { @@ -8185,14 +8180,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('fireball', { x: defender.x, @@ -8200,14 +8195,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 500 + time: 500, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('fist', { x: defender.x, @@ -8215,41 +8210,41 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 2, opacity: 0, - time: 800 + time: 800, }, 'linear'); attacker.anim({ x: defender.leftof(20), y: defender.y, z: defender.behind(-20), - time: 400 + time: 400, }, 'ballistic2Under'); attacker.anim({ x: defender.x, y: defender.y, z: defender.z, - time: 50 + time: 50, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2'); defender.delay(425); defender.anim({ x: defender.leftof(-20), y: defender.y, z: defender.behind(20), - time: 50 + time: 50, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, icepunch: { anim(scene, [attacker, defender]) { @@ -8259,14 +8254,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('icicle', { x: defender.x, @@ -8274,14 +8269,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 500 + time: 500, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('fist', { x: defender.x, @@ -8289,41 +8284,41 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 2, opacity: 0, - time: 800 + time: 800, }, 'linear'); attacker.anim({ x: defender.leftof(20), y: defender.y, z: defender.behind(-20), - time: 400 + time: 400, }, 'ballistic2Under'); attacker.anim({ x: defender.x, y: defender.y, z: defender.z, - time: 50 + time: 50, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2'); defender.delay(425); defender.anim({ x: defender.leftof(-20), y: defender.y, z: defender.behind(20), - time: 50 + time: 50, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, thunderpunch: { anim(scene, [attacker, defender]) { @@ -8333,14 +8328,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('lightning', { x: defender.x, @@ -8348,14 +8343,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 500 + time: 500, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('fist', { x: defender.x, @@ -8363,41 +8358,41 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 2, opacity: 0, - time: 800 + time: 800, }, 'linear'); attacker.anim({ x: defender.leftof(20), y: defender.y, z: defender.behind(-20), - time: 400 + time: 400, }, 'ballistic2Under'); attacker.anim({ x: defender.x, y: defender.y, z: defender.z, - time: 50 + time: 50, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2'); defender.delay(425); defender.anim({ x: defender.leftof(-20), y: defender.y, z: defender.behind(20), - time: 50 + time: 50, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, poisonfang: { anim(scene, [attacker, defender]) { @@ -8407,14 +8402,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 450 + time: 450, }, { x: defender.x, y: defender.y - 40, z: defender.behind(15), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('poisonwisp', { x: defender.x, @@ -8422,19 +8417,19 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 550 + time: 550, }, { x: defender.x, y: defender.y - 40, z: defender.behind(15), scale: 3, opacity: 0, - time: 900 + time: 900, }, 'linear'); BattleOtherAnims.bite.anim(scene, [attacker, defender]); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, psychicfangs: { anim(scene, [attacker, defender]) { @@ -8444,28 +8439,28 @@ const BattleMoveAnims: AnimTable = { x: defender.x, y: defender.y + 80, z: defender.behind(-30), - time: 400 + time: 400, }, 'ballistic'); attacker.anim({ x: defender.x, y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(450); defender.anim({ z: defender.behind(20), scale: 1.2, - time: 100 + time: 100, }, 'swing'); defender.anim({ scale: 1, - time: 300 + time: 300, }); - } + }, }, icefang: { anim(scene, [attacker, defender]) { @@ -8475,14 +8470,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 450 + time: 450, }, { x: defender.x, y: defender.y - 40, z: defender.behind(15), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('icicle', { x: defender.x, @@ -8490,19 +8485,19 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 550 + time: 550, }, { x: defender.x, y: defender.y - 40, z: defender.behind(15), scale: 3, opacity: 0, - time: 900 + time: 900, }, 'linear'); BattleOtherAnims.bite.anim(scene, [attacker, defender]); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, firefang: { anim(scene, [attacker, defender]) { @@ -8512,14 +8507,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 450 + time: 450, }, { x: defender.x, y: defender.y - 40, z: defender.behind(15), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('fireball', { x: defender.x, @@ -8527,19 +8522,19 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 550 + time: 550, }, { x: defender.x, y: defender.y - 40, z: defender.behind(15), scale: 3, opacity: 0, - time: 900 + time: 900, }, 'linear'); BattleOtherAnims.bite.anim(scene, [attacker, defender]); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, thunderfang: { anim(scene, [attacker, defender]) { @@ -8549,14 +8544,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 450 + time: 450, }, { x: defender.x, y: defender.y - 40, z: defender.behind(15), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('lightning', { x: defender.x, @@ -8564,19 +8559,19 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 550 + time: 550, }, { x: defender.x, y: defender.y - 40, z: defender.behind(15), scale: 3, opacity: 0, - time: 900 + time: 900, }, 'linear'); BattleOtherAnims.bite.anim(scene, [attacker, defender]); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, wildcharge: { anim(scene, [attacker, defender]) { @@ -8586,11 +8581,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.7, - time: 300 + time: 300, }, { scale: 4, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('electroball', { x: defender.x, @@ -8598,11 +8593,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.7, - time: 500 + time: 500, }, { scale: 4, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('lightning', { x: defender.x, @@ -8610,14 +8605,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 400 + time: 400, }, { x: defender.x, y: defender.y - 40, z: defender.behind(15), scale: 3, opacity: 0, - time: 750 + time: 750, }, 'linear'); scene.showEffect(attacker.sp, { @@ -8625,45 +8620,45 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, opacity: 0.3, - time: 50 + time: 50, }, { x: defender.x, y: defender.y, z: defender.behind(-5), opacity: 0, - time: 350 + time: 350, }, 'accel', 'fade'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 100 + time: 100, }, { x: defender.x, y: defender.y, z: defender.behind(-5), opacity: 0, - time: 400 + time: 400, }, 'accel', 'fade'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), - time: 300 + time: 300, }, 'accel'); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(280); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, spark: { anim(scene, [attacker, defender]) { @@ -8673,17 +8668,17 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 450 + time: 450, }, { x: defender.x, y: defender.y - 40, z: defender.behind(15), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, zapcannon: { anim(scene, [attacker, defender]) { @@ -8693,14 +8688,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -8708,14 +8703,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 275 + time: 275, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -8723,14 +8718,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -8738,14 +8733,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 425 + time: 425, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -8753,14 +8748,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -8768,14 +8763,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 575 + time: 575, }, 'linear', 'explode'); scene.showEffect('shadowball', { @@ -8784,11 +8779,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 550 + time: 550, }, { scale: 4, opacity: 0, - time: 750 + time: 750, }, 'linear'); scene.showEffect('shadowball', { x: defender.x, @@ -8796,11 +8791,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 600 + time: 600, }, { scale: 4, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('lightning', { @@ -8809,11 +8804,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 550 + time: 550, }, { scale: 4, opacity: 0, - time: 750 + time: 750, }, 'linear'); scene.showEffect('lightning', { x: defender.x, @@ -8821,43 +8816,43 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 600 + time: 600, }, { scale: 4, opacity: 0, - time: 800 + time: 800, }, 'linear'); defender.delay(125); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 150 + time: 150, }, 'swing'); - } + }, }, hyperbeam: { anim(scene, [attacker, defender]) { @@ -8867,14 +8862,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -8882,14 +8877,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 275 + time: 275, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -8897,14 +8892,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -8912,14 +8907,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 425 + time: 425, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -8927,14 +8922,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -8942,14 +8937,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 575 + time: 575, }, 'linear', 'explode'); scene.showEffect('shadowball', { @@ -8958,11 +8953,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 550 + time: 550, }, { scale: 4, opacity: 0, - time: 750 + time: 750, }, 'linear'); scene.showEffect('shadowball', { x: defender.x, @@ -8970,43 +8965,43 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 600 + time: 600, }, { scale: 4, opacity: 0, - time: 800 + time: 800, }, 'linear'); defender.delay(125); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 150 + time: 150, }, 'swing'); - } + }, }, gigaimpact: { anim(scene, [attacker, defender]) { @@ -9017,11 +9012,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.4, - time: 300 + time: 300, }, { scale: 4, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('impact', { x: defender.x, @@ -9029,54 +9024,54 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.4, - time: 500 + time: 500, }, { scale: 4, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 50 + time: 50, }, { x: defender.x, y: defender.y, z: defender.behind(-5), - time: 350 + time: 350, }, 'accel', 'fade'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 100 + time: 100, }, { x: defender.x, y: defender.y, z: defender.behind(-5), - time: 400 + time: 400, }, 'accel', 'fade'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), - time: 300 + time: 300, }, 'accel'); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(280); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, shelltrap: { anim(scene, [attacker, ...defenders]) { @@ -9084,48 +9079,48 @@ const BattleMoveAnims: AnimTable = { defender.delay(280); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); } const defender = defenders[1] || defenders[0]; - var xf = [1, -1, 1, -1]; - var yf = [1, -1, -1, 1]; - var xf2 = [1, 0, -1, 0]; - var yf2 = [0, 1, 0, -1]; + let xf = [1, -1, 1, -1]; + let yf = [1, -1, -1, 1]; + let xf2 = [1, 0, -1, 0]; + let yf2 = [0, 1, 0, -1]; scene.backgroundEffect('#000000', 600, 0.3); - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { scene.showEffect('flareball', { x: attacker.x, y: attacker.y, z: attacker.behind(-5), scale: 0.5, - opacity: 1 + opacity: 1, }, { x: defender.x + 240 * xf[i], y: defender.y, z: defender.z + 137 * yf[i], opacity: 0, - time: 600 + time: 600, }, 'decel'); scene.showEffect('flareball', { x: attacker.x, y: attacker.y, z: attacker.behind(-5), scale: 0.5, - opacity: 1 + opacity: 1, }, { x: defender.x + 339 * xf2[i], y: defender.y + 10, z: defender.z + 194 * yf2[i], scale: 1, opacity: 0, - time: 600 + time: 600, }, 'decel'); } scene.showEffect('fireball', { @@ -9133,14 +9128,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.7 + opacity: 0.7, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1.5, opacity: 0.6, - time: 300 + time: 300, }, 'linear', 'explode'); }, prepareAnim: BattleOtherAnims.chargestatus.anim, @@ -9153,13 +9148,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 0 + time: 0, }, { x: attacker.x - 25, y: attacker.y - 25, scale: 2, opacity: 0, - time: 300 + time: 300, }, 'ballistic'); scene.showEffect('fireball', { x: attacker.x, @@ -9167,13 +9162,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 150 + time: 150, }, { x: attacker.x + 30, y: attacker.y - 20, scale: 2, opacity: 0, - time: 450 + time: 450, }, 'ballistic'); scene.showEffect('fireball', { x: attacker.x, @@ -9181,13 +9176,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 250 + time: 250, }, { x: attacker.x + 5, y: attacker.y - 40, scale: 2, opacity: 0, - time: 550 + time: 550, }, 'ballistic'); scene.showEffect('fireball', { x: attacker.x, @@ -9195,13 +9190,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 300 + time: 300, }, { x: attacker.x - 20, y: attacker.y - 20, scale: 2, opacity: 0, - time: 600 + time: 600, }, 'ballistic'); scene.showEffect('fireball', { @@ -9210,11 +9205,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 600 + time: 600, }, { scale: 5, opacity: 0, - time: 900 + time: 900, }, 'linear'); scene.showEffect('fireball', { x: defender.x, @@ -9222,31 +9217,31 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 700 + time: 700, }, { scale: 8, opacity: 0, - time: 1000 + time: 1000, }, 'linear'); attacker.delay(300); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), - time: 300 + time: 300, }, 'accel'); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(580); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, flareblitz: { anim(scene, [attacker, defender]) { @@ -9257,11 +9252,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 300 + time: 300, }, { scale: 8, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('fireball', { x: defender.x, @@ -9269,30 +9264,30 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 500 + time: 500, }, { scale: 8, opacity: 0, - time: 800 + time: 800, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), - time: 300 + time: 300, }, 'accel'); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(280); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, burnup: { anim(scene, [attacker, defender]) { @@ -9303,11 +9298,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 300 + time: 300, }, { scale: 8, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('fireball', { x: defender.x, @@ -9315,11 +9310,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 500 + time: 500, }, { scale: 8, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('flareball', { x: defender.x, @@ -9327,11 +9322,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.4, - time: 300 + time: 300, }, { scale: 4, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('flareball', { x: defender.x, @@ -9339,11 +9334,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.4, - time: 500 + time: 500, }, { scale: 4, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('flareball', { @@ -9352,37 +9347,37 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-5), scale: 1.5, opacity: 0, - time: 0 + time: 0, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.8, - time: 300 + time: 300, }, 'accel', 'explode'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 50 + time: 50, }, { x: defender.x, y: defender.y, z: defender.behind(-5), - time: 350 + time: 350, }, 'accel', 'fade'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 100 + time: 100, }, { x: defender.x, y: defender.y, z: defender.behind(-5), - time: 400 + time: 400, }, 'accel', 'fade'); scene.showEffect('wisp', { @@ -9391,11 +9386,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 1, - time: 900 + time: 900, }, { y: attacker.y + 60, opacity: 0, - time: 1300 + time: 1300, }, 'linear'); scene.showEffect('wisp', { x: attacker.x - 30, @@ -9403,11 +9398,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 1, - time: 1000 + time: 1000, }, { y: defender.y + 60, opacity: 0, - time: 1400 + time: 1400, }, 'linear'); scene.showEffect('wisp', { x: attacker.x + 15, @@ -9415,11 +9410,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 1, - time: 1100 + time: 1100, }, { y: attacker.y + 60, opacity: 0, - time: 1500 + time: 1500, }, 'linear'); scene.showEffect('wisp', { x: attacker.x - 15, @@ -9427,31 +9422,31 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 1, - time: 1200 + time: 1200, }, { y: attacker.y + 60, opacity: 0, - time: 1600 + time: 1600, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), - time: 300 + time: 300, }, 'accel'); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(280); defender.anim({ z: defender.behind(15), - time: 200 + time: 200, }, 'decel'); defender.anim({ - time: 300 + time: 300, }, 'decel'); - } + }, }, beakblast: { anim(scene, [attacker, defender]) { @@ -9462,13 +9457,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 0 + time: 0, }, { x: attacker.x - 25, y: attacker.y - 25, scale: 2, opacity: 0, - time: 300 + time: 300, }, 'ballistic'); scene.showEffect('fireball', { x: attacker.x, @@ -9476,13 +9471,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 150 + time: 150, }, { x: attacker.x + 30, y: attacker.y - 20, scale: 2, opacity: 0, - time: 450 + time: 450, }, 'ballistic'); scene.showEffect('fireball', { x: attacker.x, @@ -9490,13 +9485,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 250 + time: 250, }, { x: attacker.x + 5, y: attacker.y - 40, scale: 2, opacity: 0, - time: 550 + time: 550, }, 'ballistic'); scene.showEffect('fireball', { x: attacker.x, @@ -9504,13 +9499,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 300 + time: 300, }, { x: attacker.x - 20, y: attacker.y - 20, scale: 2, opacity: 0, - time: 600 + time: 600, }, 'ballistic'); scene.showEffect('flareball', { @@ -9519,11 +9514,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 600 + time: 600, }, { scale: 2, opacity: 0, - time: 900 + time: 900, }, 'linear'); scene.showEffect('flareball', { x: defender.x, @@ -9531,31 +9526,31 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 700 + time: 700, }, { scale: 5, opacity: 0, - time: 1000 + time: 1000, }, 'linear'); attacker.delay(300); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), - time: 300 + time: 300, }, 'accel'); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(580); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, vcreate: { anim(scene, [attacker, defender]) { @@ -9566,11 +9561,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 300 + time: 300, }, { scale: 6, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('fireball', { x: defender.x - 30, @@ -9578,11 +9573,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 350 + time: 350, }, { scale: 6, opacity: 0, - time: 650 + time: 650, }, 'linear'); scene.showEffect('fireball', { x: defender.x + 30, @@ -9590,11 +9585,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 350 + time: 350, }, { scale: 6, opacity: 0, - time: 650 + time: 650, }, 'linear'); scene.showEffect('fireball', { x: defender.x - 70, @@ -9602,11 +9597,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 400 + time: 400, }, { scale: 6, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('fireball', { x: defender.x + 70, @@ -9614,11 +9609,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 400 + time: 400, }, { scale: 6, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('fireball', { @@ -9627,11 +9622,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 500 + time: 500, }, { scale: 6, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('fireball', { x: defender.x - 30, @@ -9639,11 +9634,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 550 + time: 550, }, { scale: 6, opacity: 0, - time: 850 + time: 850, }, 'linear'); scene.showEffect('fireball', { x: defender.x + 30, @@ -9651,11 +9646,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 550 + time: 550, }, { scale: 6, opacity: 0, - time: 850 + time: 850, }, 'linear'); scene.showEffect('fireball', { x: defender.x - 70, @@ -9663,11 +9658,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 600 + time: 600, }, { scale: 6, opacity: 0, - time: 900 + time: 900, }, 'linear'); scene.showEffect('fireball', { x: defender.x + 70, @@ -9675,11 +9670,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 600 + time: 600, }, { scale: 6, opacity: 0, - time: 900 + time: 900, }, 'linear'); scene.showEffect('flareball', { @@ -9688,56 +9683,56 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-5), scale: 1.5, opacity: 0, - time: 0 + time: 0, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.8, - time: 300 + time: 300, }, 'accel', 'explode'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 50 + time: 50, }, { x: defender.x, y: defender.y, z: defender.behind(-5), - time: 350 + time: 350, }, 'accel', 'fade'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 100 + time: 100, }, { x: defender.x, y: defender.y, z: defender.behind(-5), - time: 400 + time: 400, }, 'accel', 'fade'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), - time: 300 + time: 300, }, 'accel'); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(280); defender.anim({ z: defender.behind(15), - time: 200 + time: 200, }, 'decel'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, outrage: { anim(scene, [attacker, defender]) { @@ -9748,11 +9743,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 1, - time: 0 + time: 0, }, { scale: 3, opacity: 0, - time: 300 + time: 300, }, 'ballistic2Under', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -9760,13 +9755,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 0 + time: 0, }, { x: attacker.x - 50, y: attacker.y - 50, scale: 2, opacity: 0, - time: 300 + time: 300, }, 'ballistic'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -9774,13 +9769,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 150 + time: 150, }, { x: attacker.x + 60, y: attacker.y - 50, scale: 2, opacity: 0, - time: 450 + time: 450, }, 'ballistic'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -9788,13 +9783,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 300 + time: 300, }, { x: attacker.x + 10, y: attacker.y - 60, scale: 2, opacity: 0, - time: 600 + time: 600, }, 'ballistic'); scene.showEffect('flareball', { @@ -9803,11 +9798,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 600 + time: 600, }, { scale: 4, opacity: 0, - time: 900 + time: 900, }, 'linear'); scene.showEffect('flareball', { x: defender.x, @@ -9815,11 +9810,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 800 + time: 800, }, { scale: 4, opacity: 0, - time: 1100 + time: 1100, }, 'linear'); attacker.delay(300); @@ -9827,20 +9822,20 @@ const BattleMoveAnims: AnimTable = { x: defender.leftof(20), y: defender.y, z: defender.behind(-5), - time: 300 + time: 300, }, 'accel'); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(580); defender.anim({ z: defender.behind(20), - time: 200 + time: 200, }, 'decel'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, boltstrike: { anim(scene, [attacker, defender]) { @@ -9850,23 +9845,23 @@ const BattleMoveAnims: AnimTable = { x: attacker.x, y: attacker.y, z: attacker.behind(-5), - opacity: 1 + opacity: 1, }, { x: defender.x, y: defender.y, z: defender.z, - time: 300 + time: 300, }, 'accel', 'fade'); scene.showEffect('iceball', { x: attacker.x, y: attacker.y, z: attacker.behind(-5), - opacity: 1 + opacity: 1, }, { x: defender.x, y: defender.y, z: defender.z, - time: 300 + time: 300, }, 'accel', 'fade'); scene.showEffect('iceball', { @@ -9875,11 +9870,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.7, - time: 300 + time: 300, }, { scale: 4, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('iceball', { x: defender.x, @@ -9887,58 +9882,58 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.7, - time: 500 + time: 500, }, { scale: 4, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 50 + time: 50, }, { x: defender.x, y: defender.y, z: defender.behind(-5), opacity: 0, - time: 350 + time: 350, }, 'accel', 'fade'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 100 + time: 100, }, { x: defender.x, y: defender.y, z: defender.behind(-5), opacity: 0, - time: 400 + time: 400, }, 'accel', 'fade'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), opacity: 0, - time: 300 + time: 300, }, 'accel'); attacker.anim({ opacity: 1, - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(280); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, fusionflare: { anim(scene, [attacker, defender]) { @@ -9947,13 +9942,13 @@ const BattleMoveAnims: AnimTable = { x: attacker.x, y: attacker.y + 90, z: attacker.z, - scale: 0 + scale: 0, }, { x: attacker.x, y: attacker.y + 90, z: attacker.z, scale: 2, - time: 200 + time: 200, }, 'accel', 'fade'); scene.showEffect('flareball', { x: attacker.x, @@ -9961,14 +9956,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, opacity: 0.4, scale: 0, - time: 150 + time: 150, }, { x: attacker.x, y: attacker.y + 90, z: attacker.z, scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('flareball', { x: attacker.x, @@ -9976,13 +9971,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, opacity: 0.8, scale: 2, - time: 200 + time: 200, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2.5, - time: 500 + time: 500, }, 'accel', 'fade'); scene.showEffect('flareball', { @@ -9992,12 +9987,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 0.5, - time: 550 + time: 550, }, { scale: 3, xscale: 8, opacity: 0.1, - time: 1000 + time: 1000, }, 'linear', 'fade'); scene.showEffect('flareball', { x: defender.x, @@ -10005,14 +10000,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.3, scale: 0, - time: 500 + time: 500, }, { x: defender.x, y: defender.y, z: defender.z, scale: 4, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('flareball', { x: defender.x, @@ -10020,25 +10015,25 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.7, scale: 0, - time: 700 + time: 700, }, { x: defender.x, y: defender.y, z: defender.z, scale: 4, opacity: 0, - time: 1000 + time: 1000, }, 'linear'); defender.delay(500); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, fusionbolt: { anim(scene, [attacker, defender]) { @@ -10048,11 +10043,11 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 2, - opacity: 1 + opacity: 1, }, { y: attacker.y + 90, opacity: 0, - time: 200 + time: 200, }, 'accel'); scene.showEffect('iceball', { x: defender.leftof(-165), @@ -10060,25 +10055,25 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 0, - time: 400 + time: 400, }, { x: defender.leftof(10), y: defender.y - 20, z: defender.behind(-10), scale: 3, opacity: 1, - time: 650 + time: 650, }, 'accel', 'fade'); scene.showEffect('waterwisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 1, - opacity: 1 + opacity: 1, }, { y: attacker.y + 90, opacity: 0, - time: 200 + time: 200, }, 'accel'); scene.showEffect('waterwisp', { x: defender.leftof(-165), @@ -10086,14 +10081,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0, - time: 400 + time: 400, }, { x: defender.leftof(10), y: defender.y - 20, z: defender.behind(-10), scale: 1.5, opacity: 1, - time: 650 + time: 650, }, 'accel', 'fade'); scene.showEffect('iceball', { x: defender.x, @@ -10102,12 +10097,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 0.5, - time: 700 + time: 700, }, { scale: 3, xscale: 8, opacity: 0.1, - time: 1100 + time: 1100, }, 'linear', 'fade'); scene.showEffect('iceball', { x: defender.x, @@ -10115,14 +10110,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 0, - time: 700 + time: 700, }, { x: defender.x, y: defender.y, z: defender.z, scale: 4, opacity: 0, - time: 900 + time: 900, }, 'linear'); scene.showEffect('iceball', { x: defender.x, @@ -10130,14 +10125,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 0, - time: 800 + time: 800, }, { x: defender.x, y: defender.y, z: defender.z, scale: 3, opacity: 0, - time: 1000 + time: 1000, }, 'linear'); attacker.anim({ @@ -10145,7 +10140,7 @@ const BattleMoveAnims: AnimTable = { xscale: 0, yscale: 0, opacity: 0, - time: 300 + time: 300, }, 'accel'); attacker.delay(625); attacker.anim({ @@ -10154,23 +10149,23 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(40), xscale: 1, yscale: 1, - time: 1 + time: 1, }); attacker.anim({ x: attacker.x, y: attacker.y, z: attacker.z, - time: 250 + time: 250, }, 'decel'); defender.delay(625); defender.anim({ z: defender.behind(20), - time: 250 + time: 250, }, 'decel'); defender.anim({ - time: 200 + time: 200, }, 'swing'); - } + }, }, zenheadbutt: { anim(scene, [attacker, defender]) { @@ -10180,14 +10175,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 450 + time: 450, }, { scale: 2, opacity: 0, - time: 700 + time: 700, }, 'linear'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, fakeout: { anim(scene, [attacker, defender]) { @@ -10197,7 +10192,7 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-120), scale: 0.3, opacity: 0.1, - time: 200 + time: 200, }, { x: defender.x + 4, y: defender.y + 7, @@ -10205,7 +10200,7 @@ const BattleMoveAnims: AnimTable = { xscale: 0.15, yscale: 0.35, opacity: 1, - time: 400 + time: 400, }, 'accel', 'explode'); scene.showEffect('leftchop', { x: defender.x - 15, @@ -10213,7 +10208,7 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-120), scale: 0.3, opacity: 0.1, - time: 200 + time: 200, }, { x: defender.x - 4, y: defender.y + 7, @@ -10221,7 +10216,7 @@ const BattleMoveAnims: AnimTable = { xscale: 0.15, yscale: 0.35, opacity: 1, - time: 400 + time: 400, }, 'accel', 'explode'); attacker.anim({ @@ -10229,48 +10224,48 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.behind(-20), opacity: 0, - time: 200 + time: 200, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-120), opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(40), opacity: 1, - time: 250 + time: 250, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), opacity: 0, - time: 300 + time: 300, }, 'linear'); attacker.anim({ opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ time: 300, - opacity: 1 + opacity: 1, }, 'linear'); defender.delay(370); defender.anim({ z: defender.behind(20), yscale: 1.4, xscale: 0.7, - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, covet: { anim(scene, [attacker, defender]) { @@ -10280,11 +10275,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 1, - time: 0 + time: 0, }, { scale: 3, opacity: 0, - time: 300 + time: 300, }, 'ballistic2Under', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -10292,14 +10287,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 650 + time: 650, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(30), scale: 1.5, opacity: 0, - time: 850 + time: 850, }, 'linear'); attacker.delay(300); @@ -10308,64 +10303,64 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.behind(-20), opacity: 0, - time: 200 + time: 200, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-120), opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(40), opacity: 1, - time: 250 + time: 250, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), opacity: 0, - time: 300 + time: 300, }, 'linear'); attacker.anim({ opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ time: 300, - opacity: 1 + opacity: 1, }, 'linear'); defender.delay(630); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, feint: { - anim: BattleOtherAnims.sneakattack.anim + anim: BattleOtherAnims.sneakattack.anim, }, thief: { - anim: BattleOtherAnims.sneakattack.anim + anim: BattleOtherAnims.sneakattack.anim, }, shadowsneak: { anim(scene, [attacker, defender]) { scene.backgroundEffect('#000000', 700, 0.3); BattleOtherAnims.sneakattack.anim(scene, [attacker, defender]); - } + }, }, feintattack: { - anim: BattleOtherAnims.sneakattack.anim + anim: BattleOtherAnims.sneakattack.anim, }, struggle: { - anim: BattleOtherAnims.contactattack.anim + anim: BattleOtherAnims.contactattack.anim, }, earthquake: { anim(scene, [attacker, ...defenders]) { @@ -10374,31 +10369,31 @@ const BattleMoveAnims: AnimTable = { bottom: 0, }, 75).animate({ top: -100, - bottom: -10 + bottom: -10, }, 100).animate({ top: -90, - bottom: 0 + bottom: 0, }, 100).animate({ top: -95, - bottom: -5 + bottom: -5, }, 100).animate({ top: -90, - bottom: 0 + bottom: 0, }, 100).animate({ top: -95, - bottom: -5 + bottom: -5, }, 100).animate({ top: -90, - bottom: 0 + bottom: 0, }, 100).animate({ top: -92, - bottom: -2 + bottom: -2, }, 100).animate({ top: -90, - bottom: 0 + bottom: 0, }, 100).animate({ top: -92, - bottom: -2 + bottom: -2, }, 100).animate({ top: -90, bottom: 0, @@ -10407,95 +10402,95 @@ const BattleMoveAnims: AnimTable = { attacker.anim({ y: attacker.y - 10, yscale: 1, - time: 75 + time: 75, }); attacker.anim({ y: attacker.y + 10, yscale: 0.9, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y - 7, yscale: 1, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y + 7, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y - 7, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y + 7, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y - 7, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y + 7, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y - 2, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y + 2, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y, - time: 100 + time: 100, }); for (const defender of defenders) { defender.anim({ y: defender.y - 10, - time: 75 + time: 75, }); defender.anim({ y: defender.y + 10, - time: 100 + time: 100, }); defender.anim({ y: defender.y - 7, - time: 100 + time: 100, }); defender.anim({ y: defender.y + 7, - time: 100 + time: 100, }); defender.anim({ y: defender.y - 7, - time: 100 + time: 100, }); defender.anim({ y: defender.y + 7, - time: 100 + time: 100, }); defender.anim({ y: defender.y - 7, - time: 100 + time: 100, }); defender.anim({ y: defender.y + 7, - time: 100 + time: 100, }); defender.anim({ y: defender.y - 2, - time: 100 + time: 100, }); defender.anim({ y: defender.y + 2, - time: 100 + time: 100, }); defender.anim({ y: defender.y, - time: 100 + time: 100, }); scene.showEffect('rock3', { @@ -10504,13 +10499,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 0 + time: 0, }, { x: defender.x + 30, y: defender.y, scale: 0.4, opacity: 0, - time: 350 + time: 350, }, 'ballistic'); scene.showEffect('rock3', { x: defender.x - 10, @@ -10518,13 +10513,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 250 + time: 250, }, { x: defender.x - 35, y: defender.y, scale: 0.3, opacity: 0, - time: 600 + time: 600, }, 'ballistic'); scene.showEffect('rock3', { x: defender.x + 40, @@ -10532,13 +10527,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 400 + time: 400, }, { x: defender.x + 65, y: defender.y, scale: 0.3, opacity: 0, - time: 750 + time: 750, }, 'ballistic2'); scene.showEffect('rock3', { x: defender.x, @@ -10546,16 +10541,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.3, opacity: 1, - time: 500 + time: 500, }, { x: defender.x + 40, y: defender.y, scale: 0.4, opacity: 0, - time: 750 + time: 750, }, 'ballistic'); } - } + }, }, bulldoze: { anim(scene, [attacker, ...defenders]) { @@ -10565,31 +10560,31 @@ const BattleMoveAnims: AnimTable = { bottom: 0, }, 75).animate({ top: -100, - bottom: -10 + bottom: -10, }, 100).animate({ top: -90, - bottom: 0 + bottom: 0, }, 100).animate({ top: -95, - bottom: -5 + bottom: -5, }, 100).animate({ top: -90, - bottom: 0 + bottom: 0, }, 100).animate({ top: -95, - bottom: -5 + bottom: -5, }, 100).animate({ top: -90, - bottom: 0 + bottom: 0, }, 100).animate({ top: -92.5, - bottom: -2.5 + bottom: -2.5, }, 100).animate({ top: -90, - bottom: 0 + bottom: 0, }, 100).animate({ top: -92.5, - bottom: -2.5 + bottom: -2.5, }, 100).animate({ top: -90, bottom: 0, @@ -10597,134 +10592,134 @@ const BattleMoveAnims: AnimTable = { attacker.anim({ y: attacker.y + 20, - time: 175 + time: 175, }, 'swing'); attacker.anim({ y: attacker.y, - time: 125 + time: 125, }, 'accel'); attacker.anim({ y: attacker.y - 10, yscale: 1, - time: 75 + time: 75, }); attacker.anim({ y: attacker.y + 10, yscale: 0.9, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y - 5, yscale: 1, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y + 5, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y - 5, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y + 5, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y - 5, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y + 5, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y - 2, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y + 2, - time: 100 + time: 100, }); attacker.anim({ y: attacker.y, - time: 100 + time: 100, }); for (const defender of defenders) { defender.delay(275); defender.anim({ y: defender.y - 10, - time: 75 + time: 75, }); defender.anim({ y: defender.y + 10, - time: 100 + time: 100, }); defender.anim({ y: defender.y - 5, - time: 100 + time: 100, }); defender.anim({ y: defender.y + 5, - time: 100 + time: 100, }); defender.anim({ y: defender.y - 5, - time: 100 + time: 100, }); defender.anim({ y: defender.y + 5, - time: 100 + time: 100, }); defender.anim({ y: defender.y - 5, - time: 100 + time: 100, }); defender.anim({ y: defender.y + 5, - time: 100 + time: 100, }); defender.anim({ y: defender.y - 2, - time: 100 + time: 100, }); defender.anim({ y: defender.y + 2, - time: 100 + time: 100, }); defender.anim({ y: defender.y, - time: 100 + time: 100, }); } scene.wait(325); - } + }, }, tickle: { anim(scene, [attacker, defender]) { defender.anim({ x: defender.x - 10, - time: 75 + time: 75, }); defender.anim({ x: defender.x + 10, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 10, - time: 100 + time: 100, }); defender.anim({ x: defender.x + 10, - time: 100 + time: 100, }); defender.anim({ x: defender.x, - time: 100 + time: 100, }); scene.wait(425); - } + }, }, earthpower: { anim(scene, [attacker, defender]) { @@ -10733,31 +10728,31 @@ const BattleMoveAnims: AnimTable = { bottom: 0, }, 75).animate({ top: -100, - bottom: -10 + bottom: -10, }, 100).animate({ top: -90, - bottom: 0 + bottom: 0, }, 100).animate({ top: -95, - bottom: -5 + bottom: -5, }, 100).animate({ top: -90, - bottom: 0 + bottom: 0, }, 100).animate({ top: -95, - bottom: -5 + bottom: -5, }, 100).animate({ top: -90, - bottom: 0 + bottom: 0, }, 100).animate({ top: -92.5, - bottom: -2.5 + bottom: -2.5, }, 100).animate({ top: -90, - bottom: 0 + bottom: 0, }, 100).animate({ top: -92.5, - bottom: -2.5 + bottom: -2.5, }, 100).animate({ top: -90, bottom: 0, @@ -10768,10 +10763,10 @@ const BattleMoveAnims: AnimTable = { y: defender.y - 35, z: defender.z, scale: 0, - opacity: 0.8 + opacity: 0.8, }, { scale: 3, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('rock3', { x: defender.x + 10, @@ -10779,13 +10774,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.4, opacity: 0.6, - time: 0 + time: 0, }, { x: defender.x + 30, y: defender.y + 50, scale: 0.5, opacity: 0, - time: 300 + time: 300, }, 'linear', 'fade'); scene.showEffect('rock3', { x: defender.x + 10, @@ -10793,13 +10788,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.4, opacity: 0.6, - time: 100 + time: 100, }, { x: defender.x - 10, y: defender.y + 50, scale: 0.5, opacity: 0, - time: 400 + time: 400, }, 'linear', 'fade'); scene.showEffect('rock3', { x: defender.x + 40, @@ -10807,13 +10802,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.4, opacity: 0.6, - time: 200 + time: 200, }, { x: defender.x + 35, y: defender.y + 50, scale: 0.5, opacity: 0, - time: 500 + time: 500, }, 'linear', 'fade'); scene.showEffect('fireball', { @@ -10822,10 +10817,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.8, - time: 150 + time: 150, }, { scale: 3, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('rock3', { x: defender.x - 40, @@ -10833,13 +10828,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.4, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 60, y: defender.y + 45, scale: 0.5, opacity: 0, - time: 450 + time: 450, }, 'linear', 'fade'); scene.showEffect('rock3', { x: defender.x - 40, @@ -10847,13 +10842,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.4, opacity: 0.6, - time: 250 + time: 250, }, { x: defender.x - 20, y: defender.y + 45, scale: 0.5, opacity: 0, - time: 550 + time: 550, }, 'linear', 'fade'); scene.showEffect('rock3', { x: defender.x - 40, @@ -10861,13 +10856,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.4, opacity: 0.6, - time: 350 + time: 350, }, { x: defender.x - 35, y: defender.y + 45, scale: 0.5, opacity: 0, - time: 650 + time: 650, }, 'linear', 'fade'); scene.showEffect('fireball', { @@ -10876,10 +10871,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.8, - time: 300 + time: 300, }, { scale: 3, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('rock3', { x: defender.x + 40, @@ -10887,13 +10882,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.4, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x + 60, y: defender.y + 65, scale: 0.5, opacity: 0, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('rock3', { x: defender.x + 40, @@ -10901,13 +10896,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.4, opacity: 0.6, - time: 400 + time: 400, }, { x: defender.x + 20, y: defender.y + 65, scale: 0.5, opacity: 0, - time: 700 + time: 700, }, 'linear', 'fade'); scene.showEffect('rock3', { x: defender.x + 40, @@ -10915,53 +10910,53 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.4, opacity: 0.6, - time: 500 + time: 500, }, { x: defender.x + 30, y: defender.y + 65, scale: 0.5, opacity: 0, - time: 800 + time: 800, }, 'linear', 'fade'); defender.delay(50); defender.anim({ y: defender.y - 10, - time: 75 + time: 75, }); defender.anim({ y: defender.y + 10, - time: 100 + time: 100, }); defender.anim({ y: defender.y - 7, - time: 100 + time: 100, }); defender.anim({ y: defender.y + 7, - time: 100 + time: 100, }); defender.anim({ y: defender.y - 7, - time: 100 + time: 100, }); defender.anim({ y: defender.y + 7, - time: 100 + time: 100, }); defender.anim({ y: defender.y - 2, - time: 100 + time: 100, }); defender.anim({ y: defender.y + 2, - time: 100 + time: 100, }); defender.anim({ y: defender.y, - time: 100 + time: 100, }); - } + }, }, drillrun: { // todo: rip horn sprite and redo animation anim(scene, [attacker, defender]) { @@ -10969,19 +10964,19 @@ const BattleMoveAnims: AnimTable = { x: defender.x, y: defender.y, z: defender.behind(-5), - time: 300 + time: 300, }, 'accel'); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(280); defender.anim({ z: defender.behind(20), - time: 200 + time: 200, }); defender.anim({ z: defender.behind(0), - time: 200 + time: 200, }); scene.showEffect('wisp', { @@ -10990,11 +10985,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 300 + time: 300, }, { scale: 3, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -11002,11 +10997,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 400 + time: 400, }, { scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('impact', { x: defender.x, @@ -11014,11 +11009,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.4, - time: 300 + time: 300, }, { scale: 2, opacity: 0, - time: 500 + time: 500, }, 'linear'); scene.showEffect('impact', { x: defender.x, @@ -11026,11 +11021,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.4, - time: 500 + time: 500, }, { scale: 2, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('flareball', { x: defender.leftof(10), @@ -11039,13 +11034,13 @@ const BattleMoveAnims: AnimTable = { scale: 0.7, yscale: 1, opacity: 0.8, - time: 300 + time: 300, }, { z: defender.behind(5), scale: 0, xscale: 0, yscale: 0, - time: 450 + time: 450, }, 'accel'); scene.showEffect('flareball', { x: defender.leftof(10), @@ -11054,13 +11049,13 @@ const BattleMoveAnims: AnimTable = { scale: 0.7, yscale: 1, opacity: 0.8, - time: 350 + time: 350, }, { z: defender.behind(5), scale: 0, xscale: 0, yscale: 0, - time: 500 + time: 500, }, 'accel'); scene.showEffect('flareball', { x: defender.leftof(10), @@ -11069,15 +11064,15 @@ const BattleMoveAnims: AnimTable = { scale: 0.7, yscale: 1, opacity: 0.8, - time: 400 + time: 400, }, { z: defender.behind(5), scale: 0, xscale: 0, yscale: 0, - time: 550 + time: 550, }, 'accel'); - } + }, }, poisongas: { anim(scene, [attacker, defender]) { @@ -11087,13 +11082,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.4, opacity: 1, - time: 0 + time: 0, }, { x: defender.x + 10, y: defender.y + 20, scale: 0.7, opacity: 0, - time: 300 + time: 300, }, 'linear'); scene.showEffect('poisonwisp', { x: defender.x - 30, @@ -11101,13 +11096,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.4, opacity: 1, - time: 100 + time: 100, }, { x: defender.x - 30, y: defender.y + 20, scale: 0.7, opacity: 0, - time: 400 + time: 400, }, 'linear'); scene.showEffect('poisonwisp', { x: defender.x + 40, @@ -11115,15 +11110,15 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.4, opacity: 1, - time: 200 + time: 200, }, { x: defender.x + 40, y: defender.y + 20, scale: 0.7, opacity: 0, - time: 500 + time: 500, }, 'linear'); - } + }, }, smog: { anim(scene, [attacker, defender]) { @@ -11133,14 +11128,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.7, opacity: 0.6, - time: 0 + time: 0, }, { x: defender.x, y: defender.y + 10, z: defender.behind(10), scale: 1, opacity: 0.3, - time: 400 + time: 400, }, 'decel', 'explode'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -11148,14 +11143,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.7, opacity: 1, - time: 100 + time: 100, }, { x: defender.x - 20, y: defender.y + 5, z: defender.behind(10), scale: 1, opacity: 0.3, - time: 500 + time: 500, }, 'decel', 'explode'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -11163,14 +11158,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.7, opacity: 1, - time: 200 + time: 200, }, { x: defender.x + 25, y: defender.y, z: defender.behind(10), scale: 1, opacity: 0.3, - time: 600 + time: 600, }, 'decel', 'explode'); scene.showEffect('poisonwisp', { @@ -11179,13 +11174,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 400 + time: 400, }, { x: defender.x + 50, y: defender.y + 30, scale: 1.4, opacity: 0.2, - time: 800 + time: 800, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: defender.x - 30, @@ -11193,13 +11188,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 500 + time: 500, }, { x: defender.x - 50, y: defender.y + 30, scale: 1.4, opacity: 0.2, - time: 900 + time: 900, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: defender.x + 15, @@ -11207,15 +11202,15 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 600 + time: 600, }, { x: defender.x + 25, y: defender.y + 20, scale: 1.4, opacity: 0.2, - time: 1000 + time: 1000, }, 'decel', 'fade'); - } + }, }, clearsmog: { anim(scene, [attacker, defender]) { @@ -11225,14 +11220,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.7, opacity: 0.6, - time: 0 + time: 0, }, { x: defender.x, y: defender.y + 10, z: defender.behind(10), scale: 1, opacity: 0.3, - time: 400 + time: 400, }, 'decel', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -11240,14 +11235,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.7, opacity: 1, - time: 100 + time: 100, }, { x: defender.x - 20, y: defender.y + 5, z: defender.behind(10), scale: 1, opacity: 0.3, - time: 500 + time: 500, }, 'decel', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -11255,14 +11250,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.7, opacity: 1, - time: 200 + time: 200, }, { x: defender.x + 25, y: defender.y, z: defender.behind(10), scale: 1, opacity: 0.3, - time: 600 + time: 600, }, 'decel', 'explode'); scene.showEffect('wisp', { @@ -11271,13 +11266,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 400 + time: 400, }, { x: defender.x + 40, y: defender.y + 20, scale: 1.4, opacity: 0.2, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x - 30, @@ -11285,13 +11280,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 500 + time: 500, }, { x: defender.x - 40, y: defender.y + 20, scale: 1.4, opacity: 0.2, - time: 900 + time: 900, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x + 15, @@ -11299,15 +11294,15 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 600 + time: 600, }, { x: defender.x + 20, y: defender.y + 20, scale: 1.4, opacity: 0.2, - time: 1000 + time: 1000, }, 'linear', 'fade'); - } + }, }, bonemerang: { anim(scene, [attacker, defender]) { @@ -11315,25 +11310,24 @@ const BattleMoveAnims: AnimTable = { x: attacker.x, y: attacker.y, z: attacker.z, - opacity: 0 + opacity: 0, }, { z: defender.behind(20), opacity: 1, - time: 300 + time: 300, }, 'ballistic2'); scene.showEffect('bone', { x: defender.x, y: defender.y, z: defender.behind(20), opacity: 1, - time: 300 + time: 300, }, { z: attacker.z, opacity: 0, - time: 600 + time: 600, }, 'ballistic2Under', 'fade'); }, - multihit: true }, boneclub: { anim(scene, [attacker, defender]) { @@ -11343,14 +11337,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -11358,14 +11352,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 500 + time: 500, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('bone', { x: defender.x, @@ -11373,17 +11367,17 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 2, opacity: 0, - time: 800 + time: 800, }, 'linear'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, shadowbone: { anim(scene, [attacker, defender]) { @@ -11394,14 +11388,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('shadowball', { x: defender.x, @@ -11409,11 +11403,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 450 + time: 450, }, { scale: 2.5, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -11421,14 +11415,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 500 + time: 500, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('bone', { x: defender.x, @@ -11436,35 +11430,35 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 2, opacity: 0, - time: 800 + time: 800, }, 'linear'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, whirlwind: { anim(scene, [attacker, defender]) { - for (var i = 0; i < 3; i++) { + for (let i = 0; i < 3; i++) { scene.showEffect('wisp', { x: defender.x + 30, y: defender.y - 35, z: defender.behind(i * 40 - 60), scale: 0.2, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x - 30, y: defender.y, z: defender.behind(i * 40 - 60), scale: 0.4, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x - 30, @@ -11472,14 +11466,14 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(i * 40 - 60), scale: 0.2, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x + 30, y: defender.y, z: defender.behind(i * 40 - 60), scale: 0.4, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x + 30, @@ -11487,14 +11481,14 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(i * 40 - 60), scale: 0.2, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x - 30, y: defender.y - 35, z: defender.behind(i * 40 - 60), scale: 0.4, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x - 30, @@ -11502,37 +11496,37 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(i * 40 - 60), scale: 0.2, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x + 30, y: defender.y - 35, z: defender.behind(i * 40 - 60), scale: 0.4, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); } - } + }, }, hurricane: { anim(scene, [attacker, defender]) { scene.backgroundEffect('#000000', 900, 0.6); - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { scene.showEffect('wisp', { x: defender.x + 50, y: defender.y - 35, z: defender.z, scale: 0.2, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x - 50, y: defender.y, z: defender.z, scale: 0.4, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x - 50, @@ -11540,14 +11534,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x + 50, y: defender.y, z: defender.z, scale: 0.4, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x + 50, @@ -11555,14 +11549,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x - 50, y: defender.y - 35, z: defender.z, scale: 0.4, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x - 50, @@ -11570,35 +11564,35 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x + 50, y: defender.y - 35, z: defender.z, scale: 0.4, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); } - } + }, }, ominouswind: { anim(scene, [attacker, defender]) { - for (var i = 0; i < 3; i++) { + for (let i = 0; i < 3; i++) { scene.showEffect('poisonwisp', { x: defender.x + 30, y: defender.y - 35, z: defender.behind(i * 40 - 60), scale: 0.2, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x - 30, y: defender.y, z: defender.behind(i * 40 - 60), scale: 0.4, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x - 30, @@ -11606,14 +11600,14 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(i * 40 - 60), scale: 0.2, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x + 30, y: defender.y, z: defender.behind(i * 40 - 60), scale: 0.4, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x + 30, @@ -11621,14 +11615,14 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(i * 40 - 60), scale: 0.2, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x - 30, y: defender.y - 35, z: defender.behind(i * 40 - 60), scale: 0.4, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x - 30, @@ -11636,73 +11630,73 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(i * 40 - 60), scale: 0.2, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x + 30, y: defender.y - 35, z: defender.behind(i * 40 - 60), scale: 0.4, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); } - } + }, }, magmastorm: { anim(scene, [attacker, defender]) { scene.backgroundEffect('#CC3300', 900, 0.3); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }); defender.anim({ x: defender.x + 5, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 5, - time: 100 + time: 100, }); defender.anim({ x: defender.x + 5, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 5, - time: 100 + time: 100, }); defender.anim({ x: defender.x + 5, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 5, - time: 100 + time: 100, }); defender.anim({ x: defender.x + 5, - time: 100 + time: 100, }); defender.anim({ x: defender.x, - time: 100 + time: 100, }); - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { scene.showEffect('fireball', { x: defender.x + 50, y: defender.y - 35, z: defender.z, scale: 0.5, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x - 50, y: defender.y, z: defender.z, scale: 1, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('fireball', { x: defender.x - 50, @@ -11710,14 +11704,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x + 50, y: defender.y, z: defender.z, scale: 1, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('fireball', { x: defender.x + 50, @@ -11725,14 +11719,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x - 50, y: defender.y - 35, z: defender.z, scale: 1, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('fireball', { x: defender.x - 50, @@ -11740,35 +11734,35 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x + 50, y: defender.y - 35, z: defender.z, scale: 1, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); } - } + }, }, firespin: { anim(scene, [attacker, defender]) { - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { scene.showEffect('fireball', { x: defender.x + 50, y: defender.y - 35, z: defender.z, scale: 0.5, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x - 50, y: defender.y, z: defender.z, scale: 1, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('fireball', { x: defender.x - 50, @@ -11776,14 +11770,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x + 50, y: defender.y, z: defender.z, scale: 1, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('fireball', { x: defender.x + 50, @@ -11791,14 +11785,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x - 50, y: defender.y - 35, z: defender.z, scale: 1, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('fireball', { x: defender.x - 50, @@ -11806,35 +11800,35 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x + 50, y: defender.y - 35, z: defender.z, scale: 1, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); } - } + }, }, leaftornado: { anim(scene, [attacker, defender]) { - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { scene.showEffect('leaf1', { x: defender.x + 50, y: defender.y - 35, z: defender.z, scale: 0.5, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x - 50, y: defender.y, z: defender.z, scale: 1, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('leaf2', { x: defender.x - 50, @@ -11842,14 +11836,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x + 50, y: defender.y, z: defender.z, scale: 1, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('leaf1', { x: defender.x + 50, @@ -11857,14 +11851,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x - 50, y: defender.y - 35, z: defender.z, scale: 1, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); scene.showEffect('leaf2', { x: defender.x - 50, @@ -11872,62 +11866,62 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 200 * i + time: 200 * i, }, { x: defender.x + 50, y: defender.y - 35, z: defender.z, scale: 1, opacity: 0.4, - time: 200 * i + 200 + time: 200 * i + 200, }, 'linear', 'fade'); } - } + }, }, roar: { - anim: BattleOtherAnims.sound.anim + anim: BattleOtherAnims.sound.anim, }, round: { - anim: BattleOtherAnims.sound.anim + anim: BattleOtherAnims.sound.anim, }, yawn: { - anim: BattleOtherAnims.sound.anim + anim: BattleOtherAnims.sound.anim, }, sing: { - anim: BattleOtherAnims.sound.anim + anim: BattleOtherAnims.sound.anim, }, perishsong: { - anim: BattleOtherAnims.sound.anim + anim: BattleOtherAnims.sound.anim, }, partingshot: { - anim: BattleOtherAnims.sound.anim + anim: BattleOtherAnims.sound.anim, }, nobleroar: { - anim: BattleOtherAnims.sound.anim + anim: BattleOtherAnims.sound.anim, }, disarmingvoice: { - anim: BattleOtherAnims.sound.anim + anim: BattleOtherAnims.sound.anim, }, growl: { - anim: BattleOtherAnims.sound.anim + anim: BattleOtherAnims.sound.anim, }, screech: { - anim: BattleOtherAnims.sound.anim + anim: BattleOtherAnims.sound.anim, }, snore: { - anim: BattleOtherAnims.sound.anim + anim: BattleOtherAnims.sound.anim, }, synchronoise: { - anim: BattleOtherAnims.sound.anim + anim: BattleOtherAnims.sound.anim, }, sonicboom: { - anim: BattleOtherAnims.sound.anim + anim: BattleOtherAnims.sound.anim, }, eerieimpulse: { - anim: BattleOtherAnims.sound.anim + anim: BattleOtherAnims.sound.anim, }, metalsound: { - anim: BattleOtherAnims.sound.anim + anim: BattleOtherAnims.sound.anim, }, supersonic: { anim(scene, [attacker, defender]) { @@ -11937,14 +11931,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.5, - time: 0 + time: 0, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1, opacity: 0, - time: 200 + time: 200, }, 'linear'); scene.showEffect('electroball', { x: attacker.x, @@ -11952,14 +11946,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.5, - time: 150 + time: 150, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1, opacity: 0, - time: 350 + time: 350, }, 'linear'); scene.showEffect('electroball', { x: attacker.x, @@ -11967,31 +11961,31 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.5, - time: 300 + time: 300, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1, opacity: 0, - time: 500 + time: 500, }, 'linear'); - } + }, }, confide: { - anim: BattleOtherAnims.sound.anim + anim: BattleOtherAnims.sound.anim, }, defog: { anim(scene, [attacker, defender]) { scene.backgroundEffect('#FFFFFF', 900, 0.5); BattleOtherAnims.sound.anim(scene, [attacker, defender]); - } + }, }, grasswhistle: { anim(scene, [attacker, defender]) { scene.backgroundEffect('#9AB440', 900, 0.3); BattleOtherAnims.sound.anim(scene, [attacker, defender]); - } + }, }, hypervoice: { anim(scene, [attacker]) { @@ -12001,12 +11995,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.5, - time: 0 + time: 0, }, { z: attacker.behind(-50), scale: 7, opacity: 0, - time: 400 + time: 400, }, 'linear'); scene.showEffect('iceball', { x: attacker.x, @@ -12014,12 +12008,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.5, - time: 150 + time: 150, }, { z: attacker.behind(-50), scale: 7, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('iceball', { x: attacker.x, @@ -12027,14 +12021,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.5, - time: 300 + time: 300, }, { z: attacker.behind(-50), scale: 7, opacity: 0, - time: 800 + time: 800, }, 'linear'); - } + }, }, boomburst: { anim(scene, [attacker, ...defenders]) { @@ -12042,31 +12036,31 @@ const BattleMoveAnims: AnimTable = { defender.delay(125); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 150 + time: 150, }, 'swing'); } @@ -12077,12 +12071,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.5, - time: 0 + time: 0, }, { z: attacker.behind(-50), scale: 7, opacity: 0, - time: 400 + time: 400, }, 'linear'); scene.showEffect('iceball', { x: attacker.x, @@ -12090,12 +12084,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.5, - time: 150 + time: 150, }, { z: attacker.behind(-50), scale: 7, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('iceball', { x: attacker.x, @@ -12103,14 +12097,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.5, - time: 300 + time: 300, }, { z: attacker.behind(-50), scale: 7, opacity: 0, - time: 800 + time: 800, }, 'linear'); - } + }, }, heatwave: { anim(scene, [attacker, ...defenders]) { @@ -12118,31 +12112,31 @@ const BattleMoveAnims: AnimTable = { defender.delay(125); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 150 + time: 150, }, 'swing'); } const defender = defenders[1] || defenders[0]; @@ -12154,14 +12148,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.5, - time: 0 + time: 0, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2.5, opacity: 0, - time: 400 + time: 400, }, 'linear'); scene.showEffect('flareball', { x: attacker.x, @@ -12169,14 +12163,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.5, - time: 150 + time: 150, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2.5, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('flareball', { x: attacker.x, @@ -12184,16 +12178,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.5, - time: 300 + time: 300, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2.5, opacity: 0, - time: 800 + time: 800, }, 'linear'); - } + }, }, snarl: { anim(scene, [attacker, defender]) { @@ -12203,11 +12197,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.4, - time: 0 + time: 0, }, { scale: 7, opacity: 0, - time: 400 + time: 400, }, 'linear'); scene.showEffect('shadowball', { x: attacker.x, @@ -12215,11 +12209,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.4, - time: 150 + time: 150, }, { scale: 7, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('shadowball', { x: attacker.x, @@ -12227,13 +12221,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.4, - time: 300 + time: 300, }, { scale: 7, opacity: 0, - time: 800 + time: 800, }, 'linear'); - } + }, }, thunder: { anim(scene, [attacker, defender]) { @@ -12244,13 +12238,13 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 150, z: defender.z, yscale: 0, - xscale: 2 + xscale: 2, }, { y: defender.y + 50, yscale: 1, xscale: 1.5, opacity: 0, - time: 200 + time: 200, }, 'linear'); scene.showEffect('lightning', { x: defender.x, @@ -12258,10 +12252,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, yscale: 1, xscale: 1.5, - time: 200 + time: 200, }, { opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('lightning', { x: defender.x, @@ -12269,10 +12263,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, yscale: 1, xscale: 1.5, - time: 600 + time: 600, }, { opacity: 0, - time: 1100 + time: 1100, }, 'linear'); scene.showEffect('electroball', { @@ -12282,12 +12276,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 1.5, opacity: 0.5, - time: 200 + time: 200, }, { scale: 2, xscale: 4, opacity: 0.1, - time: 900 + time: 900, }, 'linear', 'fade'); scene.showEffect('electroball', { x: defender.x, @@ -12295,38 +12289,38 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.5, scale: 1.5, - time: 200 + time: 200, }, { scale: 1.8, opacity: 0.1, - time: 900 + time: 900, }, 'linear', 'fade'); defender.delay(200); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 100 + time: 100, }, 'accel'); - } + }, }, thunderbolt: { anim(scene, [attacker, defender]) { @@ -12336,13 +12330,13 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 150, z: defender.z, yscale: 0, - xscale: 2 + xscale: 2, }, { y: defender.y + 50, yscale: 1, xscale: 1.5, opacity: 0.8, - time: 200 + time: 200, }, 'linear', 'fade'); scene.showEffect('lightning', { x: defender.x - 15, @@ -12350,13 +12344,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, yscale: 0, xscale: 2, - time: 200 + time: 200, }, { y: defender.y + 50, yscale: 1, xscale: 1.5, opacity: 0.8, - time: 400 + time: 400, }, 'linear', 'fade'); scene.showEffect('lightning', { x: defender.x + 15, @@ -12364,15 +12358,15 @@ const BattleMoveAnims: AnimTable = { z: defender.z, yscale: 0, xscale: 2, - time: 400 + time: 400, }, { y: defender.y + 50, yscale: 1, xscale: 1.5, opacity: 0.8, - time: 600 + time: 600, }, 'linear', 'fade'); - } + }, }, psychic: { anim(scene, [attacker, defender]) { @@ -12380,22 +12374,22 @@ const BattleMoveAnims: AnimTable = { scene.backgroundEffect('#AA44FF', 250, 0.6, 400); defender.anim({ scale: 1.2, - time: 100 + time: 100, }); defender.anim({ scale: 1, - time: 100 + time: 100, }); defender.anim({ scale: 1.4, - time: 150 + time: 150, }); defender.anim({ scale: 1, - time: 150 + time: 150, }); scene.wait(700); - } + }, }, meanlook: { anim(scene, [attacker, defender]) { @@ -12407,12 +12401,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, yscale: 0, - opacity: 1 + opacity: 1, }, { yscale: 1, - time: 700 + time: 700, }, 'decel', 'fade'); - } + }, }, nightshade: { anim(scene, [attacker, defender]) { @@ -12424,23 +12418,23 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 3, opacity: 0.3, - time: 50 + time: 50, }, { x: defender.x, y: defender.y + 35, z: defender.z, scale: 3.5, opacity: 0.1, - time: 600 + time: 600, }, 'accel', 'fade'); - } + }, }, fairylock: { anim(scene, [attacker, defender]) { scene.backgroundEffect('#FF99FF', 250, 0.3); scene.backgroundEffect('#AA44BB', 250, 0.2, 400); scene.wait(700); - } + }, }, rockblast: { anim(scene, [attacker, defender]) { @@ -12449,17 +12443,16 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.6, - opacity: 0.4 + opacity: 0.4, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.6, opacity: 1, - time: 400 + time: 400, }, 'linear', 'explode'); }, - multihit: true }, geargrind: { anim(scene, [attacker, defender]) { @@ -12469,12 +12462,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.65, opacity: 0, - time: 450 + time: 450, }, { x: defender.x + 20, y: defender.y, opacity: 1, - time: 565 + time: 565, }, 'linear', 'explode'); scene.showEffect('gear', { x: defender.x - 70, @@ -12482,12 +12475,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.65, opacity: 0, - time: 450 + time: 450, }, { x: defender.x - 20, y: defender.y, opacity: 1, - time: 565 + time: 565, }, 'linear', 'explode'); scene.showEffect('wisp', { x: defender.x, @@ -12495,14 +12488,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 550 + time: 550, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('gear', { x: defender.x + 70, @@ -12510,12 +12503,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.65, opacity: 0, - time: 650 + time: 650, }, { x: defender.x + 20, y: defender.y, opacity: 1, - time: 765 + time: 765, }, 'linear', 'explode'); scene.showEffect('gear', { x: defender.x - 70, @@ -12523,12 +12516,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.65, opacity: 0, - time: 650 + time: 650, }, { x: defender.x - 20, y: defender.y, opacity: 1, - time: 765 + time: 765, }, 'linear', 'explode'); scene.showEffect('wisp', { x: defender.x, @@ -12536,52 +12529,52 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 750 + time: 750, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(20), scale: 3, opacity: 0, - time: 900 + time: 900, }, 'linear'); attacker.anim({ x: defender.leftof(-30), y: defender.y + 80, z: defender.behind(-30), - time: 400 + time: 400, }, 'ballistic'); attacker.anim({ x: defender.leftof(30), y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ x: defender.leftof(30), y: defender.y + 80, z: defender.behind(-30), - time: 200 + time: 200, }, 'ballisticUp'); attacker.anim({ x: defender.leftof(-30), y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(450); defender.anim({ y: defender.y + 15, z: defender.behind(10), yscale: 1.3, - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 100 + time: 100, }, 'swing'); defender.delay(225); defender.anim({ @@ -12589,13 +12582,12 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 15, z: defender.behind(5), yscale: 1.3, - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 100 + time: 100, }, 'swing'); }, - multihit: true }, iciclespear: { anim(scene, [attacker, defender]) { @@ -12604,13 +12596,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.6, - time: 300 + time: 300, }, 'linear', 'explode'); scene.showEffect('icicle', { x: attacker.x, @@ -12618,13 +12610,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.6, - time: 375 + time: 375, }, 'linear', 'fade'); scene.showEffect('icicle', { x: attacker.x, @@ -12632,20 +12624,18 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.6, - time: 450 + time: 450, }, 'linear', 'fade'); }, - multihit: true }, tailslap: { anim: BattleOtherAnims.contactattack.anim, - multihit: true }, furyswipes: { anim(scene, [attacker, defender]) { @@ -12655,14 +12645,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 400 + time: 400, }, { x: defender.x - 20, y: defender.y + 20, z: defender.z, scale: 1.5, opacity: 0, - time: 700 + time: 700, }, 'linear', 'fade'); scene.showEffect('leftslash', { x: defender.x - 20, @@ -12670,14 +12660,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 400 + time: 400, }, { x: defender.x - 20, y: defender.y - 20, z: defender.z, scale: 1.5, opacity: 0, - time: 700 + time: 700, }, 'linear', 'fade'); scene.showEffect('rightslash', { x: defender.x + 20, @@ -12685,14 +12675,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 700 + time: 700, }, { x: defender.x + 20, y: defender.y + 20, z: defender.z, scale: 1.5, opacity: 0, - time: 1000 + time: 1000, }, 'linear', 'fade'); scene.showEffect('rightslash', { x: defender.x + 20, @@ -12700,22 +12690,20 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 700 + time: 700, }, { x: defender.x + 20, y: defender.y - 20, z: defender.z, scale: 1.5, opacity: 0, - time: 1000 + time: 1000, }, 'linear', 'fade'); BattleOtherAnims.xattack.anim(scene, [attacker, defender]); }, - multihit: true }, furyattack: { anim: BattleOtherAnims.xattack.anim, - multihit: true }, bulletseed: { anim(scene, [attacker, defender]) { @@ -12724,13 +12712,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.6, - time: 300 + time: 300, }, 'linear', 'explode'); scene.showEffect('energyball', { x: attacker.x, @@ -12738,16 +12726,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 0.6, - time: 30 + time: 30, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.6, - time: 330 + time: 330, }, 'linear', 'fade'); }, - multihit: true }, spikecannon: { anim(scene, [attacker, defender]) { @@ -12756,13 +12743,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.6, - time: 300 + time: 300, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -12770,16 +12757,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 0.6, - time: 30 + time: 30, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.6, - time: 330 + time: 330, }, 'linear', 'fade'); }, - multihit: true }, twineedle: { anim(scene, [attacker, defender]) { @@ -12788,13 +12774,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x - 35, y: defender.y + 10, z: defender.z, opacity: 0.6, - time: 300 + time: 300, }, 'linear', 'explode'); scene.showEffect('energyball', { x: attacker.x, @@ -12802,16 +12788,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 200 + time: 200, }, { x: defender.x + 20, y: defender.y - 20, z: defender.z, opacity: 0.6, - time: 500 + time: 500, }, 'linear', 'explode'); }, - multihit: true }, razorshell: { anim(scene, [attacker, defender]) { @@ -12821,11 +12806,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 0.6, - time: 700 + time: 700, }, { scale: 2, opacity: 0, - time: 1000 + time: 1000, }, 'accel', 'fade'); scene.showEffect('leftslash', { x: defender.x - 10, @@ -12833,11 +12818,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 0.6, - time: 600 + time: 600, }, { scale: 2, opacity: 0, - time: 1000 + time: 1000, }, 'accel', 'fade'); scene.showEffect('shell', { x: defender.x - 60, @@ -12845,16 +12830,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.75, opacity: 1, - time: 400 + time: 400, }, { x: defender.x + 60, y: defender.y - 70, scale: 0.6, opacity: 0, - time: 700 + time: 700, }, 'decel'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, crabhammer: { anim(scene, [attacker, defender]) { @@ -12864,40 +12849,40 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-15), scale: 1.5, opacity: 0.8, - time: 400 + time: 400, }, { y: defender.y, z: defender.z, scale: 0.5, opacity: 1, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('waterwisp', { x: defender.x, y: defender.y - 25, z: defender.z, scale: 1, - time: 500 + time: 500, }, { x: defender.x + 50, scale: 0.6, opacity: 0.3, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('waterwisp', { x: defender.x, y: defender.y - 25, z: defender.z, scale: 1, - time: 500 + time: 500, }, { x: defender.x - 50, scale: 0.6, opacity: 0.3, - time: 800 + time: 800, }, 'linear', 'fade'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, aquajet: { anim(scene, [attacker, defender]) { @@ -12906,11 +12891,11 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 30, z: defender.z, scale: 0, - opacity: 1 + opacity: 1, }, { y: attacker.y - 20, scale: 4, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('waterwisp', { x: Math.floor((attacker.x + defender.x) / 2) - 20, @@ -12918,11 +12903,11 @@ const BattleMoveAnims: AnimTable = { z: Math.floor((attacker.z + defender.z) / 2), scale: 0, opacity: 1, - time: 150 + time: 150, }, { y: Math.floor((attacker.y + defender.y) / 2) - 20, scale: 4, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('waterwisp', { x: defender.x + 10, @@ -12930,70 +12915,70 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 300 + time: 300, }, { y: defender.y - 20, scale: 4, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 50 + time: 50, }, { x: defender.x, y: defender.y, z: defender.behind(70), - time: 350 + time: 350, }, 'accel', 'fade'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 100 + time: 100, }, { x: defender.x, y: defender.y, z: defender.behind(70), - time: 400 + time: 400, }, 'accel', 'fade'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(70), time: 300, - opacity: 0.5 + opacity: 0.5, }, 'accel'); attacker.anim({ x: defender.x, y: defender.x, z: defender.behind(100), opacity: 0, - time: 100 + time: 100, }, 'linear'); attacker.anim({ x: attacker.x, y: attacker.y, z: attacker.behind(70), opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ opacity: 1, - time: 500 + time: 500, }, 'decel'); defender.delay(260); defender.anim({ z: defender.behind(30), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, iceshard: { anim(scene, [attacker, defender]) { @@ -13002,13 +12987,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1.5, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.6, - time: 300 + time: 300, }, 'linear', 'explode'); scene.showEffect('icicle', { x: attacker.x, @@ -13016,13 +13001,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.5, opacity: 0.1, - time: 100 + time: 100, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.3, - time: 400 + time: 400, }, 'linear', 'fade'); scene.showEffect('icicle', { x: attacker.x, @@ -13030,15 +13015,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.5, opacity: 0.1, - time: 200 + time: 200, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.3, - time: 500 + time: 500, }, 'linear', 'fade'); - } + }, }, watershuriken: { anim(scene, [attacker, defender]) { @@ -13047,11 +13032,11 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 30, z: defender.z, scale: 0, - opacity: 1 + opacity: 1, }, { y: attacker.y - 20, scale: 4, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('waterwisp', { x: Math.floor((attacker.x + defender.x) / 2) - 20, @@ -13059,11 +13044,11 @@ const BattleMoveAnims: AnimTable = { z: Math.floor((attacker.z + defender.z) / 2), scale: 0, opacity: 1, - time: 150 + time: 150, }, { y: Math.floor((attacker.y + defender.y) / 2) - 20, scale: 4, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('waterwisp', { x: defender.x + 10, @@ -13071,66 +13056,65 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 300 + time: 300, }, { y: defender.y - 20, scale: 4, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('icicle', { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 50 + time: 50, }, { x: defender.x, y: defender.y, z: defender.behind(70), - time: 350 + time: 350, }, 'accel', 'fade'); scene.showEffect('icicle', { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 100 + time: 100, }, { x: defender.x, y: defender.y, z: defender.behind(70), - time: 400 + time: 400, }, 'accel', 'fade'); scene.showEffect('icicle', { x: attacker.x, y: attacker.y, - z: attacker.z + z: attacker.z, }, { x: defender.x, y: defender.y, z: defender.behind(70), - time: 300 + time: 300, }, 'accel', 'fade'); }, - multihit: true }, icebeam: { anim(scene, [attacker, defender]) { - var xstep = (defender.x - attacker.x) / 5; - var ystep = (defender.y - attacker.y) / 5; - var zstep = (defender.z - attacker.z) / 5; + let xstep = (defender.x - attacker.x) / 5; + let ystep = (defender.y - attacker.y) / 5; + let zstep = (defender.z - attacker.z) / 5; - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { scene.showEffect('icicle', { x: attacker.x + xstep * (i + 1), y: attacker.y + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 1.5, opacity: 0.6, - time: 40 * i + time: 40 * i, }, { opacity: 0, - time: 40 * i + 600 + time: 40 * i + 600, }, 'linear'); } scene.showEffect('iceball', { @@ -13139,14 +13123,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 100 + time: 100, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2, opacity: 0, - time: 400 + time: 400, }, 'linear'); scene.showEffect('iceball', { x: defender.x, @@ -13154,14 +13138,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 300 + time: 300, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('wisp', { @@ -13170,11 +13154,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 2, opacity: 0.5, - time: 200 + time: 200, }, { scale: 4, opacity: 0, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -13182,11 +13166,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 2, opacity: 0.5, - time: 300 + time: 300, }, { scale: 4, opacity: 0, - time: 650 + time: 650, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x + 15, @@ -13194,13 +13178,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 2, opacity: 0.5, - time: 400 + time: 400, }, { scale: 4, opacity: 0, - time: 700 + time: 700, }, 'linear', 'fade'); - } + }, }, freezedry: { anim(scene, [attacker, defender]) { @@ -13209,13 +13193,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x, y: defender.y, z: defender.behind(20), opacity: 0.6, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('icicle', { x: attacker.x, @@ -13223,13 +13207,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.2, - time: 100 + time: 100, }, { x: defender.x + 10, y: defender.y - 5, z: defender.behind(20), opacity: 0.6, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('icicle', { x: attacker.x, @@ -13237,13 +13221,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.2, - time: 200 + time: 200, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(20), opacity: 0.6, - time: 600 + time: 600, }, 'linear', 'explode'); scene.showEffect('icicle', { x: attacker.x, @@ -13251,13 +13235,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.2, - time: 300 + time: 300, }, { x: defender.x, y: defender.y - 5, z: defender.behind(20), opacity: 0.6, - time: 700 + time: 700, }, 'linear', 'explode'); scene.showEffect('wisp', { @@ -13265,14 +13249,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 2.4, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x + 10, y: defender.y + 5, z: defender.behind(30), scale: 3, opacity: 0.6, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -13280,14 +13264,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2.4, opacity: 0.3, - time: 100 + time: 100, }, { x: defender.x - 10, y: defender.y - 5, z: defender.behind(30), scale: 3, opacity: 0.6, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -13295,14 +13279,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2.4, opacity: 0.3, - time: 200 + time: 200, }, { x: defender.x, y: defender.y + 5, z: defender.behind(30), scale: 3, opacity: 0.6, - time: 600 + time: 600, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -13310,16 +13294,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2.4, opacity: 0.3, - time: 300 + time: 300, }, { x: defender.x, y: defender.y + 5, z: defender.behind(30), scale: 3, opacity: 0.6, - time: 700 + time: 700, }, 'linear', 'explode'); - } + }, }, icywind: { anim(scene, [attacker, ...defenders]) { @@ -13329,14 +13313,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1.7, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x + 10, y: defender.y + 5, z: defender.behind(30), scale: 2.5, opacity: 0.4, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -13344,14 +13328,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.7, opacity: 0.3, - time: 100 + time: 100, }, { x: defender.x - 10, y: defender.y - 5, z: defender.behind(30), scale: 2.5, opacity: 0.4, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -13359,14 +13343,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.7, opacity: 0.3, - time: 200 + time: 200, }, { x: defender.x, y: defender.y + 5, z: defender.behind(30), scale: 2.5, opacity: 0.4, - time: 600 + time: 600, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -13374,14 +13358,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.7, opacity: 0.3, - time: 300 + time: 300, }, { x: defender.x, y: defender.y + 5, z: defender.behind(30), scale: 2.5, opacity: 0.4, - time: 700 + time: 700, }, 'linear', 'explode'); scene.showEffect('icicle', { @@ -13389,13 +13373,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.3, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x, y: defender.y, z: defender.behind(20), opacity: 0.6, - time: 400 + time: 400, }, 'linear', 'fade'); scene.showEffect('icicle', { x: attacker.x, @@ -13403,13 +13387,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.2, - time: 200 + time: 200, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(20), opacity: 0.6, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('icicle', { x: attacker.x, @@ -13417,16 +13401,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.2, - time: 300 + time: 300, }, { x: defender.x, y: defender.y - 5, z: defender.behind(20), opacity: 0.6, - time: 700 + time: 700, }, 'linear', 'fade'); } - } + }, }, ancientpower: { anim(scene, [attacker, defender]) { @@ -13435,44 +13419,44 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.2, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x + 50, y: defender.y + 20, z: defender.behind(20), opacity: 0.6, scale: 0.7, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('rock3', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.2, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x + 40, y: defender.y - 30, z: defender.behind(20), opacity: 0.6, scale: 0.7, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('rock3', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.2, - opacity: 0.7 + opacity: 0.7, }, { x: defender.x - 50, y: defender.y + 5, z: defender.behind(20), opacity: 0.6, scale: 0.8, - time: 400 + time: 400, }, 'linear', 'explode'); - } + }, }, powergem: { anim(scene, [attacker, defender]) { @@ -13481,13 +13465,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 45, z: attacker.z, scale: 0.4, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(5), opacity: 0.3, - time: 300 + time: 300, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x - 45, @@ -13495,13 +13479,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.2, - time: 100 + time: 100, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(5), opacity: 0.3, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x + 45, @@ -13509,13 +13493,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.2, - time: 200 + time: 200, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(5), opacity: 0.3, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('shine', { @@ -13523,13 +13507,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 45, z: attacker.z, scale: 0.4, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(5), opacity: 0.3, - time: 300 + time: 300, }, 'linear', 'explode'); scene.showEffect('shine', { x: attacker.x - 45, @@ -13537,13 +13521,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.2, - time: 100 + time: 100, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(5), opacity: 0.3, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('shine', { x: attacker.x + 45, @@ -13551,13 +13535,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.2, - time: 200 + time: 200, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(5), opacity: 0.3, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('iceball', { @@ -13566,11 +13550,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.5, - time: 300 + time: 300, }, { scale: 2, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('iceball', { x: defender.x + 15, @@ -13578,11 +13562,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.5, - time: 400 + time: 400, }, { scale: 2, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('iceball', { x: defender.x, @@ -13590,36 +13574,36 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.5, - time: 500 + time: 500, }, { scale: 2, opacity: 0, - time: 800 + time: 800, }, 'linear'); defender.delay(325); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 150 + time: 150, }, 'swing'); - } + }, }, chargebeam: { anim(scene, [attacker, defender]) { @@ -13628,13 +13612,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x, y: defender.y, z: defender.behind(20), opacity: 0.6, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -13642,13 +13626,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.2, - time: 50 + time: 50, }, { x: defender.x + 10, y: defender.y - 5, z: defender.behind(20), opacity: 0.6, - time: 250 + time: 250, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -13656,13 +13640,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.2, - time: 100 + time: 100, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(20), opacity: 0.6, - time: 300 + time: 300, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -13670,15 +13654,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.2, - time: 150 + time: 150, }, { x: defender.x, y: defender.y - 5, z: defender.behind(20), opacity: 0.6, - time: 350 + time: 350, }, 'linear', 'explode'); - } + }, }, psybeam: { anim(scene, [attacker, defender]) { @@ -13687,13 +13671,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x, y: defender.y, z: defender.behind(20), opacity: 0.6, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -13701,13 +13685,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.2, - time: 50 + time: 50, }, { x: defender.x + 10, y: defender.y - 5, z: defender.behind(20), opacity: 0.6, - time: 250 + time: 250, }, 'linear', 'explode'); scene.showEffect('mistball', { x: attacker.x, @@ -13715,13 +13699,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.2, - time: 100 + time: 100, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(20), opacity: 0.6, - time: 300 + time: 300, }, 'linear', 'explode'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -13729,15 +13713,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.2, - time: 150 + time: 150, }, { x: defender.x, y: defender.y - 5, z: defender.behind(20), opacity: 0.6, - time: 350 + time: 350, }, 'linear', 'explode'); - } + }, }, flamethrower: { anim(scene, [attacker, defender]) { @@ -13746,13 +13730,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.7 + opacity: 0.7, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.6, - time: 400 + time: 400, }, 'decel', 'explode'); scene.showEffect('fireball', { x: attacker.x, @@ -13760,13 +13744,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.7, - time: 100 + time: 100, }, { x: defender.x + 10, y: defender.y - 5, z: defender.behind(0), opacity: 0.6, - time: 500 + time: 500, }, 'decel', 'explode'); scene.showEffect('fireball', { x: attacker.x, @@ -13774,13 +13758,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.7, - time: 200 + time: 200, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(0), opacity: 0.6, - time: 600 + time: 600, }, 'decel', 'explode'); scene.showEffect('fireball', { x: attacker.x, @@ -13788,15 +13772,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.7, - time: 300 + time: 300, }, { x: defender.x, y: defender.y - 5, z: defender.behind(0), opacity: 0.6, - time: 700 + time: 700, }, 'decel', 'explode'); - } + }, }, toxic: { anim(scene, [attacker, defender]) { @@ -13805,16 +13789,16 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0 + opacity: 0, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.6, opacity: 1, - time: 400 + time: 400, }, 'ballistic', 'explode'); - } + }, }, sludge: { anim(scene, [attacker, defender]) { @@ -13823,14 +13807,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0 + opacity: 0, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.7, opacity: 1, - time: 400 + time: 400, }, 'ballistic', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -13838,14 +13822,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0, - time: 100 + time: 100, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.7, opacity: 1, - time: 500 + time: 500, }, 'ballistic', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -13853,16 +13837,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0, - time: 200 + time: 200, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.7, opacity: 1, - time: 600 + time: 600, }, 'ballistic', 'fade'); - } + }, }, sludgewave: { anim(scene, [attacker, ...defenders]) { @@ -13870,24 +13854,24 @@ const BattleMoveAnims: AnimTable = { defender.delay(125); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); } @@ -13898,41 +13882,41 @@ const BattleMoveAnims: AnimTable = { y: attacker.y - 25, z: attacker.z, scale: 0.3, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x, y: defender.y + 10, z: defender.behind(50), scale: 2, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); scene.showEffect('poisonwisp', { x: attacker.x - 30, y: attacker.y - 25, z: attacker.z, scale: 0.3, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x - 60, y: defender.y, z: defender.behind(50), scale: 2, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); scene.showEffect('poisonwisp', { x: attacker.x + 30, y: attacker.y - 25, z: attacker.z, scale: 0.3, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x + 60, y: defender.y, z: defender.behind(50), scale: 2, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); - } + }, }, smokescreen: { anim(scene, [attacker, defender]) { @@ -13941,14 +13925,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0 + opacity: 0, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.7, opacity: 1, - time: 400 + time: 400, }, 'ballistic', 'explode'); scene.showEffect('blackwisp', { x: attacker.x, @@ -13956,14 +13940,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0, - time: 100 + time: 100, }, { x: defender.x + 40, y: defender.y - 20, z: defender.z, scale: 0.7, opacity: 1, - time: 500 + time: 500, }, 'ballistic', 'explode'); scene.showEffect('blackwisp', { x: attacker.x, @@ -13971,16 +13955,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0, - time: 200 + time: 200, }, { x: defender.x - 30, y: defender.y - 10, z: defender.z, scale: 0.7, opacity: 1, - time: 600 + time: 600, }, 'ballistic', 'explode'); - } + }, }, sludgebomb: { anim(scene, [attacker, defender]) { @@ -13989,14 +13973,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0 + opacity: 0, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.7, opacity: 1, - time: 400 + time: 400, }, 'ballistic', 'explode'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -14004,14 +13988,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0, - time: 100 + time: 100, }, { x: defender.x + 40, y: defender.y - 20, z: defender.z, scale: 0.7, opacity: 1, - time: 500 + time: 500, }, 'ballistic', 'explode'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -14019,16 +14003,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0, - time: 200 + time: 200, }, { x: defender.x - 30, y: defender.y - 10, z: defender.z, scale: 0.7, opacity: 1, - time: 600 + time: 600, }, 'ballistic', 'explode'); - } + }, }, mudbomb: { anim(scene, [attacker, defender]) { @@ -14037,14 +14021,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0 + opacity: 0, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.7, opacity: 1, - time: 400 + time: 400, }, 'ballistic', 'explode'); scene.showEffect('mudwisp', { x: attacker.x, @@ -14052,14 +14036,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0, - time: 100 + time: 100, }, { x: defender.x + 40, y: defender.y - 20, z: defender.z, scale: 0.7, opacity: 1, - time: 500 + time: 500, }, 'ballistic', 'explode'); scene.showEffect('mudwisp', { x: attacker.x, @@ -14067,16 +14051,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0, - time: 200 + time: 200, }, { x: defender.x - 30, y: defender.y - 10, z: defender.z, scale: 0.7, opacity: 1, - time: 600 + time: 600, }, 'ballistic', 'explode'); - } + }, }, magnetbomb: { anim(scene, [attacker, defender]) { @@ -14085,14 +14069,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0 + opacity: 0, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.7, opacity: 1, - time: 400 + time: 400, }, 'ballistic', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -14100,14 +14084,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0, - time: 100 + time: 100, }, { x: defender.x + 40, y: defender.y - 20, z: defender.z, scale: 0.7, opacity: 1, - time: 500 + time: 500, }, 'ballistic', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -14115,16 +14099,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0, - time: 200 + time: 200, }, { x: defender.x - 30, y: defender.y - 10, z: defender.z, scale: 0.7, opacity: 1, - time: 600 + time: 600, }, 'ballistic', 'explode'); - } + }, }, seedbomb: { anim(scene, [attacker, defender]) { @@ -14133,14 +14117,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0 + opacity: 0, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.7, opacity: 1, - time: 400 + time: 400, }, 'ballistic', 'explode'); scene.showEffect('energyball', { x: attacker.x, @@ -14148,14 +14132,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0, - time: 100 + time: 100, }, { x: defender.x + 40, y: defender.y - 20, z: defender.z, scale: 0.7, opacity: 1, - time: 500 + time: 500, }, 'ballistic', 'explode'); scene.showEffect('energyball', { x: attacker.x, @@ -14163,16 +14147,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0, - time: 200 + time: 200, }, { x: defender.x - 30, y: defender.y - 10, z: defender.z, scale: 0.7, opacity: 1, - time: 600 + time: 600, }, 'ballistic', 'explode'); - } + }, }, willowisp: { anim(scene, [attacker, defender]) { @@ -14181,14 +14165,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0 + opacity: 0, }, { x: defender.leftof(40), y: defender.y + 15, z: defender.z, scale: 0.8, opacity: 0.7, - time: 500 + time: 500, }, 'decel', 'fade'); if (defender.isMissedPokemon) return; scene.showEffect('bluefireball', { @@ -14197,14 +14181,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.8, opacity: 0.7, - time: 500 + time: 500, }, { x: defender.leftof(-40), y: defender.y, z: defender.z, scale: 0.7, opacity: 1, - time: 700 + time: 700, }, 'swing', 'fade'); scene.showEffect('bluefireball', { x: defender.leftof(-40), @@ -14212,16 +14196,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0, - time: 700 + time: 700, }, { x: defender.leftof(10), y: defender.y - 15, z: defender.z, scale: 0.7, opacity: 1, - time: 900 + time: 900, }, 'swing', 'explode'); - } + }, }, confuseray: { anim(scene, [attacker, defender]) { @@ -14230,14 +14214,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.15, - opacity: 0 + opacity: 0, }, { x: defender.leftof(40), y: defender.y + 15, z: defender.z, scale: 0.3, opacity: 0.7, - time: 500 + time: 500, }, 'decel', 'fade'); if (defender.isMissedPokemon) return; scene.showEffect('electroball', { @@ -14245,14 +14229,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.15, - opacity: 0 + opacity: 0, }, { x: defender.leftof(40), y: defender.y + 15, z: defender.z, scale: 0.3, opacity: 0.7, - time: 500 + time: 500, }, 'decel', 'fade'); scene.showEffect('electroball', { x: defender.leftof(40), @@ -14260,14 +14244,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.3, opacity: 0.7, - time: 500 + time: 500, }, { x: defender.leftof(-40), y: defender.y, z: defender.z, scale: 0.2, opacity: 1, - time: 700 + time: 700, }, 'swing', 'fade'); scene.showEffect('electroball', { x: defender.leftof(-40), @@ -14275,16 +14259,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0, - time: 700 + time: 700, }, { x: defender.leftof(10), y: defender.y - 15, z: defender.z, scale: 0.5, opacity: 1, - time: 900 + time: 900, }, 'swing', 'explode'); - } + }, }, lovelykiss: { anim(scene, [attacker, defender]) { @@ -14293,14 +14277,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.6, - opacity: 0 + opacity: 0, }, { x: defender.leftof(40), y: defender.y + 15, z: defender.z, scale: 0.7, opacity: 0.7, - time: 500 + time: 500, }, 'decel', 'fade'); if (defender.isMissedPokemon) return; scene.showEffect('heart', { @@ -14309,14 +14293,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.7, opacity: 0.7, - time: 500 + time: 500, }, { x: defender.leftof(-40), y: defender.y, z: defender.z, scale: 0.6, opacity: 1, - time: 700 + time: 700, }, 'swing', 'fade'); scene.showEffect('heart', { x: defender.leftof(-40), @@ -14324,16 +14308,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.7, opacity: 0, - time: 700 + time: 700, }, { x: defender.leftof(10), y: defender.y - 15, z: defender.z, scale: 1, opacity: 1, - time: 900 + time: 900, }, 'swing', 'explode'); - } + }, }, rockwrecker: { anim(scene, [attacker, defender]) { @@ -14343,12 +14327,12 @@ const BattleMoveAnims: AnimTable = { y: attacker.y - 20, z: attacker.z, scale: 1, - opacity: 0.6 + opacity: 0.6, }, { x: attacker.x, y: attacker.y + 20, opacity: 0, - time: 350 + time: 350, }, 'decel'); scene.showEffect('rock3', { x: attacker.x, @@ -14356,14 +14340,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.4, - time: 350 + time: 350, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1.2, opacity: 1, - time: 550 + time: 550, }, 'linear', 'explode'); scene.showEffect('rock3', { x: attacker.x, @@ -14371,25 +14355,25 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.2, - time: 400 + time: 400, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1.2, opacity: 0.2, - time: 600 + time: 600, }, 'linear', 'explode'); defender.delay(600); defender.anim({ z: defender.behind(20), - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, stoneedge: { anim(scene, [attacker, defender]) { @@ -14397,62 +14381,62 @@ const BattleMoveAnims: AnimTable = { x: defender.x + 15, y: defender.y - 50, z: defender.z, - scale: 0.5 + scale: 0.5, }, { y: defender.y + 60, yscale: 1, opacity: 0, - time: 350 + time: 350, }, 'accel'); scene.showEffect('rock3', { x: defender.x + 30, y: defender.y - 50, z: defender.z, scale: 0.5, - time: 150 + time: 150, }, { y: defender.y + 60, yscale: 1, opacity: 0, - time: 500 + time: 500, }, 'accel'); scene.showEffect('rock3', { x: defender.x - 30, y: defender.y - 50, z: defender.z, scale: 0.5, - time: 300 + time: 300, }, { y: defender.y + 60, yscale: 1, opacity: 0, - time: 650 + time: 650, }, 'accel'); scene.showEffect('rock3', { x: defender.x, y: defender.y - 50, z: defender.z, scale: 0.5, - time: 400 + time: 400, }, { y: defender.y + 60, yscale: 1, opacity: 0, - time: 750 + time: 750, }, 'accel'); scene.showEffect('rock3', { x: defender.x - 15, y: defender.y - 50, z: defender.z, scale: 0.5, - time: 500 + time: 500, }, { y: defender.y + 60, yscale: 1, opacity: 0, - time: 850 + time: 850, }, 'accel'); - } + }, }, rockslide: { anim(scene, [attacker, ...defenders]) { @@ -14461,19 +14445,19 @@ const BattleMoveAnims: AnimTable = { defender.anim({ y: defender.y - 7, yscale: 0.9, - time: 100 + time: 100, }, 'decel'); defender.anim({ - time: 200 + time: 200, }); defender.delay(200); defender.anim({ y: defender.y - 7, yscale: 0.9, - time: 100 + time: 100, }, 'decel'); defender.anim({ - time: 200 + time: 200, }); scene.showEffect('rock1', { @@ -14481,11 +14465,11 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 100, z: defender.z, opacity: 0, - scale: 0.5 + scale: 0.5, }, { y: defender.y - 30, opacity: 1, - time: 300 + time: 300, }, 'accel', 'explode'); scene.showEffect('rock2', { x: defender.x + 30, @@ -14493,11 +14477,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0, scale: 0.5, - time: 100 + time: 100, }, { y: defender.y - 30, opacity: 1, - time: 400 + time: 400, }, 'accel', 'explode'); scene.showEffect('rock1', { x: defender.x - 30, @@ -14505,11 +14489,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0, scale: 0.5, - time: 200 + time: 200, }, { y: defender.y - 30, opacity: 1, - time: 500 + time: 500, }, 'accel', 'explode'); scene.showEffect('rock2', { x: defender.x, @@ -14517,11 +14501,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0, scale: 0.5, - time: 300 + time: 300, }, { y: defender.y - 30, opacity: 1, - time: 600 + time: 600, }, 'accel', 'explode'); scene.showEffect('rock1', { x: defender.x - 15, @@ -14529,11 +14513,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0, scale: 0.5, - time: 400 + time: 400, }, { y: defender.y - 30, opacity: 1, - time: 700 + time: 700, }, 'accel', 'explode'); scene.showEffect('mudwisp', { @@ -14542,10 +14526,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.4, - time: 300 + time: 300, }, { scale: 2, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('mudwisp', { x: defender.x - 40, @@ -14553,10 +14537,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.4, - time: 450 + time: 450, }, { scale: 2, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('mudwisp', { x: defender.x + 10, @@ -14564,13 +14548,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.4, - time: 600 + time: 600, }, { scale: 2, - opacity: 0 + opacity: 0, }, 'decel'); } - } + }, }, avalanche: { anim(scene, [attacker, defender]) { @@ -14578,19 +14562,19 @@ const BattleMoveAnims: AnimTable = { defender.anim({ y: defender.y - 7, yscale: 0.9, - time: 100 + time: 100, }, 'decel'); defender.anim({ - time: 200 + time: 200, }); defender.delay(200); defender.anim({ y: defender.y - 7, yscale: 0.9, - time: 100 + time: 100, }, 'decel'); defender.anim({ - time: 200 + time: 200, }); scene.showEffect('wisp', { @@ -14598,11 +14582,11 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 100, z: defender.z, opacity: 0, - scale: 0.8 + scale: 0.8, }, { y: defender.y - 30, opacity: 1, - time: 300 + time: 300, }, 'accel', 'explode'); scene.showEffect('wisp', { x: defender.x + 30, @@ -14610,11 +14594,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0, scale: 0.8, - time: 100 + time: 100, }, { y: defender.y - 30, opacity: 1, - time: 400 + time: 400, }, 'accel', 'explode'); scene.showEffect('wisp', { x: defender.x - 30, @@ -14622,11 +14606,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0, scale: 0.8, - time: 200 + time: 200, }, { y: defender.y - 30, opacity: 1, - time: 500 + time: 500, }, 'accel', 'explode'); scene.showEffect('wisp', { x: defender.x, @@ -14634,11 +14618,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0, scale: 0.8, - time: 300 + time: 300, }, { y: defender.y - 30, opacity: 1, - time: 600 + time: 600, }, 'accel', 'explode'); scene.showEffect('wisp', { x: defender.x - 15, @@ -14646,11 +14630,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0, scale: 0.8, - time: 400 + time: 400, }, { y: defender.y - 30, opacity: 1, - time: 700 + time: 700, }, 'accel', 'explode'); scene.showEffect('wisp', { @@ -14659,10 +14643,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.4, - time: 300 + time: 300, }, { scale: 2, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('wisp', { x: defender.x - 40, @@ -14670,10 +14654,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.4, - time: 450 + time: 450, }, { scale: 2, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('wisp', { x: defender.x + 10, @@ -14681,12 +14665,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.4, - time: 600 + time: 600, }, { scale: 2, - opacity: 0 + opacity: 0, }, 'decel'); - } + }, }, thousandarrows: { anim(scene, [attacker, ...defenders]) { @@ -14694,30 +14678,30 @@ const BattleMoveAnims: AnimTable = { defender.delay(425); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 100 + time: 100, }, 'accel'); } const defender = defenders[1] || defenders[0]; @@ -14728,21 +14712,21 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.5 + opacity: 0.5, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('wisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.5 + opacity: 0.5, }, { scale: 3, opacity: 0.3, - time: 600 + time: 600, }, 'decel', 'fade'); scene.showEffect('energyball', { @@ -14751,14 +14735,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.4, - time: 0 + time: 0, }, { x: attacker.x + 30, y: attacker.y + 200, z: attacker.z, scale: 0.2, opacity: 0, - time: 300 + time: 300, }, 'decel'); scene.showEffect('energyball', { x: attacker.x, @@ -14766,14 +14750,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.4, - time: 50 + time: 50, }, { x: attacker.x - 30, y: attacker.y + 200, z: attacker.z, scale: 0.2, opacity: 0, - time: 350 + time: 350, }, 'decel'); scene.showEffect('energyball', { x: attacker.x, @@ -14781,14 +14765,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.4, - time: 100 + time: 100, }, { x: attacker.x - 10, y: attacker.y + 200, z: attacker.z, scale: 0.2, opacity: 0, - time: 400 + time: 400, }, 'decel'); scene.showEffect('energyball', { x: attacker.x, @@ -14796,14 +14780,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.4, - time: 150 + time: 150, }, { x: attacker.x + 10, y: attacker.y + 200, z: attacker.z, scale: 0.2, opacity: 0, - time: 450 + time: 450, }, 'decel'); scene.showEffect('energyball', { x: attacker.x, @@ -14811,14 +14795,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.4, - time: 175 + time: 175, }, { x: attacker.x + 35, y: attacker.y + 200, z: attacker.z, scale: 0.2, opacity: 0, - time: 500 + time: 500, }, 'decel', 'fade'); scene.showEffect('energyball', { x: attacker.x, @@ -14826,14 +14810,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.4, - time: 200 + time: 200, }, { x: attacker.x, y: attacker.y + 200, z: attacker.behind(-10), scale: 0.2, opacity: 0, - time: 550 + time: 550, }, 'decel', 'fade'); scene.showEffect('energyball', { @@ -14843,11 +14827,11 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 375 + time: 375, }, { y: defender.y + 150, opacity: 0, - time: 675 + time: 675, }, 'decel'); scene.showEffect('energyball', { x: defender.x - 20, @@ -14856,12 +14840,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 390 + time: 390, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 675 + time: 675, }, 'linear'); scene.showEffect('energyball', { @@ -14871,11 +14855,11 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 525 + time: 525, }, { y: defender.y + 150, opacity: 0, - time: 800 + time: 800, }, 'decel'); scene.showEffect('energyball', { x: defender.x + 40, @@ -14884,12 +14868,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 540 + time: 540, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('energyball', { @@ -14899,12 +14883,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 575 + time: 575, }, { y: defender.y + 150, z: defender.behind(-10), opacity: 0, - time: 825 + time: 825, }, 'decel'); scene.showEffect('energyball', { x: defender.x - 70, @@ -14913,12 +14897,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 590 + time: 590, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 825 + time: 825, }, 'linear'); scene.showEffect('energyball', { @@ -14928,11 +14912,11 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 650 + time: 650, }, { y: defender.y + 150, opacity: 0, - time: 950 + time: 950, }, 'decel'); scene.showEffect('energyball', { x: defender.x + 70, @@ -14941,12 +14925,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 665 + time: 665, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 950 + time: 950, }, 'linear'); scene.showEffect('energyball', { @@ -14956,11 +14940,11 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 700 + time: 700, }, { y: defender.y + 150, opacity: 0, - time: 1000 + time: 1000, }, 'decel'); scene.showEffect('energyball', { x: defender.x, @@ -14969,12 +14953,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 720 + time: 720, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 1000 + time: 1000, }, 'linear'); scene.showEffect('energyball', { @@ -14984,11 +14968,11 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 725 + time: 725, }, { y: defender.y + 150, opacity: 0, - time: 1025 + time: 1025, }, 'decel'); scene.showEffect('energyball', { x: defender.x, @@ -14997,14 +14981,14 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 740 + time: 740, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 1025 + time: 1025, }, 'linear'); - } + }, }, thousandwaves: { anim(scene, [attacker, ...defenders]) { @@ -15012,24 +14996,24 @@ const BattleMoveAnims: AnimTable = { defender.delay(825); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); } const defender = defenders[1] || defenders[0]; @@ -15041,21 +15025,21 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.5 + opacity: 0.5, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('wisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.5 + opacity: 0.5, }, { scale: 3, opacity: 0.3, - time: 600 + time: 600, }, 'decel', 'fade'); scene.showEffect('energyball', { @@ -15063,82 +15047,82 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.behind(-30), scale: 0, - opacity: 0 + opacity: 0, }, { y: attacker.y - 50, scale: 0.1, yscale: 0.4, opacity: 0.3, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('energyball', { x: attacker.x, y: attacker.y, z: attacker.behind(-30), scale: 0, - opacity: 0 + opacity: 0, }, { y: attacker.y + 50, scale: 0.1, yscale: 0.4, opacity: 0.5, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('energyball', { x: attacker.x, y: attacker.y, z: attacker.behind(-30), scale: 0, - opacity: 0 + opacity: 0, }, { x: attacker.x - 35, y: attacker.y + 30, scale: 0.1, yscale: 0.4, opacity: 0.6, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('energyball', { x: attacker.x, y: attacker.y, z: attacker.behind(-30), scale: 0, - opacity: 0 + opacity: 0, }, { x: attacker.x + 35, y: attacker.y + 30, scale: 0.1, yscale: 0.4, opacity: 0.4, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('energyball', { x: attacker.x, y: attacker.y, z: attacker.behind(-30), scale: 0, - opacity: 0 + opacity: 0, }, { x: attacker.x - 35, y: attacker.y - 30, scale: 0.1, yscale: 0.4, opacity: 1, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('energyball', { x: attacker.x, y: attacker.y, z: attacker.behind(-30), scale: 0, - opacity: 0 + opacity: 0, }, { x: attacker.x + 35, y: attacker.y - 30, scale: 0.1, yscale: 0.4, opacity: 1, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('energyball', { @@ -15148,7 +15132,7 @@ const BattleMoveAnims: AnimTable = { scale: 0.1, yscale: 0.4, opacity: 1, - time: 400 + time: 400, }, { x: attacker.x - 5, y: attacker.y - 25, @@ -15156,7 +15140,7 @@ const BattleMoveAnims: AnimTable = { scale: 0.2, yscale: 0.3, opacity: 0, - time: 600 + time: 600, }, 'ballistic', 'fade'); scene.showEffect('energyball', { x: attacker.x, @@ -15165,7 +15149,7 @@ const BattleMoveAnims: AnimTable = { scale: 0.1, yscale: 0.4, opacity: 1, - time: 400 + time: 400, }, { x: attacker.x - 5, y: attacker.y - 25, @@ -15173,7 +15157,7 @@ const BattleMoveAnims: AnimTable = { scale: 0.2, yscale: 0.3, opacity: 0, - time: 620 + time: 620, }, 'ballistic', 'fade'); scene.showEffect('energyball', { x: attacker.x - 35, @@ -15182,7 +15166,7 @@ const BattleMoveAnims: AnimTable = { scale: 0.1, yscale: 0.4, opacity: 1, - time: 400 + time: 400, }, { x: attacker.x - 5, y: attacker.y - 25, @@ -15190,7 +15174,7 @@ const BattleMoveAnims: AnimTable = { scale: 0.2, yscale: 0.3, opacity: 0, - time: 600 + time: 600, }, 'ballistic', 'fade'); scene.showEffect('energyball', { x: attacker.x + 35, @@ -15199,7 +15183,7 @@ const BattleMoveAnims: AnimTable = { scale: 0.1, yscale: 0.4, opacity: 1, - time: 400 + time: 400, }, { x: attacker.x - 5, y: attacker.y - 25, @@ -15207,7 +15191,7 @@ const BattleMoveAnims: AnimTable = { scale: 0.2, yscale: 0.3, opacity: 0, - time: 630 + time: 630, }, 'ballistic', 'fade'); scene.showEffect('energyball', { x: attacker.x - 35, @@ -15216,7 +15200,7 @@ const BattleMoveAnims: AnimTable = { scale: 0.1, yscale: 0.4, opacity: 1, - time: 400 + time: 400, }, { x: attacker.x - 5, y: attacker.y - 25, @@ -15224,7 +15208,7 @@ const BattleMoveAnims: AnimTable = { scale: 0.2, yscale: 0.3, opacity: 0, - time: 640 + time: 640, }, 'ballistic', 'fade'); scene.showEffect('energyball', { x: attacker.x + 35, @@ -15233,7 +15217,7 @@ const BattleMoveAnims: AnimTable = { scale: 0.1, yscale: 0.5, opacity: 1, - time: 400 + time: 400, }, { x: attacker.x - 5, y: attacker.y - 25, @@ -15241,7 +15225,7 @@ const BattleMoveAnims: AnimTable = { scale: 0.2, yscale: 0.4, opacity: 0, - time: 600 + time: 600, }, 'ballistic', 'fade'); scene.showEffect('wisp', { @@ -15250,13 +15234,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-70), scale: 0.7, opacity: 0.3, - time: 600 + time: 600, }, { x: defender.x, y: defender.y - 10, z: defender.behind(30), scale: 1.3, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); scene.showEffect('wisp', { x: attacker.x - 5, @@ -15264,13 +15248,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-70), scale: 0.7, opacity: 0.3, - time: 600 + time: 600, }, { x: defender.x - 80, y: defender.y - 10, z: defender.behind(30), scale: 1.3, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); scene.showEffect('wisp', { x: attacker.x + 5, @@ -15278,13 +15262,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-70), scale: 0.7, opacity: 0.3, - time: 600 + time: 600, }, { x: defender.x + 55, y: defender.y - 10, z: defender.behind(30), scale: 1.3, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); scene.showEffect('energyball', { @@ -15294,25 +15278,25 @@ const BattleMoveAnims: AnimTable = { scale: 1.5, xscale: 6, opacity: 0.1, - time: 900 + time: 900, }, { scale: 1, xscale: 3, opacity: 0.6, - time: 1200 + time: 1200, }, 'linear', 'fade'); attacker.anim({ y: attacker.y - 40, scale: 0, opacity: 0, - time: 300 + time: 300, }, 'linear'); attacker.delay(900); attacker.anim({ - time: 300 + time: 300, }, 'linear'); - } + }, }, iciclecrash: { anim(scene, [attacker, defender]) { @@ -15321,12 +15305,12 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 70, z: defender.z, opacity: 0, - scale: 1 + scale: 1, }, { y: defender.y - 20, opacity: 1, xscale: 2, - time: 300 + time: 300, }, 'linear', 'explode'); scene.showEffect('icicle', { x: defender.x + 30, @@ -15334,12 +15318,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0, scale: 1, - time: 100 + time: 100, }, { y: defender.y - 20, opacity: 1, xscale: 2, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('icicle', { x: defender.x - 30, @@ -15347,12 +15331,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0, scale: 1, - time: 200 + time: 200, }, { y: defender.y - 20, opacity: 1, xscale: 2, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('icicle', { x: defender.x, @@ -15360,12 +15344,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0, scale: 1, - time: 300 + time: 300, }, { y: defender.y - 20, opacity: 1, xscale: 2, - time: 600 + time: 600, }, 'linear', 'explode'); scene.showEffect('icicle', { x: defender.x - 15, @@ -15373,14 +15357,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0, scale: 1, - time: 400 + time: 400, }, { y: defender.y - 20, opacity: 1, xscale: 2, - time: 700 + time: 700, }, 'linear', 'explode'); - } + }, }, spore: { anim(scene, [attacker, defender]) { @@ -15389,11 +15373,11 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 90, z: defender.z, opacity: 0, - scale: 0.4 + scale: 0.4, }, { y: defender.y - 5, opacity: 1, - time: 500 + time: 500, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: defender.x + 30, @@ -15401,11 +15385,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0, scale: 0.4, - time: 150 + time: 150, }, { y: defender.y - 5, opacity: 1, - time: 650 + time: 650, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: defender.x - 30, @@ -15413,13 +15397,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0, scale: 0.4, - time: 300 + time: 300, }, { y: defender.y - 5, opacity: 1, - time: 800 + time: 800, }, 'decel', 'fade'); - } + }, }, fireblast: { anim(scene, [attacker, defender]) { @@ -15430,14 +15414,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2, opacity: 1, - time: 500 + time: 500, }, 'linear', 'fade'); scene.showEffect('fireball', { x: attacker.x, @@ -15445,14 +15429,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.2, - time: 50 + time: 50, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2, opacity: 1, - time: 550 + time: 550, }, 'linear', 'fade'); scene.showEffect('fireball', { x: defender.x, @@ -15460,13 +15444,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 2, opacity: 1, - time: 500 + time: 500, }, { x: defender.x, y: defender.y + 100, scale: 3, opacity: 0, - time: 1100 + time: 1100, }, 'linear', 'fade'); scene.showEffect('fireball', { x: defender.x, @@ -15474,13 +15458,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 2, opacity: 1, - time: 500 + time: 500, }, { x: defender.x - 60, y: defender.y - 80, scale: 3, opacity: 0, - time: 1100 + time: 1100, }, 'linear', 'fade'); scene.showEffect('fireball', { x: defender.x, @@ -15488,13 +15472,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 2, opacity: 1, - time: 500 + time: 500, }, { x: defender.x + 60, y: defender.y - 80, scale: 3, opacity: 0, - time: 1100 + time: 1100, }, 'linear', 'fade'); scene.showEffect('fireball', { x: defender.x, @@ -15502,13 +15486,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 2, opacity: 1, - time: 500 + time: 500, }, { x: defender.x - 90, y: defender.y + 40, scale: 3, opacity: 0, - time: 1100 + time: 1100, }, 'linear', 'fade'); scene.showEffect('fireball', { x: defender.x, @@ -15516,24 +15500,24 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 2, opacity: 1, - time: 500 + time: 500, }, { x: defender.x + 90, y: defender.y + 40, scale: 3, opacity: 0, - time: 1100 + time: 1100, }, 'linear', 'fade'); defender.delay(500); defender.anim({ z: defender.behind(10), - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, judgment: { anim(scene, [attacker, defender]) { @@ -15543,13 +15527,13 @@ const BattleMoveAnims: AnimTable = { y: defender.y, z: defender.z, scale: 0.5, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x, y: defender.y, scale: 1, opacity: 1, - time: 250 + time: 250, }, 'decel', 'fade'); scene.showEffect('wisp', { x: defender.x + 70, @@ -15557,13 +15541,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.2, - time: 100 + time: 100, }, { x: defender.x, y: defender.y, scale: 1, opacity: 1, - time: 350 + time: 350, }, 'decel', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -15571,13 +15555,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.2, - time: 200 + time: 200, }, { x: defender.x, y: defender.y, scale: 1, opacity: 1, - time: 450 + time: 450, }, 'decel', 'fade'); scene.showEffect('wisp', { @@ -15586,13 +15570,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 450 + time: 450, }, { x: defender.x, y: defender.y - 100, scale: 0.9, opacity: 0, - time: 950 + time: 950, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -15600,13 +15584,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 450 + time: 450, }, { x: defender.x - 60, y: defender.y + 80, scale: 0.9, opacity: 0, - time: 950 + time: 950, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -15614,13 +15598,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 450 + time: 450, }, { x: defender.x + 60, y: defender.y + 80, scale: 0.9, opacity: 0, - time: 950 + time: 950, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -15628,13 +15612,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 450 + time: 450, }, { x: defender.x - 90, y: defender.y - 40, scale: 0.9, opacity: 0, - time: 950 + time: 950, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -15642,24 +15626,24 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 450 + time: 450, }, { x: defender.x + 90, y: defender.y - 40, scale: 0.9, opacity: 0, - time: 950 + time: 950, }, 'linear', 'fade'); defender.delay(450); defender.anim({ z: defender.behind(10), - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, psystrike: { anim(scene, [attacker, defender]) { @@ -15669,13 +15653,13 @@ const BattleMoveAnims: AnimTable = { y: defender.y, z: defender.z, scale: 0.5, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x, y: defender.y, scale: 1, opacity: 1, - time: 250 + time: 250, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: defender.x + 70, @@ -15683,13 +15667,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.2, - time: 100 + time: 100, }, { x: defender.x, y: defender.y, scale: 1, opacity: 1, - time: 350 + time: 350, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: defender.x, @@ -15697,13 +15681,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.2, - time: 200 + time: 200, }, { x: defender.x, y: defender.y, scale: 1, opacity: 1, - time: 450 + time: 450, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { @@ -15712,13 +15696,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 450 + time: 450, }, { x: defender.x, y: defender.y - 100, scale: 0.9, opacity: 0, - time: 950 + time: 950, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x, @@ -15726,13 +15710,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 450 + time: 450, }, { x: defender.x - 60, y: defender.y + 80, scale: 0.9, opacity: 0, - time: 950 + time: 950, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x, @@ -15740,13 +15724,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 450 + time: 450, }, { x: defender.x + 60, y: defender.y + 80, scale: 0.9, opacity: 0, - time: 950 + time: 950, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x, @@ -15754,13 +15738,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 450 + time: 450, }, { x: defender.x - 90, y: defender.y - 40, scale: 0.9, opacity: 0, - time: 950 + time: 950, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x, @@ -15768,24 +15752,24 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 450 + time: 450, }, { x: defender.x + 90, y: defender.y - 40, scale: 0.9, opacity: 0, - time: 950 + time: 950, }, 'linear', 'fade'); defender.delay(450); defender.anim({ z: defender.behind(10), - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, shadowball: { anim(scene, [attacker, defender]) { @@ -15796,13 +15780,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0.5, opacity: 0, - time: 0 + time: 0, }, { x: attacker.x, y: attacker.y, scale: 1, opacity: 0.8, - time: 200 + time: 200, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x - 60, @@ -15810,13 +15794,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0.5, opacity: 0, - time: 50 + time: 50, }, { x: attacker.x, y: attacker.y, scale: 1, opacity: 0.8, - time: 300 + time: 300, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x + 60, @@ -15824,13 +15808,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0.5, opacity: 0, - time: 100 + time: 100, }, { x: attacker.x, y: attacker.y, scale: 1, opacity: 0.8, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x - 90, @@ -15838,13 +15822,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0.5, opacity: 0, - time: 150 + time: 150, }, { x: attacker.x, y: attacker.y, scale: 1, opacity: 0.8, - time: 500 + time: 500, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x + 90, @@ -15852,13 +15836,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0.5, opacity: 0, - time: 200 + time: 200, }, { x: attacker.x, y: attacker.y, scale: 1, opacity: 0.8, - time: 600 + time: 600, }, 'decel', 'fade'); scene.showEffect('shadowball', { @@ -15867,11 +15851,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0, opacity: 0, - time: 0 + time: 0, }, { scale: 0.8, opacity: 0.5, - time: 600 + time: 600, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -15879,11 +15863,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0, opacity: 0, - time: 0 + time: 0, }, { scale: 1.5, opacity: 0.8, - time: 600 + time: 600, }, 'decel', 'fade'); scene.showEffect('shadowball', { x: attacker.x, @@ -15891,12 +15875,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0.8, opacity: 0.8, - time: 600 + time: 600, }, { x: defender.x, y: defender.y, z: defender.z, - time: 900 + time: 900, }, 'accel', 'explode'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -15904,24 +15888,24 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 1.5, opacity: 0.8, - time: 600 + time: 600, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2, - time: 900 + time: 900, }, 'accel', 'explode'); defender.delay(900); defender.anim({ z: defender.behind(10), - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, hex: { anim(scene, [attacker, defender]) { @@ -15931,10 +15915,10 @@ const BattleMoveAnims: AnimTable = { y: defender.y, z: defender.z, scale: 0, - opacity: 1 + opacity: 1, }, { scale: 3, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('poisonwisp', { x: defender.x - 40, @@ -15942,10 +15926,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 150 + time: 150, }, { scale: 3, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('poisonwisp', { x: defender.x + 10, @@ -15953,10 +15937,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 300 + time: 300, }, { scale: 3, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('bluefireball', { @@ -15965,11 +15949,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.8, opacity: 0.5, - time: 0 + time: 0, }, { y: defender.y + 60, opacity: 0, - time: 400 + time: 400, }, 'accel'); scene.showEffect('bluefireball', { x: defender.x - 40, @@ -15977,11 +15961,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.8, opacity: 0.5, - time: 200 + time: 200, }, { y: defender.y + 60, opacity: 0, - time: 600 + time: 600, }, 'accel'); scene.showEffect('bluefireball', { x: defender.x, @@ -15989,20 +15973,20 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.8, opacity: 0.5, - time: 400 + time: 400, }, { y: defender.y + 60, opacity: 0, - time: 800 + time: 800, }, 'accel'); - } + }, }, darkpulse: { anim(scene, [attacker, defender]) { - var xf = [1, -1, 1, -1]; - var yf = [1, -1, -1, 1]; - var xf2 = [1, 0, -1, 0]; - var yf2 = [0, 1, 0, -1]; + let xf = [1, -1, 1, -1]; + let yf = [1, -1, -1, 1]; + let xf2 = [1, 0, -1, 0]; + let yf2 = [0, 1, 0, -1]; scene.backgroundEffect('#000000', 900, 0.3); scene.showEffect('shadowball', { @@ -16012,12 +15996,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 5, opacity: 0.8, - time: 0 + time: 0, }, { scale: 2, xscale: 8, opacity: 0.1, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('shadowball', { x: defender.x, @@ -16025,14 +16009,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.3, scale: 0, - time: 300 + time: 300, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('shadowball', { x: defender.x, @@ -16040,46 +16024,46 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.3, scale: 0, - time: 500 + time: 500, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2, opacity: 0, - time: 800 + time: 800, }, 'linear'); - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { scene.showEffect('poisonwisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.3, - opacity: 0.4 + opacity: 0.4, }, { x: attacker.x + 240 * xf[i], y: attacker.y, z: attacker.z + 137 * yf[i], scale: 0.7, opacity: 0.4, - time: 600 + time: 600, }, 'accel', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.2, - opacity: 0.4 + opacity: 0.4, }, { x: attacker.x + 339 * xf2[i], y: attacker.y, z: attacker.z + 194 * yf2[i], scale: 0.5, opacity: 0.4, - time: 600 + time: 600, }, 'accel', 'fade'); } - } + }, }, naturesmadness: { anim(scene, [attacker, defender]) { @@ -16091,12 +16075,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 5, opacity: 0.6, - time: 0 + time: 0, }, { scale: 2, xscale: 8, opacity: 0.1, - time: 300 + time: 300, }, 'linear', 'fade'); scene.showEffect('iceball', { x: defender.x, @@ -16104,11 +16088,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 5, opacity: 0, - time: 200 + time: 200, }, { scale: 0.5, opacity: 0.6, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('iceball', { x: defender.x, @@ -16116,13 +16100,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 5, opacity: 0, - time: 350 + time: 350, }, { scale: 0.5, opacity: 0.2, - time: 800 + time: 800, }, 'linear', 'fade'); - } + }, }, energyball: { anim(scene, [attacker, defender]) { @@ -16131,26 +16115,26 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.8, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.6, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1.5, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('energyball', { x: defender.x + 30, @@ -16158,12 +16142,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 0.6, - time: 400 + time: 400, }, { x: defender.x + 50, y: defender.y + 10, opacity: 0.3, - time: 700 + time: 700, }, 'accel', 'explode'); scene.showEffect('energyball', { x: defender.x - 30, @@ -16171,12 +16155,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 0.6, - time: 500 + time: 500, }, { x: defender.x - 50, y: defender.y - 20, opacity: 0.3, - time: 700 + time: 700, }, 'accel', 'explode'); scene.showEffect('energyball', { x: defender.x + 15, @@ -16184,12 +16168,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 0.7, - time: 600 + time: 600, }, { x: defender.x + 35, y: defender.y + 30, opacity: 0.3, - time: 800 + time: 800, }, 'accel', 'explode'); scene.showEffect('energyball', { x: defender.x - 15, @@ -16197,23 +16181,23 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 0.7, - time: 600 + time: 600, }, { x: defender.x - 35, y: defender.y - 40, opacity: 0.3, - time: 800 + time: 800, }, 'accel', 'explode'); defender.delay(400); defender.anim({ z: defender.behind(5), - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, electroball: { anim(scene, [attacker, defender]) { @@ -16222,25 +16206,25 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1, opacity: 0.6, - time: 500 + time: 500, }, 'linear', 'explode'); defender.delay(500); defender.anim({ z: defender.behind(5), - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, moonblast: { anim(scene, [attacker, defender]) { @@ -16250,28 +16234,28 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1, opacity: 0.6, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1, opacity: 0.8, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('wisp', { @@ -16279,29 +16263,29 @@ const BattleMoveAnims: AnimTable = { y: +175, z: +50, scale: 1.5, - opacity: 1 + opacity: 1, }, { - time: 800 + time: 800, }, 'accel', 'fade'); scene.showEffect('iceball', { x: 0, y: +175, z: +50, scale: 0.5, - opacity: 0.8 + opacity: 0.8, }, { - time: 800 + time: 800, }, 'accel', 'fade'); defender.delay(500); defender.anim({ z: defender.behind(5), - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, mistball: { anim(scene, [attacker, defender]) { @@ -16310,14 +16294,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.behind(-30), scale: 3, - opacity: 0.3 + opacity: 0.3, }, { x: attacker.x, y: attacker.y, z: attacker.behind(-30), scale: 0.6, opacity: 1, - time: 300 + time: 300, }, 'decel', 'fade'); scene.showEffect('iceball', { x: attacker.x, @@ -16325,14 +16309,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-30), scale: 3, opacity: 0.3, - time: 100 + time: 100, }, { x: attacker.x, y: attacker.y, z: attacker.behind(-30), scale: 0.8, opacity: 0.6, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('iceball', { x: attacker.x, @@ -16340,14 +16324,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-30), scale: 0.6, opacity: 0.8, - time: 400 + time: 400, }, { x: defender.x, y: defender.y, z: defender.behind(0), scale: 1, opacity: 0.8, - time: 800 + time: 800, }, 'accel', 'explode'); scene.showEffect('wisp', { x: defender.x, @@ -16355,13 +16339,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 800 + time: 800, }, { x: defender.x - 60, y: defender.y + 80, scale: 0.9, opacity: 0, - time: 1050 + time: 1050, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -16369,13 +16353,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 800 + time: 800, }, { x: defender.x + 60, y: defender.y - 80, scale: 0.9, opacity: 0, - time: 1050 + time: 1050, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -16383,13 +16367,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 800 + time: 800, }, { x: defender.x + 90, y: defender.y + 40, scale: 0.9, opacity: 0, - time: 1050 + time: 1050, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -16397,13 +16381,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 800 + time: 800, }, { x: defender.x - 90, y: defender.y - 40, scale: 0.9, opacity: 0, - time: 1050 + time: 1050, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -16411,13 +16395,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 800 + time: 800, }, { x: defender.x, y: defender.y + 100, scale: 0.9, opacity: 0, - time: 1050 + time: 1050, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -16425,24 +16409,24 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 800 + time: 800, }, { x: defender.x, y: defender.y - 100, scale: 0.9, opacity: 0, - time: 1050 + time: 1050, }, 'linear', 'fade'); defender.delay(500); defender.anim({ z: defender.behind(5), - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, present: { anim(scene, [attacker, defender]) { @@ -16451,16 +16435,16 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1, opacity: 0.6, - time: 500 + time: 500, }, 'linear', 'explode'); - } + }, }, iceball: { anim(scene, [attacker, defender]) { @@ -16469,16 +16453,16 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.6, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1, opacity: 0.6, - time: 500 + time: 500, }, 'ballistic', 'explode'); - } + }, }, weatherball: { anim(scene, [attacker, defender]) { @@ -16487,10 +16471,10 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { y: attacker.y + 90, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('iceball', { x: defender.x, @@ -16498,13 +16482,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0, - time: 500 + time: 500, }, { y: defender.y, opacity: 1, - time: 1000 + time: 1000, }, 'linear', 'explode'); - } + }, }, wish: { anim(scene, [attacker]) { @@ -16515,10 +16499,10 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 1 + opacity: 1, }, { y: attacker.y + 130, - opacity: 0 + opacity: 0, }, 'accel'); }, residualAnim(scene, [attacker]) { @@ -16529,16 +16513,16 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 130, z: attacker.z, scale: 1, - opacity: 0 + opacity: 0, }, { x: attacker.x, y: attacker.y, z: attacker.z, - opacity: 1 + opacity: 1, }, 'decel', 'explode'); scene.timeOffset += 500; - } + }, }, healingwish: { anim(scene, [attacker]) { @@ -16547,12 +16531,12 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 1 + opacity: 1, }, { x: attacker.x, y: attacker.y + 130, z: attacker.z, - opacity: 0 + opacity: 0, }, 'accel'); }, residualAnim(scene, [attacker]) { @@ -16561,14 +16545,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 130, z: attacker.z, scale: 1, - opacity: 0 + opacity: 0, }, { x: attacker.x, y: attacker.y, z: attacker.z, - opacity: 1 + opacity: 1, }, 'decel', 'explode'); - } + }, }, stealthrock: { anim(scene, [attacker, defender]) { @@ -16577,13 +16561,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0.5 + opacity: 0.5, }, { x: defender.leftof(-40), y: defender.y - 10, z: defender.z, scale: 0.2, - opacity: 1 + opacity: 1, }, 'ballistic'); scene.showEffect('rock2', { x: attacker.x, @@ -16591,13 +16575,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.5, - time: 75 + time: 75, }, { x: defender.leftof(-20), y: defender.y - 40, z: defender.z, scale: 0.2, - opacity: 1 + opacity: 1, }, 'ballistic'); scene.showEffect('rock1', { x: attacker.x, @@ -16605,13 +16589,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.5, - time: 150 + time: 150, }, { x: defender.leftof(30), y: defender.y - 20, z: defender.z, scale: 0.2, - opacity: 1 + opacity: 1, }, 'ballistic'); scene.showEffect('rock2', { x: attacker.x, @@ -16619,15 +16603,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.5, - time: 225 + time: 225, }, { x: defender.leftof(10), y: defender.y - 30, z: defender.z, scale: 0.2, - opacity: 1 + opacity: 1, }, 'ballistic'); - } + }, }, spikes: { anim(scene, [attacker, defender]) { @@ -16636,13 +16620,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0.5 + opacity: 0.5, }, { x: -25, y: defender.y - 40, z: defender.z, scale: 0.3, - opacity: 1 + opacity: 1, }, 'ballistic'); scene.showEffect('caltrop', { x: attacker.x, @@ -16650,13 +16634,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.5, - time: 125 + time: 125, }, { x: +50, y: defender.y - 40, z: defender.z, scale: 0.3, - opacity: 1 + opacity: 1, }, 'ballistic'); scene.showEffect('caltrop', { x: attacker.x, @@ -16664,15 +16648,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.5, - time: 250 + time: 250, }, { x: +30, y: defender.y - 45, z: defender.z, scale: 0.3, - opacity: 1 + opacity: 1, }, 'ballistic'); - } + }, }, toxicspikes: { anim(scene, [attacker, defender]) { @@ -16681,13 +16665,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0.5 + opacity: 0.5, }, { x: +5, y: defender.y - 40, z: defender.z, scale: 0.3, - opacity: 1 + opacity: 1, }, 'ballistic'); scene.showEffect('poisoncaltrop', { x: attacker.x, @@ -16695,15 +16679,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.5, - time: 200 + time: 200, }, { x: -15, y: defender.y - 35, z: defender.z, scale: 0.3, - opacity: 1 + opacity: 1, }, 'ballistic'); - } + }, }, stickyweb: { anim(scene, [attacker, defender]) { @@ -16712,15 +16696,15 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0.5 + opacity: 0.5, }, { x: 0, y: defender.y, z: defender.z, scale: 0.5, - opacity: 1 + opacity: 1, }, 'ballistic'); - } + }, }, leechseed: { anim(scene, [attacker, defender]) { @@ -16729,13 +16713,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0.5 + opacity: 0.5, }, { x: defender.x - 30, y: defender.y - 40, z: defender.z, scale: 0.2, - opacity: 0.6 + opacity: 0.6, }, 'ballistic'); scene.showEffect('energyball', { x: attacker.x, @@ -16743,13 +16727,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.5, - time: 125 + time: 125, }, { x: defender.x + 40, y: defender.y - 35, z: defender.z, scale: 0.2, - opacity: 0.6 + opacity: 0.6, }, 'ballistic'); scene.showEffect('energyball', { x: attacker.x, @@ -16757,15 +16741,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.5, - time: 250 + time: 250, }, { x: defender.x + 20, y: defender.y - 25, z: defender.z, scale: 0.2, - opacity: 0.6 + opacity: 0.6, }, 'ballistic'); - } + }, }, psyshock: { anim(scene, [attacker, defender]) { @@ -16774,10 +16758,10 @@ const BattleMoveAnims: AnimTable = { y: defender.y, z: defender.z, scale: 0, - opacity: 0.6 + opacity: 0.6, }, { scale: 3, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('poisonwisp', { x: defender.x - 40, @@ -16785,10 +16769,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 150 + time: 150, }, { scale: 3, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('waterwisp', { x: defender.x + 10, @@ -16796,12 +16780,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 300 + time: 300, }, { scale: 3, - opacity: 0 + opacity: 0, }, 'decel'); - } + }, }, sandtomb: { anim(scene, [attacker, defender]) { @@ -16810,10 +16794,10 @@ const BattleMoveAnims: AnimTable = { y: defender.y, z: defender.z, scale: 0, - opacity: 0.6 + opacity: 0.6, }, { scale: 3, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('mudwisp', { x: defender.x - 40, @@ -16821,10 +16805,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 150 + time: 150, }, { scale: 3, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('mudwisp', { x: defender.x + 10, @@ -16832,12 +16816,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 300 + time: 300, }, { scale: 3, - opacity: 0 + opacity: 0, }, 'decel'); - } + }, }, flashcannon: { anim(scene, [attacker, defender]) { @@ -16846,13 +16830,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x, y: defender.y, z: defender.behind(20), opacity: 0.6, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('waterwisp', { x: attacker.x, @@ -16860,13 +16844,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.2, - time: 50 + time: 50, }, { x: defender.x + 10, y: defender.y - 5, z: defender.behind(20), opacity: 0.6, - time: 250 + time: 250, }, 'linear', 'explode'); scene.showEffect('waterwisp', { x: attacker.x, @@ -16874,13 +16858,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.2, - time: 100 + time: 100, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(20), opacity: 0.6, - time: 300 + time: 300, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -16888,15 +16872,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.2, - time: 150 + time: 150, }, { x: defender.x, y: defender.y - 5, z: defender.behind(20), opacity: 0.6, - time: 350 + time: 350, }, 'linear', 'explode'); - } + }, }, lusterpurge: { anim(scene, [attacker, defender]) { @@ -16906,11 +16890,11 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 10, z: attacker.z, scale: 0.1, - opacity: 0.5 + opacity: 0.5, }, { scale: 15, opacity: 0.8, - time: 500 + time: 500, }, 'linear', 'fade'); scene.showEffect('impact', { x: defender.x - 25, @@ -16918,11 +16902,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 0.7, opacity: 0.2, - time: 175 + time: 175, }, { scale: 1, opacity: 0, - time: 375 + time: 375, }, 'linear'); scene.showEffect('impact', { x: defender.x + 25, @@ -16930,11 +16914,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 0.7, opacity: 0.2, - time: 300 + time: 300, }, { scale: 1, opacity: 0, - time: 500 + time: 500, }, 'linear'); scene.showEffect('impact', { x: defender.x - 25, @@ -16942,11 +16926,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 0.7, opacity: 0.2, - time: 400 + time: 400, }, { scale: 1, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('impact', { x: defender.x + 2, @@ -16954,40 +16938,40 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 1, opacity: 0.2, - time: 500 + time: 500, }, { scale: 1.25, opacity: 0, - time: 700 + time: 700, }, 'linear'); attacker.anim({ opacity: 0, - time: 75 + time: 75, }); attacker.delay(500); attacker.anim({ opacity: 1, - time: 100 + time: 100, }); defender.delay(200); defender.anim({ x: defender.x - 30, - time: 75 + time: 75, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x, - time: 100 + time: 100, }); - } + }, }, grassknot: { anim(scene, [attacker, defender]) { @@ -16997,10 +16981,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 50 + time: 50, }, { scale: 3, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('energyball', { x: defender.x - 30, @@ -17008,10 +16992,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 200 + time: 200, }, { scale: 3, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('leaf1', { x: defender.x + 30, @@ -17019,11 +17003,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 50 + time: 50, }, { y: defender.y - 40, scale: 3, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('leaf2', { x: defender.x - 30, @@ -17031,34 +17015,34 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 200 + time: 200, }, { y: defender.y - 50, scale: 3, - opacity: 0 + opacity: 0, }, 'decel'); - } + }, }, aeroblast: { anim(scene, [attacker, defender]) { - var xstep = (defender.x - attacker.x) / 5; - var ystep = (defender.y - attacker.y) / 5; - var zstep = (defender.behind(50) - attacker.z) / 5; + let xstep = (defender.x - attacker.x) / 5; + let ystep = (defender.y - attacker.y) / 5; + let zstep = (defender.behind(50) - attacker.z) / 5; scene.backgroundEffect('#000000', 700, 0.6); - for (var i = 0; i < 5; i++) { + for (let i = 0; i < 5; i++) { scene.showEffect('wisp', { x: attacker.x + xstep * (i + 1), y: attacker.y + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 1, opacity: 1, - time: 20 * i + time: 20 * i, }, { scale: 3, opacity: 0, - time: 40 * i + 600 + time: 40 * i + 600, }, 'linear'); } scene.showEffect('iceball', { @@ -17066,14 +17050,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 0.6, opacity: 0.2, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -17081,14 +17065,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 0.6, opacity: 0.2, - time: 275 + time: 275, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -17096,14 +17080,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.2, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -17111,14 +17095,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 0.6, opacity: 0.2, - time: 425 + time: 425, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -17126,14 +17110,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 0.6, opacity: 0.2, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -17141,14 +17125,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.2, - time: 575 + time: 575, }, 'linear', 'explode'); scene.showEffect('iceball', { @@ -17157,11 +17141,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 550 + time: 550, }, { scale: 4, opacity: 0, - time: 750 + time: 750, }, 'linear'); scene.showEffect('iceball', { x: defender.x, @@ -17169,43 +17153,43 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 600 + time: 600, }, { scale: 4, opacity: 0, - time: 800 + time: 800, }, 'linear'); defender.delay(125); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 150 + time: 150, }, 'swing'); - } + }, }, airslash: { anim(scene, [attacker, defender]) { @@ -17214,14 +17198,14 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 30, z: defender.z, scale: 0.2, - opacity: 1 + opacity: 1, }, { x: defender.x - 70, y: defender.y - 40, z: defender.z, scale: 0.4, opacity: 0.4, - time: 200 + time: 200, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x + 60, @@ -17229,14 +17213,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 100 + time: 100, }, { x: defender.x - 70, y: defender.y - 40, z: defender.z, scale: 0.4, opacity: 0.4, - time: 300 + time: 300, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x + 80, @@ -17244,14 +17228,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 100 + time: 100, }, { x: defender.x - 50, y: defender.y - 60, z: defender.z, scale: 0.4, opacity: 0.4, - time: 300 + time: 300, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x + 80, @@ -17259,16 +17243,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 200 + time: 200, }, { x: defender.x - 50, y: defender.y - 60, z: defender.z, scale: 0.4, opacity: 0.4, - time: 400 + time: 400, }, 'linear', 'fade'); - } + }, }, aircutter: { anim(scene, [attacker, defender]) { @@ -17277,14 +17261,14 @@ const BattleMoveAnims: AnimTable = { y: defender.y - 10, z: defender.z, scale: 0.2, - opacity: 1 + opacity: 1, }, { x: defender.x - 60, y: defender.y - 10, z: defender.z, scale: 0.4, opacity: 0.4, - time: 200 + time: 200, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x + 60, @@ -17292,14 +17276,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 100 + time: 100, }, { x: defender.x - 60, y: defender.y + 20, z: defender.z, scale: 0.4, opacity: 0.4, - time: 300 + time: 300, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x + 60, @@ -17307,16 +17291,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 200 + time: 200, }, { x: defender.x - 60, y: defender.y + 50, z: defender.z, scale: 0.4, opacity: 0.4, - time: 400 + time: 400, }, 'linear', 'fade'); - } + }, }, dracometeor: { anim(scene, [attacker, defender]) { @@ -17326,12 +17310,12 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 175, z: defender.z, scale: 0.1, - opacity: 0 + opacity: 0, }, { x: defender.x + 50, y: defender.y, scale: 1.5, - opacity: 0.8 + opacity: 0.8, }, 'accel', 'explode'); scene.showEffect('flareball', { x: defender.leftof(-200), @@ -17339,12 +17323,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y - 5, scale: 1.5, - opacity: 0.8 + opacity: 0.8, }, 'accel', 'explode'); scene.showEffect('flareball', { x: defender.leftof(-200), @@ -17352,24 +17336,24 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0, - time: 300 + time: 300, }, { x: defender.x + 30, y: defender.y - 10, scale: 1.5, - opacity: 0.8 + opacity: 0.8, }, 'accel', 'explode'); scene.showEffect('rock3', { x: defender.leftof(-200), y: defender.y + 175, z: defender.z, scale: 0.1, - opacity: 0 + opacity: 0, }, { x: defender.x + 30, y: defender.y, scale: 1.5, - opacity: 0.4 + opacity: 0.4, }, 'accel', 'explode'); scene.showEffect('rock3', { x: defender.leftof(-200), @@ -17377,12 +17361,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0, - time: 150 + time: 150, }, { x: defender.x - 20, y: defender.y - 5, scale: 1.5, - opacity: 0.4 + opacity: 0.4, }, 'accel', 'explode'); scene.showEffect('rock3', { x: defender.leftof(-200), @@ -17390,12 +17374,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0, - time: 300 + time: 300, }, { x: defender.x + 20, y: defender.y, scale: 1.5, - opacity: 0.4 + opacity: 0.4, }, 'accel', 'explode'); scene.showEffect('shadowball', { @@ -17405,12 +17389,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 2, opacity: 0.5, - time: 500 + time: 500, }, { scale: 3, xscale: 8, opacity: 0.1, - time: 700 + time: 700, }, 'linear', 'fade'); scene.showEffect('shadowball', { x: defender.x, @@ -17418,11 +17402,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.3, scale: 0, - time: 500 + time: 500, }, { scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('shadowball', { x: defender.x - 20, @@ -17431,12 +17415,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 2, opacity: 0.5, - time: 650 + time: 650, }, { scale: 3, xscale: 8, opacity: 0.1, - time: 850 + time: 850, }, 'linear', 'fade'); scene.showEffect('shadowball', { x: defender.x, @@ -17444,11 +17428,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.3, scale: 0, - time: 650 + time: 650, }, { scale: 4, opacity: 0, - time: 850 + time: 850, }, 'linear'); scene.showEffect('shadowball', { x: defender.x + 20, @@ -17457,12 +17441,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 2, opacity: 0.5, - time: 700 + time: 700, }, { scale: 3, xscale: 8, opacity: 0.1, - time: 900 + time: 900, }, 'linear', 'fade'); scene.showEffect('shadowball', { x: defender.x, @@ -17470,11 +17454,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.3, scale: 0, - time: 700 + time: 700, }, { scale: 4, opacity: 0, - time: 900 + time: 900, }, 'linear'); scene.showEffect('rock3', { @@ -17483,13 +17467,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0.6, - time: 50 + time: 50, }, { x: defender.x - 250, y: defender.y - 80, z: defender.behind(60), scale: 0.8, - opacity: 0 + opacity: 0, }, 'accel', 'fade'); scene.showEffect('rock3', { x: defender.leftof(-220), @@ -17497,13 +17481,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x + 80, y: defender.y - 50, z: defender.behind(30), scale: 0.8, - opacity: 0 + opacity: 0, }, 'accel', 'fade'); scene.showEffect('rock3', { x: defender.leftof(-180), @@ -17511,42 +17495,42 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x - 200, y: defender.y + 20, z: defender.behind(30), scale: 0.8, - opacity: 0 + opacity: 0, }, 'accel', 'fade'); defender.delay(500); defender.anim({ x: defender.x + 30, z: defender.behind(10), - time: 75 + time: 75, }); defender.anim({ x: defender.x - 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 30, z: defender.behind(10), - time: 100 + time: 100, }); defender.anim({ x: defender.x, - time: 100 + time: 100, }); - } + }, }, brine: { - anim: BattleOtherAnims.hydroshot.anim + anim: BattleOtherAnims.hydroshot.anim, }, octazooka: { anim(scene, [attacker, defender]) { @@ -17555,13 +17539,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x + 10, y: defender.y + 5, z: defender.behind(30), scale: 1, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); scene.showEffect('blackwisp', { x: attacker.x, @@ -17569,13 +17553,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.3, - time: 75 + time: 75, }, { x: defender.x - 10, y: defender.y - 5, z: defender.behind(30), scale: 1, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); scene.showEffect('blackwisp', { x: attacker.x, @@ -17583,21 +17567,21 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.3, - time: 150 + time: 150, }, { x: defender.x, y: defender.y + 5, z: defender.behind(30), scale: 1, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); - } + }, }, waterpledge: { - anim: BattleOtherAnims.hydroshot.anim + anim: BattleOtherAnims.hydroshot.anim, }, soak: { - anim: BattleOtherAnims.hydroshot.anim + anim: BattleOtherAnims.hydroshot.anim, }, watersport: { anim(scene, [attacker, defender]) { @@ -17606,13 +17590,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 30, y: defender.y + 20, z: defender.z, scale: 1, - opacity: 0.3 + opacity: 0.3, }, 'ballistic', 'explode'); scene.showEffect('waterwisp', { x: attacker.x, @@ -17620,13 +17604,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 20, z: defender.z, scale: 1, - opacity: 0.3 + opacity: 0.3, }, 'ballistic', 'explode'); scene.showEffect('waterwisp', { x: attacker.x, @@ -17634,13 +17618,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 1, - opacity: 0.3 + opacity: 0.3, }, 'ballistic', 'explode'); scene.showEffect('waterwisp', { x: attacker.x, @@ -17648,15 +17632,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 5, z: defender.z, scale: 1, - opacity: 0.3 + opacity: 0.3, }, 'ballistic', 'explode'); - } + }, }, scald: { anim(scene, [attacker, defender]) { @@ -17667,11 +17651,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 300 + time: 300, }, { y: defender.y + 60, opacity: 0.2, - time: 700 + time: 700, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x - 30, @@ -17679,11 +17663,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 400 + time: 400, }, { y: defender.y + 60, opacity: 0.2, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x + 15, @@ -17691,11 +17675,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 500 + time: 500, }, { y: defender.y + 60, opacity: 0.2, - time: 900 + time: 900, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x - 15, @@ -17703,13 +17687,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 600 + time: 600, }, { y: defender.y + 60, opacity: 0.2, - time: 1000 + time: 1000, }, 'linear', 'fade'); - } + }, }, steameruption: { anim(scene, [attacker, defender]) { @@ -17718,10 +17702,10 @@ const BattleMoveAnims: AnimTable = { defender.delay(200); defender.anim({ z: defender.behind(20), - time: 400 + time: 400, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); scene.showEffect('wisp', { @@ -17730,11 +17714,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 1, opacity: 1, - time: 300 + time: 300, }, { y: defender.y + 60, opacity: 0.2, - time: 700 + time: 700, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x - 30, @@ -17742,11 +17726,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(10), scale: 1, opacity: 1, - time: 400 + time: 400, }, { y: defender.y + 60, opacity: 0.2, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x + 15, @@ -17754,11 +17738,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(15), scale: 1, opacity: 1, - time: 500 + time: 500, }, { y: defender.y + 60, opacity: 0.2, - time: 900 + time: 900, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x - 15, @@ -17766,13 +17750,13 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(20), scale: 1, opacity: 1, - time: 600 + time: 600, }, { y: defender.y + 60, opacity: 0.2, - time: 1000 + time: 1000, }, 'linear', 'fade'); - } + }, }, waterpulse: { anim(scene, [attacker, defender]) { @@ -17781,28 +17765,28 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.8 + opacity: 0.8, }, { x: defender.x, y: defender.y, z: defender.behind(0), opacity: 0.7, - time: 400 + time: 400, }, 'decel', 'explode'); scene.showEffect('waterwisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x, y: defender.y, z: defender.behind(0), opacity: 0.7, - time: 400 + time: 400, }, 'decel', 'explode'); - } + }, }, bubblebeam: { anim(scene, [attacker, defender]) { @@ -17811,13 +17795,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 0.7 + opacity: 0.7, }, { x: defender.x, y: defender.y, z: defender.behind(0), opacity: 0.6, - time: 400 + time: 400, }, 'decel', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -17825,13 +17809,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.7, - time: 100 + time: 100, }, { x: defender.x + 20, y: defender.y - 10, z: defender.behind(0), opacity: 0.6, - time: 500 + time: 500, }, 'decel', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -17839,13 +17823,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.7, - time: 200 + time: 200, }, { x: defender.x - 20, y: defender.y + 10, z: defender.behind(0), opacity: 0.6, - time: 600 + time: 600, }, 'decel', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -17853,15 +17837,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.7, - time: 300 + time: 300, }, { x: defender.x, y: defender.y - 5, z: defender.behind(0), opacity: 0.6, - time: 700 + time: 700, }, 'decel', 'explode'); - } + }, }, surf: { anim(scene, [attacker, ...defenders]) { @@ -17869,24 +17853,24 @@ const BattleMoveAnims: AnimTable = { defender.delay(125); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); } const defender = defenders[1] || defenders[0]; @@ -17897,41 +17881,41 @@ const BattleMoveAnims: AnimTable = { y: attacker.y - 25, z: attacker.z, scale: 0.4, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x, y: defender.y + 10, z: defender.behind(50), scale: 1, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); scene.showEffect('waterwisp', { x: attacker.x - 30, y: attacker.y - 25, z: attacker.z, scale: 0.4, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x - 60, y: defender.y, z: defender.behind(50), scale: 1, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); scene.showEffect('waterwisp', { x: attacker.x + 30, y: attacker.y - 25, z: attacker.z, scale: 0.4, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x + 60, y: defender.y, z: defender.behind(50), scale: 1, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); - } + }, }, hydropump: { anim(scene, [attacker, defender]) { @@ -17940,12 +17924,12 @@ const BattleMoveAnims: AnimTable = { defender.delay(200); defender.anim({ z: defender.behind(20), - time: 400 + time: 400, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, muddywater: { anim(scene, [attacker, ...defenders]) { @@ -17953,24 +17937,24 @@ const BattleMoveAnims: AnimTable = { defender.delay(125); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); } const defender = defenders[1] || defenders[0]; @@ -17981,41 +17965,41 @@ const BattleMoveAnims: AnimTable = { y: attacker.y - 25, z: attacker.z, scale: 0.4, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x, y: defender.y + 10, z: defender.behind(50), scale: 1, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); scene.showEffect('mudwisp', { x: attacker.x - 30, y: attacker.y - 25, z: attacker.z, scale: 0.4, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x - 60, y: defender.y, z: defender.behind(50), scale: 1, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); scene.showEffect('mudwisp', { x: attacker.x + 30, y: attacker.y - 25, z: attacker.z, scale: 0.4, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x + 60, y: defender.y, z: defender.behind(50), scale: 1, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); - } + }, }, mudshot: { anim(scene, [attacker, defender]) { @@ -18024,13 +18008,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x + 10, y: defender.y + 5, z: defender.behind(30), scale: 1, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); scene.showEffect('mudwisp', { x: attacker.x, @@ -18038,13 +18022,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.3, - time: 75 + time: 75, }, { x: defender.x - 10, y: defender.y - 5, z: defender.behind(30), scale: 1, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); scene.showEffect('mudwisp', { x: attacker.x, @@ -18052,15 +18036,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.3, - time: 150 + time: 150, }, { x: defender.x, y: defender.y + 5, z: defender.behind(30), scale: 1, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); - } + }, }, lavaplume: { anim(scene, [attacker, ...defenders]) { @@ -18070,13 +18054,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 1 + opacity: 1, }, { x: defender.x + 30, y: defender.y + 20, z: defender.z, scale: 1, - opacity: 0.7 + opacity: 0.7, }, 'ballistic', 'explode'); scene.showEffect('fireball', { x: attacker.x, @@ -18084,13 +18068,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 1, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 20, z: defender.z, scale: 1, - opacity: 0.7 + opacity: 0.7, }, 'ballistic', 'explode'); scene.showEffect('fireball', { x: attacker.x, @@ -18098,13 +18082,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 1, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 1, - opacity: 0.7 + opacity: 0.7, }, 'ballistic', 'explode'); scene.showEffect('fireball', { x: attacker.x, @@ -18112,16 +18096,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 1, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 5, z: defender.z, scale: 1, - opacity: 0.7 + opacity: 0.7, }, 'ballistic', 'explode'); } - } + }, }, eruption: { anim(scene, [attacker, ...defenders]) { @@ -18129,23 +18113,23 @@ const BattleMoveAnims: AnimTable = { defender.delay(625); defender.anim({ x: defender.x - 30, - time: 75 + time: 75, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x, - time: 100 + time: 100, }); } const defender = defenders[1] || defenders[0]; @@ -18156,13 +18140,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 1 + opacity: 1, }, { x: attacker.x, y: attacker.y, z: attacker.z, scale: 6, - opacity: 0 + opacity: 0, }, 'linear', 'fade'); scene.showEffect('flareball', { x: attacker.x, @@ -18170,14 +18154,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 0 + time: 0, }, { x: attacker.x + 30, y: attacker.y + 150, z: attacker.z, scale: 0.5, opacity: 0, - time: 300 + time: 300, }, 'decel', 'fade'); scene.showEffect('flareball', { x: attacker.x, @@ -18185,14 +18169,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 100 + time: 100, }, { x: attacker.x - 10, y: attacker.y + 150, z: attacker.z, scale: 0.5, opacity: 0, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('flareball', { x: attacker.x, @@ -18200,14 +18184,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 200 + time: 200, }, { x: attacker.x + 35, y: attacker.y + 150, z: attacker.z, scale: 0.5, opacity: 0, - time: 500 + time: 500, }, 'decel', 'fade'); scene.showEffect('rock3', { @@ -18216,14 +18200,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 0 + time: 0, }, { x: attacker.x + 30, y: attacker.y + 150, z: attacker.z, scale: 0.5, opacity: 0, - time: 300 + time: 300, }, 'decel', 'fade'); scene.showEffect('fireball', { x: attacker.x, @@ -18231,14 +18215,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.9, opacity: 0.6, - time: 50 + time: 50, }, { x: attacker.x - 30, y: attacker.y + 150, z: attacker.z, scale: 1, opacity: 0, - time: 350 + time: 350, }, 'decel', 'fade'); scene.showEffect('rock3', { x: attacker.x, @@ -18246,14 +18230,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 100 + time: 100, }, { x: attacker.x - 10, y: attacker.y + 150, z: attacker.z, scale: 0.5, opacity: 0, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('fireball', { x: attacker.x, @@ -18261,14 +18245,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.9, opacity: 0.6, - time: 150 + time: 150, }, { x: attacker.x + 10, y: attacker.y + 150, z: attacker.z, scale: 1, opacity: 0, - time: 450 + time: 450, }, 'decel', 'fade'); scene.showEffect('rock3', { x: attacker.x, @@ -18276,14 +18260,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 200 + time: 200, }, { x: attacker.x + 35, y: attacker.y + 150, z: attacker.z, scale: 0.5, opacity: 0, - time: 500 + time: 500, }, 'decel', 'fade'); scene.showEffect('fireball', { @@ -18292,14 +18276,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-90), scale: 0.4, opacity: 1, - time: 300 + time: 300, }, { x: defender.x + 45, y: defender.y + 20, z: defender.z, scale: 1.5, opacity: 0.7, - time: 600 + time: 600, }, 'accel', 'explode'); scene.showEffect('rock3', { x: attacker.x, @@ -18307,14 +18291,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-90), scale: 0.4, opacity: 1, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y - 20, z: defender.z, scale: 1, opacity: 0.7, - time: 675 + time: 675, }, 'accel', 'explode'); scene.showEffect('flareball', { x: attacker.x, @@ -18322,14 +18306,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-90), scale: 0.4, opacity: 1, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y - 20, z: defender.z, scale: 1, opacity: 0.7, - time: 675 + time: 675, }, 'accel', 'explode'); scene.showEffect('fireball', { x: attacker.x, @@ -18337,14 +18321,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-90), scale: 0.4, opacity: 1, - time: 450 + time: 450, }, { x: defender.x + 30, y: defender.y, z: defender.z, scale: 1.5, opacity: 0.7, - time: 750 + time: 750, }, 'accel', 'explode'); scene.showEffect('rock3', { x: attacker.x, @@ -18352,14 +18336,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-90), scale: 0.4, opacity: 1, - time: 525 + time: 525, }, { x: defender.x + 40, y: defender.y + 5, z: defender.z, scale: 1, opacity: 0.7, - time: 825 + time: 825, }, 'accel', 'explode'); scene.showEffect('flareball', { x: attacker.x, @@ -18367,14 +18351,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-90), scale: 0.4, opacity: 1, - time: 525 + time: 525, }, { x: defender.x + 40, y: defender.y + 5, z: defender.z, scale: 1, opacity: 0.7, - time: 825 + time: 825, }, 'accel', 'explode'); scene.showEffect('fireball', { x: attacker.x, @@ -18382,14 +18366,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-90), scale: 0.4, opacity: 1, - time: 575 + time: 575, }, { x: defender.x - 70, y: defender.y + 5, z: defender.z, scale: 1.5, opacity: 0.7, - time: 875 + time: 875, }, 'accel', 'explode'); scene.showEffect('fireball', { x: attacker.x, @@ -18397,16 +18381,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-90), scale: 0.4, opacity: 1, - time: 650 + time: 650, }, { x: defender.x + 70, y: defender.y + 5, z: defender.z, scale: 1.5, opacity: 0.7, - time: 950 + time: 950, }, 'accel', 'explode'); - } + }, }, waterspout: { anim(scene, [attacker, ...defenders]) { @@ -18414,23 +18398,23 @@ const BattleMoveAnims: AnimTable = { defender.delay(625); defender.anim({ x: defender.x - 30, - time: 75 + time: 75, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x, - time: 100 + time: 100, }); } const defender = defenders[1] || defenders[0]; @@ -18441,13 +18425,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 1 + opacity: 1, }, { x: attacker.x, y: attacker.y, z: attacker.z, scale: 6, - opacity: 0 + opacity: 0, }, 'linear', 'fade'); scene.showEffect('waterwisp', { @@ -18456,14 +18440,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 0 + time: 0, }, { x: attacker.x + 30, y: attacker.y + 150, z: attacker.z, scale: 0.5, opacity: 0, - time: 300 + time: 300, }, 'decel', 'fade'); scene.showEffect('waterwisp', { x: attacker.x, @@ -18471,14 +18455,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.9, opacity: 0.6, - time: 50 + time: 50, }, { x: attacker.x - 30, y: attacker.y + 150, z: attacker.z, scale: 1, opacity: 0, - time: 350 + time: 350, }, 'decel', 'fade'); scene.showEffect('waterwisp', { x: attacker.x, @@ -18486,14 +18470,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 100 + time: 100, }, { x: attacker.x - 10, y: attacker.y + 150, z: attacker.z, scale: 0.5, opacity: 0, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('waterwisp', { x: attacker.x, @@ -18501,14 +18485,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.9, opacity: 0.6, - time: 150 + time: 150, }, { x: attacker.x + 10, y: attacker.y + 150, z: attacker.z, scale: 1, opacity: 0, - time: 450 + time: 450, }, 'decel', 'fade'); scene.showEffect('waterwisp', { x: attacker.x, @@ -18516,14 +18500,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 200 + time: 200, }, { x: attacker.x + 35, y: attacker.y + 150, z: attacker.z, scale: 0.5, opacity: 0, - time: 500 + time: 500, }, 'decel', 'fade'); scene.showEffect('waterwisp', { @@ -18532,14 +18516,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-90), scale: 0.4, opacity: 1, - time: 300 + time: 300, }, { x: defender.x + 45, y: defender.y + 20, z: defender.z, scale: 1.5, opacity: 0.7, - time: 600 + time: 600, }, 'accel', 'explode'); scene.showEffect('waterwisp', { x: attacker.x, @@ -18547,14 +18531,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-90), scale: 0.4, opacity: 1, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y - 20, z: defender.z, scale: 1, opacity: 0.7, - time: 675 + time: 675, }, 'accel', 'explode'); scene.showEffect('waterwisp', { x: attacker.x, @@ -18562,14 +18546,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-90), scale: 0.4, opacity: 1, - time: 450 + time: 450, }, { x: defender.x + 30, y: defender.y, z: defender.z, scale: 1.5, opacity: 0.7, - time: 750 + time: 750, }, 'accel', 'explode'); scene.showEffect('waterwisp', { x: attacker.x, @@ -18577,14 +18561,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-90), scale: 0.4, opacity: 1, - time: 525 + time: 525, }, { x: defender.x - 40, y: defender.y + 5, z: defender.z, scale: 1, opacity: 0.7, - time: 825 + time: 825, }, 'accel', 'explode'); scene.showEffect('waterwisp', { x: attacker.x, @@ -18592,14 +18576,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-90), scale: 0.4, opacity: 1, - time: 525 + time: 525, }, { x: defender.x + 40, y: defender.y + 5, z: defender.z, scale: 1, opacity: 0.7, - time: 825 + time: 825, }, 'accel', 'explode'); scene.showEffect('waterwisp', { x: attacker.x, @@ -18607,14 +18591,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-90), scale: 0.4, opacity: 1, - time: 575 + time: 575, }, { x: defender.x - 70, y: defender.y + 5, z: defender.z, scale: 1.5, opacity: 0.7, - time: 875 + time: 875, }, 'accel', 'explode'); scene.showEffect('waterwisp', { x: attacker.x, @@ -18622,36 +18606,36 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-90), scale: 0.4, opacity: 1, - time: 650 + time: 650, }, { x: defender.x + 70, y: defender.y + 5, z: defender.z, scale: 1.5, opacity: 0.7, - time: 950 + time: 950, }, 'accel', 'explode'); - } + }, }, solarbeam: { anim(scene, [attacker, defender]) { - var xstep = (defender.x - attacker.x) / 5; - var ystep = (defender.x - 200 - attacker.x) / 5; - var zstep = (defender.z - attacker.z) / 5; + let xstep = (defender.x - attacker.x) / 5; + let ystep = (defender.x - 200 - attacker.x) / 5; + let zstep = (defender.z - attacker.z) / 5; scene.backgroundEffect("url('https://play.pokemonshowdown.com/fx/weather-sunnyday.jpg')", 900, 0.5); - for (var i = 0; i < 5; i++) { + for (let i = 0; i < 5; i++) { scene.showEffect('energyball', { x: attacker.x + xstep * (i + 1), y: (attacker.y + 200) + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 0.7, opacity: 0.6, - time: 40 * i + 300 + time: 40 * i + 300, }, { opacity: 0, - time: 100 * i + 500 + time: 100 * i + 500, }, 'linear'); } @@ -18660,28 +18644,28 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.75, - opacity: 0.6 + opacity: 0.6, }, { x: attacker.x, y: attacker.y + 200, z: attacker.z, scale: 1.25, opacity: 0, - time: 200 + time: 200, }, 'decel'); scene.showEffect('wisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.6 + opacity: 0.6, }, { x: attacker.x, y: attacker.y + 200, z: attacker.z, scale: 1.5, opacity: 0, - time: 200 + time: 200, }, 'decel'); scene.showEffect('flareball', { @@ -18690,14 +18674,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -18705,14 +18689,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 375 + time: 375, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 575 + time: 575, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -18720,14 +18704,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 425 + time: 425, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 625 + time: 625, }, 'linear', 'explode'); scene.showEffect('flareball', { x: attacker.x, @@ -18735,14 +18719,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 450 + time: 450, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 650 + time: 650, }, 'linear', 'explode'); scene.showEffect('flareball', { x: attacker.x, @@ -18750,14 +18734,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 500 + time: 500, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 700 + time: 700, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -18765,23 +18749,23 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 575 + time: 575, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 775 + time: 775, }, 'linear', 'explode'); }, prepareAnim: BattleOtherAnims.chargestatus.anim, }, solarblade: { anim(scene, [attacker, defender]) { - var xstep = 0; - var ystep = 20; - var zstep = 0; + let xstep = 0; + let ystep = 20; + let zstep = 0; scene.backgroundEffect("url('https://play.pokemonshowdown.com/fx/weather-sunnyday.jpg')", 900, 0.5); @@ -18790,25 +18774,25 @@ const BattleMoveAnims: AnimTable = { y: attacker.y - 10, z: attacker.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { y: attacker.y + 10, scale: 1, opacity: 0.4, - time: 300 + time: 300, }, 'decel', 'fade'); - for (var i = 0; i < 5; i++) { + for (let i = 0; i < 5; i++) { scene.showEffect('wisp', { x: attacker.leftof(10) + xstep * (i + 1), y: attacker.y - 20 + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 1.5, opacity: 1, - time: 40 * i + 0 + time: 40 * i + 0, }, { opacity: 0, - time: 45 * i + 500 + time: 45 * i + 500, }, 'linear'); } @@ -18818,12 +18802,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 500 + time: 500, }, { x: defender.x + 50, y: defender.y + 10, opacity: 0.5, - time: 800 + time: 800, }, 'accel', 'explode'); scene.showEffect('energyball', { x: defender.x - 30, @@ -18831,12 +18815,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 600 + time: 600, }, { x: defender.x - 50, y: defender.y - 20, opacity: 0.5, - time: 800 + time: 800, }, 'accel', 'explode'); scene.showEffect('energyball', { x: defender.x + 15, @@ -18844,12 +18828,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 700 + time: 700, }, { x: defender.x + 35, y: defender.y + 30, opacity: 0.5, - time: 900 + time: 900, }, 'accel', 'explode'); scene.showEffect('flareball', { x: defender.x - 15, @@ -18857,12 +18841,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 700 + time: 700, }, { x: defender.x - 35, y: defender.y - 40, opacity: 0.5, - time: 900 + time: 900, }, 'accel', 'explode'); scene.showEffect('flareball', { x: defender.x + 10, @@ -18870,11 +18854,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 0.6, - time: 700 + time: 700, }, { scale: 2, opacity: 0, - time: 1000 + time: 1000, }, 'accel', 'fade'); scene.showEffect('leftslash', { x: defender.x - 10, @@ -18882,20 +18866,20 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 3, opacity: 0.6, - time: 600 + time: 600, }, { scale: 3.5, opacity: 0, - time: 1000 + time: 1000, }, 'accel', 'fade'); defender.delay(550); defender.anim({ z: defender.behind(20), - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); }, prepareAnim: BattleOtherAnims.chargestatus.anim, @@ -18909,11 +18893,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 3, opacity: 2, - time: 0 + time: 0, }, { scale: 0, opacity: 0.5, - time: 200 + time: 200, }, 'accel'); scene.showEffect('mistball', { x: attacker.x, @@ -18921,14 +18905,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 200 + time: 200, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('mistball', { x: attacker.x, @@ -18936,14 +18920,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 275 + time: 275, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 475 + time: 475, }, 'linear', 'explode'); scene.showEffect('mistball', { x: attacker.x, @@ -18951,14 +18935,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 350 + time: 350, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 550 + time: 550, }, 'linear', 'explode'); scene.showEffect('mistball', { x: attacker.x, @@ -18966,14 +18950,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 425 + time: 425, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 625 + time: 625, }, 'linear', 'explode'); scene.showEffect('mistball', { x: attacker.x, @@ -18981,14 +18965,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 500 + time: 500, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 700 + time: 700, }, 'linear', 'explode'); scene.showEffect('mistball', { x: attacker.x, @@ -18996,14 +18980,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 575 + time: 575, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 775 + time: 775, }, 'linear', 'explode'); scene.showEffect('shadowball', { @@ -19012,11 +18996,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 750 + time: 750, }, { scale: 4, opacity: 0, - time: 950 + time: 950, }, 'linear'); scene.showEffect('shadowball', { x: defender.x, @@ -19024,43 +19008,43 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 800 + time: 800, }, { scale: 4, opacity: 0, - time: 1000 + time: 1000, }, 'linear'); defender.delay(325); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 150 + time: 150, }, 'swing'); - } + }, }, blizzard: { // todo: better blizzard anim anim(scene, [attacker, defender]) { @@ -19070,13 +19054,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.6, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 60, y: defender.y + 40, z: defender.z, scale: 2, - opacity: 0.3 + opacity: 0.3, }, 'accel', 'explode'); scene.showEffect('icicle', { x: attacker.x, @@ -19084,13 +19068,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 40, y: defender.y - 40, z: defender.z, scale: 2, - opacity: 0.3 + opacity: 0.3, }, 'accel', 'explode'); scene.showEffect('icicle', { x: attacker.x, @@ -19098,13 +19082,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 60, y: defender.y, z: defender.z, scale: 2, - opacity: 0.3 + opacity: 0.3, }, 'accel', 'explode'); scene.showEffect('icicle', { x: attacker.x, @@ -19112,15 +19096,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 20, y: defender.y + 10, z: defender.z, scale: 2, - opacity: 0.3 + opacity: 0.3, }, 'accel', 'explode'); - } + }, }, sheercold: { // Reminder: Improve this later anim(scene, [attacker, defender]) { @@ -19131,14 +19115,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, xscale: 2, yscale: 5, - opacity: 0.6 + opacity: 0.6, }, { xscale: 2.2, yscale: 5.25, scale: 0.6, - time: 800 + time: 800, }, 'linear', 'explode'); - } + }, }, freezeshock: { anim(scene, [attacker, defender]) { @@ -19147,14 +19131,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -19162,14 +19146,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 275 + time: 275, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -19177,14 +19161,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -19192,14 +19176,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 425 + time: 425, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -19207,14 +19191,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -19222,14 +19206,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 575 + time: 575, }, 'linear', 'explode'); scene.showEffect('electroball', { @@ -19238,11 +19222,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 550 + time: 550, }, { scale: 4, opacity: 0, - time: 750 + time: 750, }, 'linear'); scene.showEffect('electroball', { x: defender.x, @@ -19250,11 +19234,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 600 + time: 600, }, { scale: 4, opacity: 0, - time: 800 + time: 800, }, 'linear'); }, prepareAnim: BattleOtherAnims.selfstatus.anim, @@ -19266,14 +19250,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -19281,14 +19265,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 275 + time: 275, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -19296,14 +19280,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -19311,14 +19295,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 425 + time: 425, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -19326,14 +19310,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -19341,14 +19325,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 575 + time: 575, }, 'linear', 'explode'); scene.showEffect('flareball', { @@ -19357,11 +19341,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 550 + time: 550, }, { scale: 4, opacity: 0, - time: 750 + time: 750, }, 'linear'); scene.showEffect('flareball', { x: defender.x, @@ -19369,11 +19353,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 600 + time: 600, }, { scale: 4, opacity: 0, - time: 800 + time: 800, }, 'linear'); }, prepareAnim: BattleOtherAnims.selfstatus.anim, @@ -19390,13 +19374,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.6, - opacity: 0.8 + opacity: 0.8, }, { x: defender.x + 60, y: defender.y + 40, z: defender.z, scale: 2, - opacity: 0.5 + opacity: 0.5, }, 'decel', 'explode'); scene.showEffect('fireball', { x: attacker.x, @@ -19404,13 +19388,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.8, - time: 75 + time: 75, }, { x: defender.x + 40, y: defender.y - 40, z: defender.z, scale: 2, - opacity: 0.5 + opacity: 0.5, }, 'decel', 'explode'); scene.showEffect('fireball', { x: attacker.x, @@ -19418,13 +19402,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.8, - time: 150 + time: 150, }, { x: defender.x - 60, y: defender.y, z: defender.z, scale: 2, - opacity: 0.5 + opacity: 0.5, }, 'decel', 'explode'); scene.showEffect('fireball', { x: attacker.x, @@ -19432,13 +19416,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.8, - time: 225 + time: 225, }, { x: defender.x - 20, y: defender.y + 10, z: defender.z, scale: 2, - opacity: 0.5 + opacity: 0.5, }, 'decel', 'explode'); scene.showEffect('wisp', { x: attacker.x + 30, @@ -19446,11 +19430,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 1, - time: 100 + time: 100, }, { y: attacker.y + 60, opacity: 0.2, - time: 500 + time: 500, }, 'linear', 'fade'); scene.showEffect('wisp', { x: attacker.x - 30, @@ -19458,11 +19442,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 1, - time: 200 + time: 200, }, { y: defender.y + 60, opacity: 0.2, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('wisp', { x: attacker.x + 15, @@ -19470,11 +19454,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 1, - time: 300 + time: 300, }, { y: attacker.y + 60, opacity: 0.2, - time: 700 + time: 700, }, 'linear', 'fade'); scene.showEffect('wisp', { x: attacker.x - 15, @@ -19482,46 +19466,46 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 1, - time: 400 + time: 400, }, { y: attacker.y + 60, opacity: 0.2, - time: 800 + time: 800, }, 'linear', 'fade'); defender.delay(200); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 100 + time: 100, }, 'accel'); - } + }, }, blastburn: { anim(scene, [attacker, defender]) { @@ -19531,13 +19515,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.6, - opacity: 0.8 + opacity: 0.8, }, { x: defender.x + 60, y: defender.y + 40, z: defender.z, scale: 2, - opacity: 0.5 + opacity: 0.5, }, 'decel', 'explode'); scene.showEffect('fireball', { x: attacker.x, @@ -19545,13 +19529,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.8, - time: 75 + time: 75, }, { x: defender.x + 40, y: defender.y - 40, z: defender.z, scale: 2, - opacity: 0.5 + opacity: 0.5, }, 'decel', 'explode'); scene.showEffect('fireball', { x: attacker.x, @@ -19559,13 +19543,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.8, - time: 150 + time: 150, }, { x: defender.x - 60, y: defender.y, z: defender.z, scale: 2, - opacity: 0.5 + opacity: 0.5, }, 'decel', 'explode'); scene.showEffect('fireball', { x: attacker.x, @@ -19573,48 +19557,48 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.8, - time: 225 + time: 225, }, { x: defender.x - 20, y: defender.y + 10, z: defender.z, scale: 2, - opacity: 0.5 + opacity: 0.5, }, 'decel', 'explode'); defender.delay(200); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 100 + time: 100, }, 'accel'); - } + }, }, sacredfire: { anim(scene, [attacker, defender]) { @@ -19624,14 +19608,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x, y: defender.y - 40, z: defender.z, scale: 1.5, opacity: 1, - time: 500 + time: 500, }, 'linear', 'fade'); scene.showEffect('bluefireball', { x: attacker.x, @@ -19639,14 +19623,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.2, - time: 50 + time: 50, }, { x: defender.x, y: defender.y - 40, z: defender.z, scale: 1.5, opacity: 1, - time: 550 + time: 550, }, 'linear', 'fade'); scene.showEffect('iceball', { @@ -19655,14 +19639,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.8, scale: 0, - time: 550 + time: 550, }, { x: defender.x, y: defender.y, z: defender.z, scale: 4, opacity: 0.3, - time: 850 + time: 850, }, 'linear', 'fade'); scene.showEffect('iceball', { x: defender.x, @@ -19670,14 +19654,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.8, scale: 0, - time: 650 + time: 650, }, { x: defender.x, y: defender.y, z: defender.z, scale: 4, opacity: 0.3, - time: 950 + time: 950, }, 'linear', 'fade'); scene.showEffect('bluefireball', { @@ -19686,14 +19670,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.8, - time: 550 + time: 550, }, { x: defender.x + 60, y: defender.y - 20, z: defender.z, scale: 1.5, opacity: 0.5, - time: 825 + time: 825, }, 'decel', 'explode'); scene.showEffect('bluefireball', { x: defender.x, @@ -19701,14 +19685,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.8, - time: 575 + time: 575, }, { x: defender.x - 50, y: defender.y - 20, z: defender.z, scale: 1, opacity: 0.5, - time: 850 + time: 850, }, 'decel', 'explode'); scene.showEffect('bluefireball', { x: defender.x, @@ -19716,14 +19700,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.8, - time: 600 + time: 600, }, { x: defender.x - 60, y: defender.y + 20, z: defender.z, scale: 1.5, opacity: 0.5, - time: 875 + time: 875, }, 'decel', 'explode'); scene.showEffect('bluefireball', { x: defender.x, @@ -19731,14 +19715,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.8, - time: 625 + time: 625, }, { x: defender.x + 50, y: defender.y + 30, z: defender.z, scale: 1.5, opacity: 0.5, - time: 900 + time: 900, }, 'decel', 'explode'); scene.showEffect('bluefireball', { x: defender.x, @@ -19746,16 +19730,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.8, - time: 650 + time: 650, }, { x: defender.x - 10, y: defender.y + 60, z: defender.z, scale: 1.5, opacity: 0.5, - time: 925 + time: 925, }, 'decel', 'explode'); - } + }, }, blueflare: { anim(scene, [attacker, defender]) { @@ -19765,13 +19749,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.6, - opacity: 0.8 + opacity: 0.8, }, { x: defender.x + 60, y: defender.y + 40, z: defender.z, scale: 2, - opacity: 0.5 + opacity: 0.5, }, 'decel', 'explode'); scene.showEffect('bluefireball', { x: attacker.x, @@ -19779,13 +19763,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.8, - time: 75 + time: 75, }, { x: defender.x + 40, y: defender.y - 40, z: defender.z, scale: 2, - opacity: 0.5 + opacity: 0.5, }, 'decel', 'explode'); scene.showEffect('bluefireball', { x: attacker.x, @@ -19793,13 +19777,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.8, - time: 150 + time: 150, }, { x: defender.x - 60, y: defender.y, z: defender.z, scale: 2, - opacity: 0.5 + opacity: 0.5, }, 'decel', 'explode'); scene.showEffect('bluefireball', { x: attacker.x, @@ -19807,15 +19791,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.8, - time: 225 + time: 225, }, { x: defender.x - 20, y: defender.y + 10, z: defender.z, scale: 2, - opacity: 0.5 + opacity: 0.5, }, 'decel', 'explode'); - } + }, }, electroweb: { anim(scene, [attacker, defender]) { @@ -19824,14 +19808,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0 + opacity: 0, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.5, opacity: 1, - time: 400 + time: 400, }, 'ballistic', 'explode'); scene.showEffect('web', { x: attacker.x, @@ -19839,14 +19823,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0, - time: 100 + time: 100, }, { x: defender.x + 40, y: defender.y - 20, z: defender.z, scale: 0.5, opacity: 1, - time: 500 + time: 500, }, 'ballistic', 'explode'); scene.showEffect('web', { x: attacker.x, @@ -19854,16 +19838,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0, - time: 200 + time: 200, }, { x: defender.x - 30, y: defender.y - 10, z: defender.z, scale: 0.5, opacity: 1, - time: 600 + time: 600, }, 'ballistic', 'explode'); - } + }, }, fling: { anim(scene, [attacker, defender]) { @@ -19872,16 +19856,16 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0 + opacity: 0, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.4, opacity: 1, - time: 400 + time: 400, }, 'ballistic', 'explode'); - } + }, }, worryseed: { anim(scene, [attacker, defender]) { @@ -19890,16 +19874,16 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0 + opacity: 0, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.4, opacity: 1, - time: 400 + time: 400, }, 'ballistic', 'explode'); - } + }, }, rockthrow: { anim(scene, [attacker, defender]) { @@ -19908,16 +19892,16 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.3, - opacity: 0 + opacity: 0, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1, opacity: 1, - time: 400 + time: 400, }, 'ballistic', 'explode'); - } + }, }, paraboliccharge: { anim(scene, [attacker, defender]) { @@ -19927,11 +19911,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 7, opacity: 0, - time: 0 + time: 0, }, { scale: 0, opacity: 0.5, - time: 400 + time: 400, }, 'linear', 'fade'); scene.showEffect('electroball', { x: attacker.x, @@ -19939,13 +19923,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 7, opacity: 0, - time: 150 + time: 150, }, { scale: 0, opacity: 0.5, - time: 600 + time: 600, }, 'linear', 'fade'); - } + }, }, drainingkiss: { anim(scene, [attacker, defender]) { @@ -19955,13 +19939,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 0 + time: 0, }, { x: attacker.x, y: attacker.y, z: attacker.z, time: 500, - opacity: 0 + opacity: 0, }, 'ballistic2'); scene.showEffect('mistball', { x: defender.x, @@ -19969,13 +19953,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 50 + time: 50, }, { x: attacker.x, y: attacker.y, z: attacker.z, time: 550, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('mistball', { x: defender.x, @@ -19983,35 +19967,35 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 100 + time: 100, }, { x: attacker.x, y: attacker.y, z: attacker.z, time: 600, - opacity: 0 + opacity: 0, }, 'ballistic2Under'); - } + }, }, oblivionwing: { anim(scene, [attacker, defender]) { - var xstep = (defender.x - attacker.x) / 5; - var ystep = (defender.x - 165 - attacker.x) / 5; - var zstep = (defender.z - attacker.z) / 5; + let xstep = (defender.x - attacker.x) / 5; + let ystep = (defender.x - 165 - attacker.x) / 5; + let zstep = (defender.z - attacker.z) / 5; scene.backgroundEffect('#000000', 900, 0.5); - for (var i = 0; i < 5; i++) { + for (let i = 0; i < 5; i++) { scene.showEffect('flareball', { x: attacker.x + xstep * (i + 1), y: (attacker.y + 165) + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 1, opacity: 0.9, - time: 40 * i + 500 + time: 40 * i + 500, }, { opacity: 0, - time: 100 * i + 800 + time: 100 * i + 800, }, 'linear'); } @@ -20021,14 +20005,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.8, opacity: 0.7, - time: 500 + time: 500, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 1.4, opacity: 0.3, - time: 700 + time: 700, }, 'linear', 'explode'); scene.showEffect('blackwisp', { x: attacker.x, @@ -20036,14 +20020,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.8, opacity: 0.7, - time: 575 + time: 575, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 1.4, opacity: 0.3, - time: 775 + time: 775, }, 'linear', 'explode'); scene.showEffect('blackwisp', { x: attacker.x, @@ -20051,14 +20035,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.8, opacity: 0.7, - time: 625 + time: 625, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 1.4, opacity: 0.3, - time: 825 + time: 825, }, 'linear', 'explode'); scene.showEffect('blackwisp', { x: attacker.x, @@ -20066,14 +20050,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.8, opacity: 0.7, - time: 650 + time: 650, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 1.4, opacity: 0.3, - time: 850 + time: 850, }, 'linear', 'explode'); scene.showEffect('blackwisp', { x: attacker.x, @@ -20081,14 +20065,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.8, opacity: 0.7, - time: 700 + time: 700, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 1.4, opacity: 0.3, - time: 900 + time: 900, }, 'linear', 'explode'); scene.showEffect('blackwisp', { x: attacker.x, @@ -20096,14 +20080,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.8, opacity: 0.7, - time: 775 + time: 775, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 1.4, opacity: 0.3, - time: 975 + time: 975, }, 'linear', 'explode'); scene.showEffect('blackwisp', { @@ -20112,14 +20096,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 0.5, - time: 1000 + time: 1000, }, { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.3, opacity: 0, - time: 1500 + time: 1500, }, 'ballistic2'); scene.showEffect('blackwisp', { x: defender.x, @@ -20127,14 +20111,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 0.5, - time: 1050 + time: 1050, }, { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.3, opacity: 0, - time: 1550 + time: 1550, }, 'linear'); scene.showEffect('blackwisp', { x: defender.x, @@ -20142,67 +20126,67 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 0.3, - time: 1100 + time: 1100, }, { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.5, opacity: 0, - time: 1600 + time: 1600, }, 'ballistic2Under'); attacker.anim({ y: defender.y + 120, opacity: 0, - time: 300 + time: 300, }, 'accel'); attacker.delay(725); attacker.anim({ x: attacker.x, y: attacker.y + 40, z: attacker.behind(40), - time: 1 + time: 1, }); attacker.anim({ x: attacker.x, y: attacker.y, z: attacker.z, - time: 250 + time: 250, }, 'decel'); defender.delay(600); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 100 + time: 100, }, 'accel'); - } + }, }, signalbeam: { anim(scene, [attacker, defender]) { @@ -20211,13 +20195,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x, y: defender.y, z: defender.behind(20), opacity: 0.6, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -20225,13 +20209,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.2, - time: 100 + time: 100, }, { x: defender.x + 10, y: defender.y - 5, z: defender.behind(20), opacity: 0.6, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('energyball', { x: attacker.x, @@ -20239,13 +20223,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.2, - time: 200 + time: 200, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(20), opacity: 0.6, - time: 600 + time: 600, }, 'linear', 'explode'); scene.showEffect('energyball', { x: attacker.x, @@ -20253,15 +20237,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.2, - time: 300 + time: 300, }, { x: defender.x, y: defender.y - 5, z: defender.behind(20), opacity: 0.6, - time: 700 + time: 700, }, 'linear', 'explode'); - } + }, }, simplebeam: { anim(scene, [attacker, defender]) { @@ -20270,13 +20254,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.5, - opacity: 0.2 + opacity: 0.2, }, { x: defender.x, y: defender.y, z: defender.behind(20), opacity: 0.6, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -20284,13 +20268,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.2, - time: 100 + time: 100, }, { x: defender.x + 10, y: defender.y - 5, z: defender.behind(20), opacity: 0.6, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -20298,13 +20282,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.2, - time: 200 + time: 200, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(20), opacity: 0.6, - time: 600 + time: 600, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -20312,15 +20296,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.2, - time: 300 + time: 300, }, { x: defender.x, y: defender.y - 5, z: defender.behind(20), opacity: 0.6, - time: 700 + time: 700, }, 'linear', 'explode'); - } + }, }, triattack: { anim(scene, [attacker, defender]) { @@ -20329,11 +20313,11 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 45, z: attacker.z, scale: 0, - opacity: 0.2 + opacity: 0.2, }, { scale: 0.5, opacity: 0.6, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('iceball', { x: attacker.x - 45, @@ -20341,11 +20325,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.2, - time: 100 + time: 100, }, { scale: 0.5, opacity: 0.6, - time: 500 + time: 500, }, 'decel', 'fade'); scene.showEffect('electroball', { x: attacker.x + 45, @@ -20353,11 +20337,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.2, - time: 200 + time: 200, }, { scale: 0.5, opacity: 0.6, - time: 600 + time: 600, }, 'decel', 'fade'); scene.showEffect('flareball', { @@ -20366,13 +20350,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.6, - time: 400 + time: 400, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(5), opacity: 0.8, - time: 700 + time: 700, }, 'accel', 'explode'); scene.showEffect('electroball', { x: attacker.x - 45, @@ -20380,13 +20364,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.6, - time: 500 + time: 500, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(5), opacity: 0.8, - time: 800 + time: 800, }, 'accel', 'explode'); scene.showEffect('iceball', { x: attacker.x + 45, @@ -20394,13 +20378,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.6, - time: 600 + time: 600, }, { x: defender.x - 10, y: defender.y + 5, z: defender.behind(5), opacity: 0.8, - time: 900 + time: 900, }, 'accel', 'explode'); scene.showEffect('fireball', { @@ -20409,11 +20393,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.8, - time: 600 + time: 600, }, { scale: 3, opacity: 0, - time: 900 + time: 900, }, 'linear'); scene.showEffect('lightning', { x: defender.x + 15, @@ -20421,11 +20405,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.8, - time: 700 + time: 700, }, { scale: 5, opacity: 0, - time: 1000 + time: 1000, }, 'linear'); scene.showEffect('icicle', { x: defender.x, @@ -20433,36 +20417,36 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.8, - time: 800 + time: 800, }, { scale: 3, opacity: 0, - time: 1100 + time: 1100, }, 'linear'); defender.delay(675); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 150 + time: 150, }, 'swing'); - } + }, }, hypnosis: { anim(scene, [attacker, defender]) { @@ -20472,11 +20456,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.8, - time: 0 + time: 0, }, { scale: 2, opacity: 0, - time: 400 + time: 400, }, 'decel'); scene.showEffect('mistball', { x: defender.x, @@ -20484,11 +20468,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.8, - time: 100 + time: 100, }, { scale: 2, opacity: 0, - time: 500 + time: 500, }, 'decel'); scene.showEffect('mistball', { x: defender.x, @@ -20496,13 +20480,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.8, - time: 200 + time: 200, }, { scale: 2, opacity: 0, - time: 600 + time: 600, }, 'decel'); - } + }, }, darkvoid: { anim(scene, [attacker, ...defenders]) { @@ -20510,18 +20494,18 @@ const BattleMoveAnims: AnimTable = { defender.anim({ y: defender.y - 80, opacity: 0, - time: 300 + time: 300, }, 'accel'); defender.anim({ y: defender.y, opacity: 0, - time: 200 + time: 200, }); defender.delay(200); defender.anim({ y: defender.y, opacity: 1, - time: 200 + time: 200, }); } const defender = defenders[1] || defenders[0]; @@ -20534,14 +20518,14 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 0.8, - time: 0 + time: 0, }, { scale: 2, xscale: 8, opacity: 0.1, - time: 600 + time: 600, }, 'accel', 'fade'); - } + }, }, roaroftime: { anim(scene, [attacker, defender]) { @@ -20552,12 +20536,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.5, - time: 0 + time: 0, }, { z: attacker.behind(-70), scale: 7, opacity: 0, - time: 400 + time: 400, }, 'linear'); scene.showEffect('iceball', { x: attacker.x, @@ -20565,12 +20549,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.5, - time: 150 + time: 150, }, { z: attacker.behind(-70), scale: 7, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('iceball', { x: attacker.x, @@ -20578,12 +20562,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.5, - time: 300 + time: 300, }, { z: attacker.behind(-70), scale: 7, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('poisonwisp', { @@ -20592,11 +20576,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 900 + time: 900, }, { scale: 5, opacity: 0, - time: 1300 + time: 1300, }, 'decel'); scene.showEffect('waterwisp', { x: defender.x - 40, @@ -20604,11 +20588,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 1050 + time: 1050, }, { scale: 5, opacity: 0, - time: 1450 + time: 1450, }, 'decel'); scene.showEffect('poisonwisp', { x: defender.x + 10, @@ -20616,11 +20600,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 1200 + time: 1200, }, { scale: 5, opacity: 0, - time: 1600 + time: 1600, }, 'decel'); scene.showEffect('waterwisp', { x: defender.x - 10, @@ -20628,43 +20612,43 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 1350 + time: 1350, }, { scale: 5, opacity: 0, - time: 1750 + time: 1750, }, 'decel'); defender.delay(925); defender.anim({ x: defender.x - 30, - time: 75 + time: 75, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x, - time: 100 + time: 100, }); - } + }, }, spacialrend: { anim(scene, [attacker, defender]) { @@ -20675,12 +20659,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 0 + time: 0, }, { x: defender.x + 50, y: defender.y + 10, opacity: 0.5, - time: 300 + time: 300, }, 'accel', 'explode'); scene.showEffect('mistball', { x: defender.x - 30, @@ -20688,12 +20672,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 100 + time: 100, }, { x: defender.x - 50, y: defender.y - 20, opacity: 0.5, - time: 300 + time: 300, }, 'accel', 'explode'); scene.showEffect('mistball', { x: defender.x + 15, @@ -20701,12 +20685,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 200 + time: 200, }, { x: defender.x + 35, y: defender.y + 30, opacity: 0.5, - time: 400 + time: 400, }, 'accel', 'explode'); scene.showEffect('mistball', { x: defender.x - 15, @@ -20714,12 +20698,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 200 + time: 200, }, { x: defender.x - 35, y: defender.y - 40, opacity: 0.5, - time: 400 + time: 400, }, 'accel', 'explode'); scene.showEffect('mistball', { x: defender.x + 10, @@ -20727,11 +20711,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 0.6, - time: 300 + time: 300, }, { scale: 2, opacity: 0, - time: 500 + time: 500, }, 'accel', 'fade'); scene.showEffect('leftslash', { x: defender.x - 10, @@ -20739,11 +20723,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 0.7, - time: 100 + time: 100, }, { scale: 2, opacity: 0, - time: 500 + time: 500, }, 'decel', 'fade'); scene.showEffect(defender.sp, { @@ -20751,24 +20735,24 @@ const BattleMoveAnims: AnimTable = { y: defender.y, z: defender.z, opacity: 0.5, - time: 125 + time: 125, }, { x: defender.x - 5, y: defender.y - 5, z: defender.z - 5, - time: 425 + time: 425, }, 'decel'); scene.showEffect(defender.sp, { x: defender.x - 5, y: defender.y - 5, z: defender.z - 5, opacity: 0.5, - time: 425 + time: 425, }, { x: defender.x, y: defender.y, z: defender.z, - time: 625 + time: 625, }, 'accel'); defender.delay(125); defender.anim({ @@ -20776,14 +20760,14 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 5, z: defender.z + 5, opacity: 0.5, - time: 300 + time: 300, }, 'decel'); defender.anim({ x: defender.x, opacity: 1, - time: 199 + time: 199, }, 'accel'); - } + }, }, sacredsword: { anim(scene, [attacker, defender]) { @@ -20793,33 +20777,33 @@ const BattleMoveAnims: AnimTable = { y: defender.y, z: defender.behind(70), time: 300, - opacity: 0.5 + opacity: 0.5, }, 'accel'); attacker.anim({ x: defender.x, y: defender.x, z: defender.behind(100), opacity: 0, - time: 100 + time: 100, }, 'linear'); attacker.anim({ x: attacker.x, y: attacker.y, z: attacker.behind(70), opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ opacity: 1, - time: 500 + time: 500, }, 'decel'); defender.delay(600); defender.anim({ z: defender.behind(30), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); scene.showEffect('sword', { @@ -20827,12 +20811,12 @@ const BattleMoveAnims: AnimTable = { y: attacker.y - 10, z: attacker.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { y: attacker.y + 10, scale: 1, opacity: 0.4, - time: 300 + time: 300, }, 'decel', 'fade'); scene.showEffect('iceball', { @@ -20841,12 +20825,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 410 + time: 410, }, { x: defender.x + 50, y: defender.y + 10, opacity: 0.5, - time: 710 + time: 710, }, 'accel', 'explode'); scene.showEffect('iceball', { x: defender.x - 30, @@ -20854,12 +20838,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 510 + time: 510, }, { x: defender.x - 50, y: defender.y - 20, opacity: 0.5, - time: 710 + time: 710, }, 'accel', 'explode'); scene.showEffect('iceball', { x: defender.x + 15, @@ -20867,12 +20851,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 610 + time: 610, }, { x: defender.x + 35, y: defender.y + 30, opacity: 0.5, - time: 810 + time: 810, }, 'accel', 'explode'); scene.showEffect('iceball', { x: defender.x - 15, @@ -20880,12 +20864,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 610 + time: 610, }, { x: defender.x - 35, y: defender.y - 40, opacity: 0.5, - time: 910 + time: 910, }, 'accel', 'explode'); scene.showEffect('iceball', { x: defender.x + 10, @@ -20893,11 +20877,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 0.6, - time: 610 + time: 610, }, { scale: 2, opacity: 0, - time: 910 + time: 910, }, 'accel', 'fade'); scene.showEffect('leftslash', { x: defender.x - 10, @@ -20905,23 +20889,23 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 0.6, - time: 610 + time: 610, }, { scale: 2, opacity: 0, - time: 910 + time: 910, }, 'accel', 'fade'); - } + }, }, secretsword: { anim(scene, [attacker, defender]) { defender.delay(400); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); scene.showEffect('sword', { @@ -20929,12 +20913,12 @@ const BattleMoveAnims: AnimTable = { y: attacker.y - 10, z: attacker.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { y: attacker.y + 10, scale: 1, opacity: 0.4, - time: 300 + time: 300, }, 'decel', 'fade'); scene.showEffect('flareball', { @@ -20943,12 +20927,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 400 + time: 400, }, { x: defender.x + 50, y: defender.y + 10, opacity: 0.5, - time: 700 + time: 700, }, 'accel', 'explode'); scene.showEffect('flareball', { x: defender.x - 30, @@ -20956,12 +20940,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 500 + time: 500, }, { x: defender.x - 50, y: defender.y - 20, opacity: 0.5, - time: 700 + time: 700, }, 'accel', 'explode'); scene.showEffect('flareball', { x: defender.x + 15, @@ -20969,12 +20953,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 600 + time: 600, }, { x: defender.x + 35, y: defender.y + 30, opacity: 0.5, - time: 800 + time: 800, }, 'accel', 'explode'); scene.showEffect('flareball', { x: defender.x - 15, @@ -20982,12 +20966,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 600 + time: 600, }, { x: defender.x - 35, y: defender.y - 40, opacity: 0.5, - time: 800 + time: 800, }, 'accel', 'explode'); scene.showEffect('flareball', { x: defender.x + 10, @@ -20995,11 +20979,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 0.6, - time: 700 + time: 700, }, { scale: 2, opacity: 0, - time: 900 + time: 900, }, 'accel', 'fade'); scene.showEffect('leftslash', { x: defender.x - 10, @@ -21007,13 +20991,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1.5, opacity: 0.6, - time: 500 + time: 500, }, { scale: 2, opacity: 0, - time: 900 + time: 900, }, 'accel', 'fade'); - } + }, }, psychocut: { anim(scene, [attacker, defender]) { @@ -21022,14 +21006,14 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 30, z: defender.z, scale: 0.2, - opacity: 1 + opacity: 1, }, { x: defender.x - 70, y: defender.y - 40, z: defender.z, scale: 0.4, opacity: 0.4, - time: 200 + time: 200, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x + 60, @@ -21037,14 +21021,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 100 + time: 100, }, { x: defender.x - 70, y: defender.y - 40, z: defender.z, scale: 0.4, opacity: 0.4, - time: 300 + time: 300, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x + 80, @@ -21052,14 +21036,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 100 + time: 100, }, { x: defender.x - 50, y: defender.y - 60, z: defender.z, scale: 0.4, opacity: 0.4, - time: 300 + time: 300, }, 'linear', 'fade'); scene.showEffect('wisp', { x: defender.x + 80, @@ -21067,16 +21051,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 200 + time: 200, }, { x: defender.x - 50, y: defender.y - 60, z: defender.z, scale: 0.4, opacity: 0.4, - time: 400 + time: 400, }, 'linear', 'fade'); - } + }, }, precipiceblades: { anim(scene, [attacker, defender]) { @@ -21086,13 +21070,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 1 + opacity: 1, }, { x: attacker.x, y: attacker.y, z: attacker.z, scale: 6, - opacity: 0 + opacity: 0, }, 'linear', 'fade'); scene.showEffect('fireball', { @@ -21100,11 +21084,11 @@ const BattleMoveAnims: AnimTable = { y: attacker.y - 35, z: attacker.behind(-50), scale: 0, - opacity: 0.8 + opacity: 0.8, }, { scale: 3, opacity: 0, - time: 200 + time: 200, }, 'linear'); scene.showEffect('rock2', { x: attacker.x, @@ -21113,11 +21097,11 @@ const BattleMoveAnims: AnimTable = { scale: 0.5, yscale: 1.4, opacity: 0.7, - time: 25 + time: 25, }, { y: attacker.y, yscale: 1.5, - time: 250 + time: 250, }, 'decel', 'fade'); scene.showEffect('fireball', { @@ -21126,10 +21110,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-125), scale: 0, opacity: 0.8, - time: 150 + time: 150, }, { scale: 3, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('rock1', { x: attacker.x, @@ -21138,11 +21122,11 @@ const BattleMoveAnims: AnimTable = { scale: 0.5, yscale: 1.5, opacity: 0.7, - time: 175 + time: 175, }, { y: attacker.y, yscale: 1.6, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('fireball', { @@ -21151,10 +21135,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.8, - time: 300 + time: 300, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('rock2', { x: defender.x - 15, @@ -21163,11 +21147,11 @@ const BattleMoveAnims: AnimTable = { scale: 0.5, yscale: 1.6, opacity: 0.7, - time: 350 + time: 350, }, { y: attacker.y, yscale: 1.7, - time: 550 + time: 550, }, 'decel', 'fade'); scene.showEffect('rock2', { x: defender.x + 15, @@ -21176,11 +21160,11 @@ const BattleMoveAnims: AnimTable = { scale: 0.5, yscale: 1.6, opacity: 0.7, - time: 375 + time: 375, }, { y: attacker.y, yscale: 1.7, - time: 575 + time: 575, }, 'decel', 'fade'); scene.showEffect('rock1', { x: defender.x, @@ -21189,43 +21173,43 @@ const BattleMoveAnims: AnimTable = { scale: 0.5, yscale: 1.8, opacity: 0.7, - time: 400 + time: 400, }, { y: defender.y + 10, yscale: 1.9, - time: 600 + time: 600, }, 'accel', 'fade'); defender.delay(325); defender.anim({ x: defender.x - 30, - time: 75 + time: 75, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x, - time: 100 + time: 100, }); - } + }, }, originpulse: { anim(scene, [attacker, defender]) { @@ -21235,26 +21219,26 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 1 + opacity: 1, }, { x: attacker.x, y: attacker.y, z: attacker.z, scale: 6, - opacity: 0 + opacity: 0, }, 'linear', 'fade'); scene.showEffect('waterwisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x + 10, y: defender.y + 5, z: defender.behind(30), scale: 1, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); scene.showEffect('waterwisp', { x: attacker.x, @@ -21262,13 +21246,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.3, - time: 75 + time: 75, }, { x: defender.x - 10, y: defender.y - 5, z: defender.behind(30), scale: 1, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); scene.showEffect('waterwisp', { x: attacker.x, @@ -21276,15 +21260,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.3, - time: 150 + time: 150, }, { x: defender.x, y: defender.y + 5, z: defender.behind(30), scale: 1, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'explode'); - } + }, }, dragonascent: { anim(scene, [attacker, defender]) { @@ -21295,13 +21279,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.8, - time: 400 + time: 400, }, { x: defender.x, y: defender.y, z: defender.behind(5), scale: 2, - time: 700 + time: 700, }, 'accel', 'explode'); scene.showEffect('energyball', { x: attacker.leftof(-25), @@ -21309,13 +21293,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.1, - time: 400 + time: 400, }, { x: defender.x, y: defender.y, z: defender.behind(5), scale: 2, - time: 700 + time: 700, }, 'accel', 'explode'); scene.showEffect('electroball', { @@ -21324,11 +21308,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.7, - time: 650 + time: 650, }, { scale: 4, opacity: 0, - time: 900 + time: 900, }, 'linear', 'fade'); scene.showEffect('energyball', { x: defender.x, @@ -21336,40 +21320,40 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.7, - time: 750 + time: 750, }, { scale: 4, opacity: 0, - time: 1000 + time: 1000, }, 'linear', 'fade'); attacker.anim({ opacity: 0, y: defender.y + 120, - time: 300 + time: 300, }, 'accel'); attacker.delay(625); attacker.anim({ x: attacker.x, y: attacker.y + 40, z: attacker.behind(40), - time: 1 + time: 1, }); attacker.anim({ x: attacker.x, y: attacker.y, z: attacker.z, - time: 250 + time: 250, }, 'decel'); defender.delay(725); defender.anim({ z: defender.behind(20), - time: 250 + time: 250, }, 'decel'); defender.anim({ - time: 200 + time: 200, }, 'swing'); - } + }, }, diamondstorm: { // todo: new animation involving icicles anim(scene, [attacker, defender]) { @@ -21379,14 +21363,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('mistball', { x: attacker.x, @@ -21394,14 +21378,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 275 + time: 275, }, 'linear', 'explode'); scene.showEffect('mistball', { x: attacker.x, @@ -21409,14 +21393,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('mistball', { x: attacker.x, @@ -21424,14 +21408,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 425 + time: 425, }, 'linear', 'explode'); scene.showEffect('mistball', { x: attacker.x, @@ -21439,14 +21423,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('mistball', { x: attacker.x, @@ -21454,16 +21438,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 575 + time: 575, }, 'linear', 'explode'); - } + }, }, dazzlinggleam: { anim(scene, [attacker, defender]) { @@ -21473,14 +21457,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.6, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 1, opacity: 0.3, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -21488,14 +21472,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 1, opacity: 0.3, - time: 275 + time: 275, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -21503,14 +21487,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 1, opacity: 0.3, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -21518,14 +21502,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 1, opacity: 0.3, - time: 425 + time: 425, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -21533,14 +21517,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 1, opacity: 0.3, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -21548,16 +21532,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 1, opacity: 0.3, - time: 575 + time: 575, }, 'linear', 'explode'); - } + }, }, payday: { anim(scene, [attacker, defender]) { @@ -21566,14 +21550,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 0.3, opacity: 0.3, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -21581,14 +21565,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 0.3, opacity: 0.3, - time: 275 + time: 275, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -21596,14 +21580,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 0.3, opacity: 0.3, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -21611,14 +21595,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 0.3, opacity: 0.3, - time: 425 + time: 425, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -21626,14 +21610,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 0.3, opacity: 0.3, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -21641,16 +21625,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.6, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 0.3, opacity: 0.3, - time: 575 + time: 575, }, 'linear', 'explode'); - } + }, }, swift: { anim(scene, [attacker, defender]) { @@ -21659,14 +21643,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.6, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 1, opacity: 0.3, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -21674,14 +21658,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 1, opacity: 0.3, - time: 275 + time: 275, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -21689,14 +21673,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 1, opacity: 0.3, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -21704,14 +21688,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 1, opacity: 0.3, - time: 425 + time: 425, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -21719,14 +21703,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 1, opacity: 0.3, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -21734,16 +21718,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 1, opacity: 0.3, - time: 575 + time: 575, }, 'linear', 'explode'); - } + }, }, leafstorm: { anim(scene, [attacker, defender]) { @@ -21753,14 +21737,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1.1, - opacity: 1 + opacity: 1, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 2, opacity: 0.6, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('leaf2', { x: attacker.x, @@ -21768,14 +21752,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.1, opacity: 1, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 2, opacity: 0.6, - time: 275 + time: 275, }, 'linear', 'explode'); scene.showEffect('energyball', { x: attacker.x, @@ -21783,14 +21767,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 1, opacity: 0.3, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('leaf2', { x: attacker.x, @@ -21798,14 +21782,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.1, opacity: 1, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 2, opacity: 0.6, - time: 425 + time: 425, }, 'linear', 'explode'); scene.showEffect('leaf1', { x: attacker.x, @@ -21813,14 +21797,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.1, opacity: 1, - time: 300 + time: 300, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 2, opacity: 0.6, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('energyball', { x: attacker.x, @@ -21828,46 +21812,46 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 1, opacity: 0.3, - time: 575 + time: 575, }, 'linear', 'explode'); defender.delay(125); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 150 + time: 150, }, 'swing'); - } + }, }, petaldance: { // Work on this later anim(scene, [attacker, defender]) { @@ -21879,13 +21863,13 @@ const BattleMoveAnims: AnimTable = { x: defender.x, y: defender.y + 50, z: defender.behind(-150), - time: 200 + time: 200, }, 'ballistic2'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-100), - time: 100 + time: 100, }, 'accel'); attacker.anim({z: attacker.z, time: 400}, 'swing'); @@ -21895,13 +21879,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 0 + time: 0, }, { x: attacker.x - 45, y: attacker.y - 45, scale: 2, opacity: 0, - time: 300 + time: 300, }, 'decel'); scene.showEffect('petal', { x: attacker.x, @@ -21909,13 +21893,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 150 + time: 150, }, { x: attacker.x + 50, y: attacker.y - 30, scale: 2, opacity: 0, - time: 450 + time: 450, }, 'decel'); scene.showEffect('petal', { x: attacker.x, @@ -21923,13 +21907,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 250 + time: 250, }, { x: attacker.x + 25, y: attacker.y - 60, scale: 2, opacity: 0, - time: 550 + time: 550, }, 'decel'); scene.showEffect('petal', { x: attacker.x, @@ -21937,13 +21921,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 300 + time: 300, }, { x: attacker.x - 40, y: attacker.y - 40, scale: 2, opacity: 0, - time: 600 + time: 600, }, 'decel'); scene.showEffect('mistball', { @@ -21952,14 +21936,14 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-100), scale: 0.6, opacity: 1, - time: 700 + time: 700, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 0.8, opacity: 0.6, - time: 900 + time: 900, }, 'ballistic', 'explode'); scene.showEffect('petal', { x: attacker.x, @@ -21967,14 +21951,14 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-100), scale: 0.7, opacity: 1, - time: 775 + time: 775, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 0.9, opacity: 0.6, - time: 975 + time: 975, }, 'ballistic2Under', 'explode'); scene.showEffect('mistball', { x: attacker.x, @@ -21982,14 +21966,14 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-100), scale: 0.5, opacity: 0.6, - time: 850 + time: 850, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 0.8, opacity: 0.3, - time: 1050 + time: 1050, }, 'ballistic2', 'explode'); scene.showEffect('petal', { x: attacker.x, @@ -21997,14 +21981,14 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-100), scale: 0.6, opacity: 1, - time: 925 + time: 925, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 0.9, opacity: 0.6, - time: 1125 + time: 1125, }, 'ballistic', 'explode'); scene.showEffect('petal', { x: attacker.x, @@ -22012,14 +21996,14 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-100), scale: 0.8, opacity: 1, - time: 1000 + time: 1000, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 1, opacity: 0.6, - time: 1200 + time: 1200, }, 'linear', 'explode'); scene.showEffect('petal', { x: attacker.x, @@ -22027,46 +22011,46 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-100), scale: 0.8, opacity: 0.6, - time: 1075 + time: 1075, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 0.9, opacity: 0.3, - time: 1175 + time: 1175, }, 'ballistic2', 'explode'); defender.delay(825); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 150 + time: 150, }, 'swing'); - } + }, }, petalblizzard: { anim(scene, [attacker, ...defenders]) { @@ -22076,24 +22060,24 @@ const BattleMoveAnims: AnimTable = { defender.delay(350); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); } const defender = defenders[1] || defenders[0]; @@ -22102,13 +22086,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.6, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 80, y: defender.y + 60, z: defender.z, scale: 2, - opacity: 0.3 + opacity: 0.3, }, 'accel', 'explode'); scene.showEffect('petal', { x: attacker.x, @@ -22116,13 +22100,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 60, y: defender.y - 60, z: defender.z, scale: 2, - opacity: 0.3 + opacity: 0.3, }, 'accel', 'explode'); scene.showEffect('petal', { x: attacker.x, @@ -22130,13 +22114,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 80, y: defender.y - 20, z: defender.z, scale: 2, - opacity: 0.3 + opacity: 0.3, }, 'accel', 'explode'); scene.showEffect('petal', { x: attacker.x, @@ -22144,13 +22128,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 60, y: defender.y + 20, z: defender.z, scale: 2, - opacity: 0.3 + opacity: 0.3, }, 'accel', 'explode'); scene.showEffect('petal', { x: attacker.x, @@ -22158,13 +22142,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 275 + time: 275, }, { x: defender.x + 40, y: defender.y - 40, z: defender.z, scale: 2, - opacity: 0.3 + opacity: 0.3, }, 'accel', 'explode'); scene.showEffect('petal', { x: attacker.x, @@ -22172,15 +22156,15 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x - 60, y: defender.y - 30, z: defender.z, scale: 2, - opacity: 0.3 + opacity: 0.3, }, 'accel', 'explode'); - } + }, }, magicalleaf: { anim(scene, [attacker, defender]) { @@ -22189,14 +22173,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1.1, - opacity: 1 + opacity: 1, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 2, opacity: 0.6, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('leaf2', { x: attacker.x, @@ -22204,14 +22188,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.1, opacity: 1, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 2, opacity: 0.6, - time: 275 + time: 275, }, 'linear', 'explode'); scene.showEffect('leaf1', { x: attacker.x, @@ -22219,14 +22203,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.1, opacity: 1, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 2, opacity: 0.6, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('leaf2', { x: attacker.x, @@ -22234,14 +22218,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.1, opacity: 1, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 2, opacity: 0.6, - time: 425 + time: 425, }, 'linear', 'explode'); scene.showEffect('leaf1', { x: attacker.x, @@ -22249,14 +22233,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.1, opacity: 1, - time: 300 + time: 300, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 2, opacity: 0.6, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('leaf2', { x: attacker.x, @@ -22264,16 +22248,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.1, opacity: 1, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 2, opacity: 0.6, - time: 575 + time: 575, }, 'linear', 'explode'); - } + }, }, leafage: { anim(scene, [attacker, defender]) { @@ -22282,13 +22266,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 0.6, - time: 300 + time: 300, }, 'linear', 'explode'); scene.showEffect('energyball', { x: attacker.x, @@ -22296,13 +22280,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 100 + time: 100, }, { x: defender.x + 10, y: defender.y + 5, z: defender.z, opacity: 0.6, - time: 400 + time: 400, }, 'ballistic2', 'explode'); scene.showEffect('energyball', { x: attacker.x, @@ -22310,13 +22294,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 200 + time: 200, }, { x: defender.x - 10, y: defender.y - 10, z: defender.z, opacity: 0.6, - time: 500 + time: 500, }, 'ballistic2Under', 'explode'); scene.showEffect('feather', { @@ -22324,14 +22308,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.2, opacity: 0.1, - time: 300 + time: 300, }, 'linear', 'explode'); scene.showEffect('feather', { x: attacker.x, @@ -22339,14 +22323,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 100 + time: 100, }, { x: defender.x + 10, y: defender.y + 5, z: defender.z, scale: 0.2, opacity: 0.1, - time: 400 + time: 400, }, 'ballistic2', 'explode'); scene.showEffect('feather', { x: attacker.x, @@ -22354,16 +22338,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 200 + time: 200, }, { x: defender.x - 10, y: defender.y - 10, z: defender.z, scale: 0.2, opacity: 0.1, - time: 500 + time: 500, }, 'ballistic2Under', 'explode'); - } + }, }, gunkshot: { anim(scene, [attacker, defender]) { @@ -22372,14 +22356,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 2, opacity: 0.3, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -22387,14 +22371,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 2, opacity: 0.3, - time: 275 + time: 275, }, 'linear', 'explode'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -22402,14 +22386,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 2, opacity: 0.3, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -22417,14 +22401,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 2, opacity: 0.3, - time: 425 + time: 425, }, 'linear', 'explode'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -22432,14 +22416,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 2, opacity: 0.3, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -22447,16 +22431,16 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.6, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 2, opacity: 0.3, - time: 575 + time: 575, }, 'linear', 'explode'); - } + }, }, hyperspacehole: { anim(scene, [attacker, defender]) { @@ -22465,21 +22449,21 @@ const BattleMoveAnims: AnimTable = { attacker.anim({ opacity: 0, y: attacker.y - 80, - time: 300 + time: 300, }, 'swing'); attacker.anim({ x: defender.x, y: defender.y - 80, z: defender.z, opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y + 10, z: defender.z, opacity: 1, - time: 350 + time: 350, }, 'decel'); scene.showEffect('mistball', { x: defender.x, @@ -22487,11 +22471,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.8, - time: 550 + time: 550, }, { scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('mistball', { x: defender.x, @@ -22499,11 +22483,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.8, - time: 650 + time: 650, }, { scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('mistball', { x: defender.x, @@ -22511,37 +22495,37 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.8, - time: 750 + time: 750, }, { scale: 3, opacity: 0, - time: 900 + time: 900, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y - 80, z: defender.z, opacity: 0, - time: 300 + time: 300, }, 'accel'); attacker.anim({ y: attacker.y - 80, opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ time: 300, - opacity: 1 + opacity: 1, }, 'decel'); defender.delay(500); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, hyperspacefury: { anim(scene, [attacker, defender]) { @@ -22551,27 +22535,27 @@ const BattleMoveAnims: AnimTable = { y: defender.y, z: defender.behind(-100), scale: 0.8, - opacity: 0.8 + opacity: 0.8, }, { x: defender.x, y: defender.y, z: defender.behind(-100), scale: 1, - opacity: 1 + opacity: 1, }, 'linear', 'fade'); scene.showEffect('fist', { x: defender.x, y: defender.y, z: defender.behind(-100), scale: 0.6, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 1, opacity: 1, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('fist', { x: defender.x, @@ -22579,14 +22563,14 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-100), scale: 0.6, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 1, opacity: 1, - time: 275 + time: 275, }, 'linear', 'explode'); scene.showEffect('fist', { x: defender.x, @@ -22594,14 +22578,14 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-100), scale: 0.6, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 1, opacity: 1, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('fist', { x: defender.x, @@ -22609,14 +22593,14 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-100), scale: 0.6, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 1, opacity: 1, - time: 425 + time: 425, }, 'linear', 'explode'); scene.showEffect('fist', { x: defender.x, @@ -22624,14 +22608,14 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-100), scale: 0.6, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 1, opacity: 1, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('fist', { x: defender.x, @@ -22639,14 +22623,14 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-100), scale: 0.6, opacity: 0.6, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 1, opacity: 1, - time: 575 + time: 575, }, 'linear', 'explode'); attacker.anim({ @@ -22654,46 +22638,46 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.behind(-20), opacity: 0, - time: 200 + time: 200, }, 'linear'); attacker.anim({ opacity: 0, - time: 300 + time: 300, }, 'linear'); attacker.anim({ opacity: 1, - time: 200 + time: 200, }, 'linear'); defender.delay(125); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 150 + time: 150, }, 'swing'); - } + }, }, poisonjab: { anim(scene, [attacker, defender]) { @@ -22703,14 +22687,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(50), scale: 3, opacity: 0, - time: 700 + time: 700, }, 'linear'); scene.showEffect('poisonwisp', { x: defender.x, @@ -22718,14 +22702,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 500 + time: 500, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(50), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('poisonwisp', { x: defender.x, @@ -22733,41 +22717,41 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 1, - time: 400 + time: 400, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(50), scale: 2, opacity: 0, - time: 800 + time: 800, }, 'linear'); attacker.anim({ x: defender.leftof(20), y: defender.y, z: defender.behind(-20), - time: 400 + time: 400, }, 'ballistic2Under'); attacker.anim({ x: defender.x, y: defender.y, z: defender.z, - time: 50 + time: 50, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2'); defender.delay(425); defender.anim({ x: defender.leftof(-20), y: defender.y, z: defender.behind(20), - time: 50 + time: 50, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, psychoboost: { anim(scene, [attacker, defender]) { @@ -22777,11 +22761,11 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.6, - opacity: 0.5 + opacity: 0.5, }, { scale: 3, opacity: 0.3, - time: 300 + time: 300, }, 'decel', 'fade'); scene.showEffect('mistball', { x: attacker.x, @@ -22789,11 +22773,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.8, opacity: 0.6, - time: 100 + time: 100, }, { scale: 3, opacity: 0.5, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('mistball', { x: attacker.x, @@ -22801,13 +22785,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2, opacity: 0.8, - time: 400 + time: 400, }, { x: defender.x, y: defender.y, z: defender.behind(20), scale: 1.25, - time: 600 + time: 600, }, 'accel', 'explode'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -22815,11 +22799,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.8, opacity: 0.6, - time: 100 + time: 100, }, { scale: 4, opacity: 0.5, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -22827,14 +22811,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2.5, opacity: 0.8, - time: 400 + time: 400, }, { x: defender.x, y: defender.y, z: defender.behind(20), scale: 1.5, opacity: 0.8, - time: 600 + time: 600, }, 'accel', 'explode'); scene.showEffect('mistball', { @@ -22843,12 +22827,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 800 + time: 800, }, { x: defender.x + 50, y: defender.y + 10, opacity: 0.5, - time: 1000 + time: 1000, }, 'accel', 'explode'); scene.showEffect('mistball', { x: defender.x - 30, @@ -22856,12 +22840,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 900 + time: 900, }, { x: defender.x - 50, y: defender.y - 20, opacity: 0.5, - time: 1100 + time: 1100, }, 'accel', 'explode'); scene.showEffect('mistball', { x: defender.x + 15, @@ -22869,12 +22853,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 900 + time: 900, }, { x: defender.x + 35, y: defender.y + 30, opacity: 0.5, - time: 1100 + time: 1100, }, 'accel', 'explode'); scene.showEffect('mistball', { x: defender.x - 15, @@ -22882,31 +22866,31 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 1, - time: 800 + time: 800, }, { x: defender.x - 35, y: defender.y - 40, opacity: 0.5, - time: 1000 + time: 1000, }, 'accel', 'explode'); attacker.delay(400); attacker.anim({ z: attacker.behind(20), - time: 300 + time: 300, }, 'swing'); attacker.anim({ - time: 300 + time: 300, }, 'swing'); defender.delay(600); defender.anim({ z: defender.behind(10), - time: 300 + time: 300, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, bestow: { anim(scene, [attacker, defender]) { @@ -22915,16 +22899,16 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.1, - opacity: 0 + opacity: 0, }, { x: defender.x, y: defender.y, z: defender.z, scale: 0.6, opacity: 1, - time: 400 + time: 400, }, 'ballistic', 'fade'); - } + }, }, finalgambit: { anim(scene, [attacker, defender]) { @@ -22934,41 +22918,41 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.3, - time: 500 + time: 500, }, { scale: 4, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 50 + time: 50, }, { x: defender.x, y: defender.y, z: defender.behind(-5), - time: 350 + time: 350, }, 'accel', 'fade'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 100 + time: 100, }, { x: defender.x, y: defender.y, z: defender.behind(-5), - time: 400 + time: 400, }, 'accel', 'fade'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), - time: 300 + time: 300, }, 'accel'); attacker.anim({ x: defender.x, @@ -22976,24 +22960,24 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-5), scale: 5, opacity: 0, - time: 300 + time: 300, }, 'linear'); attacker.anim({ opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ - time: 300 + time: 300, }, 'linear'); defender.delay(280); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, forestscurse: { anim(scene, [attacker, defender]) { @@ -23001,13 +22985,13 @@ const BattleMoveAnims: AnimTable = { x: defender.x, y: defender.y - 50, z: defender.z, - scale: 0 + scale: 0, }, { y: defender.y, scale: 3, - opacity: 0 + opacity: 0, }, 'accel'); - } + }, }, trickortreat: { anim(scene, [attacker, defender]) { @@ -23015,20 +22999,20 @@ const BattleMoveAnims: AnimTable = { x: defender.x, y: defender.y - 50, z: defender.z, - scale: 0 + scale: 0, }, { y: defender.y, scale: 3, - opacity: 0 + opacity: 0, }, 'accel'); - } + }, }, healpulse: { anim(scene, [attacker, defender]) { - var xf = [1, -1, 1, -1]; - var yf = [1, -1, -1, 1]; - var xf2 = [1, 0, -1, 0]; - var yf2 = [0, 1, 0, -1]; + let xf = [1, -1, 1, -1]; + let yf = [1, -1, -1, 1]; + let xf2 = [1, 0, -1, 0]; + let yf2 = [0, 1, 0, -1]; scene.showEffect('mistball', { x: attacker.x, @@ -23036,11 +23020,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.4, - time: 0 + time: 0, }, { scale: 8, opacity: 0.1, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('mistball', { x: defender.x, @@ -23048,14 +23032,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.3, scale: 0, - time: 300 + time: 300, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2, opacity: 0, - time: 600 + time: 600, }, 'linear'); scene.showEffect('mistball', { x: defender.x, @@ -23063,46 +23047,46 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.3, scale: 0, - time: 500 + time: 500, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2, opacity: 0, - time: 800 + time: 800, }, 'linear'); - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { scene.showEffect('wisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.2, - opacity: 1 + opacity: 1, }, { x: attacker.x + 240 * xf[i], y: attacker.y, z: attacker.z + 137 * yf[i], scale: 0.3, opacity: 0.5, - time: 800 + time: 800, }, 'accel'); scene.showEffect('wisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.2, - opacity: 1 + opacity: 1, }, { x: attacker.x + 339 * xf2[i], y: attacker.y, z: attacker.z + 194 * yf2[i], scale: 0.3, opacity: 0.5, - time: 800 + time: 800, }, 'accel'); } - } + }, }, spite: { anim(scene, [attacker, defender]) { @@ -23112,14 +23096,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, opacity: 1, - scale: 1 + scale: 1, }, { x: defender.x, y: defender.y, z: defender.z, scale: 1.2, opacity: 0, - time: 400 + time: 400, }, 'decel'); scene.showEffect(defender.sp, { x: defender.x, @@ -23127,14 +23111,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, xscale: 1, - time: 200 + time: 200, }, { x: defender.x + 7, y: defender.y, z: defender.z, opacity: 0, xscale: 1.5, - time: 800 + time: 800, }, 'accel'); scene.showEffect(defender.sp, { x: defender.x, @@ -23142,16 +23126,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, xscale: 1, - time: 700 + time: 700, }, { x: defender.x - 7, y: defender.y, z: defender.z, opacity: 0, xscale: 1.5, - time: 1300 + time: 1300, }, 'accel'); - } + }, }, lockon: { anim(scene, [attacker, defender]) { @@ -23160,32 +23144,32 @@ const BattleMoveAnims: AnimTable = { y: defender.y, z: defender.z, scale: 1, - opacity: 0.5 + opacity: 0.5, }, { opacity: 1, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('leftslash', { x: defender.x, y: defender.y, z: defender.z, scale: 1, - opacity: 0.5 + opacity: 0.5, }, { opacity: 1, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('iceball', { x: defender.x, y: defender.y, z: defender.z, scale: 1, - opacity: 1 + opacity: 1, }, { opacity: 0.5, - time: 400 + time: 400, }, 'linear', 'explode'); - } + }, }, mindreader: { anim(scene, [attacker, defender]) { @@ -23194,12 +23178,12 @@ const BattleMoveAnims: AnimTable = { y: defender.y, z: defender.z, opacity: 0, - scale: 2 + scale: 2, }, { opacity: 1, - scale: 0.5 + scale: 0.5, }, 'accel', 'explode'); - } + }, }, memento: { anim(scene, [attacker, defender]) { @@ -23208,12 +23192,12 @@ const BattleMoveAnims: AnimTable = { x: attacker.x, y: attacker.y, z: attacker.z, - opacity: 0 + opacity: 0, }, { y: attacker.y + 600, yscale: 10, opacity: 0.3, - time: 400 + time: 400, }, 'accel', 'fade'); scene.showEffect(attacker.sp, { x: defender.x, @@ -23221,14 +23205,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, yscale: 10, opacity: 0.3, - time: 500 + time: 500, }, { y: defender.y, opacity: 0, yscale: 1, - time: 900 + time: 900, }, 'decel', 'fade'); - } + }, }, spiritshackle: { anim(scene, [attacker, defender]) { @@ -23238,10 +23222,10 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.5 + opacity: 0.5, }, { scale: 3, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('shadowball', { x: attacker.x, @@ -23249,14 +23233,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.1, opacity: 0.4, - time: 0 + time: 0, }, { x: attacker.x, y: attacker.y + 200, z: attacker.z, scale: 0.2, opacity: 0, - time: 300 + time: 300, }, 'decel'); scene.showEffect('shadowball', { @@ -23266,12 +23250,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 575 + time: 575, }, { y: defender.y + 150, z: defender.behind(-10), opacity: 0, - time: 825 + time: 825, }, 'decel'); scene.showEffect('shadowball', { x: defender.x, @@ -23280,23 +23264,23 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 590 + time: 590, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 825 + time: 825, }, 'linear', 'explode'); defender.delay(825); defender.anim({ z: defender.behind(5), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, brutalswing: { anim(scene, [attacker, ...defenders]) { @@ -23306,17 +23290,17 @@ const BattleMoveAnims: AnimTable = { defender.delay(700); defender.anim({ z: defender.behind(10), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 200 + time: 200, }, 'swing'); defender.anim({ z: defender.behind(10), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); scene.showEffect('shadowball', { @@ -23325,11 +23309,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.3, scale: 0, - time: 700 + time: 700, }, { scale: 2, opacity: 0, - time: 1000 + time: 1000, }, 'linear'); scene.showEffect('shadowball', { x: defender.x, @@ -23337,11 +23321,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.3, scale: 0, - time: 900 + time: 900, }, { scale: 2, opacity: 0, - time: 1200 + time: 1200, }, 'linear'); } const defender = defenders[1] || defenders[0]; @@ -23350,16 +23334,16 @@ const BattleMoveAnims: AnimTable = { x: defender.x, y: defender.y + 80, z: defender.behind(-30), - time: 400 + time: 400, }, 'ballistic'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-50), - time: 100 + time: 100, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); scene.showEffect('shadowball', { @@ -23369,14 +23353,14 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 5, opacity: 0.8, - time: 500 + time: 500, }, { scale: 2, xscale: 8, opacity: 0.1, - time: 700 + time: 700, }, 'decel', 'fade'); - } + }, }, revelationdance: { anim(scene, [attacker, defender]) { @@ -23388,11 +23372,11 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 2, opacity: 0.5, - time: 150 + time: 150, }, { scale: 1.5, xscale: 4, - opacity: 0 + opacity: 0, }, 'linear', 'fade'); scene.showEffect('electroball', { x: attacker.x - 20, @@ -23401,11 +23385,11 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 2, opacity: 0.5, - time: 500 + time: 500, }, { scale: 1.5, xscale: 4, - opacity: 0 + opacity: 0, }, 'linear', 'fade'); scene.showEffect('electroball', { x: attacker.x, @@ -23414,11 +23398,11 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 2, opacity: 0.5, - time: 650 + time: 650, }, { scale: 1.5, xscale: 4, - opacity: 0 + opacity: 0, }, 'linear', 'fade'); scene.showEffect('electroball', { x: attacker.x, @@ -23427,12 +23411,12 @@ const BattleMoveAnims: AnimTable = { scale: 0.7, xscale: 1, opacity: 0.8, - time: 900 + time: 900, }, { x: defender.x, y: defender.y, z: defender.behind(5), - time: 1100 + time: 1100, }, 'linear', 'explode'); scene.showEffect('wisp', { x: defender.x + 30, @@ -23440,12 +23424,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 0.6, - time: 1100 + time: 1100, }, { x: defender.x + 50, y: defender.y + 10, opacity: 0.3, - time: 1400 + time: 1400, }, 'accel', 'explode'); scene.showEffect('wisp', { x: defender.x - 30, @@ -23453,12 +23437,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 0.6, - time: 1200 + time: 1200, }, { x: defender.x - 50, y: defender.y - 20, opacity: 0.3, - time: 1400 + time: 1400, }, 'accel', 'explode'); scene.showEffect('wisp', { x: defender.x + 15, @@ -23466,12 +23450,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 0.7, - time: 1300 + time: 1300, }, { x: defender.x + 35, y: defender.y + 30, opacity: 0.3, - time: 1500 + time: 1500, }, 'accel', 'explode'); scene.showEffect('wisp', { x: defender.x - 15, @@ -23479,84 +23463,84 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.2, opacity: 0.7, - time: 1300 + time: 1300, }, { x: defender.x - 35, y: defender.y - 40, opacity: 0.3, - time: 1500 + time: 1500, }, 'accel', 'explode'); attacker.anim({ x: attacker.x + 5, y: attacker.y + 10, - time: 100 + time: 100, }, 'ballistic'); attacker.anim({ x: attacker.x + 10, y: attacker.y, - time: 50 + time: 50, }); attacker.anim({ x: attacker.x - 5, y: attacker.y + 10, - time: 200 + time: 200, }, 'ballistic'); attacker.anim({ x: attacker.x - 10, y: attacker.y, - time: 100 + time: 100, }); attacker.anim({ x: attacker.x - 5, y: attacker.y + 10, - time: 100 + time: 100, }, 'ballistic'); attacker.anim({ x: attacker.x, y: attacker.y, - time: 50 + time: 50, }); attacker.anim({ z: attacker.behind(15), - time: 200 + time: 200, }, 'decel'); attacker.anim({ z: attacker.behind(-15), - time: 100 + time: 100, }, 'accel'); attacker.anim({ z: attacker.z, - time: 300 + time: 300, }, 'swing'); defender.delay(1100); defender.anim({ z: defender.behind(15), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, prismaticlaser: { anim(scene, [attacker, defender]) { - var xstep = (defender.x - attacker.x) / 5; - var ystep = (defender.y - attacker.y) / 5; - var zstep = (defender.z - attacker.z) / 5; + let xstep = (defender.x - attacker.x) / 5; + let ystep = (defender.y - attacker.y) / 5; + let zstep = (defender.z - attacker.z) / 5; - for (var i = 0; i < 5; i++) { + for (let i = 0; i < 5; i++) { scene.showEffect('wisp', { x: attacker.x + xstep * (i + 1), y: attacker.y + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 1, opacity: 1, - time: 20 * i + time: 20 * i, }, { scale: 2, opacity: 0, - time: 40 * i + 600 + time: 40 * i + 600, }, 'linear'); scene.showEffect('poisonwisp', { x: attacker.x + xstep * (i + 1), @@ -23564,11 +23548,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z + zstep * (i + 1), scale: 0.5, opacity: 0.3, - time: 20 * i + time: 20 * i, }, { scale: 2, opacity: 0, - time: 40 * i + 600 + time: 40 * i + 600, }, 'linear'); } scene.backgroundEffect('#000000', 700, 0.6); @@ -23577,14 +23561,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 0.6, opacity: 0.2, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -23592,14 +23576,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 0.6, opacity: 0.2, - time: 275 + time: 275, }, 'linear', 'explode'); scene.showEffect('energyball', { x: attacker.x, @@ -23607,14 +23591,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.2, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -23622,14 +23606,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 0.6, opacity: 0.2, - time: 425 + time: 425, }, 'linear', 'explode'); scene.showEffect('mistball', { x: attacker.x, @@ -23637,14 +23621,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 0.6, opacity: 0.2, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('shadowball', { x: attacker.x, @@ -23652,14 +23636,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.2, - time: 575 + time: 575, }, 'linear', 'explode'); scene.showEffect('iceball', { @@ -23668,11 +23652,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 550 + time: 550, }, { scale: 4, opacity: 0, - time: 750 + time: 750, }, 'linear'); scene.showEffect('iceball', { x: defender.x, @@ -23680,43 +23664,43 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 600 + time: 600, }, { scale: 4, opacity: 0, - time: 800 + time: 800, }, 'linear'); defender.delay(125); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 150 + time: 150, }, 'swing'); - } + }, }, firstimpression: { anim(scene, [attacker, defender]) { @@ -23726,11 +23710,11 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 60, z: attacker.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { scale: 0.25, opacity: 0, - time: 400 + time: 400, }, 'linear'); scene.showEffect('electroball', { x: attacker.x, @@ -23739,22 +23723,22 @@ const BattleMoveAnims: AnimTable = { scale: 0.5, xscale: 0.25, yscale: 0.75, - opacity: 1 + opacity: 1, }, { scale: 0.25, opacity: 0, - time: 400 + time: 400, }, 'linear'); scene.showEffect('electroball', { x: defender.x, y: defender.y + 60, z: defender.z, scale: 0.5, - opacity: 1 + opacity: 1, }, { scale: 0.25, opacity: 0, - time: 400 + time: 400, }, 'linear'); scene.showEffect('electroball', { x: defender.x, @@ -23763,11 +23747,11 @@ const BattleMoveAnims: AnimTable = { scale: 0.5, xscale: 0.25, yscale: 0.75, - opacity: 1 + opacity: 1, }, { scale: 0.25, opacity: 0, - time: 400 + time: 400, }, 'linear'); scene.showEffect('impact', { @@ -23776,11 +23760,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 500 + time: 500, }, { scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('impact', { x: defender.x, @@ -23788,52 +23772,52 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 700 + time: 700, }, { scale: 3, opacity: 0, - time: 1000 + time: 1000, }, 'linear'); attacker.anim({ y: attacker.y + 5, xscale: 0.9, yscale: 1.1, - time: 100 + time: 100, }, 'swing'); attacker.anim({ - time: 100 + time: 100, }, 'swing'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-5), - time: 300 + time: 300, }, 'accel'); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.anim({ y: defender.y + 5, xscale: 0.9, yscale: 1.1, - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 100 + time: 100, }, 'swing'); defender.delay(280); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, shoreup: { - anim: BattleOtherAnims.lightstatus.anim + anim: BattleOtherAnims.lightstatus.anim, }, firelash: { anim(scene, [attacker, defender]) { @@ -23843,14 +23827,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 450 + time: 450, }, { x: defender.x, y: defender.y - 40, z: defender.behind(15), scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('fireball', { x: defender.x, @@ -23858,17 +23842,17 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 550 + time: 550, }, { x: defender.x, y: defender.y - 40, z: defender.behind(15), scale: 3, opacity: 0, - time: 900 + time: 900, }, 'linear'); BattleOtherAnims.contactattack.anim(scene, [attacker, defender]); - } + }, }, powertrip: { anim(scene, [attacker, defender]) { @@ -23878,11 +23862,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.4, - time: 100 + time: 100, }, { y: attacker.y + 60, opacity: 0.2, - time: 500 + time: 500, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x - 30, @@ -23890,11 +23874,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.4, - time: 200 + time: 200, }, { y: defender.y + 60, opacity: 0.2, - time: 600 + time: 600, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x + 15, @@ -23902,11 +23886,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.4, - time: 300 + time: 300, }, { y: attacker.y + 60, opacity: 0.2, - time: 700 + time: 700, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x - 15, @@ -23914,11 +23898,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.4, - time: 400 + time: 400, }, { y: attacker.y + 60, opacity: 0.2, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('wisp', { @@ -23927,14 +23911,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.5, opacity: 0.1, - time: 500 + time: 500, }, { x: attacker.leftof(-30), y: attacker.y + 20, z: attacker.behind(-50), scale: 1, opacity: 0.3, - time: 800 + time: 800, }, 'ballistic2Under', 'fade'); scene.showEffect('wisp', { @@ -23943,67 +23927,67 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 1250 + time: 1250, }, { x: defender.leftof(-20), y: defender.y, z: defender.behind(30), scale: 1.5, opacity: 0, - time: 1450 + time: 1450, }, 'linear'); attacker.anim({ y: attacker.y + 5, xscale: 0.9, yscale: 1.1, - time: 100 + time: 100, }, 'swing'); attacker.anim({ - time: 100 + time: 100, }, 'swing'); attacker.anim({ y: attacker.y + 5, xscale: 0.9, yscale: 1.1, - time: 100 + time: 100, }, 'swing'); attacker.anim({ - time: 100 + time: 100, }, 'swing'); attacker.anim({ y: attacker.y + 5, xscale: 0.9, yscale: 1.1, - time: 100 + time: 100, }, 'swing'); attacker.anim({ - time: 100 + time: 100, }, 'swing'); attacker.delay(200); attacker.anim({ x: defender.x, y: defender.y + 80, z: defender.behind(-30), - time: 400 + time: 400, }, 'ballistic'); attacker.anim({ x: defender.x, y: defender.y + 5, z: defender.z, - time: 100 + time: 100, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(1250); defender.anim({ z: defender.behind(20), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, smartstrike: { anim(scene, [attacker, defender]) { @@ -24012,30 +23996,30 @@ const BattleMoveAnims: AnimTable = { y: defender.y, z: defender.z, scale: 1, - opacity: 0.5 + opacity: 0.5, }, { opacity: 1, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('leftslash', { x: defender.x, y: defender.y, z: defender.z, scale: 1, - opacity: 0.5 + opacity: 0.5, }, { opacity: 1, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('iceball', { x: defender.x, y: defender.y, z: defender.z, scale: 1, - opacity: 1 + opacity: 1, }, { opacity: 0.5, - time: 400 + time: 400, }, 'linear', 'explode'); scene.showEffect('wisp', { @@ -24044,11 +24028,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 860 + time: 860, }, { scale: 2, opacity: 0, - time: 1160 + time: 1160, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -24056,35 +24040,35 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 910 + time: 910, }, { scale: 2, opacity: 0, - time: 1210 + time: 1210, }, 'linear'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 550 + time: 550, }, { x: defender.x, y: defender.y, z: defender.behind(70), - time: 850 + time: 850, }, 'accel', 'fade'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 0.3, - time: 600 + time: 600, }, { x: defender.x, y: defender.y, z: defender.behind(70), - time: 900 + time: 900, }, 'accel', 'fade'); attacker.delay(500); attacker.anim({ @@ -24092,35 +24076,35 @@ const BattleMoveAnims: AnimTable = { y: defender.y, z: defender.behind(70), time: 300, - opacity: 0.5 + opacity: 0.5, }, 'accel'); attacker.anim({ x: defender.x, y: defender.x, z: defender.behind(100), opacity: 0, - time: 100 + time: 100, }, 'linear'); attacker.anim({ x: attacker.x, y: attacker.y, z: attacker.behind(70), opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ opacity: 1, - time: 500 + time: 500, }, 'decel'); defender.delay(760); defender.anim({ z: defender.behind(30), - time: 100 + time: 100, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, spotlight: { anim(scene, [attacker, defender]) { @@ -24130,7 +24114,7 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 30, z: attacker.z, scale: 0.4, - opacity: 1 + opacity: 1, }, { x: attacker.x + 30, y: attacker.y + 35, @@ -24138,7 +24122,7 @@ const BattleMoveAnims: AnimTable = { xscale: 0.3, yscale: 0.6, opacity: 1, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('pointer', { x: attacker.x + 30, @@ -24148,7 +24132,7 @@ const BattleMoveAnims: AnimTable = { xscale: 0.3, yscale: 0.6, opacity: 1, - time: 400 + time: 400, }, { x: attacker.x + 60, y: attacker.y + 30, @@ -24156,43 +24140,43 @@ const BattleMoveAnims: AnimTable = { xscale: 0.4, yscale: 0.4, opacity: 0, - time: 900 + time: 900, }, 'linear'); defender.delay(400); defender.anim({ y: defender.y + 15, - time: 150 + time: 150, }, 'decel'); defender.anim({ - time: 150 + time: 150, }, 'accel'); defender.anim({ y: defender.y + 15, - time: 150 + time: 150, }, 'decel'); defender.anim({ - time: 150 + time: 150, }, 'accel'); - } + }, }, anchorshot: { anim(scene, [attacker, defender]) { - var xstep = (defender.x - attacker.x) / 5; - var ystep = (defender.y - attacker.y) / 5; - var zstep = (defender.z - attacker.z) / 5; + let xstep = (defender.x - attacker.x) / 5; + let ystep = (defender.y - attacker.y) / 5; + let zstep = (defender.z - attacker.z) / 5; - for (var i = 0; i < 5; i++) { + for (let i = 0; i < 5; i++) { scene.showEffect('energyball', { x: attacker.x + xstep * (i + 1), y: attacker.y + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 0.5, opacity: 1, - time: 20 * i + time: 20 * i, }, { opacity: 0, - time: 40 * i + 600 + time: 40 * i + 600, }, 'linear'); } scene.showEffect('energyball', { @@ -24202,12 +24186,12 @@ const BattleMoveAnims: AnimTable = { scale: 0.7, xscale: 2, opacity: 0.3, - time: 300 + time: 300, }, { scale: 0.4, xscale: 1, opacity: 0.1, - time: 900 + time: 900, }, 'decel', 'fade'); scene.showEffect('energyball', { x: defender.x, @@ -24216,12 +24200,12 @@ const BattleMoveAnims: AnimTable = { scale: 0.7, xscale: 2, opacity: 0.3, - time: 350 + time: 350, }, { scale: 0.4, xscale: 1, opacity: 0.1, - time: 950 + time: 950, }, 'decel', 'fade'); scene.showEffect('energyball', { x: defender.x, @@ -24230,22 +24214,22 @@ const BattleMoveAnims: AnimTable = { scale: 0.7, xscale: 2, opacity: 0.3, - time: 400 + time: 400, }, { scale: 0.4, xscale: 1, opacity: 0.1, - time: 1000 + time: 1000, }, 'decel', 'fade'); defender.delay(300); defender.anim({ y: defender.y + 15, z: defender.behind(10), yscale: 1.3, - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 200 + time: 200, }, 'swing'); defender.delay(25); defender.anim({ @@ -24253,12 +24237,12 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 15, z: defender.behind(5), yscale: 1.3, - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 200 + time: 200, }, 'swing'); - } + }, }, clangingscales: { anim(scene, [attacker, defender]) { @@ -24268,25 +24252,25 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.behind(-5), scale: 1, - opacity: 0.5 + opacity: 0.5, }, { z: attacker.behind(-10), scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('shadowball', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.4, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 200 + time: 200, }, 'linear', 'explode'); scene.showEffect('shadowball', { x: attacker.x, @@ -24294,14 +24278,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 275 + time: 275, }, 'linear', 'explode'); scene.showEffect('shadowball', { x: attacker.x, @@ -24309,14 +24293,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 350 + time: 350, }, 'linear', 'explode'); scene.showEffect('shadowball', { x: attacker.x, @@ -24324,14 +24308,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 425 + time: 425, }, 'linear', 'explode'); scene.showEffect('shadowball', { x: attacker.x, @@ -24339,14 +24323,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 500 + time: 500, }, 'linear', 'explode'); scene.showEffect('shadowball', { x: attacker.x, @@ -24354,14 +24338,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 575 + time: 575, }, 'linear', 'explode'); scene.showEffect('shadowball', { @@ -24370,11 +24354,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 550 + time: 550, }, { scale: 4, opacity: 0, - time: 750 + time: 750, }, 'linear'); scene.showEffect('shadowball', { x: defender.x, @@ -24382,43 +24366,43 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 600 + time: 600, }, { scale: 4, opacity: 0, - time: 800 + time: 800, }, 'linear'); defender.delay(125); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 150 + time: 150, }, 'swing'); - } + }, }, spectralthief: { anim(scene, [attacker, defender]) { @@ -24430,36 +24414,36 @@ const BattleMoveAnims: AnimTable = { scale: 0.5, xscale: 0.5, yscale: 1, - opacity: 0.5 + opacity: 0.5, }, { scale: 2, xscale: 4, opacity: 0.1, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x, y: attacker.y - 25, z: attacker.z, - scale: 1 + scale: 1, }, { x: attacker.x + 50, scale: 3, xscale: 3.5, opacity: 0.5, - time: 500 + time: 500, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x, y: attacker.y - 25, z: attacker.z, - scale: 1 + scale: 1, }, { x: attacker.x - 50, scale: 3, xscale: 3.5, opacity: 0.5, - time: 500 + time: 500, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { @@ -24468,12 +24452,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2, opacity: 0.3, - time: 300 + time: 300, }, { x: defender.x - 50, y: defender.y - 40, z: defender.z, - time: 900 + time: 900, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x - 50, @@ -24481,12 +24465,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2, opacity: 0.3, - time: 400 + time: 400, }, { x: defender.x - 50, y: defender.y - 40, z: defender.z, - time: 900 + time: 900, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -24494,12 +24478,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2, opacity: 0.3, - time: 450 + time: 450, }, { x: defender.x, y: defender.y - 40, z: defender.z, - time: 925 + time: 925, }, 'decel', 'fade'); scene.showEffect('shadowball', { @@ -24510,12 +24494,12 @@ const BattleMoveAnims: AnimTable = { xscale: 0.5, yscale: 1, opacity: 0.5, - time: 750 + time: 750, }, { scale: 2, xscale: 4, opacity: 0.1, - time: 1200 + time: 1200, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: defender.x, @@ -24523,12 +24507,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 2, opacity: 0.3, - time: 750 + time: 750, }, { x: defender.x + 75, opacity: 1, scale: 3, - time: 1200 + time: 1200, }, 'linear', 'explode'); scene.showEffect('poisonwisp', { x: defender.x, @@ -24536,12 +24520,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 2, opacity: 0.3, - time: 750 + time: 750, }, { x: defender.x - 75, opacity: 1, scale: 3, - time: 1200 + time: 1200, }, 'linear', 'explode'); scene.showEffect(attacker.sp, { @@ -24550,11 +24534,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 3, opacity: 0.3, - time: 700 + time: 700, }, { y: defender.y + 600, yscale: 10, - time: 1200 + time: 1200, }, 'linear', 'fade'); scene.showEffect(attacker.sp, { x: defender.x + 30, @@ -24562,11 +24546,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 3, opacity: 0.3, - time: 800 + time: 800, }, { y: defender.y + 600, yscale: 10, - time: 1300 + time: 1300, }, 'linear', 'fade'); scene.showEffect(attacker.sp, { x: defender.x - 30, @@ -24574,11 +24558,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 3, opacity: 0.3, - time: 900 + time: 900, }, { y: defender.y + 600, yscale: 10, - time: 1400 + time: 1400, }, 'linear', 'fade'); scene.showEffect(attacker.sp, { x: defender.x - 15, @@ -24586,11 +24570,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 3, opacity: 0.3, - time: 1000 + time: 1000, }, { y: defender.y + 600, yscale: 10, - time: 1500 + time: 1500, }, 'linear', 'fade'); scene.showEffect(attacker.sp, { x: defender.x - 15, @@ -24598,11 +24582,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 3, opacity: 0.3, - time: 1100 + time: 1100, }, { y: defender.y + 600, yscale: 10, - time: 1600 + time: 1600, }, 'linear', 'fade'); scene.showEffect('impact', { @@ -24611,11 +24595,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 0.6, opacity: 0.5, - time: 700 + time: 700, }, { scale: 1, opacity: 0, - time: 900 + time: 900, }, 'linear'); scene.showEffect('impact', { x: defender.x + 25, @@ -24623,11 +24607,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 0.6, opacity: 0.5, - time: 800 + time: 800, }, { scale: 1, opacity: 0, - time: 1000 + time: 1000, }, 'linear'); scene.showEffect('impact', { x: defender.x - 25, @@ -24635,11 +24619,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 0.6, opacity: 0.5, - time: 900 + time: 900, }, { scale: 1, opacity: 0, - time: 1100 + time: 1100, }, 'linear'); scene.showEffect('impact', { x: defender.x + 2, @@ -24647,11 +24631,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 0.6, opacity: 0.5, - time: 1000 + time: 1000, }, { scale: 1, opacity: 0, - time: 1200 + time: 1200, }, 'linear'); scene.showEffect('impact', { x: defender.x - 20, @@ -24659,11 +24643,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 0.6, opacity: 0.2, - time: 1100 + time: 1100, }, { scale: 1, opacity: 0, - time: 1300 + time: 1300, }, 'linear'); scene.showEffect('poisonwisp', { @@ -24671,69 +24655,69 @@ const BattleMoveAnims: AnimTable = { y: attacker.y - 30, z: attacker.z, scale: 1, - time: 1700 + time: 1700, }, { x: attacker.x + 70, scale: 0.8, opacity: 0, - time: 2200 + time: 2200, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x, y: attacker.y - 30, z: attacker.z, scale: 1, - time: 1700 + time: 1700, }, { x: attacker.x - 70, scale: 0.8, opacity: 0, - time: 2200 + time: 2200, }, 'linear', 'fade'); attacker.anim({ opacity: 0, y: attacker.y - 40, - time: 200 + time: 200, }, 'swing'); attacker.delay(1200); attacker.anim({ opacity: 0, y: attacker.y + 60, - time: 1 + time: 1, }); attacker.anim({ - time: 200 + time: 200, }, 'swing'); defender.delay(725); defender.anim({ x: defender.x - 30, - time: 75 + time: 75, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x, - time: 100 + time: 100, }); - } + }, }, plasmafists: { anim(scene, [attacker, defender]) { @@ -24746,11 +24730,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.5, opacity: 0.1, - time: 0 + time: 0, }, { scale: 0.5, opacity: 0.5, - time: 200 + time: 200, }, 'linear', 'fade'); scene.showEffect('iceball', { x: attacker.x, @@ -24758,11 +24742,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.7, - time: 100 + time: 100, }, { scale: 1, opacity: 0, - time: 300 + time: 300, }, 'linear'); scene.showEffect('electroball', { x: attacker.x, @@ -24770,11 +24754,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.5, opacity: 0.1, - time: 200 + time: 200, }, { scale: 0.5, opacity: 0.5, - time: 400 + time: 400, }, 'linear', 'fade'); scene.showEffect('iceball', { x: attacker.x, @@ -24782,11 +24766,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 0.7, - time: 300 + time: 300, }, { scale: 1, opacity: 0, - time: 500 + time: 500, }, 'linear'); scene.showEffect('electroball', { @@ -24797,11 +24781,11 @@ const BattleMoveAnims: AnimTable = { xscale: 0.25, yscale: 0.75, opacity: 0.5, - time: 900 + time: 900, }, { scale: 2, xscale: 3.5, - opacity: 0.1 + opacity: 0.1, }, 'decel', 'fade'); scene.showEffect('fist1', { x: defender.x - 10, @@ -24809,13 +24793,13 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-70), scale: 0.8, opacity: 0.8, - time: 800 + time: 800, }, { y: defender.y - 15, z: defender.behind(-65), scale: 1, opacity: 1, - time: 900 + time: 900, }, 'accel', 'explode'); scene.showEffect('fist1', { x: defender.x + 10, @@ -24823,13 +24807,13 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-70), scale: 0.8, opacity: 0.8, - time: 800 + time: 800, }, { y: defender.y - 15, z: defender.behind(-65), scale: 1, opacity: 1, - time: 900 + time: 900, }, 'accel', 'explode'); scene.showEffect('lightning', { x: defender.x - 20, @@ -24837,7 +24821,7 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-75), yscale: 0, xscale: 2, - time: 900 + time: 900, }, { x: defender.x, y: defender.y + 15, @@ -24846,7 +24830,7 @@ const BattleMoveAnims: AnimTable = { yscale: 1, xscale: 1.5, opacity: 1, - time: 1200 + time: 1200, }, 'ballistic2Under', 'explode'); scene.showEffect('lightning', { x: defender.x + 20, @@ -24854,7 +24838,7 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-75), yscale: 0, xscale: 2, - time: 1000 + time: 1000, }, { x: defender.x, y: defender.y + 15, @@ -24863,7 +24847,7 @@ const BattleMoveAnims: AnimTable = { yscale: 1, xscale: 1.5, opacity: 1, - time: 1300 + time: 1300, }, 'linear', 'explode'); scene.showEffect('lightning', { x: defender.x - 20, @@ -24871,7 +24855,7 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-75), yscale: 0, xscale: 2, - time: 1100 + time: 1100, }, { x: defender.x, y: defender.y + 15, @@ -24880,7 +24864,7 @@ const BattleMoveAnims: AnimTable = { yscale: 1, xscale: 1.5, opacity: 1, - time: 1400 + time: 1400, }, 'ballistic2Under', 'explode'); scene.showEffect('lightning', { x: defender.x + 20, @@ -24888,7 +24872,7 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-75), yscale: 0, xscale: 2, - time: 1200 + time: 1200, }, { x: defender.x, y: defender.y + 15, @@ -24897,7 +24881,7 @@ const BattleMoveAnims: AnimTable = { yscale: 1, xscale: 1.5, opacity: 1, - time: 1500 + time: 1500, }, 'linear', 'explode'); scene.showEffect('electroball', { x: defender.x - 10, @@ -24905,11 +24889,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.75, - time: 1050 + time: 1050, }, { scale: 2.5, opacity: 0, - time: 1400 + time: 1400, }, 'linear'); scene.showEffect('electroball', { x: defender.x + 10, @@ -24917,11 +24901,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.75, - time: 1250 + time: 1250, }, { scale: 2.5, opacity: 0, - time: 1600 + time: 1600, }, 'linear'); scene.showEffect('electroball', { x: defender.x, @@ -24929,60 +24913,60 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.75, - time: 1450 + time: 1450, }, { scale: 2.5, opacity: 0, - time: 1800 + time: 1800, }, 'linear'); attacker.delay(400); attacker.anim({ x: defender.x, y: defender.y + 80, z: defender.behind(-125), - time: 400 + time: 400, }, 'ballistic'); attacker.anim({ x: defender.x, y: defender.y + 5, z: defender.behind(-75), - time: 100 + time: 100, }); attacker.anim({ - time: 600 + time: 600, }, 'ballistic2Back'); defender.delay(1000); defender.anim({ x: defender.x - 12.5, - time: 75 + time: 75, }); defender.anim({ x: defender.x + 12.5, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 12.5, - time: 100 + time: 100, }); defender.anim({ x: defender.x + 12.5, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 12.5, - time: 100 + time: 100, }); defender.anim({ x: defender.x, - time: 100 + time: 100, }); - } + }, }, sunsteelstrike: { anim(scene, [attacker, defender]) { - var xstep = (defender.x - attacker.x) / 5; - var ystep = (defender.x - 200 - attacker.x) / 5; - var zstep = (defender.z - attacker.z) / 5; + let xstep = (defender.x - attacker.x) / 5; + let ystep = (defender.x - 200 - attacker.x) / 5; + let zstep = (defender.z - attacker.z) / 5; scene.backgroundEffect('linear-gradient(#390000 30%, #B84038)', 500, 0.6); scene.backgroundEffect('linear-gradient(#FFFFFF 30%, #B84038)', 1200, 0.6, 500); @@ -24993,24 +24977,24 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2.5, opacity: 1, - time: 500 + time: 500, }, { scale: 3, opacity: 0, - time: 1200 + time: 1200, }, 'decel'); - for (var i = 0; i < 5; i++) { + for (let i = 0; i < 5; i++) { scene.showEffect('flareball', { x: attacker.x + xstep * (i + 1), y: (attacker.y + 200) + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 2, opacity: 0.4, - time: 40 * i + 700 + time: 40 * i + 700, }, { scale: 1.5, opacity: 0, - time: 60 * i + 1500 + time: 60 * i + 1500, }, 'linear'); } scene.showEffect('flareball', { @@ -25020,12 +25004,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 0.5, - time: 1075 + time: 1075, }, { scale: 3, xscale: 8, opacity: 0.1, - time: 1675 + time: 1675, }, 'linear', 'fade'); scene.showEffect('fireball', { x: defender.x, @@ -25033,11 +25017,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 0, opacity: 1, - time: 1075 + time: 1075, }, { scale: 8, opacity: 0, - time: 1375 + time: 1375, }, 'linear'); scene.showEffect('fireball', { x: defender.x, @@ -25045,23 +25029,23 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(10), scale: 0, opacity: 1, - time: 1175 + time: 1175, }, { scale: 8, opacity: 0, - time: 1575 + time: 1575, }, 'linear'); attacker.anim({ y: defender.y + 120, opacity: 0, - time: 300 + time: 300, }, 'accel'); attacker.delay(425); attacker.anim({ y: defender.y + 200, opacity: 1, - time: 1 + time: 1, }, 'accel'); attacker.anim({ x: defender.x, @@ -25069,43 +25053,43 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 1, - time: 350 + time: 350, }, 'accel'); attacker.anim({ x: defender.leftof(50), y: defender.y - 20, z: defender.z, opacity: 0, - time: 75 + time: 75, }); attacker.delay(300); attacker.anim({ x: attacker.x, y: attacker.y + 40, z: attacker.behind(40), - time: 1 + time: 1, }); attacker.anim({ x: attacker.x, y: attacker.y, z: attacker.z, - time: 250 + time: 250, }, 'decel'); defender.delay(1075); defender.anim({ z: defender.behind(30), - time: 400 + time: 400, }, 'decel'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, moongeistbeam: { anim(scene, [attacker, defender]) { - var xstep = (defender.x - attacker.x) / 5; - var ystep = (defender.x - 200 - attacker.x) / 5; - var zstep = (defender.z - attacker.z) / 5; + let xstep = (defender.x - attacker.x) / 5; + let ystep = (defender.x - 200 - attacker.x) / 5; + let zstep = (defender.z - attacker.z) / 5; scene.backgroundEffect('#000000', 600, 0.6); scene.backgroundEffect('linear-gradient(#000000 10%, #2630A9)', 1100, 0.6, 600); @@ -25116,24 +25100,24 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2.5, opacity: 1, - time: 500 + time: 500, }, { scale: 3, opacity: 0, - time: 1300 + time: 1300, }, 'decel'); - for (var i = 0; i < 5; i++) { + for (let i = 0; i < 5; i++) { scene.showEffect('wisp', { x: attacker.x + xstep * (i + 1), y: (attacker.y + 200) + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 2.5, opacity: 1, - time: 40 * i + 700 + time: 40 * i + 700, }, { scale: 2, opacity: 0, - time: 60 * i + 1500 + time: 60 * i + 1500, }, 'linear'); } scene.showEffect('iceball', { @@ -25142,14 +25126,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 800 + time: 800, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 1000 + time: 1000, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -25157,14 +25141,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 875 + time: 875, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 0.6, opacity: 0.3, - time: 1075 + time: 1075, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -25172,14 +25156,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 950 + time: 950, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 1150 + time: 1150, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -25187,14 +25171,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 1025 + time: 1025, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 1225 + time: 1225, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -25202,14 +25186,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 1100 + time: 1100, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 0.6, opacity: 0.3, - time: 1300 + time: 1300, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -25217,14 +25201,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 1175 + time: 1175, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 0.6, opacity: 0.3, - time: 1375 + time: 1375, }, 'linear', 'explode'); scene.showEffect('iceball', { x: defender.x, @@ -25233,12 +25217,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 0.5, - time: 1375 + time: 1375, }, { scale: 3, xscale: 8, opacity: 0.1, - time: 1675 + time: 1675, }, 'linear', 'explode'); scene.showEffect('bluefireball', { x: defender.x, @@ -25246,11 +25230,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 0, opacity: 1, - time: 1175 + time: 1175, }, { scale: 8, opacity: 0, - time: 1375 + time: 1375, }, 'linear'); scene.showEffect('bluefireball', { x: defender.x, @@ -25258,68 +25242,68 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(10), scale: 0, opacity: 1, - time: 1275 + time: 1275, }, { scale: 8, opacity: 0, - time: 1675 + time: 1675, }, 'linear'); attacker.anim({ y: defender.y + 120, opacity: 0, - time: 300 + time: 300, }, 'accel'); attacker.delay(1150); attacker.anim({ x: attacker.x, y: attacker.y + 40, z: attacker.behind(40), - time: 1 + time: 1, }); attacker.anim({ x: attacker.x, y: attacker.y, z: attacker.z, - time: 250 + time: 250, }, 'decel'); defender.delay(775); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(10), - time: 300 + time: 300, }, 'decel'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, photongeyser: { anim(scene, [attacker, defender]) { @@ -25331,10 +25315,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0, opacity: 1, - time: 0 + time: 0, }, { scale: 0.6, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('shadowball', { x: attacker.x, @@ -25342,10 +25326,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0, opacity: 1, - time: 200 + time: 200, }, { scale: 0.8, - time: 600 + time: 600, }, 'decel', 'fade'); scene.showEffect('shadowball', { x: attacker.x, @@ -25353,10 +25337,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0, opacity: 1, - time: 400 + time: 400, }, { scale: 1, - time: 800 + time: 800, }, 'decel', 'explode'); scene.showEffect('flareball', { x: attacker.x, @@ -25364,10 +25348,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0, opacity: 0.5, - time: 0 + time: 0, }, { scale: 0.8, - time: 800 + time: 800, }, 'linear', 'fade'); scene.showEffect('electroball', { x: attacker.x, @@ -25375,10 +25359,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0.3, opacity: 1, - time: 800 + time: 800, }, { scale: 1.2, - time: 1300 + time: 1300, }, 'linear', 'fade'); scene.showEffect('energyball', { x: attacker.x, @@ -25386,10 +25370,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0.3, opacity: 0.3, - time: 800 + time: 800, }, { scale: 1.2, - time: 1300 + time: 1300, }, 'linear', 'fade'); scene.showEffect('electroball', { x: attacker.x, @@ -25397,12 +25381,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 1.2, opacity: 0.8, - time: 1300 + time: 1300, }, { x: defender.x, y: defender.y, z: defender.z, - time: 1500 + time: 1500, }, 'linear', 'explode'); scene.showEffect('electroball', { x: attacker.x, @@ -25410,12 +25394,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 1.2, opacity: 0.3, - time: 1300 + time: 1300, }, { x: defender.x, y: defender.y, z: defender.z, - time: 1500 + time: 1500, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -25423,10 +25407,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 0.2, opacity: 1, - time: 0 + time: 0, }, { scale: 0.5, - time: 1200 + time: 1200, }, 'decel', 'fade'); scene.showEffect('wisp', { x: attacker.x, @@ -25434,9 +25418,9 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 2, opacity: 1, - time: 900 + time: 900, }, { - time: 1200 + time: 1200, }, 'decel', 'fade'); scene.showEffect('wisp', { x: attacker.x, @@ -25444,13 +25428,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-20), scale: 2, opacity: 1, - time: 1300 + time: 1300, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2.5, - time: 1500 + time: 1500, }, 'linear', 'explode'); scene.showEffect('electroball', { @@ -25460,12 +25444,12 @@ const BattleMoveAnims: AnimTable = { scale: 0, xscale: 0, opacity: 0.5, - time: 1500 + time: 1500, }, { scale: 2, xscale: 12, opacity: 0, - time: 2500 + time: 2500, }, 'accel'); scene.showEffect('wisp', { x: defender.x, @@ -25475,10 +25459,10 @@ const BattleMoveAnims: AnimTable = { scale: 8, xscale: 0, yscale: 13, - time: 1500 + time: 1500, }, { xscale: 4, - time: 2500 + time: 2500, }, 'accel', 'explode'); scene.showEffect('wisp', { x: defender.x, @@ -25486,22 +25470,22 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 2, - time: 1500 + time: 1500, }, { scale: 6, - time: 2500 + time: 2500, }, 'decel', 'explode'); defender.delay(1500); defender.anim({ z: defender.behind(10), opacity: 0, - time: 200 + time: 200, }, 'swing'); defender.delay(700); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, coreenforcer: { anim(scene, [attacker, ...defenders]) { @@ -25512,31 +25496,31 @@ const BattleMoveAnims: AnimTable = { defender.delay(2075); defender.anim({ x: defender.x - 30, - time: 75 + time: 75, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x - 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x + 30, - time: 100 + time: 100, }); defender.anim({ x: defender.x, - time: 100 + time: 100, }); } const defender = defenders[1] || defenders[0]; @@ -25544,76 +25528,76 @@ const BattleMoveAnims: AnimTable = { attacker.anim({ y: defender.y + 120, opacity: 0, - time: 300 + time: 300, }, 'accel'); attacker.delay(1525); attacker.anim({ x: attacker.x, y: attacker.y + 40, z: attacker.behind(40), - time: 1 + time: 1, }); attacker.anim({ x: attacker.x, y: attacker.y, z: attacker.z, - time: 250 + time: 250, }, 'decel'); attacker.delay(600); - var xstep = (defender.x - defender.leftof(-25)) / 5; - var ystep = (defender.y - 225 - attacker.y) / 5; - var zstep = (defender.z - attacker.z) / 5; + let xstep = (defender.x - defender.leftof(-25)) / 5; + let ystep = (defender.y - 225 - attacker.y) / 5; + let zstep = (defender.z - attacker.z) / 5; - for (var i = 0; i < 6; i++) { + for (let i = 0; i < 6; i++) { scene.showEffect('wisp', { x: attacker.leftof(50) + xstep * (i + 1), y: (attacker.y + 300) + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 1.3, opacity: 1, - time: 5 * i + 700 + time: 5 * i + 700, }, { x: defender.leftof(50) + xstep * (i + 1), opacity: 0, - time: 100 * i + 800 + time: 100 * i + 800, }, 'linear'); } - var xstep = (defender.x - defender.leftof(25)) / 5; - var ystep = (defender.y - 250 - attacker.y) / 5; - var zstep = (defender.behind(-100) - attacker.z) / 5; + xstep = (defender.x - defender.leftof(25)) / 5; + ystep = (defender.y - 250 - attacker.y) / 5; + zstep = (defender.behind(-100) - attacker.z) / 5; - for (var i = 0; i < 6; i++) { + for (let i = 0; i < 6; i++) { scene.showEffect('wisp', { x: attacker.leftof(-50) + xstep * (i + 1), y: (attacker.y + 275) + ystep * (i + 1), z: attacker.behind(-150) + zstep * (i + 1), scale: 1.3, opacity: 1, - time: 5 * i + 900 + time: 5 * i + 900, }, { x: defender.leftof(-50) + xstep * (i + 1), z: attacker.z + zstep * (i + 1), opacity: 0, - time: 100 * i + 1000 + time: 100 * i + 1000, }, 'linear'); } - var xstep = (defender.x - defender.leftof(-15)) / 5; - var ystep = (defender.y - 275 - attacker.y - 25) / 5; - var zstep = (defender.z - attacker.z) / 5; + xstep = (defender.x - defender.leftof(-15)) / 5; + ystep = (defender.y - 275 - attacker.y - 25) / 5; + zstep = (defender.z - attacker.z) / 5; - for (var i = 0; i < 6; i++) { + for (let i = 0; i < 6; i++) { scene.showEffect('wisp', { x: attacker.leftof(50) + xstep * (i + 1), y: (attacker.y + 275) + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 1.3, opacity: 1, - time: 5 * i + 1100 + time: 5 * i + 1100, }, { x: defender.leftof(50) + xstep * (i + 1), opacity: 0, - time: 100 * i + 1200 + time: 100 * i + 1200, }, 'linear'); } @@ -25623,14 +25607,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 0.6, - time: 1100 + time: 1100, }, { x: defender.x + 60, y: defender.y + 30, z: defender.behind(20), scale: 1, opacity: 0.6, - time: 1300 + time: 1300, }, 'linear', 'fade'); scene.showEffect('flareball', { x: attacker.x, @@ -25638,14 +25622,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 1, - time: 1175 + time: 1175, }, { x: defender.x - 10, y: defender.y - 30, z: defender.behind(20), scale: 1, opacity: 0.6, - time: 1375 + time: 1375, }, 'linear', 'fade'); scene.showEffect('iceball', { x: attacker.x, @@ -25653,14 +25637,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 1, - time: 1225 + time: 1225, }, { x: defender.x + 20, y: defender.y + 10, z: defender.behind(10), scale: 1, opacity: 1, - time: 1425 + time: 1425, }, 'linear', 'fade'); scene.showEffect('flareball', { x: attacker.x, @@ -25668,14 +25652,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 1, - time: 1250 + time: 1250, }, { x: defender.x - 30, y: defender.y, z: defender.behind(-10), scale: 1, opacity: 0.6, - time: 1450 + time: 1450, }, 'linear', 'fade'); scene.showEffect('iceball', { x: attacker.x, @@ -25683,14 +25667,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 1, - time: 1325 + time: 1325, }, { x: defender.x - 50, y: defender.y + 10, z: defender.behind(-20), scale: 1, opacity: 1, - time: 1525 + time: 1525, }, 'linear', 'fade'); scene.showEffect('flareball', { x: attacker.x, @@ -25698,14 +25682,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 1, - time: 1350 + time: 1350, }, { x: defender.x - 30, y: defender.y, z: defender.behind(-25), scale: 1, opacity: 0.6, - time: 1550 + time: 1550, }, 'linear', 'fade'); scene.showEffect('iceball', { x: attacker.x, @@ -25713,14 +25697,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 1.4, - time: 1400 + time: 1400, }, { x: defender.x - 60, y: defender.y - 10, z: defender.behind(-40), scale: 1, opacity: 1, - time: 1600 + time: 1600, }, 'linear', 'fade'); scene.showEffect('flareball', { x: attacker.x, @@ -25728,14 +25712,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 1.4, - time: 1475 + time: 1475, }, { x: defender.x - 30, y: defender.y, z: defender.behind(-30), scale: 1, opacity: 0.6, - time: 1675 + time: 1675, }, 'linear', 'fade'); scene.showEffect('iceball', { x: attacker.x, @@ -25743,14 +25727,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 1, - time: 1525 + time: 1525, }, { x: defender.x + 40, y: defender.y + 10, z: defender.behind(-40), scale: 1, opacity: 1, - time: 1725 + time: 1725, }, 'linear', 'fade'); scene.showEffect('flareball', { x: attacker.x, @@ -25758,14 +25742,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.4, opacity: 1, - time: 1550 + time: 1550, }, { x: defender.x + 80, y: defender.y, z: defender.behind(-50), scale: 1, opacity: 0.6, - time: 1750 + time: 1750, }, 'linear', 'fade'); scene.backgroundEffect('#ffffff', 800, 0.8, 2000); @@ -25775,10 +25759,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 2000 + time: 2000, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('fireball', { x: defender.x - 40, @@ -25786,10 +25770,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 2150 + time: 2150, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('fireball', { x: defender.x + 10, @@ -25797,12 +25781,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 2300 + time: 2300, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); - } + }, }, // z-move animations @@ -25817,11 +25801,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 8, opacity: 0, - time: 0 + time: 0, }, { scale: 0, opacity: 0.5, - time: 300 + time: 300, }, 'linear', 'fade'); scene.showEffect('electroball', { x: attacker.x, @@ -25829,11 +25813,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 8, opacity: 0, - time: 150 + time: 150, }, { scale: 0, opacity: 0.5, - time: 500 + time: 500, }, 'linear', 'fade'); scene.showEffect('lightning', { x: attacker.x - 10, @@ -25841,11 +25825,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 200 + time: 200, }, { scale: 3, opacity: 0, - time: 400 + time: 400, }, 'decel'); scene.showEffect('lightning', { x: attacker.x + 10, @@ -25853,11 +25837,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 350 + time: 350, }, { scale: 3, opacity: 0, - time: 550 + time: 550, }, 'decel'); scene.showEffect('electroball', { @@ -25866,14 +25850,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.8, opacity: 0.8, - time: 600 + time: 600, }, { x: defender.x, y: defender.y, z: defender.behind(20), scale: 1.2, opacity: 0.8, - time: 800 + time: 800, }, 'linear', 'explode'); scene.showEffect('electroball', { @@ -25883,12 +25867,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 1, - time: 850 + time: 850, }, { scale: 2, xscale: 12, opacity: 0, - time: 1250 + time: 1250, }, 'linear', 'fade'); scene.showEffect('electroball', { x: defender.x, @@ -25896,11 +25880,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.7, scale: 1, - time: 850 + time: 850, }, { scale: 6, opacity: 0, - time: 1400 + time: 1400, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -25909,11 +25893,11 @@ const BattleMoveAnims: AnimTable = { opacity: 1, scale: 3, yscale: 10, - time: 850 + time: 850, }, { xscale: 0, opacity: 0.5, - time: 1200 + time: 1200, }, 'accel', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -25921,10 +25905,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 3, - time: 850 + time: 850, }, { scale: 9, - time: 1400 + time: 1400, }, 'linear', 'explode'); scene.showEffect('lightning', { @@ -25933,10 +25917,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 800 + time: 800, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('lightning', { x: defender.x - 40, @@ -25944,10 +25928,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 950 + time: 950, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('lightning', { x: defender.x + 10, @@ -25955,22 +25939,22 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 1100 + time: 1100, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); defender.delay(825); defender.anim({ z: defender.behind(20), opacity: 0.5, - time: 400 + time: 400, }, 'swing'); defender.anim({ - time: 400 + time: 400, }, 'swing'); - } + }, }, infernooverdrive: { anim(scene, [attacker, defender]) { @@ -25982,14 +25966,14 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 20, z: attacker.behind(-30), scale: 1, - opacity: 0.3 + opacity: 0.3, }, { x: attacker.x, y: attacker.y, z: attacker.behind(-30), scale: 0.6, opacity: 1, - time: 100 + time: 100, }, 'accel', 'fade'); scene.showEffect('fireball', { x: attacker.x + 20, @@ -25997,14 +25981,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-30), scale: 1, opacity: 0.3, - time: 100 + time: 100, }, { x: attacker.x, y: attacker.y, z: attacker.behind(-30), scale: 0.6, opacity: 1, - time: 200 + time: 200, }, 'accel', 'fade'); scene.showEffect('fireball', { x: attacker.x, @@ -26012,14 +25996,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-30), scale: 1, opacity: 0.3, - time: 200 + time: 200, }, { x: attacker.x, y: attacker.y, z: attacker.behind(-30), scale: 0.6, opacity: 1, - time: 300 + time: 300, }, 'accel', 'fade'); scene.showEffect('fireball', { x: attacker.x - 20, @@ -26027,14 +26011,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-30), scale: 1, opacity: 0.3, - time: 300 + time: 300, }, { x: attacker.x, y: attacker.y, z: attacker.behind(-30), scale: 0.6, opacity: 1, - time: 400 + time: 400, }, 'accel', 'fade'); scene.showEffect('flareball', { @@ -26042,11 +26026,11 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.behind(-30), scale: 3, - opacity: 0.3 + opacity: 0.3, }, { scale: 0.6, opacity: 1, - time: 300 + time: 300, }, 'decel', 'fade'); scene.showEffect('flareball', { x: attacker.x, @@ -26054,11 +26038,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-30), scale: 3, opacity: 0.3, - time: 100 + time: 100, }, { scale: 0.8, opacity: 0.6, - time: 400 + time: 400, }, 'decel', 'fade'); scene.showEffect('flareball', { x: attacker.x, @@ -26066,14 +26050,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-30), scale: 0.6, opacity: 0.8, - time: 400 + time: 400, }, { x: defender.x, y: defender.y, z: defender.behind(20), scale: 5, opacity: 0.8, - time: 800 + time: 800, }, 'accel', 'explode'); scene.showEffect('flareball', { @@ -26083,12 +26067,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 0.5, - time: 900 + time: 900, }, { scale: 3, xscale: 8, opacity: 0.1, - time: 1300 + time: 1300, }, 'linear', 'fade'); scene.showEffect('electroball', { x: defender.x, @@ -26096,11 +26080,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 1, - time: 900 + time: 900, }, { scale: 6, opacity: 0, - time: 1100 + time: 1100, }, 'linear'); scene.showEffect('flareball', { x: defender.x, @@ -26108,11 +26092,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 1, - time: 1000 + time: 1000, }, { scale: 6, opacity: 0, - time: 1300 + time: 1300, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -26120,11 +26104,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 5, - time: 800 + time: 800, }, { scale: 12, opacity: 0.5, - time: 1500 + time: 1500, }, 'linear', 'fade'); scene.showEffect('fireball', { @@ -26133,10 +26117,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 800 + time: 800, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('fireball', { x: defender.x - 40, @@ -26144,10 +26128,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 950 + time: 950, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('fireball', { x: defender.x + 10, @@ -26155,21 +26139,21 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 1100 + time: 1100, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); defender.delay(825); defender.anim({ z: defender.behind(20), - time: 300 + time: 300, }, 'swing'); defender.anim({ - time: 400 + time: 400, }, 'swing'); - } + }, }, alloutpummeling: { anim(scene, [attacker, defender]) { @@ -26179,24 +26163,24 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 1 + opacity: 1, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('fist', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 0.6, - opacity: 0.6 + opacity: 0.6, }, { x: defender.x + 30, y: defender.y + 30, z: defender.z, scale: 1, opacity: 1, - time: 200 + time: 200, }, 'ballistic', 'explode'); scene.showEffect('fist', { x: attacker.x, @@ -26204,14 +26188,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 75 + time: 75, }, { x: defender.x + 20, y: defender.y - 30, z: defender.z, scale: 1, opacity: 1, - time: 275 + time: 275, }, 'ballistic2', 'explode'); scene.showEffect('fist', { x: attacker.x, @@ -26219,14 +26203,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 150 + time: 150, }, { x: defender.x - 30, y: defender.y, z: defender.z, scale: 1, opacity: 1, - time: 350 + time: 350, }, 'ballistic2Under', 'explode'); scene.showEffect('fist', { x: attacker.x, @@ -26234,14 +26218,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 225 + time: 225, }, { x: defender.x - 10, y: defender.y + 10, z: defender.z, scale: 1, opacity: 1, - time: 425 + time: 425, }, 'ballistic', 'explode'); scene.showEffect('fist', { x: attacker.x, @@ -26249,14 +26233,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 300 + time: 300, }, { x: defender.x + 10, y: defender.y - 10, z: defender.z, scale: 1, opacity: 1, - time: 500 + time: 500, }, 'ballistic2', 'explode'); scene.showEffect('fist', { x: attacker.x, @@ -26264,14 +26248,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.6, opacity: 0.6, - time: 375 + time: 375, }, { x: defender.x - 20, y: defender.y, z: defender.z, scale: 1, opacity: 1, - time: 575 + time: 575, }, 'ballistic2Under', 'explode'); scene.showEffect('flareball', { x: attacker.x, @@ -26279,49 +26263,49 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-5), scale: 1.5, opacity: 0, - time: 800 + time: 800, }, { x: defender.x, y: defender.y, z: defender.z, opacity: 1, - time: 1150 + time: 1150, }, 'accel', 'explode'); scene.showEffect('wisp', { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 1, - time: 800 + time: 800, }, { x: defender.x, y: defender.y, z: defender.behind(-5), - time: 1100 + time: 1100, }, 'accel', 'fade'); scene.showEffect('wisp', { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 1, - time: 800 + time: 800, }, { x: defender.x, y: defender.y, z: defender.behind(-5), - time: 1125 + time: 1125, }, 'accel', 'fade'); scene.showEffect('wisp', { x: attacker.x, y: attacker.y, z: attacker.z, opacity: 1, - time: 800 + time: 800, }, { x: defender.x, y: defender.y, z: defender.behind(-5), - time: 1150 + time: 1150, }, 'accel', 'fade'); scene.showEffect('iceball', { @@ -26331,12 +26315,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 2, opacity: 0.8, - time: 1150 + time: 1150, }, { scale: 1, xscale: 12, opacity: 0, - time: 1450 + time: 1450, }, 'decel', 'fade'); scene.showEffect('iceball', { x: defender.x, @@ -26344,11 +26328,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.7, scale: 0.5, - time: 1150 + time: 1150, }, { scale: 3, opacity: 0, - time: 1650 + time: 1650, }, 'decel'); scene.showEffect('flareball', { x: defender.x, @@ -26356,11 +26340,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 0.5, - time: 1150 + time: 1150, }, { scale: 6, opacity: 0, - time: 1650 + time: 1650, }, 'decel'); scene.showEffect('wisp', { x: defender.x, @@ -26369,11 +26353,11 @@ const BattleMoveAnims: AnimTable = { opacity: 1, scale: 5, yscale: 13, - time: 1150 + time: 1150, }, { opacity: 0.5, xscale: 0, - time: 2000 + time: 2000, }, 'accel', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -26381,73 +26365,73 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 2, - time: 1150 + time: 1150, }, { opacity: 0.5, scale: 6, - time: 2000 + time: 2000, }, 'decel', 'explode'); attacker.delay(600); attacker.anim({ z: attacker.behind(15), - time: 200 + time: 200, }, 'decel'); attacker.anim({ z: defender.behind(-170), opacity: 0, - time: 100 + time: 100, }, 'accel'); attacker.delay(1000); attacker.anim({ z: attacker.behind(70), opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.anim({ z: attacker.z, - time: 300 + time: 300, }, 'swing'); defender.delay(200); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.delay(300); defender.anim({ z: defender.behind(5), opacity: 0, - time: 75 + time: 75, }, 'swing'); defender.delay(750); defender.anim({ - time: 150 + time: 150, }, 'swing'); - } + }, }, supersonicskystrike: { anim(scene, [attacker, defender]) { @@ -26457,24 +26441,24 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, opacity: 0.3, - time: 25 + time: 25, }, { y: attacker.y + 250, opacity: 0, - time: 325 + time: 325, }, 'decel'); scene.showEffect(attacker.sp, { x: attacker.x, y: attacker.y + 250, z: attacker.z, opacity: 0.3, - time: 625 + time: 625, }, { x: defender.leftof(-10), y: defender.y + 5, z: defender.behind(10), opacity: 0, - time: 825 + time: 825, }, 'decel'); scene.showEffect('iceball', { x: attacker.x, @@ -26482,13 +26466,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.6, - time: 600 + time: 600, }, { x: defender.leftof(-10), y: defender.y + 5, z: defender.behind(10), opacity: 0.3, - time: 800 + time: 800, }, 'accel', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -26496,13 +26480,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-50), scale: 1, opacity: 0.5, - time: 600 + time: 600, }, { x: defender.leftof(-10), y: defender.y + 5, z: defender.behind(10), opacity: 0.6, - time: 800 + time: 800, }, 'accel', 'explode'); scene.showEffect('iceball', { @@ -26512,12 +26496,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 1, - time: 850 + time: 850, }, { scale: 2, xscale: 12, opacity: 0, - time: 1250 + time: 1250, }, 'linear', 'fade'); scene.showEffect('iceball', { x: defender.x, @@ -26525,11 +26509,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.7, scale: 1, - time: 850 + time: 850, }, { scale: 6, opacity: 0, - time: 1400 + time: 1400, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -26538,10 +26522,10 @@ const BattleMoveAnims: AnimTable = { opacity: 1, scale: 3, yscale: 10, - time: 850 + time: 850, }, { xscale: 0, - time: 1500 + time: 1500, }, 'accel', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -26549,17 +26533,17 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 3, - time: 850 + time: 850, }, { scale: 9, - time: 1400 + time: 1400, }, 'linear', 'explode'); attacker.anim({ x: attacker.x, y: attacker.y + 250, z: attacker.z, - time: 300 + time: 300, }, 'decel'); attacker.delay(300); attacker.anim({ @@ -26567,103 +26551,103 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 5, z: defender.behind(10), opacity: 1, - time: 200 + time: 200, }, 'ballistic2Under'); attacker.delay(50); attacker.anim({ opacity: 0, - time: 1 + time: 1, }); attacker.delay(700); attacker.anim({ opacity: 1, - time: 200 + time: 200, }); defender.delay(650); defender.anim({ y: defender.y - 10, z: defender.behind(5), - time: 50 + time: 50, }, 'swing'); defender.anim({ y: defender.y - 20, z: defender.behind(20), - time: 200 + time: 200, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, aciddownpour: { anim(scene, [attacker, defender]) { defender.delay(125); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.delay(100); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.delay(75); defender.anim({ y: defender.y - 40, opacity: 0, - time: 200 + time: 200, }, 'accel'); defender.delay(400); defender.anim({ y: defender.y, opacity: 0, - time: 200 + time: 200, }); defender.anim({ y: defender.y, opacity: 1, - time: 200 + time: 200, }); scene.backgroundEffect('linear-gradient(#440044 30%, #000000', 2300, 0.7); scene.showEffect('shadowball', { @@ -26671,21 +26655,21 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.5 + opacity: 0.5, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('poisonwisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 1, - opacity: 0.5 + opacity: 0.5, }, { scale: 4, opacity: 0.3, - time: 600 + time: 600, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { @@ -26693,39 +26677,39 @@ const BattleMoveAnims: AnimTable = { y: attacker.y - 25, z: attacker.z, scale: 0.3, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x, z: defender.behind(50), scale: 2, xscale: 4, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x - 30, y: attacker.y - 25, z: attacker.z, scale: 0.3, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x - 60, z: defender.behind(50), scale: 2, xscale: 4, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x + 30, y: attacker.y - 25, z: attacker.z, scale: 0.3, - opacity: 0.3 + opacity: 0.3, }, { x: defender.x + 60, z: defender.behind(50), scale: 2, xscale: 4, - opacity: 0.6 + opacity: 0.6, }, 'decel', 'fade'); scene.showEffect('shadowball', { @@ -26736,13 +26720,13 @@ const BattleMoveAnims: AnimTable = { xscale: 6, yscale: 1, opacity: 0.5, - time: 650 + time: 650, }, { scale: 0, xscale: 2, yscale: 0.5, opacity: 0, - time: 1600 + time: 1600, }, 'linear', 'fade'); scene.showEffect('shadowball', { x: defender.x, @@ -26752,13 +26736,13 @@ const BattleMoveAnims: AnimTable = { xscale: 6, yscale: 1, opacity: 0.5, - time: 1450 + time: 1450, }, { scale: 0, xscale: 2, yscale: 0.5, opacity: 0, - time: 2000 + time: 2000, }, 'linear', 'fade'); scene.showEffect('shadowball', { @@ -26768,11 +26752,11 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 775 + time: 775, }, { y: defender.y + 150, opacity: 0, - time: 975 + time: 975, }, 'decel'); scene.showEffect('shadowball', { x: defender.x - 20, @@ -26781,12 +26765,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 790 + time: 790, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 875 + time: 875, }, 'linear'); scene.showEffect('shadowball', { @@ -26796,11 +26780,11 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 925 + time: 925, }, { y: defender.y + 150, opacity: 0, - time: 1100 + time: 1100, }, 'decel'); scene.showEffect('shadowball', { x: defender.x + 40, @@ -26809,12 +26793,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 940 + time: 940, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 1100 + time: 1100, }, 'linear'); scene.showEffect('shadowball', { @@ -26824,12 +26808,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 975 + time: 975, }, { y: defender.y + 150, z: defender.behind(-10), opacity: 0, - time: 1125 + time: 1125, }, 'decel'); scene.showEffect('shadowball', { x: defender.x - 70, @@ -26838,12 +26822,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 990 + time: 990, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 1125 + time: 1125, }, 'linear'); scene.showEffect('shadowball', { @@ -26853,11 +26837,11 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 1050 + time: 1050, }, { y: defender.y + 150, opacity: 0, - time: 1250 + time: 1250, }, 'decel'); scene.showEffect('shadowball', { x: defender.x + 70, @@ -26866,12 +26850,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 1065 + time: 1065, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 1250 + time: 1250, }, 'linear'); scene.showEffect('shadowball', { @@ -26881,11 +26865,11 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 1100 + time: 1100, }, { y: defender.y + 150, opacity: 0, - time: 1300 + time: 1300, }, 'decel'); scene.showEffect('shadowball', { x: defender.x, @@ -26894,12 +26878,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 1120 + time: 1120, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 1300 + time: 1300, }, 'linear'); scene.showEffect('shadowball', { @@ -26909,11 +26893,11 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 1125 + time: 1125, }, { y: defender.y + 150, opacity: 0, - time: 1325 + time: 1325, }, 'decel'); scene.showEffect('shadowball', { x: defender.x, @@ -26922,12 +26906,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 1140 + time: 1140, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 1425 + time: 1425, }, 'linear'); scene.showEffect('poisonwisp', { @@ -26936,13 +26920,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 2, opacity: 0.8, - time: 350 + time: 350, }, { x: defender.x + 75, opacity: 0.3, scale: 4, xscale: 5, - time: 1800 + time: 1800, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x, @@ -26950,15 +26934,15 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 2, opacity: 0.8, - time: 350 + time: 350, }, { x: defender.x - 75, opacity: 0.3, scale: 4, xscale: 5, - time: 1800 + time: 1800, }, 'linear', 'fade'); - } + }, }, blackholeeclipse: { anim(scene, [attacker, defender]) { @@ -26969,11 +26953,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.2, - time: 0 + time: 0, }, { scale: 2, opacity: 0.5, - time: 600 + time: 600, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -26981,11 +26965,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.1, - time: 0 + time: 0, }, { scale: 0, opacity: 0.5, - time: 400 + time: 400, }, 'accel'); scene.showEffect('iceball', { x: attacker.x, @@ -26993,11 +26977,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.1, - time: 200 + time: 200, }, { scale: 0, opacity: 0.5, - time: 600 + time: 600, }, 'accel'); scene.showEffect('shadowball', { x: attacker.x, @@ -27005,11 +26989,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.1, - time: 550 + time: 550, }, { scale: 0.7, opacity: 0.5, - time: 900 + time: 900, }, 'decel', 'fade'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -27017,11 +27001,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2, opacity: 0.1, - time: 550 + time: 550, }, { scale: 1.5, opacity: 1, - time: 900 + time: 900, }, 'decel', 'fade'); scene.showEffect('shadowball', { @@ -27030,14 +27014,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.7, opacity: 0.5, - time: 900 + time: 900, }, { x: defender.x, y: defender.y + 80, z: defender.z, opacity: 0.7, scale: 2, - time: 1500 + time: 1500, }, 'accel', 'explode'); scene.showEffect('poisonwisp', { x: attacker.x, @@ -27045,13 +27029,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1.5, opacity: 1, - time: 900 + time: 900, }, { x: defender.x, y: defender.y + 80, z: defender.z, scale: 3, - time: 1500 + time: 1500, }, 'accel', 'explode'); scene.showEffect('shadowball', { x: defender.x, @@ -27059,10 +27043,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 0.7, - time: 1500 + time: 1500, }, { scale: 2, - time: 2200 + time: 2200, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x, @@ -27070,10 +27054,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 4, opacity: 1, - time: 1500 + time: 1500, }, { scale: 4.2, - time: 2200 + time: 2200, }, 'linear', 'fade'); scene.showEffect('flareball', { @@ -27082,11 +27066,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 0.1, - time: 1600 + time: 1600, }, { scale: 3, opacity: 0, - time: 1900 + time: 1900, }, 'linear'); scene.showEffect('flareball', { x: defender.x, @@ -27094,11 +27078,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 0.1, - time: 1900 + time: 1900, }, { scale: 3, opacity: 0, - time: 2200 + time: 2200, }, 'linear'); scene.showEffect('poisonwisp', { x: defender.x, @@ -27106,10 +27090,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 4.2, opacity: 0.5, - time: 2200 + time: 2200, }, { scale: 0, - time: 2500 + time: 2500, }, 'accel'); defender.delay(1500); @@ -27118,18 +27102,18 @@ const BattleMoveAnims: AnimTable = { xscale: 0, yscale: 0, opacity: 0, - time: 400 + time: 400, }, 'accel'); defender.delay(1500); defender.anim({ y: defender.y, opacity: 0, - time: 1 + time: 1, }); defender.anim({ - time: 400 + time: 400, }); - } + }, }, continentalcrush: { anim(scene, [attacker, defender]) { @@ -27139,13 +27123,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, opacity: 0.3, - time: 25 + time: 25, }, { x: attacker.x, y: attacker.y + 250, z: defender.behind(-50), opacity: 0, - time: 325 + time: 325, }, 'accel'); scene.showEffect('rock2', { x: attacker.x, @@ -27153,13 +27137,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-40), scale: 0.4, opacity: 0, - time: 225 + time: 225, }, { x: attacker.x, y: attacker.y + 250, z: defender.behind(-30), opacity: 1, - time: 525 + time: 525, }, 'accel'); scene.showEffect('rocks', { x: attacker.x, @@ -27167,14 +27151,14 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-70), scale: 0.8, opacity: 0, - time: 300 + time: 300, }, { x: attacker.x, y: attacker.y + 250, z: defender.behind(-20), scale: 0.4, opacity: 1, - time: 650 + time: 650, }, 'accel'); scene.showEffect('rock2', { x: attacker.x, @@ -27182,13 +27166,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-90), scale: 0.2, opacity: 0, - time: 325 + time: 325, }, { x: attacker.x, y: attacker.y + 250, z: defender.behind(-50), opacity: 1, - time: 675 + time: 675, }, 'accel'); scene.showEffect('rock1', { x: defender.x, @@ -27196,14 +27180,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 0.5, - time: 1000 + time: 1000, }, { x: defender.x, y: defender.y + 55, z: defender.z, scale: 5.5, opacity: 1, - time: 1800 + time: 1800, }, 'decel', 'fade'); scene.showEffect('iceball', { @@ -27213,12 +27197,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 1, - time: 1650 + time: 1650, }, { scale: 2, xscale: 12, opacity: 0, - time: 2050 + time: 2050, }, 'linear', 'fade'); scene.showEffect('iceball', { x: defender.x, @@ -27226,11 +27210,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.7, scale: 1, - time: 1650 + time: 1650, }, { scale: 6, opacity: 0, - time: 2200 + time: 2200, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -27239,11 +27223,11 @@ const BattleMoveAnims: AnimTable = { opacity: 1, scale: 3, yscale: 8, - time: 1650 + time: 1650, }, { xscale: 12, opacity: 0.5, - time: 2000 + time: 2000, }, 'accel', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -27251,161 +27235,161 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 6, - time: 1650 + time: 1650, }, { scale: 12, opacity: 0.7, - time: 2200 + time: 2200, }, 'linear', 'explode'); attacker.anim({ x: attacker.x, y: attacker.y + 250, z: attacker.behind(-50), - time: 300 + time: 300, }, 'decel'); attacker.delay(1700); attacker.anim({ opacity: 0, - time: 1 + time: 1, }); attacker.anim({ opacity: 1, - time: 200 + time: 200, }); defender.delay(1450); defender.anim({ y: defender.y - 10, yscale: 0.4, - time: 50 + time: 50, }, 'swing'); defender.anim({ y: defender.y - 20, yscale: 0.3, - time: 300 + time: 300, }, 'swing'); defender.delay(200); defender.anim({ - time: 400 + time: 400, }, 'swing'); - } + }, }, neverendingnightmare: { anim(scene, [attacker, defender]) { scene.backgroundEffect('linear-gradient(#440044 30%, #000000', 1500, 0.6); - var xstep = (defender.x + 200 - defender.x) / 5; - var ystep = (defender.x - 200 - defender.x) / 5; - var zstep = defender.z / 5; + let xstep = (defender.x + 200 - defender.x) / 5; + let ystep = (defender.x - 200 - defender.x) / 5; + let zstep = defender.z / 5; - for (var i = 0; i < 5; i++) { + for (let i = 0; i < 5; i++) { scene.showEffect('poisonwisp', { x: defender.x - 200 + xstep * (i + 1), y: (defender.y + 200) + ystep * (i + 1), z: defender.z + zstep * (i + 1), scale: 0.6, opacity: 0.7, - time: 40 * i + 0 + time: 40 * i + 0, }, { opacity: 0, - time: 50 * i + 1000 + time: 50 * i + 1000, }, 'linear'); } - var xstep = (defender.x + 150 - defender.x) / 5; - for (var i = 0; i < 5; i++) { + xstep = (defender.x + 150 - defender.x) / 5; + for (let i = 0; i < 5; i++) { scene.showEffect('poisonwisp', { x: defender.x - 150 + xstep * (i + 1), y: (defender.y + 200) + ystep * (i + 1), z: defender.z + zstep * (i + 1), scale: 0.6, opacity: 0.7, - time: 40 * i + 100 + time: 40 * i + 100, }, { opacity: 0, - time: 50 * i + 1000 + time: 50 * i + 1000, }, 'linear'); } - var xstep = (defender.x + 100 - defender.x) / 5; - for (var i = 0; i < 5; i++) { + xstep = (defender.x + 100 - defender.x) / 5; + for (let i = 0; i < 5; i++) { scene.showEffect('poisonwisp', { x: defender.x - 100 + xstep * (i + 1), y: (defender.y + 200) + ystep * (i + 1), z: defender.z + zstep * (i + 1), scale: 1.2, opacity: 1, - time: 40 * i + 200 + time: 40 * i + 200, }, { opacity: 0, - time: 50 * i + 1000 + time: 50 * i + 1000, }, 'linear'); } - var xstep = (defender.x + 50 - defender.x) / 5; - for (var i = 0; i < 5; i++) { + xstep = (defender.x + 50 - defender.x) / 5; + for (let i = 0; i < 5; i++) { scene.showEffect('poisonwisp', { x: defender.x - 50 + xstep * (i + 1), y: (defender.y + 200) + ystep * (i + 1), z: defender.z + zstep * (i + 1), scale: 0.6, opacity: 0.7, - time: 40 * i + 300 + time: 40 * i + 300, }, { opacity: 0, - time: 50 * i + 1000 + time: 50 * i + 1000, }, 'linear'); } - var xstep = (defender.x - 50 - defender.x) / 5; - for (var i = 0; i < 5; i++) { + xstep = (defender.x - 50 - defender.x) / 5; + for (let i = 0; i < 5; i++) { scene.showEffect('poisonwisp', { x: defender.x + 50 + xstep * (i + 1), y: (defender.y + 200) + ystep * (i + 1), z: defender.z + zstep * (i + 1), scale: 1.2, opacity: 1, - time: 40 * i + 400 + time: 40 * i + 400, }, { opacity: 0, - time: 50 * i + 1000 + time: 50 * i + 1000, }, 'linear'); } - var xstep = (defender.x - 100 - defender.x) / 5; - for (var i = 0; i < 5; i++) { + xstep = (defender.x - 100 - defender.x) / 5; + for (let i = 0; i < 5; i++) { scene.showEffect('poisonwisp', { x: defender.x + 100 + xstep * (i + 1), y: (defender.y + 200) + ystep * (i + 1), z: defender.z + zstep * (i + 1), scale: 0.6, opacity: 0.7, - time: 40 * i + 500 + time: 40 * i + 500, }, { opacity: 0, - time: 50 * i + 1000 + time: 50 * i + 1000, }, 'linear'); } - var xstep = (defender.x - 150 - defender.x) / 5; - for (var i = 0; i < 5; i++) { + xstep = (defender.x - 150 - defender.x) / 5; + for (let i = 0; i < 5; i++) { scene.showEffect('poisonwisp', { x: defender.x + 150 + xstep * (i + 1), y: (defender.y + 200) + ystep * (i + 1), z: defender.z + zstep * (i + 1), scale: 0.6, opacity: 0.7, - time: 40 * i + 600 + time: 40 * i + 600, }, { opacity: 0, - time: 50 * i + 1000 + time: 50 * i + 1000, }, 'linear'); } - var xstep = (defender.x - 200 - defender.x) / 5; - for (var i = 0; i < 5; i++) { + xstep = (defender.x - 200 - defender.x) / 5; + for (let i = 0; i < 5; i++) { scene.showEffect('poisonwisp', { x: defender.x + 200 + xstep * (i + 1), y: (defender.y + 200) + ystep * (i + 1), z: defender.z + zstep * (i + 1), scale: 0.6, opacity: 0.7, - time: 40 * i + 700 + time: 40 * i + 700, }, { opacity: 0, - time: 50 * i + 1000 + time: 50 * i + 1000, }, 'linear'); } scene.showEffect('shadowball', { @@ -27415,12 +27399,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 0.5, - time: 200 + time: 200, }, { scale: 3, xscale: 8, opacity: 0.1, - time: 1300 + time: 1300, }, 'linear', 'fade'); scene.showEffect('shadowball', { x: defender.x, @@ -27428,11 +27412,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 2, - time: 200 + time: 200, }, { scale: 2.5, opacity: 0, - time: 1500 + time: 1500, }, 'linear', 'fade'); scene.showEffect('poisonwisp', { x: defender.x, @@ -27440,13 +27424,13 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.7, scale: 3, - time: 200 + time: 200, }, { scale: 9, opacity: 1, - time: 1500 + time: 1500, }, 'linear', 'fade'); - } + }, }, corkscrewcrash: { anim(scene, [attacker, defender]) { @@ -27457,11 +27441,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 500 + time: 500, }, { scale: 3, opacity: 0, - time: 800 + time: 800, }, 'linear'); scene.showEffect('impact', { x: defender.x, @@ -27469,11 +27453,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 700 + time: 700, }, { scale: 3, opacity: 0, - time: 1000 + time: 1000, }, 'linear'); scene.showEffect('iceball', { @@ -27481,11 +27465,11 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 2, - opacity: 1 + opacity: 1, }, { y: attacker.y + 90, opacity: 0, - time: 200 + time: 200, }, 'accel'); scene.showEffect('iceball', { x: defender.leftof(-165), @@ -27493,14 +27477,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 0, - time: 400 + time: 400, }, { x: defender.leftof(10), y: defender.y - 20, z: defender.behind(-10), scale: 2, opacity: 0.5, - time: 650 + time: 650, }, 'accel', 'explode'); scene.showEffect('iceball', { x: defender.leftof(-65), @@ -27509,7 +27493,7 @@ const BattleMoveAnims: AnimTable = { scale: 3, yscale: 3.3, opacity: 0.8, - time: 500 + time: 500, }, { x: defender.leftof(10), y: defender.y - 20, @@ -27517,7 +27501,7 @@ const BattleMoveAnims: AnimTable = { scale: 0, xscale: 0, yscale: 0, - time: 650 + time: 650, }, 'accel'); scene.showEffect('iceball', { x: defender.leftof(-65), @@ -27526,7 +27510,7 @@ const BattleMoveAnims: AnimTable = { scale: 3, yscale: 3.3, opacity: 0.8, - time: 550 + time: 550, }, { x: defender.leftof(10), y: defender.y - 20, @@ -27534,7 +27518,7 @@ const BattleMoveAnims: AnimTable = { scale: 0, xscale: 0, yscale: 0, - time: 700 + time: 700, }, 'accel'); scene.showEffect('iceball', { x: defender.leftof(-65), @@ -27543,7 +27527,7 @@ const BattleMoveAnims: AnimTable = { scale: 3, yscale: 3.3, opacity: 0.8, - time: 600 + time: 600, }, { x: defender.leftof(10), y: defender.y - 20, @@ -27551,7 +27535,7 @@ const BattleMoveAnims: AnimTable = { scale: 0, xscale: 0, yscale: 0, - time: 750 + time: 750, }, 'accel'); scene.showEffect('iceball', { x: defender.leftof(-65), @@ -27560,7 +27544,7 @@ const BattleMoveAnims: AnimTable = { scale: 3, yscale: 3.3, opacity: 0.8, - time: 650 + time: 650, }, { x: defender.leftof(10), y: defender.y - 20, @@ -27568,7 +27552,7 @@ const BattleMoveAnims: AnimTable = { scale: 0, xscale: 0, yscale: 0, - time: 800 + time: 800, }, 'accel'); scene.showEffect('iceball', { x: defender.leftof(-65), @@ -27577,7 +27561,7 @@ const BattleMoveAnims: AnimTable = { scale: 3, yscale: 3.3, opacity: 0.8, - time: 700 + time: 700, }, { x: defender.leftof(10), y: defender.y - 20, @@ -27585,7 +27569,7 @@ const BattleMoveAnims: AnimTable = { scale: 0, xscale: 0, yscale: 0, - time: 850 + time: 850, }, 'accel'); scene.showEffect('iceball', { x: defender.leftof(-65), @@ -27594,7 +27578,7 @@ const BattleMoveAnims: AnimTable = { scale: 3, yscale: 3.3, opacity: 0.8, - time: 750 + time: 750, }, { x: defender.leftof(10), y: defender.y - 20, @@ -27602,7 +27586,7 @@ const BattleMoveAnims: AnimTable = { scale: 0, xscale: 0, yscale: 0, - time: 900 + time: 900, }, 'accel'); scene.showEffect('iceball', { x: defender.leftof(-65), @@ -27611,7 +27595,7 @@ const BattleMoveAnims: AnimTable = { scale: 3, yscale: 3.3, opacity: 0.8, - time: 800 + time: 800, }, { x: defender.leftof(10), y: defender.y - 20, @@ -27619,7 +27603,7 @@ const BattleMoveAnims: AnimTable = { scale: 0, xscale: 0, yscale: 0, - time: 950 + time: 950, }, 'accel'); scene.showEffect('iceball', { x: defender.leftof(-65), @@ -27628,7 +27612,7 @@ const BattleMoveAnims: AnimTable = { scale: 3, yscale: 3.3, opacity: 0.8, - time: 900 + time: 900, }, { x: defender.leftof(10), y: defender.y - 20, @@ -27636,7 +27620,7 @@ const BattleMoveAnims: AnimTable = { scale: 0, xscale: 0, yscale: 0, - time: 1050 + time: 1050, }, 'accel'); attacker.anim({ @@ -27644,7 +27628,7 @@ const BattleMoveAnims: AnimTable = { xscale: 0, yscale: 0, opacity: 0, - time: 300 + time: 300, }, 'accel'); attacker.delay(825); attacker.anim({ @@ -27653,37 +27637,37 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(40), xscale: 1, yscale: 1, - time: 1 + time: 1, }); attacker.anim({ x: attacker.x, y: attacker.y, z: attacker.z, - time: 250 + time: 250, }, 'decel'); defender.delay(625); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(15), - time: 200 + time: 200, }, 'decel'); defender.anim({ - time: 350 + time: 350, }, 'swing'); - } + }, }, twinkletackle: { anim(scene, [attacker, defender]) { @@ -27693,10 +27677,10 @@ const BattleMoveAnims: AnimTable = { y: attacker.y - 10, z: attacker.z, scale: 0.3, - opacity: 0.6 + opacity: 0.6, }, { opacity: 0, - time: 200 + time: 200, }, 'decel'); scene.showEffect('shine', { x: attacker.x + 20, @@ -27704,11 +27688,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 0 + time: 0, }, { y: attacker.y + 40, opacity: 0, - time: 250 + time: 250, }, 'accel'); scene.showEffect('shine', { x: attacker.x + 20, @@ -27716,10 +27700,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.6, - time: 150 + time: 150, }, { opacity: 0, - time: 250 + time: 250, }, 'decel'); scene.showEffect('shine', { x: attacker.x - 20, @@ -27727,11 +27711,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 175 + time: 175, }, { y: attacker.y + 40, opacity: 0, - time: 275 + time: 275, }, 'accel'); scene.showEffect('shine', { x: attacker.x - 5, @@ -27739,10 +27723,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.6, - time: 100 + time: 100, }, { opacity: 0, - time: 300 + time: 300, }, 'decel'); scene.showEffect('shine', { x: attacker.x + 5, @@ -27750,10 +27734,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.6, - time: 125 + time: 125, }, { opacity: 0, - time: 325 + time: 325, }, 'accel'); scene.showEffect('impact', { @@ -27762,11 +27746,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 0, opacity: 0.2, - time: 600 + time: 600, }, { scale: 2, opacity: 0, - time: 900 + time: 900, }, 'linear'); scene.showEffect('shine', { x: defender.x + 30, @@ -27774,12 +27758,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.3, opacity: 0.7, - time: 600 + time: 600, }, { x: defender.x + 40, y: defender.y + 10, opacity: 0, - time: 900 + time: 900, }, 'accel'); scene.showEffect('shine', { x: defender.x - 30, @@ -27787,12 +27771,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.3, opacity: 0.7, - time: 700 + time: 700, }, { x: defender.x - 40, y: defender.y - 20, opacity: 0, - time: 900 + time: 900, }, 'accel'); scene.showEffect('shine', { x: defender.x + 15, @@ -27800,12 +27784,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.3, opacity: 0.7, - time: 700 + time: 700, }, { x: defender.x + 25, y: defender.y + 20, opacity: 0, - time: 1000 + time: 1000, }, 'accel'); scene.showEffect('shine', { x: defender.x - 15, @@ -27813,28 +27797,28 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.3, opacity: 0.7, - time: 800 + time: 800, }, { x: defender.x - 25, y: defender.y - 40, opacity: 0, - time: 1100 + time: 1100, }, 'accel'); attacker.delay(200); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(5), - time: 375 + time: 375, }, 'accel'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(20), - time: 250 + time: 250, }, 'decel'); attacker.anim({ - time: 700 + time: 700, }, 'ballistic2Back'); defender.delay(600); defender.anim({ @@ -27842,17 +27826,17 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 50, z: defender.behind(150), opacity: 0, - time: 400 + time: 400, }, 'swing'); defender.delay(500); defender.anim({ opacity: 0, - time: 1 + time: 1, }); defender.anim({ - time: 400 + time: 400, }); - } + }, }, pulverizingpancake: { anim(scene, [attacker, defender]) { @@ -27864,12 +27848,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 1, - time: 1450 + time: 1450, }, { scale: 2, xscale: 12, opacity: 0, - time: 1850 + time: 1850, }, 'linear', 'fade'); scene.showEffect('iceball', { x: defender.x, @@ -27877,11 +27861,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.7, scale: 1, - time: 1450 + time: 1450, }, { scale: 6, opacity: 0, - time: 2000 + time: 2000, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -27890,11 +27874,11 @@ const BattleMoveAnims: AnimTable = { opacity: 1, scale: 3, yscale: 10, - time: 1450 + time: 1450, }, { xscale: 0, opacity: 0.5, - time: 1800 + time: 1800, }, 'accel', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -27902,64 +27886,64 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 3, - time: 1450 + time: 1450, }, { scale: 9, opacity: 0.7, - time: 2000 + time: 2000, }, 'linear', 'explode'); attacker.anim({ x: defender.x, y: defender.y + 50, z: defender.behind(-150), - time: 400 + time: 400, }, 'ballistic'); attacker.anim({ x: defender.x, y: defender.y, z: defender.behind(-125), - time: 200 + time: 200, }, 'ballistic2Back'); attacker.anim({ x: defender.x, y: defender.y - 7, z: defender.behind(-125), yscale: 0.7, - time: 50 + time: 50, }, 'ballistic2Back'); attacker.anim({ x: defender.x, y: defender.y + 200, z: defender.behind(-30), - time: 600 + time: 600, }, 'ballistic'); attacker.anim({ x: defender.leftof(-10), y: defender.y + 5, z: defender.behind(10), - time: 200 + time: 200, }); attacker.anim({ - time: 500 + time: 500, }, 'ballistic2Back'); defender.delay(1450); defender.anim({ y: defender.y - 10, z: defender.behind(5), yscale: 0.3, - time: 50 + time: 50, }, 'swing'); defender.anim({ y: defender.y - 20, z: defender.behind(20), yscale: 0.3, - time: 300 + time: 300, }, 'swing'); defender.anim({ - time: 400 + time: 400, }, 'swing'); - } + }, }, stokedsparksurfer: { anim(scene, [attacker, defender]) { @@ -27969,11 +27953,11 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, scale: 2, - opacity: 1 + opacity: 1, }, { y: attacker.y + 120, opacity: 0, - time: 300 + time: 300, }, 'accel'); scene.showEffect('electroball', { x: defender.leftof(-200), @@ -27981,14 +27965,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 0, - time: 700 + time: 700, }, { x: defender.x, y: defender.y, z: defender.z, scale: 2, opacity: 1, - time: 1100 + time: 1100, }, 'accel', 'explode'); scene.showEffect('electroball', { @@ -27998,12 +27982,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 1, - time: 1050 + time: 1050, }, { scale: 2, xscale: 12, opacity: 0, - time: 1450 + time: 1450, }, 'linear', 'fade'); scene.showEffect('electroball', { x: defender.x, @@ -28011,11 +27995,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.7, scale: 1, - time: 1050 + time: 1050, }, { scale: 6, opacity: 0, - time: 1600 + time: 1600, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -28024,11 +28008,11 @@ const BattleMoveAnims: AnimTable = { opacity: 1, scale: 3, yscale: 10, - time: 1050 + time: 1050, }, { xscale: 0, opacity: 0.5, - time: 1600 + time: 1600, }, 'accel', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -28036,10 +28020,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 3, - time: 1050 + time: 1050, }, { scale: 9, - time: 1600 + time: 1600, }, 'linear', 'explode'); scene.showEffect('lightning', { @@ -28048,10 +28032,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 1000 + time: 1000, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('lightning', { x: defender.x - 40, @@ -28059,10 +28043,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 1150 + time: 1150, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('lightning', { x: defender.x + 10, @@ -28070,16 +28054,16 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 1300 + time: 1300, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); attacker.anim({ y: attacker.y + 120, opacity: 0, - time: 300 + time: 300, }, 'accel'); attacker.delay(100); attacker.anim({ @@ -28087,20 +28071,20 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 80, z: attacker.z, opacity: 0, - time: 350 + time: 350, }, 'accel'); attacker.anim({ x: defender.leftof(-200), y: defender.y + 80, z: defender.z, - time: 1 + time: 1, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.z, opacity: 1, - time: 350 + time: 350, }, 'accel'); scene.showEffect('wisp', { x: defender.x, @@ -28108,41 +28092,41 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 1000 + time: 1000, }, { scale: 2, opacity: 0, - time: 1300 + time: 1300, }, 'linear'); attacker.anim({ x: defender.leftof(100), y: defender.y - 40, z: defender.z, opacity: 0, - time: 175 + time: 175, }); attacker.delay(700); attacker.anim({ x: attacker.x, y: attacker.y + 40, z: attacker.behind(40), - time: 1 + time: 1, }); attacker.anim({ x: attacker.x, y: attacker.y, z: attacker.z, - time: 250 + time: 250, }, 'decel'); defender.delay(1000); defender.anim({ z: defender.behind(20), - time: 300 + time: 300, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, catastropika: { anim(scene, [attacker, defender]) { @@ -28152,13 +28136,13 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.z, opacity: 0.3, - time: 25 + time: 25, }, { x: attacker.x, y: attacker.y + 250, z: attacker.behind(-50), opacity: 0, - time: 325 + time: 325, }, 'decel'); scene.showEffect('electroball', { x: attacker.x, @@ -28166,13 +28150,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-50), scale: 1, opacity: 1, - time: 600 + time: 600, }, { x: defender.leftof(-10), y: defender.y + 5, z: defender.behind(10), opacity: 0.8, - time: 800 + time: 800, }, 'accel', 'explode'); scene.showEffect('wisp', { x: attacker.x, @@ -28180,13 +28164,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.behind(-50), scale: 1, opacity: 0.5, - time: 600 + time: 600, }, { x: defender.leftof(-10), y: defender.y + 5, z: defender.behind(10), opacity: 0.6, - time: 800 + time: 800, }, 'accel', 'explode'); scene.showEffect('electroball', { @@ -28196,12 +28180,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 1, - time: 850 + time: 850, }, { scale: 2, xscale: 12, opacity: 0, - time: 1250 + time: 1250, }, 'linear', 'fade'); scene.showEffect('electroball', { x: defender.x, @@ -28209,11 +28193,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.7, scale: 1, - time: 850 + time: 850, }, { scale: 6, opacity: 0, - time: 1400 + time: 1400, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -28222,11 +28206,11 @@ const BattleMoveAnims: AnimTable = { opacity: 1, scale: 3, yscale: 10, - time: 850 + time: 850, }, { xscale: 0, opacity: 0.5, - time: 1400 + time: 1400, }, 'accel', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -28234,10 +28218,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 3, - time: 850 + time: 850, }, { scale: 9, - time: 1400 + time: 1400, }, 'linear', 'explode'); scene.showEffect('lightning', { @@ -28246,10 +28230,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 800 + time: 800, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('lightning', { x: defender.x - 40, @@ -28257,10 +28241,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 950 + time: 950, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); scene.showEffect('lightning', { x: defender.x + 10, @@ -28268,17 +28252,17 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 1100 + time: 1100, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'linear'); attacker.anim({ x: attacker.x, y: attacker.y + 250, z: attacker.behind(-50), - time: 300 + time: 300, }, 'decel'); attacker.delay(300); attacker.anim({ @@ -28286,77 +28270,77 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 5, z: defender.behind(10), opacity: 0, - time: 200 + time: 200, }); attacker.delay(50); attacker.anim({ opacity: 0, - time: 1 + time: 1, }); attacker.delay(700); attacker.anim({ opacity: 1, - time: 200 + time: 200, }); defender.delay(850); defender.anim({ y: defender.y - 10, z: defender.behind(5), yscale: 0.3, - time: 50 + time: 50, }, 'swing'); defender.anim({ y: defender.y - 20, z: defender.behind(20), yscale: 0.3, - time: 300 + time: 300, }, 'swing'); defender.anim({ - time: 400 + time: 400, }, 'swing'); - } + }, }, sinisterarrowraid: { anim(scene, [attacker, defender]) { defender.delay(1050); defender.anim({ z: defender.behind(20), - time: 300 + time: 300, }, 'swing'); defender.anim({ - time: 200 + time: 200, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x - 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ x: defender.x + 5, - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 100 + time: 100, }, 'accel'); attacker.anim({ y: attacker.y + 120, opacity: 0, - time: 300 + time: 300, }, 'accel'); attacker.delay(100); attacker.anim({ @@ -28364,20 +28348,20 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 80, z: attacker.z, opacity: 0, - time: 350 + time: 350, }, 'accel'); attacker.anim({ x: defender.leftof(-200), y: defender.y + 80, z: defender.z, - time: 1 + time: 1, }, 'linear'); attacker.anim({ x: defender.x, y: defender.y, z: defender.z, opacity: 1, - time: 350 + time: 350, }, 'accel'); scene.showEffect('wisp', { @@ -28386,31 +28370,31 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.5, - time: 1000 + time: 1000, }, { scale: 2, opacity: 0, - time: 1300 + time: 1300, }, 'linear'); attacker.anim({ x: defender.leftof(100), y: defender.y - 40, z: defender.z, opacity: 0, - time: 175 + time: 175, }); attacker.delay(700); attacker.anim({ x: attacker.x, y: attacker.y + 40, z: attacker.behind(40), - time: 1 + time: 1, }); attacker.anim({ x: attacker.x, y: attacker.y, z: attacker.z, - time: 250 + time: 250, }, 'decel'); scene.backgroundEffect('linear-gradient(#440044 30%, #000000', 2300, 0.4); @@ -28421,11 +28405,11 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 1475 + time: 1475, }, { y: defender.y + 150, opacity: 0, - time: 1775 + time: 1775, }, 'decel'); scene.showEffect('shadowball', { x: defender.x - 20, @@ -28434,12 +28418,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 1490 + time: 1490, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 1775 + time: 1775, }, 'linear'); scene.showEffect('shadowball', { @@ -28449,11 +28433,11 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 1625 + time: 1625, }, { y: defender.y + 150, opacity: 0, - time: 1900 + time: 1900, }, 'decel'); scene.showEffect('shadowball', { x: defender.x + 40, @@ -28462,12 +28446,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 1640 + time: 1640, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 1900 + time: 1900, }, 'linear'); scene.showEffect('shadowball', { @@ -28477,12 +28461,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 1675 + time: 1675, }, { y: defender.y + 150, z: defender.behind(-10), opacity: 0, - time: 1925 + time: 1925, }, 'decel'); scene.showEffect('shadowball', { x: defender.x - 70, @@ -28491,12 +28475,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 1690 + time: 1690, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 1925 + time: 1925, }, 'linear'); scene.showEffect('shadowball', { @@ -28506,11 +28490,11 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 1750 + time: 1750, }, { y: defender.y + 150, opacity: 0, - time: 2050 + time: 2050, }, 'decel'); scene.showEffect('shadowball', { x: defender.x + 70, @@ -28519,12 +28503,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 1765 + time: 1765, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 2050 + time: 2050, }, 'linear'); scene.showEffect('shadowball', { @@ -28534,11 +28518,11 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 1800 + time: 1800, }, { y: defender.y + 150, opacity: 0, - time: 2100 + time: 2100, }, 'decel'); scene.showEffect('shadowball', { x: defender.x, @@ -28547,12 +28531,12 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 1820 + time: 1820, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 2100 + time: 2100, }, 'linear'); scene.showEffect('shadowball', { @@ -28562,11 +28546,11 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.1, yscale: 5, - time: 1825 + time: 1825, }, { y: defender.y + 150, opacity: 0, - time: 2125 + time: 2125, }, 'decel'); scene.showEffect('shadowball', { x: defender.x, @@ -28575,14 +28559,14 @@ const BattleMoveAnims: AnimTable = { opacity: 0.4, xscale: 0.3, yscale: 0.1, - time: 1840 + time: 1840, }, { xscale: 0.6, yscale: 0.1, opacity: 0, - time: 2125 + time: 2125, }, 'linear'); - } + }, }, oceanicoperetta: { anim(scene, [attacker, defender]) { @@ -28593,22 +28577,22 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 120, z: attacker.z, scale: 2.5, - opacity: 0 + opacity: 0, }, { scale: 3, opacity: 1, - time: 599 + time: 599, }, 'linear', 'fade'); scene.showEffect('waterwisp', { x: attacker.x, y: attacker.y + 120, z: attacker.z, scale: 3, - opacity: 0 + opacity: 0, }, { scale: 3.25, opacity: 0.7, - time: 599 + time: 599, }, 'linear', 'fade'); scene.showEffect('iceball', { x: attacker.x, @@ -28616,12 +28600,12 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 3, opacity: 1, - time: 600 + time: 600, }, { x: defender.x, y: defender.y + 10, z: defender.z, - time: 2000 + time: 2000, }, 'accel', 'explode'); scene.showEffect('waterwisp', { x: attacker.x, @@ -28629,131 +28613,131 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 3.25, opacity: 0.7, - time: 600 + time: 600, }, { x: defender.x, y: defender.y + 10, z: defender.z, - time: 2000 + time: 2000, }, 'accel', 'explode'); - } + }, }, extremeevoboost: { anim(scene, [attacker, defender]) { scene.backgroundEffect('#000000', 1000, 0.3); - var xstep = (attacker.x + 200 - attacker.x) / 5; - var ystep = (attacker.x - 200 - attacker.x) / 5; - var zstep = (defender.z - attacker.z) / 5; + let xstep = (attacker.x + 200 - attacker.x) / 5; + let ystep = (attacker.x - 200 - attacker.x) / 5; + let zstep = (defender.z - attacker.z) / 5; - for (var i = 0; i < 5; i++) { + for (let i = 0; i < 5; i++) { scene.showEffect('flareball', { x: attacker.x - 200 + xstep * (i + 1), y: (attacker.y + 200) + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 0.6, opacity: 0.7, - time: 40 * i + 0 + time: 40 * i + 0, }, { opacity: 0, - time: 50 * i + 1000 + time: 50 * i + 1000, }, 'linear'); } - var xstep = (attacker.x + 150 - attacker.x) / 5; - for (var i = 0; i < 5; i++) { + xstep = (attacker.x + 150 - attacker.x) / 5; + for (let i = 0; i < 5; i++) { scene.showEffect('electroball', { x: attacker.x - 150 + xstep * (i + 1), y: (attacker.y + 200) + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 0.6, opacity: 0.7, - time: 40 * i + 100 + time: 40 * i + 100, }, { opacity: 0, - time: 50 * i + 1000 + time: 50 * i + 1000, }, 'linear'); } - var xstep = (attacker.x + 100 - attacker.x) / 5; - for (var i = 0; i < 5; i++) { + xstep = (attacker.x + 100 - attacker.x) / 5; + for (let i = 0; i < 5; i++) { scene.showEffect('waterwisp', { x: attacker.x - 100 + xstep * (i + 1), y: (attacker.y + 200) + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 1.2, opacity: 1, - time: 40 * i + 200 + time: 40 * i + 200, }, { opacity: 0, - time: 50 * i + 1000 + time: 50 * i + 1000, }, 'linear'); } - var xstep = (attacker.x + 50 - attacker.x) / 5; - for (var i = 0; i < 5; i++) { + xstep = (attacker.x + 50 - attacker.x) / 5; + for (let i = 0; i < 5; i++) { scene.showEffect('shadowball', { x: attacker.x - 50 + xstep * (i + 1), y: (attacker.y + 200) + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 0.6, opacity: 0.7, - time: 40 * i + 300 + time: 40 * i + 300, }, { opacity: 0, - time: 50 * i + 1000 + time: 50 * i + 1000, }, 'linear'); } - var xstep = (attacker.x - 50 - attacker.x) / 5; - for (var i = 0; i < 5; i++) { + xstep = (attacker.x - 50 - attacker.x) / 5; + for (let i = 0; i < 5; i++) { scene.showEffect('poisonwisp', { x: attacker.x + 50 + xstep * (i + 1), y: (attacker.y + 200) + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 1.2, opacity: 1, - time: 40 * i + 400 + time: 40 * i + 400, }, { opacity: 0, - time: 50 * i + 1000 + time: 50 * i + 1000, }, 'linear'); } - var xstep = (attacker.x - 100 - attacker.x) / 5; - for (var i = 0; i < 5; i++) { + xstep = (attacker.x - 100 - attacker.x) / 5; + for (let i = 0; i < 5; i++) { scene.showEffect('iceball', { x: attacker.x + 100 + xstep * (i + 1), y: (attacker.y + 200) + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 0.6, opacity: 0.7, - time: 40 * i + 500 + time: 40 * i + 500, }, { opacity: 0, - time: 50 * i + 1000 + time: 50 * i + 1000, }, 'linear'); } - var xstep = (attacker.x - 150 - attacker.x) / 5; - for (var i = 0; i < 5; i++) { + xstep = (attacker.x - 150 - attacker.x) / 5; + for (let i = 0; i < 5; i++) { scene.showEffect('energyball', { x: attacker.x + 150 + xstep * (i + 1), y: (attacker.y + 200) + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 0.6, opacity: 0.7, - time: 40 * i + 600 + time: 40 * i + 600, }, { opacity: 0, - time: 50 * i + 1000 + time: 50 * i + 1000, }, 'linear'); } - var xstep = (attacker.x - 200 - attacker.x) / 5; - for (var i = 0; i < 5; i++) { + xstep = (attacker.x - 200 - attacker.x) / 5; + for (let i = 0; i < 5; i++) { scene.showEffect('mistball', { x: attacker.x + 200 + xstep * (i + 1), y: (attacker.y + 200) + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 0.6, opacity: 0.7, - time: 40 * i + 700 + time: 40 * i + 700, }, { opacity: 0, - time: 50 * i + 1000 + time: 50 * i + 1000, }, 'linear'); } scene.showEffect('rainbow', { @@ -28762,24 +28746,24 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.8, opacity: 0, - time: 0 + time: 0, }, { scale: 1, opacity: 0.6, - time: 1000 + time: 1000, }, 'linear', 'explode'); scene.showEffect('wisp', { x: attacker.x, y: attacker.y, z: attacker.z, scale: 2, - opacity: 0 + opacity: 0, }, { scale: 2.5, opacity: 0.7, - time: 1000 + time: 1000, }, 'linear', 'explode'); - } + }, }, guardianofalola: { anim(scene, [attacker, defender]) { @@ -28790,14 +28774,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.5, opacity: 1, - time: 400 + time: 400, }, { x: defender.x, y: defender.y + 15, z: defender.z, scale: 5.5, opacity: 0.5, - time: 799 + time: 799, }, 'accel', 'fade'); scene.showEffect('fist1', { x: defender.x, @@ -28805,14 +28789,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 5.5, opacity: 1, - time: 800 + time: 800, }, { x: defender.x, y: defender.y - 10, z: defender.z, xscale: 10, opacity: 0, - time: 1050 + time: 1050, }, 'linear'); scene.showEffect('electroball', { x: defender.x, @@ -28821,12 +28805,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 1, - time: 850 + time: 850, }, { scale: 2, xscale: 12, opacity: 0, - time: 1200 + time: 1200, }, 'linear', 'fade'); scene.showEffect('electroball', { x: defender.x, @@ -28835,12 +28819,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 1, - time: 1050 + time: 1050, }, { scale: 2, xscale: 12, opacity: 0, - time: 1500 + time: 1500, }, 'linear', 'fade'); scene.showEffect('electroball', { x: defender.x, @@ -28849,12 +28833,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 1, - time: 1250 + time: 1250, }, { scale: 2, xscale: 12, opacity: 0, - time: 1800 + time: 1800, }, 'linear', 'fade'); scene.showEffect('electroball', { x: defender.x, @@ -28862,11 +28846,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.7, scale: 1, - time: 850 + time: 850, }, { scale: 6, opacity: 0, - time: 2000 + time: 2000, }, 'linear'); scene.showEffect('wisp', { x: defender.x, @@ -28874,11 +28858,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 6, - time: 850 + time: 850, }, { scale: 12, opacity: 0.8, - time: 2000 + time: 2000, }, 'linear', 'explode'); attacker.anim({ @@ -28886,27 +28870,27 @@ const BattleMoveAnims: AnimTable = { y: attacker.y + 60, z: attacker.behind(40), opacity: 0, - time: 250 + time: 250, }, 'accel'); attacker.delay(1300); attacker.anim({ x: attacker.x, y: attacker.y, z: attacker.z, - time: 250 + time: 250, }, 'decel'); defender.delay(750); defender.anim({ y: defender.y - 30, z: defender.z, yscale: 0.5, - time: 200 + time: 200, }, 'swing'); defender.delay(700); defender.anim({ - time: 300 + time: 300, }, 'swing'); - } + }, }, splinteredstormshards: { anim(scene, [attacker, defender]) { @@ -28922,7 +28906,7 @@ const BattleMoveAnims: AnimTable = { }, { y: defender.y + 100, opacity: 0, - time: 1000 + time: 1000, }, 'accel'); scene.showEffect('rock3', { x: defender.x + 50, @@ -28930,11 +28914,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-40), scale: 0.2, opacity: 1, - time: 150 + time: 150, }, { y: defender.y + 100, opacity: 0, - time: 1100 + time: 1100, }, 'accel'); scene.showEffect('rock3', { x: defender.x + 70, @@ -28942,11 +28926,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(10), scale: 0.4, opacity: 1, - time: 175 + time: 175, }, { y: defender.y + 100, opacity: 0, - time: 1175 + time: 1175, }, 'accel'); scene.showEffect('rock3', { x: defender.x + 60, @@ -28954,11 +28938,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(30), scale: 0.3, opacity: 1, - time: 200 + time: 200, }, { y: defender.x + 100, opacity: 0, - time: 1200 + time: 1200, }, 'accel'); scene.showEffect('rock3', { x: defender.x - 40, @@ -28966,11 +28950,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-30), scale: 0.5, opacity: 1, - time: 210 + time: 210, }, { y: defender.y + 100, opacity: 0, - time: 1300 + time: 1300, }, 'accel'); scene.showEffect('rock3', { x: defender.x + 30, @@ -28978,11 +28962,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(20), scale: 0.2, opacity: 1, - time: 220 + time: 220, }, { y: defender.y + 100, opacity: 0, - time: 1220 + time: 1220, }, 'accel'); scene.showEffect('rock3', { @@ -28991,11 +28975,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-40), scale: 0.2, opacity: 1, - time: 650 + time: 650, }, { y: defender.y + 100, opacity: 0, - time: 1500 + time: 1500, }, 'accel'); scene.showEffect('rock3', { x: defender.x - 72, @@ -29003,11 +28987,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(20), scale: 0.3, opacity: 1, - time: 750 + time: 750, }, { y: defender.y + 100, opacity: 0, - time: 1500 + time: 1500, }, 'accel'); scene.showEffect('rock3', { x: defender.x + 80, @@ -29015,11 +28999,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-60), scale: 0.4, opacity: 1, - time: 850 + time: 850, }, { y: defender.y + 100, opacity: 0, - time: 1500 + time: 1500, }, 'accel'); scene.showEffect('rock3', { x: defender.x + 70, @@ -29027,11 +29011,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(-60), scale: 0.4, opacity: 1, - time: 950 + time: 950, }, { y: defender.y + 100, opacity: 0, - time: 1500 + time: 1500, }, 'accel'); scene.showEffect('flareball', { @@ -29040,12 +29024,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0, - time: 1600 + time: 1600, }, { x: defender.x + 30, y: defender.y, scale: 1.5, - opacity: 0.8 + opacity: 0.8, }, 'accel', 'explode'); scene.showEffect('rock3', { x: defender.leftof(-200), @@ -29053,12 +29037,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0, - time: 1600 + time: 1600, }, { x: defender.x + 30, y: defender.y, scale: 1, - opacity: 0.4 + opacity: 0.4, }, 'accel', 'explode'); scene.showEffect('flareball', { x: defender.leftof(-200), @@ -29066,12 +29050,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0, - time: 1750 + time: 1750, }, { x: defender.x + 30, y: defender.y - 5, scale: 1.5, - opacity: 0.8 + opacity: 0.8, }, 'accel', 'explode'); scene.showEffect('rock3', { x: defender.leftof(-150), @@ -29079,12 +29063,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0, - time: 1750 + time: 1750, }, { x: defender.x + 20, y: defender.y - 5, scale: 1, - opacity: 0.4 + opacity: 0.4, }, 'accel', 'explode'); scene.showEffect('flareball', { x: defender.leftof(150), @@ -29092,12 +29076,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0, - time: 1900 + time: 1900, }, { x: defender.x - 20, y: defender.y, scale: 1, - opacity: 0.8 + opacity: 0.8, }, 'accel', 'explode'); scene.showEffect('rock3', { x: defender.leftof(150), @@ -29105,12 +29089,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0, - time: 1900 + time: 1900, }, { x: defender.x - 20, y: defender.y, scale: 1, - opacity: 0.4 + opacity: 0.4, }, 'accel', 'explode'); scene.showEffect('flareball', { x: defender.leftof(-300), @@ -29118,12 +29102,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0, - time: 1950 + time: 1950, }, { x: defender.x + 20, y: defender.y, scale: 1.5, - opacity: 0.8 + opacity: 0.8, }, 'accel', 'explode'); scene.showEffect('rock3', { x: defender.leftof(-300), @@ -29131,12 +29115,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0, - time: 1950 + time: 1950, }, { x: defender.x + 20, y: defender.y, scale: 1, - opacity: 0.4 + opacity: 0.4, }, 'accel', 'explode'); scene.showEffect('flareball', { x: defender.leftof(-175), @@ -29144,12 +29128,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0, - time: 2100 + time: 2100, }, { x: defender.x + 20, y: defender.y, scale: 1.5, - opacity: 0.8 + opacity: 0.8, }, 'accel', 'explode'); scene.showEffect('rock3', { x: defender.leftof(-175), @@ -29157,12 +29141,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0, - time: 2100 + time: 2100, }, { x: defender.x + 20, y: defender.y, scale: 1, - opacity: 0.4 + opacity: 0.4, }, 'accel', 'explode'); scene.showEffect('mudwisp', { @@ -29172,12 +29156,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 2, opacity: 0.8, - time: 1850 + time: 1850, }, { scale: 1, xscale: 9, opacity: 0, - time: 2750 + time: 2750, }, 'decel', 'fade'); scene.showEffect('wisp', { x: defender.x, @@ -29185,10 +29169,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 2, - time: 1950 + time: 1950, }, { scale: 6, - time: 2700 + time: 2700, }, 'linear', 'explode'); scene.showEffect('wisp', { x: defender.x, @@ -29197,10 +29181,10 @@ const BattleMoveAnims: AnimTable = { opacity: 1, scale: 3, yscale: 10, - time: 1850 + time: 1850, }, { xscale: 0, - time: 2700 + time: 2700, }, 'accel', 'fade'); scene.showEffect('wisp', { x: defender.x - 5, @@ -29208,14 +29192,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 2450 + time: 2450, }, { x: defender.x - 10, y: defender.y - 10, z: defender.z, scale: 2, opacity: 0.1, - time: 2750 + time: 2750, }, 'linear', 'explode'); scene.showEffect('wisp', { x: defender.x + 10, @@ -29223,14 +29207,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 2575 + time: 2575, }, { x: defender.x + 20, y: defender.y + 20, z: defender.z, scale: 1.5, opacity: 0.1, - time: 2875 + time: 2875, }, 'linear', 'explode'); scene.showEffect('wisp', { x: defender.x + 20, @@ -29238,48 +29222,48 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.6, opacity: 0.6, - time: 2600 + time: 2600, }, { x: defender.x + 30, y: defender.y - 25, z: defender.z, scale: 2, opacity: 0.1, - time: 2900 + time: 2900, }, 'linear', 'explode'); defender.delay(1925); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(15), time: 75, - opacity: 0 + opacity: 0, }, 'swing'); defender.delay(300); defender.anim({ - time: 200 + time: 200, }, 'swing'); - } + }, }, letssnuggleforever: { anim(scene, [attacker, defender]) { @@ -29287,7 +29271,7 @@ const BattleMoveAnims: AnimTable = { x: attacker.x, y: attacker.y + 250, z: attacker.behind(-50), - time: 300 + time: 300, }, 'decel'); attacker.delay(300); attacker.anim({ @@ -29295,7 +29279,7 @@ const BattleMoveAnims: AnimTable = { y: defender.y + 15, z: defender.behind(10), scale: 4, - time: 400 + time: 400, }, 'decel'); attacker.delay(300); attacker.anim({ @@ -29304,7 +29288,7 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(10), yscale: 4.2, xscale: 4, - time: 200 + time: 200, }); attacker.anim({ x: defender.x, @@ -29312,7 +29296,7 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(10), yscale: 3, xscale: 4.2, - time: 200 + time: 200, }); attacker.anim({ x: defender.x, @@ -29320,7 +29304,7 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(10), yscale: 4.5, xscale: 4, - time: 200 + time: 200, }); attacker.anim({ x: defender.x, @@ -29328,7 +29312,7 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(10), yscale: 3, xscale: 4.2, - time: 200 + time: 200, }); attacker.anim({ x: defender.x, @@ -29336,7 +29320,7 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(10), yscale: 4.5, xscale: 4, - time: 200 + time: 200, }); attacker.anim({ x: defender.x, @@ -29344,42 +29328,42 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(10), yscale: 3, xscale: 4.2, - time: 200 + time: 200, }); attacker.anim({ x: defender.x, y: defender.y + 15, z: defender.behind(10), scale: 4, - time: 200 + time: 200, }); attacker.delay(300); attacker.anim({ - time: 500 + time: 500, }, 'ballistic'); defender.delay(750); defender.anim({ opacity: 0, - time: 50 + time: 50, }, 'swing'); defender.delay(2100); defender.anim({ y: defender.y + 100, z: defender.behind(5), opacity: 1, - time: 300 + time: 300, }, 'decel'); defender.anim({ - time: 250 + time: 250, }, 'accel'); defender.anim({ x: defender.x, y: defender.y - 30, yscale: 0.25, - time: 50 + time: 50, }, 'swing'); defender.anim({ - time: 300 + time: 300, }, 'swing'); scene.showEffect('impact', { @@ -29388,11 +29372,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 1, opacity: 1, - time: 1575 + time: 1575, }, { scale: 2, opacity: 0, - time: 1775 + time: 1775, }, 'linear'); scene.showEffect('impact', { x: defender.x + 25, @@ -29400,11 +29384,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 1, opacity: 1, - time: 1700 + time: 1700, }, { scale: 2, opacity: 0, - time: 1900 + time: 1900, }, 'linear'); scene.showEffect('impact', { x: defender.x - 25, @@ -29412,11 +29396,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 1, opacity: 1, - time: 1700 + time: 1700, }, { scale: 2, opacity: 0, - time: 2000 + time: 2000, }, 'linear'); scene.showEffect('impact', { x: defender.x + 2, @@ -29424,11 +29408,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 1, opacity: 1, - time: 1800 + time: 1800, }, { scale: 2, opacity: 0, - time: 2100 + time: 2100, }, 'linear'); scene.showEffect('impact', { x: defender.x + 35, @@ -29436,11 +29420,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 1, opacity: 1, - time: 1900 + time: 1900, }, { scale: 2, opacity: 0, - time: 2300 + time: 2300, }, 'linear'); scene.showEffect('impact', { x: defender.x + 5, @@ -29448,11 +29432,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 1, opacity: 1, - time: 2100 + time: 2100, }, { scale: 2, opacity: 0, - time: 2300 + time: 2300, }, 'linear'); scene.showEffect('impact', { x: defender.x - 35, @@ -29460,11 +29444,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 1, opacity: 1, - time: 2200 + time: 2200, }, { scale: 2, opacity: 0, - time: 2500 + time: 2500, }, 'linear'); scene.showEffect('impact', { x: defender.x + 35, @@ -29472,11 +29456,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 1, opacity: 1, - time: 2300 + time: 2300, }, { scale: 2, opacity: 0, - time: 2600 + time: 2600, }, 'linear'); scene.showEffect('impact', { x: defender.x, @@ -29484,11 +29468,11 @@ const BattleMoveAnims: AnimTable = { z: defender.behind(5), scale: 1, opacity: 1, - time: 2500 + time: 2500, }, { scale: 3, opacity: 0, - time: 2800 + time: 2800, }, 'linear'); scene.showEffect('mudwisp', { x: defender.x + 5, @@ -29496,14 +29480,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 0.6, - time: 1450 + time: 1450, }, { x: defender.x - 10, y: defender.y - 10, z: defender.z, scale: 1, opacity: 0.8, - time: 1750 + time: 1750, }, 'linear', 'explode'); scene.showEffect('wisp', { x: defender.x + 10, @@ -29511,14 +29495,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 0.6, - time: 1575 + time: 1575, }, { x: defender.x + 20, y: defender.y + 20, z: defender.z, scale: 1, opacity: 0.8, - time: 1875 + time: 1875, }, 'linear', 'explode'); scene.showEffect('mudwisp', { x: defender.x + 20, @@ -29526,14 +29510,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 0.6, - time: 1600 + time: 1600, }, { x: defender.x + 30, y: defender.y - 25, z: defender.z, scale: 1, opacity: 0.8, - time: 2000 + time: 2000, }, 'linear', 'explode'); scene.showEffect('wisp', { x: defender.x + 5, @@ -29541,14 +29525,14 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 0.6, - time: 1950 + time: 1950, }, { x: defender.x - 10, y: defender.y - 10, z: defender.z, scale: 1.5, opacity: 0.8, - time: 2350 + time: 2350, }, 'linear', 'explode'); scene.showEffect('mudwisp', { x: defender.x + 10, @@ -29556,15 +29540,15 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 1, opacity: 0.6, - time: 2175 + time: 2175, }, { x: defender.x + 20, y: defender.y - 25, scale: 1.5, opacity: 0.8, - time: 2575 + time: 2575, }, 'linear', 'explode'); - } + }, }, clangoroussoulblaze: { anim(scene, [attacker, ...defenders]) { @@ -29575,60 +29559,60 @@ const BattleMoveAnims: AnimTable = { attacker.anim({ y: attacker.y - 10, yscale: 0.9, - time: 50 + time: 50, }); attacker.anim({ y: attacker.y + 250, yscale: 1, - time: 300 + time: 300, }, 'decel'); attacker.delay(1700); attacker.anim({ opacity: 0, - time: 1 + time: 1, }); attacker.anim({ opacity: 1, - time: 200 + time: 200, }); for (const defender of defenders) { defender.delay(1825); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(15), time: 75, - opacity: 0 + opacity: 0, }, 'swing'); defender.delay(400); defender.anim({ - time: 200 + time: 200, }, 'swing'); } const defender = defenders[1] || defenders[0]; @@ -29641,10 +29625,10 @@ const BattleMoveAnims: AnimTable = { y: attacker.y - 10, z: attacker.z, scale: 0.3, - opacity: 0.6 + opacity: 0.6, }, { opacity: 0, - time: 300 + time: 300, }, 'decel'); scene.showEffect('shine', { x: attacker.x + 20, @@ -29652,10 +29636,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.6, - time: 100 + time: 100, }, { opacity: 0, - time: 400 + time: 400, }, 'decel'); scene.showEffect('shine', { x: attacker.x - 5, @@ -29663,10 +29647,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.6, - time: 200 + time: 200, }, { opacity: 0, - time: 500 + time: 500, }, 'decel'); scene.showEffect('shine', { x: attacker.x + 5, @@ -29674,10 +29658,10 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.3, opacity: 0.6, - time: 300 + time: 300, }, { opacity: 0, - time: 600 + time: 600, }, 'accel'); scene.showEffect('shine', { @@ -29686,11 +29670,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 0 + time: 0, }, { y: attacker.y + 40, opacity: 0, - time: 400 + time: 400, }, 'accel'); scene.showEffect('shine', { x: attacker.x - 20, @@ -29698,11 +29682,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 200 + time: 200, }, { y: attacker.y + 40, opacity: 0, - time: 600 + time: 600, }, 'accel'); scene.showEffect('shine', { x: attacker.x, @@ -29710,11 +29694,11 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0.2, opacity: 1, - time: 400 + time: 400, }, { y: attacker.y + 40, opacity: 0, - time: 800 + time: 800, }, 'accel'); scene.showEffect('mistball', { @@ -29723,13 +29707,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 1700 + time: 1700, }, { y: defender.y - 200, z: defender.behind(150), scale: 10, opacity: 0, - time: 2100 + time: 2100, }, 'linear'); scene.showEffect('shadowball', { x: attacker.x, @@ -29737,13 +29721,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 1800 + time: 1800, }, { y: defender.y - 200, z: defender.behind(150), scale: 10, opacity: 0, - time: 2200 + time: 2200, }, 'linear'); scene.showEffect('mistball', { x: attacker.x, @@ -29751,13 +29735,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 1900 + time: 1900, }, { y: defender.y - 200, z: defender.behind(150), scale: 10, opacity: 0, - time: 2300 + time: 2300, }, 'linear'); scene.showEffect('shadowball', { x: attacker.x, @@ -29765,13 +29749,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 2000 + time: 2000, }, { y: defender.y - 200, z: defender.behind(150), scale: 10, opacity: 0, - time: 2400 + time: 2400, }, 'linear'); scene.showEffect('mistball', { x: attacker.x, @@ -29779,13 +29763,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 2100 + time: 2100, }, { y: defender.y - 200, z: defender.behind(150), scale: 10, opacity: 0, - time: 2500 + time: 2500, }, 'linear'); scene.showEffect('shadowball', { x: attacker.x, @@ -29793,13 +29777,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 2200 + time: 2200, }, { y: defender.y - 200, z: defender.behind(150), scale: 10, opacity: 0, - time: 2600 + time: 2600, }, 'linear'); scene.showEffect('mistball', { x: attacker.x, @@ -29807,13 +29791,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 2300 + time: 2300, }, { y: defender.y - 200, z: defender.behind(150), scale: 10, opacity: 0, - time: 2700 + time: 2700, }, 'linear'); scene.showEffect('shadowball', { x: attacker.x, @@ -29821,13 +29805,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 2400 + time: 2400, }, { y: defender.y - 200, z: defender.behind(150), scale: 10, opacity: 0, - time: 2800 + time: 2800, }, 'linear'); scene.showEffect('mistball', { x: attacker.x, @@ -29835,13 +29819,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 0, opacity: 1, - time: 2500 + time: 2500, }, { y: defender.y - 200, z: defender.behind(150), scale: 10, opacity: 0, - time: 2900 + time: 2900, }, 'linear'); scene.showEffect('fireball', { @@ -29850,10 +29834,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 2300 + time: 2300, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('fireball', { x: defender.x - 40, @@ -29861,10 +29845,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 2550 + time: 2550, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('fireball', { x: defender.x + 10, @@ -29872,12 +29856,12 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 0.6, - time: 2700 + time: 2700, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'decel'); - } + }, }, soulstealing7starstrike: { anim(scene, [attacker, defender]) { @@ -29889,13 +29873,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 1, - time: 300 + time: 300, }, { x: attacker.leftof(-20), y: attacker.y, z: attacker.behind(-40), opacity: 0, - time: 500 + time: 500, }, 'decel'); scene.showEffect('fist', { x: attacker.x, @@ -29903,13 +29887,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 1, - time: 350 + time: 350, }, { x: attacker.leftof(20), y: attacker.y - 5, z: attacker.behind(-40), opacity: 0, - time: 600 + time: 600, }, 'decel'); scene.showEffect('fist', { x: attacker.x, @@ -29917,13 +29901,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 1, - time: 400 + time: 400, }, { x: attacker.x, y: attacker.y + 5, z: attacker.behind(-40), opacity: 0, - time: 700 + time: 700, }, 'decel'); scene.showEffect('iceball', { @@ -29932,11 +29916,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 1, - time: 250 + time: 250, }, { opacity: 0, scale: 0.5, - time: 300 + time: 300, }, 'linear', 'explode'); scene.showEffect('iceball', { x: attacker.x, @@ -29944,11 +29928,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 450 + time: 450, }, { opacity: 0, scale: 0.5, - time: 550 + time: 550, }, 'linear', 'explode'); scene.showEffect('iceball', { x: defender.x + 30, @@ -29956,11 +29940,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 650 + time: 650, }, { opacity: 0, scale: 0.5, - time: 700 + time: 700, }, 'linear', 'explode'); scene.showEffect('iceball', { x: defender.x - 10, @@ -29968,11 +29952,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 850 + time: 850, }, { opacity: 0, scale: 0.5, - time: 900 + time: 900, }, 'linear', 'explode'); scene.showEffect('iceball', { x: defender.x + 10, @@ -29980,11 +29964,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 1050 + time: 1050, }, { opacity: 0, scale: 0.5, - time: 1100 + time: 1100, }, 'linear', 'explode'); scene.showEffect('iceball', { x: defender.x - 10, @@ -29992,11 +29976,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 1250 + time: 1250, }, { opacity: 0, scale: 0.5, - time: 1300 + time: 1300, }, 'linear', 'explode'); scene.showEffect('iceball', { x: defender.x + 10, @@ -30004,11 +29988,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 1450 + time: 1450, }, { opacity: 0, scale: 0.5, - time: 1500 + time: 1500, }, 'linear', 'explode'); scene.showEffect('shine', { @@ -30017,11 +30001,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0.7, - time: 300 + time: 300, }, { opacity: 0.9, scale: 0.2, - time: 2500 + time: 2500, }, 'decel', 'explode'); scene.showEffect('shine', { x: defender.x, @@ -30029,11 +30013,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0.7, - time: 500 + time: 500, }, { opacity: 0.9, scale: 0.2, - time: 2500 + time: 2500, }, 'decel', 'explode'); scene.showEffect('shine', { x: defender.x + 30, @@ -30041,11 +30025,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0.7, - time: 700 + time: 700, }, { opacity: 0.9, scale: 0.2, - time: 2500 + time: 2500, }, 'decel', 'explode'); scene.showEffect('shine', { x: defender.x - 10, @@ -30053,11 +30037,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0.7, - time: 900 + time: 900, }, { opacity: 0.9, scale: 0.2, - time: 2500 + time: 2500, }, 'decel', 'explode'); scene.showEffect('shine', { x: defender.x + 10, @@ -30065,11 +30049,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0.7, - time: 1100 + time: 1100, }, { opacity: 0.9, scale: 0.2, - time: 2500 + time: 2500, }, 'decel', 'explode'); scene.showEffect('shine', { x: defender.x - 10, @@ -30077,11 +30061,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0.7, - time: 1300 + time: 1300, }, { opacity: 0.9, scale: 0.2, - time: 2500 + time: 2500, }, 'decel', 'explode'); scene.showEffect('shine', { x: defender.x + 10, @@ -30089,11 +30073,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.1, opacity: 0.7, - time: 1500 + time: 1500, }, { opacity: 0.9, scale: 0.2, - time: 2500 + time: 2500, }, 'decel', 'explode'); scene.showEffect('zsymbol', { @@ -30102,11 +30086,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0.7, opacity: 1, - time: 1600 + time: 1600, }, { scale: 1, opacity: 0, - time: 2600 + time: 2600, }, 'decel'); scene.showEffect(attacker.sp, { @@ -30115,13 +30099,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, opacity: 0.3, scale: 1, - time: 1900 + time: 1900, }, { x: attacker.x, y: attacker.y + 250, z: attacker.behind(-50), opacity: 0, - time: 2300 + time: 2300, }, 'accel'); scene.showEffect(attacker.sp, { x: attacker.x, @@ -30129,13 +30113,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, opacity: 0.3, scale: 1, - time: 1920 + time: 1920, }, { x: attacker.x, y: attacker.y + 250, z: attacker.behind(-50), opacity: 0, - time: 2320 + time: 2320, }, 'accel'); scene.showEffect(attacker.sp, { x: attacker.x, @@ -30143,13 +30127,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, opacity: 0.3, scale: 1, - time: 1940 + time: 1940, }, { x: attacker.x, y: attacker.y + 250, z: attacker.behind(-50), opacity: 0, - time: 2340 + time: 2340, }, 'accel'); scene.showEffect('shadowball', { @@ -30159,12 +30143,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 2, opacity: 0.5, - time: 3350 + time: 3350, }, { scale: 1, xscale: 12, opacity: 0, - time: 3750 + time: 3750, }, 'decel', 'fade'); scene.showEffect('shadowball', { x: defender.x, @@ -30172,11 +30156,11 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 0.4, scale: 0.5, - time: 3350 + time: 3350, }, { scale: 3, opacity: 0, - time: 3900 + time: 3900, }, 'decel'); scene.showEffect('poisonwisp', { x: defender.x, @@ -30185,11 +30169,11 @@ const BattleMoveAnims: AnimTable = { opacity: 1, scale: 5, yscale: 13, - time: 3350 + time: 3350, }, { opacity: 0.5, xscale: 0, - time: 4200 + time: 4200, }, 'accel', 'fade'); scene.showEffect('poisonwisp', { x: defender.x, @@ -30197,31 +30181,31 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 2, - time: 3350 + time: 3350, }, { opacity: 0.5, scale: 6, - time: 4200 + time: 4200, }, 'decel', 'explode'); attacker.anim({ z: attacker.behind(15), - time: 200 + time: 200, }, 'decel'); attacker.anim({ z: defender.behind(-175), - time: 300 + time: 300, }, 'accel'); attacker.anim({ z: attacker.z, - time: 400 + time: 400, }, 'swing'); attacker.delay(1100); attacker.anim({ x: attacker.x, y: attacker.y + 250, z: attacker.behind(-50), - time: 300 + time: 300, }, 'decel'); attacker.delay(300); attacker.anim({ @@ -30229,14 +30213,14 @@ const BattleMoveAnims: AnimTable = { y: defender.y, z: defender.behind(-10), opacity: 1, - time: 300 + time: 300, }, 'linear'); attacker.anim({ x: defender.leftof(-10), y: defender.y, z: defender.behind(-10), opacity: 0, - time: 0 + time: 0, }, 'linear'); attacker.delay(600); attacker.anim({ @@ -30244,66 +30228,66 @@ const BattleMoveAnims: AnimTable = { y: attacker.y, z: attacker.behind(70), opacity: 0, - time: 1 + time: 1, }, 'linear'); attacker.delay(600); attacker.anim({ opacity: 1, - time: 500 + time: 500, }, 'decel'); defender.delay(400); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.anim({ z: defender.behind(5), - time: 75 + time: 75, }, 'swing'); defender.anim({ - time: 75 + time: 75, }, 'swing'); defender.delay(2275); defender.anim({ z: defender.behind(5), opacity: 0, - time: 75 + time: 75, }, 'swing'); defender.delay(600); defender.anim({ - time: 150 + time: 150, }, 'swing'); - } + }, }, searingsunrazesmash: { anim(scene, [attacker, defender]) { - var xstep = (defender.x - attacker.x) / 5; - var ystep = (defender.x - 200 - attacker.x) / 5; - var zstep = (defender.z - attacker.z) / 5; + let xstep = (defender.x - attacker.x) / 5; + let ystep = (defender.x - 200 - attacker.x) / 5; + let zstep = (defender.z - attacker.z) / 5; scene.backgroundEffect("url('https://play.pokemonshowdown.com/fx/weather-trickroom.png')", 700, 1); scene.backgroundEffect("url('https://play.pokemonshowdown.com/fx/bg-space.jpg')", 2500, 1, 700); @@ -30315,23 +30299,23 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 2.5, opacity: 1, - time: 1700 + time: 1700, }, { scale: 3, opacity: 0, - time: 2400 + time: 2400, }, 'decel'); - for (var i = 0; i < 5; i++) { + for (let i = 0; i < 5; i++) { scene.showEffect('flareball', { x: attacker.x + xstep * (i + 1), y: (attacker.y + 200) + ystep * (i + 1), z: attacker.z + zstep * (i + 1), scale: 2, opacity: 0.8, - time: 40 * i + 1900 + time: 40 * i + 1900, }, { opacity: 0, - time: 60 * i + 2700 + time: 60 * i + 2700, }, 'linear'); } scene.showEffect('iceball', { @@ -30340,13 +30324,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.1, - time: 2000 + time: 2000, }, { x: defender.x, y: defender.y, z: defender.behind(5), scale: 1.5, - time: 2400 + time: 2400, }, 'accel', 'explode'); scene.showEffect('iceball', { x: attacker.leftof(-25), @@ -30354,13 +30338,13 @@ const BattleMoveAnims: AnimTable = { z: attacker.z, scale: 1, opacity: 0.8, - time: 2050 + time: 2050, }, { x: defender.x, y: defender.y, z: defender.behind(5), scale: 1.5, - time: 2450 + time: 2450, }, 'accel', 'explode'); scene.showEffect('flareball', { @@ -30370,12 +30354,12 @@ const BattleMoveAnims: AnimTable = { scale: 1, xscale: 3, opacity: 0.5, - time: 2275 + time: 2275, }, { scale: 3, xscale: 8, opacity: 0.1, - time: 2875 + time: 2875, }, 'linear', 'fade'); scene.showEffect('fireball', { x: defender.x + 40, @@ -30383,10 +30367,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 2500 + time: 2500, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('fireball', { x: defender.x - 40, @@ -30394,10 +30378,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 2650 + time: 2650, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('fireball', { x: defender.x + 10, @@ -30405,10 +30389,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 2800 + time: 2800, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('fireball', { x: defender.x, @@ -30416,10 +30400,10 @@ const BattleMoveAnims: AnimTable = { z: defender.z, scale: 0, opacity: 1, - time: 2950 + time: 2950, }, { scale: 6, - opacity: 0 + opacity: 0, }, 'decel'); scene.showEffect('wisp', { x: defender.x, @@ -30427,314 +30411,314 @@ const BattleMoveAnims: AnimTable = { z: defender.z, opacity: 1, scale: 3, - time: 2350 + time: 2350, }, { scale: 13, - time: 3700 + time: 3700, }, 'linear', 'explode'); attacker.anim({ opacity: 0, - time: 100 + time: 100, }); attacker.delay(500); attacker.anim({ opacity: 1, - time: 100 + time: 100, }); attacker.delay(500); attacker.anim({ y: defender.y + 120, opacity: 0, - time: 300 + time: 300, }, 'accel'); attacker.delay(2525); attacker.anim({ x: attacker.x, y: attacker.y + 40, z: attacker.behind(40), - time: 1 + time: 1, }); attacker.anim({ x: attacker.x, y: attacker.y, z: attacker.z, - time: 250 + time: 250, }, 'decel'); defender.anim({ opacity: 0, - time: 100 + time: 100, }); defender.delay(500); defender.anim({ opacity: 1, - time: 100 + time: 100, }); defender.delay(1875); defender.anim({ z: defender.behind(30), time: 500, - opacity: 0 + opacity: 0, }, 'decel'); defender.delay(600); defender.anim({ - time: 400 + time: 400, }, 'swing'); - } - } + }, + }, }; // placeholder animations -BattleMoveAnims['torment'] = {anim:BattleMoveAnims['swagger'].anim}; - -BattleMoveAnims['mefirst'] = {anim:BattleMoveAnims['mimic'].anim}; - -BattleMoveAnims['conversion2'] = {anim:BattleMoveAnims['conversion'].anim}; - -BattleMoveAnims['gearup'] = {anim:BattleMoveAnims['shiftgear'].anim}; -BattleMoveAnims['honeclaws'] = {anim:BattleMoveAnims['rockpolish'].anim}; - -BattleMoveAnims['workup'] = {anim:BattleMoveAnims['bulkup'].anim}; - -BattleMoveAnims['heatcrash'] = {anim:BattleMoveAnims['flareblitz'].anim}; -BattleMoveAnims['darkestlariat'] = {anim:BattleMoveAnims['flareblitz'].anim}; -BattleMoveAnims['flameburst'] = {anim:BattleMoveAnims['shelltrap'].anim}; -BattleMoveAnims['searingshot'] = {anim:BattleMoveAnims['shelltrap'].anim}; -BattleMoveAnims['fierydance'] = {anim:BattleMoveAnims['magmastorm'].anim}; -BattleMoveAnims['inferno'] = {anim:BattleMoveAnims['magmastorm'].anim}; -BattleMoveAnims['mysticalfire'] = {anim:BattleMoveAnims['flamethrower'].anim}; -BattleMoveAnims['firepledge'] = {anim:BattleMoveAnims['flamethrower'].anim}; -BattleMoveAnims['ember'] = {anim:BattleMoveAnims['flamethrower'].anim}; -BattleMoveAnims['incinerate'] = {anim:BattleMoveAnims['flamethrower'].anim}; -BattleMoveAnims['flamewheel'] = {anim:BattleMoveAnims['flamecharge'].anim}; - -BattleMoveAnims['razorleaf'] = {anim:BattleMoveAnims['magicalleaf'].anim}; -BattleMoveAnims['grasspledge'] = {anim:BattleMoveAnims['magicalleaf'].anim}; -BattleMoveAnims['sleeppowder'] = {anim:BattleMoveAnims['spore'].anim}; -BattleMoveAnims['poisonpowder'] = {anim:BattleMoveAnims['spore'].anim}; -BattleMoveAnims['stunspore'] = {anim:BattleMoveAnims['spore'].anim}; -BattleMoveAnims['powder'] = {anim:BattleMoveAnims['spore'].anim}; -BattleMoveAnims['cottonspore'] = {anim:BattleMoveAnims['spore'].anim}; -BattleMoveAnims['vinewhip'] = {anim:BattleMoveAnims['powerwhip'].anim}; - -BattleMoveAnims['bubble'] = {anim:BattleMoveAnims['bubblebeam'].anim}; -BattleMoveAnims['sparklingaria'] = {anim:BattleMoveAnims['bubblebeam'].anim}; - -BattleMoveAnims['watergun'] = {anim:BattleMoveAnims['watersport'].anim}; -BattleMoveAnims['whirlpool'] = {anim:BattleMoveAnims['watersport'].anim}; - -BattleMoveAnims['waterfall'] = {anim:BattleMoveAnims['aquajet'].anim}; -BattleMoveAnims['aquatail'] = {anim:BattleMoveAnims['crabhammer'].anim}; -BattleMoveAnims['liquidation'] = {anim:BattleMoveAnims['crabhammer'].anim}; - -BattleMoveAnims['magikarpsrevenge'] = {anim:BattleMoveAnims['outrage'].anim}; - -BattleMoveAnims['electrify'] = {anim:BattleMoveAnims['thunderwave'].anim}; -BattleMoveAnims['volttackle'] = {anim:BattleMoveAnims['wildcharge'].anim}; -BattleMoveAnims['zingzap'] = {anim:BattleMoveAnims['wildcharge'].anim}; -BattleMoveAnims['nuzzle'] = {anim:BattleMoveAnims['spark'].anim}; -BattleMoveAnims['thundershock'] = {anim:BattleMoveAnims['electroball'].anim}; - -BattleMoveAnims['glaciate'] = {anim:BattleMoveAnims['freezedry'].anim}; -BattleMoveAnims['frostbreath'] = {anim:BattleMoveAnims['freezedry'].anim}; -BattleMoveAnims['aurorabeam'] = {anim:BattleMoveAnims['icebeam'].anim}; -BattleMoveAnims['powdersnow'] = {anim:BattleMoveAnims['icywind'].anim}; - -BattleMoveAnims['pinmissile'] = {anim:BattleMoveAnims['bulletseed'].anim, multihit: true}; -BattleMoveAnims['attackorder'] = {anim:BattleMoveAnims['bulletseed'].anim}; -BattleMoveAnims['fellstinger'] = {anim:BattleMoveAnims['bulletseed'].anim}; -BattleMoveAnims['strugglebug'] = {anim:BattleMoveAnims['bulletseed'].anim}; -BattleMoveAnims['infestation'] = {anim:BattleMoveAnims['bulletseed'].anim}; - -BattleMoveAnims['nightdaze'] = {anim:BattleMoveAnims['darkpulse'].anim}; - -BattleMoveAnims['strengthsap'] = {anim:BattleMoveAnims['leechlife'].anim}; -BattleMoveAnims['hornattack'] = {anim:BattleMoveAnims['megahorn'].anim}; -BattleMoveAnims['lunge'] = {anim:BattleMoveAnims['megahorn'].anim}; - -BattleMoveAnims['constrict'] = {anim:BattleMoveAnims['bind'].anim}; -BattleMoveAnims['wrap'] = {anim:BattleMoveAnims['bind'].anim}; - -BattleMoveAnims['lowsweep'] = {anim:BattleMoveAnims['lowkick'].anim}; -BattleMoveAnims['megakick'] = {anim:BattleMoveAnims['jumpkick'].anim}; -BattleMoveAnims['frustration'] = {anim:BattleMoveAnims['thrash'].anim}; -BattleMoveAnims['rage'] = {anim:BattleMoveAnims['thrash'].anim}; -BattleMoveAnims['headsmash'] = {anim:BattleMoveAnims['gigaimpact'].anim}; -BattleMoveAnims['headcharge'] = {anim:BattleMoveAnims['gigaimpact'].anim}; -BattleMoveAnims['takedown'] = {anim:BattleMoveAnims['gigaimpact'].anim}; -BattleMoveAnims['dragonrush'] = {anim:BattleMoveAnims['gigaimpact'].anim}; -BattleMoveAnims['lastresort'] = {anim:BattleMoveAnims['gigaimpact'].anim}; -BattleMoveAnims['horndrill'] = {anim:BattleMoveAnims['gigaimpact'].anim}; -BattleMoveAnims['trumpcard'] = {anim:BattleMoveAnims['gigaimpact'].anim}; -BattleMoveAnims['doubleedge'] = {anim:BattleMoveAnims['gigaimpact'].anim}; - -BattleMoveAnims['paleowave'] = {anim:BattleMoveAnims['muddywater'].anim}; -BattleMoveAnims['rocktomb'] = {anim:BattleMoveAnims['rockslide'].anim}; - -BattleMoveAnims['frenzyplant'] = {anim:BattleMoveAnims['leafstorm'].anim}; -BattleMoveAnims['hydrocannon'] = {anim:BattleMoveAnims['hydropump'].anim}; - -BattleMoveAnims['guardsplit'] = {anim:BattleMoveAnims['skillswap'].anim}; -BattleMoveAnims['powersplit'] = {anim:BattleMoveAnims['skillswap'].anim}; -BattleMoveAnims['guardswap'] = {anim:BattleMoveAnims['skillswap'].anim}; -BattleMoveAnims['heartswap'] = {anim:BattleMoveAnims['skillswap'].anim}; -BattleMoveAnims['powerswap'] = {anim:BattleMoveAnims['skillswap'].anim}; -BattleMoveAnims['speedswap'] = {anim:BattleMoveAnims['skillswap'].anim}; -BattleMoveAnims['psychoshift'] = {anim:BattleMoveAnims['painsplit'].anim}; -BattleMoveAnims['helpinghand'] = {anim:BattleMoveAnims['painsplit'].anim}; -BattleMoveAnims['entrainment'] = {anim:BattleMoveAnims['painsplit'].anim}; -BattleMoveAnims['roleplay'] = {anim:BattleMoveAnims['painsplit'].anim}; -BattleMoveAnims['psychup'] = {anim:BattleMoveAnims['painsplit'].anim}; -BattleMoveAnims['holdhands'] = {anim:BattleMoveAnims['painsplit'].anim}; -BattleMoveAnims['lunardance'] = {anim:BattleMoveAnims['wish'].anim}; - -BattleMoveAnims['brickbreak'] = {anim:BattleMoveAnims['karatechop'].anim}; -BattleMoveAnims['throatchop'] = {anim:BattleMoveAnims['karatechop'].anim}; -BattleMoveAnims['wringout'] = {anim:BattleMoveAnims['forcepalm'].anim}; -BattleMoveAnims['stormthrow'] = {anim:BattleMoveAnims['circlethrow'].anim}; -BattleMoveAnims['vitalthrow'] = {anim:BattleMoveAnims['circlethrow'].anim}; -BattleMoveAnims['doubleslap'] = {anim:BattleMoveAnims['wakeupslap'].anim}; -BattleMoveAnims['crushgrip'] = {anim:BattleMoveAnims['quash'].anim}; - -BattleMoveAnims['beatup'] = {anim:BattleMoveAnims['slam'].anim}; -BattleMoveAnims['counter'] = {anim:BattleMoveAnims['slam'].anim}; -BattleMoveAnims['payback'] = {anim:BattleMoveAnims['slam'].anim}; -BattleMoveAnims['revenge'] = {anim:BattleMoveAnims['slam'].anim}; -BattleMoveAnims['rockclimb'] = {anim:BattleMoveAnims['slam'].anim}; -BattleMoveAnims['tackle'] = {anim:BattleMoveAnims['slam'].anim}; -BattleMoveAnims['dragonhammer'] = {anim:BattleMoveAnims['heavyslam'].anim}; - -BattleMoveAnims['highhorsepower'] = {anim:BattleMoveAnims['stomp'].anim}; - -BattleMoveAnims['retaliate'] = {anim:BattleMoveAnims['closecombat'].anim}; -BattleMoveAnims['superpower'] = {anim:BattleMoveAnims['closecombat'].anim}; -BattleMoveAnims['submission'] = {anim:BattleMoveAnims['closecombat'].anim}; -BattleMoveAnims['bonerush'] = {anim:BattleMoveAnims['boneclub'].anim, multihit:true}; - -BattleMoveAnims['dragonrage'] = {anim:BattleMoveAnims['dragonbreath'].anim}; - -BattleMoveAnims['silverwind'] = {anim:BattleMoveAnims['whirlwind'].anim}; -BattleMoveAnims['gust'] = {anim:BattleMoveAnims['whirlwind'].anim}; -BattleMoveAnims['twister'] = {anim:BattleMoveAnims['whirlwind'].anim}; +BattleMoveAnims['torment'] = {anim: BattleMoveAnims['swagger'].anim}; + +BattleMoveAnims['mefirst'] = {anim: BattleMoveAnims['mimic'].anim}; + +BattleMoveAnims['conversion2'] = {anim: BattleMoveAnims['conversion'].anim}; + +BattleMoveAnims['gearup'] = {anim: BattleMoveAnims['shiftgear'].anim}; +BattleMoveAnims['honeclaws'] = {anim: BattleMoveAnims['rockpolish'].anim}; + +BattleMoveAnims['workup'] = {anim: BattleMoveAnims['bulkup'].anim}; + +BattleMoveAnims['heatcrash'] = {anim: BattleMoveAnims['flareblitz'].anim}; +BattleMoveAnims['darkestlariat'] = {anim: BattleMoveAnims['flareblitz'].anim}; +BattleMoveAnims['flameburst'] = {anim: BattleMoveAnims['shelltrap'].anim}; +BattleMoveAnims['searingshot'] = {anim: BattleMoveAnims['shelltrap'].anim}; +BattleMoveAnims['fierydance'] = {anim: BattleMoveAnims['magmastorm'].anim}; +BattleMoveAnims['inferno'] = {anim: BattleMoveAnims['magmastorm'].anim}; +BattleMoveAnims['mysticalfire'] = {anim: BattleMoveAnims['flamethrower'].anim}; +BattleMoveAnims['firepledge'] = {anim: BattleMoveAnims['flamethrower'].anim}; +BattleMoveAnims['ember'] = {anim: BattleMoveAnims['flamethrower'].anim}; +BattleMoveAnims['incinerate'] = {anim: BattleMoveAnims['flamethrower'].anim}; +BattleMoveAnims['flamewheel'] = {anim: BattleMoveAnims['flamecharge'].anim}; + +BattleMoveAnims['razorleaf'] = {anim: BattleMoveAnims['magicalleaf'].anim}; +BattleMoveAnims['grasspledge'] = {anim: BattleMoveAnims['magicalleaf'].anim}; +BattleMoveAnims['sleeppowder'] = {anim: BattleMoveAnims['spore'].anim}; +BattleMoveAnims['poisonpowder'] = {anim: BattleMoveAnims['spore'].anim}; +BattleMoveAnims['stunspore'] = {anim: BattleMoveAnims['spore'].anim}; +BattleMoveAnims['powder'] = {anim: BattleMoveAnims['spore'].anim}; +BattleMoveAnims['cottonspore'] = {anim: BattleMoveAnims['spore'].anim}; +BattleMoveAnims['vinewhip'] = {anim: BattleMoveAnims['powerwhip'].anim}; + +BattleMoveAnims['bubble'] = {anim: BattleMoveAnims['bubblebeam'].anim}; +BattleMoveAnims['sparklingaria'] = {anim: BattleMoveAnims['bubblebeam'].anim}; + +BattleMoveAnims['watergun'] = {anim: BattleMoveAnims['watersport'].anim}; +BattleMoveAnims['whirlpool'] = {anim: BattleMoveAnims['watersport'].anim}; + +BattleMoveAnims['waterfall'] = {anim: BattleMoveAnims['aquajet'].anim}; +BattleMoveAnims['aquatail'] = {anim: BattleMoveAnims['crabhammer'].anim}; +BattleMoveAnims['liquidation'] = {anim: BattleMoveAnims['crabhammer'].anim}; + +BattleMoveAnims['magikarpsrevenge'] = {anim: BattleMoveAnims['outrage'].anim}; + +BattleMoveAnims['electrify'] = {anim: BattleMoveAnims['thunderwave'].anim}; +BattleMoveAnims['volttackle'] = {anim: BattleMoveAnims['wildcharge'].anim}; +BattleMoveAnims['zingzap'] = {anim: BattleMoveAnims['wildcharge'].anim}; +BattleMoveAnims['nuzzle'] = {anim: BattleMoveAnims['spark'].anim}; +BattleMoveAnims['thundershock'] = {anim: BattleMoveAnims['electroball'].anim}; + +BattleMoveAnims['glaciate'] = {anim: BattleMoveAnims['freezedry'].anim}; +BattleMoveAnims['frostbreath'] = {anim: BattleMoveAnims['freezedry'].anim}; +BattleMoveAnims['aurorabeam'] = {anim: BattleMoveAnims['icebeam'].anim}; +BattleMoveAnims['powdersnow'] = {anim: BattleMoveAnims['icywind'].anim}; + +BattleMoveAnims['pinmissile'] = {anim: BattleMoveAnims['bulletseed'].anim}; +BattleMoveAnims['attackorder'] = {anim: BattleMoveAnims['bulletseed'].anim}; +BattleMoveAnims['fellstinger'] = {anim: BattleMoveAnims['bulletseed'].anim}; +BattleMoveAnims['strugglebug'] = {anim: BattleMoveAnims['bulletseed'].anim}; +BattleMoveAnims['infestation'] = {anim: BattleMoveAnims['bulletseed'].anim}; + +BattleMoveAnims['nightdaze'] = {anim: BattleMoveAnims['darkpulse'].anim}; + +BattleMoveAnims['strengthsap'] = {anim: BattleMoveAnims['leechlife'].anim}; +BattleMoveAnims['hornattack'] = {anim: BattleMoveAnims['megahorn'].anim}; +BattleMoveAnims['lunge'] = {anim: BattleMoveAnims['megahorn'].anim}; + +BattleMoveAnims['constrict'] = {anim: BattleMoveAnims['bind'].anim}; +BattleMoveAnims['wrap'] = {anim: BattleMoveAnims['bind'].anim}; + +BattleMoveAnims['lowsweep'] = {anim: BattleMoveAnims['lowkick'].anim}; +BattleMoveAnims['megakick'] = {anim: BattleMoveAnims['jumpkick'].anim}; +BattleMoveAnims['frustration'] = {anim: BattleMoveAnims['thrash'].anim}; +BattleMoveAnims['rage'] = {anim: BattleMoveAnims['thrash'].anim}; +BattleMoveAnims['headsmash'] = {anim: BattleMoveAnims['gigaimpact'].anim}; +BattleMoveAnims['headcharge'] = {anim: BattleMoveAnims['gigaimpact'].anim}; +BattleMoveAnims['takedown'] = {anim: BattleMoveAnims['gigaimpact'].anim}; +BattleMoveAnims['dragonrush'] = {anim: BattleMoveAnims['gigaimpact'].anim}; +BattleMoveAnims['lastresort'] = {anim: BattleMoveAnims['gigaimpact'].anim}; +BattleMoveAnims['horndrill'] = {anim: BattleMoveAnims['gigaimpact'].anim}; +BattleMoveAnims['trumpcard'] = {anim: BattleMoveAnims['gigaimpact'].anim}; +BattleMoveAnims['doubleedge'] = {anim: BattleMoveAnims['gigaimpact'].anim}; + +BattleMoveAnims['paleowave'] = {anim: BattleMoveAnims['muddywater'].anim}; +BattleMoveAnims['rocktomb'] = {anim: BattleMoveAnims['rockslide'].anim}; + +BattleMoveAnims['frenzyplant'] = {anim: BattleMoveAnims['leafstorm'].anim}; +BattleMoveAnims['hydrocannon'] = {anim: BattleMoveAnims['hydropump'].anim}; + +BattleMoveAnims['guardsplit'] = {anim: BattleMoveAnims['skillswap'].anim}; +BattleMoveAnims['powersplit'] = {anim: BattleMoveAnims['skillswap'].anim}; +BattleMoveAnims['guardswap'] = {anim: BattleMoveAnims['skillswap'].anim}; +BattleMoveAnims['heartswap'] = {anim: BattleMoveAnims['skillswap'].anim}; +BattleMoveAnims['powerswap'] = {anim: BattleMoveAnims['skillswap'].anim}; +BattleMoveAnims['speedswap'] = {anim: BattleMoveAnims['skillswap'].anim}; +BattleMoveAnims['psychoshift'] = {anim: BattleMoveAnims['painsplit'].anim}; +BattleMoveAnims['helpinghand'] = {anim: BattleMoveAnims['painsplit'].anim}; +BattleMoveAnims['entrainment'] = {anim: BattleMoveAnims['painsplit'].anim}; +BattleMoveAnims['roleplay'] = {anim: BattleMoveAnims['painsplit'].anim}; +BattleMoveAnims['psychup'] = {anim: BattleMoveAnims['painsplit'].anim}; +BattleMoveAnims['holdhands'] = {anim: BattleMoveAnims['painsplit'].anim}; +BattleMoveAnims['lunardance'] = {anim: BattleMoveAnims['wish'].anim}; + +BattleMoveAnims['brickbreak'] = {anim: BattleMoveAnims['karatechop'].anim}; +BattleMoveAnims['throatchop'] = {anim: BattleMoveAnims['karatechop'].anim}; +BattleMoveAnims['wringout'] = {anim: BattleMoveAnims['forcepalm'].anim}; +BattleMoveAnims['stormthrow'] = {anim: BattleMoveAnims['circlethrow'].anim}; +BattleMoveAnims['vitalthrow'] = {anim: BattleMoveAnims['circlethrow'].anim}; +BattleMoveAnims['doubleslap'] = {anim: BattleMoveAnims['wakeupslap'].anim}; +BattleMoveAnims['crushgrip'] = {anim: BattleMoveAnims['quash'].anim}; + +BattleMoveAnims['beatup'] = {anim: BattleMoveAnims['slam'].anim}; +BattleMoveAnims['counter'] = {anim: BattleMoveAnims['slam'].anim}; +BattleMoveAnims['payback'] = {anim: BattleMoveAnims['slam'].anim}; +BattleMoveAnims['revenge'] = {anim: BattleMoveAnims['slam'].anim}; +BattleMoveAnims['rockclimb'] = {anim: BattleMoveAnims['slam'].anim}; +BattleMoveAnims['tackle'] = {anim: BattleMoveAnims['slam'].anim}; +BattleMoveAnims['dragonhammer'] = {anim: BattleMoveAnims['heavyslam'].anim}; + +BattleMoveAnims['highhorsepower'] = {anim: BattleMoveAnims['stomp'].anim}; + +BattleMoveAnims['retaliate'] = {anim: BattleMoveAnims['closecombat'].anim}; +BattleMoveAnims['superpower'] = {anim: BattleMoveAnims['closecombat'].anim}; +BattleMoveAnims['submission'] = {anim: BattleMoveAnims['closecombat'].anim}; +BattleMoveAnims['bonerush'] = {anim: BattleMoveAnims['boneclub'].anim}; + +BattleMoveAnims['dragonrage'] = {anim: BattleMoveAnims['dragonbreath'].anim}; + +BattleMoveAnims['silverwind'] = {anim: BattleMoveAnims['whirlwind'].anim}; +BattleMoveAnims['gust'] = {anim: BattleMoveAnims['whirlwind'].anim}; +BattleMoveAnims['twister'] = {anim: BattleMoveAnims['whirlwind'].anim}; BattleMoveAnims['razorwind'].anim = BattleMoveAnims['airslash'].anim; -BattleMoveAnims['chatter'] = {anim:BattleMoveAnims['hypervoice'].anim}; -BattleMoveAnims['echoedvoice'] = {anim:BattleMoveAnims['hypervoice'].anim}; -BattleMoveAnims['relicsong'] = {anim:BattleMoveAnims['hypervoice'].anim}; -BattleMoveAnims['uproar'] = {anim:BattleMoveAnims['hypervoice'].anim}; +BattleMoveAnims['chatter'] = {anim: BattleMoveAnims['hypervoice'].anim}; +BattleMoveAnims['echoedvoice'] = {anim: BattleMoveAnims['hypervoice'].anim}; +BattleMoveAnims['relicsong'] = {anim: BattleMoveAnims['hypervoice'].anim}; +BattleMoveAnims['uproar'] = {anim: BattleMoveAnims['hypervoice'].anim}; -BattleMoveAnims['destinybond'] = {anim:BattleMoveAnims['painsplit'].anim}; -BattleMoveAnims['reflecttype'] = {anim:BattleMoveAnims['painsplit'].anim}; +BattleMoveAnims['destinybond'] = {anim: BattleMoveAnims['painsplit'].anim}; +BattleMoveAnims['reflecttype'] = {anim: BattleMoveAnims['painsplit'].anim}; -BattleMoveAnims['selfdestruct'] = {anim:BattleMoveAnims['explosion'].anim}; +BattleMoveAnims['selfdestruct'] = {anim: BattleMoveAnims['explosion'].anim}; -BattleMoveAnims['acid'] = {anim:BattleMoveAnims['sludge'].anim}; -BattleMoveAnims['acidspray'] = {anim:BattleMoveAnims['sludge'].anim}; -BattleMoveAnims['belch'] = {anim:BattleMoveAnims['gunkshot'].anim}; -BattleMoveAnims['venoshock'] = {anim:BattleMoveAnims['sludgebomb'].anim}; -BattleMoveAnims['venomdrench'] = {anim:BattleMoveAnims['sludge'].anim}; -BattleMoveAnims['poisonsting'] = {anim:BattleMoveAnims['poisonjab'].anim}; -BattleMoveAnims['poisontail'] = {anim:BattleMoveAnims['poisonjab'].anim}; -BattleMoveAnims['gastroacid'] = {anim:BattleMoveAnims['toxic'].anim}; - -BattleMoveAnims['magnitude'] = {anim:BattleMoveAnims['earthquake'].anim}; -BattleMoveAnims['fissure'] = {anim:BattleMoveAnims['earthquake'].anim}; -BattleMoveAnims['landswrath'] = {anim:BattleMoveAnims['earthquake'].anim}; -BattleMoveAnims['stompingtantrum'] = {anim:BattleMoveAnims['bulldoze'].anim}; - -BattleMoveAnims['mindblown'] = {anim:BattleMoveAnims['iceball'].anim}; - -BattleMoveAnims['camouflage'] = {anim:BattleMoveAnims['tailglow'].anim}; -BattleMoveAnims['telekinesis'] = {anim:BattleMoveAnims['kinesis'].anim}; -BattleMoveAnims['foulplay'] = {anim:BattleMoveAnims['psyshock'].anim}; -BattleMoveAnims['psywave'] = {anim:BattleMoveAnims['psybeam'].anim}; -BattleMoveAnims['extrasensory'] = {anim:BattleMoveAnims['psychic'].anim}; -BattleMoveAnims['confusion'] = {anim:BattleMoveAnims['psychic'].anim}; -BattleMoveAnims['miracleeye'] = {anim:BattleMoveAnims['mindreader'].anim}; -BattleMoveAnims['futuresight'] = {anim:BattleMoveAnims['doomdesire'].anim}; - -BattleMoveAnims['glare'] = {anim:BattleMoveAnims['meanlook'].anim}; -BattleMoveAnims['grudge'] = {anim:BattleMoveAnims['meanlook'].anim}; -BattleMoveAnims['scaryface'] = {anim:BattleMoveAnims['meanlook'].anim}; -BattleMoveAnims['disable'] = {anim:BattleMoveAnims['meanlook'].anim}; -BattleMoveAnims['laserfocus'] = {anim:BattleMoveAnims['meanlook'].anim}; -BattleMoveAnims['nightmare'] = {anim:BattleMoveAnims['nightshade'].anim}; - -BattleMoveAnims['captivate'] = {anim:BattleMoveAnims['attract'].anim}; -BattleMoveAnims['charm'] = {anim:BattleMoveAnims['attract'].anim}; -BattleMoveAnims['flatter'] = {anim:BattleMoveAnims['attract'].anim}; - -BattleMoveAnims['armthrust'] = {anim:BattleMoveAnims['smellingsalts'].anim, multihit:true}; - -BattleMoveAnims['phantomforce'] = {anim:BattleMoveAnims['shadowforce'].anim, prepareAnim:BattleMoveAnims['shadowforce'].prepareAnim}; -BattleMoveAnims['shadowstrike'] = {anim:BattleMoveAnims['shadowforce'].anim}; - -BattleMoveAnims['smackdown'] = {anim:BattleMoveAnims['rockblast'].anim}; - -BattleMoveAnims['fairywind'] = {anim:BattleMoveAnims['dazzlinggleam'].anim}; -BattleMoveAnims['dreameater'] = {anim:BattleMoveAnims['drainingkiss'].anim}; -BattleMoveAnims['sweetkiss'] = {anim:BattleMoveAnims['lovelykiss'].anim}; - -BattleMoveAnims['mirrorshot'] = {anim:BattleMoveAnims['flashcannon'].anim}; -BattleMoveAnims['mirrorcoat'] = {anim:BattleMoveAnims['flashcannon'].anim}; -BattleMoveAnims['metalburst'] = {anim:BattleMoveAnims['flashcannon'].anim}; - -BattleMoveAnims['mudslap'] = {anim:BattleMoveAnims['mudshot'].anim}; -BattleMoveAnims['sandattack'] = {anim:BattleMoveAnims['mudshot'].anim}; -BattleMoveAnims['mudsport'] = {anim:BattleMoveAnims['mudbomb'].anim}; - -BattleMoveAnims['spiderweb'] = {anim:BattleMoveAnims['electroweb'].anim}; -BattleMoveAnims['stringshot'] = {anim:BattleMoveAnims['electroweb'].anim}; -BattleMoveAnims['toxicthread'] = {anim:BattleMoveAnims['electroweb'].anim}; - -BattleMoveAnims['hyperfang'] = {anim:BattleMoveAnims['superfang'].anim}; - -BattleMoveAnims['barrage'] = {anim:BattleMoveAnims['magnetbomb'].anim, multihit:true}; -BattleMoveAnims['eggbomb'] = {anim:BattleMoveAnims['magnetbomb'].anim}; -BattleMoveAnims['spitup'] = {anim:BattleMoveAnims['magnetbomb'].anim}; - -BattleMoveAnims['rollingkick'] = {anim:BattleMoveAnims['doublekick'].anim}; -BattleMoveAnims['triplekick'] = {anim:BattleMoveAnims['doublekick'].anim}; - -BattleMoveAnims['aromaticmist'] = {anim:BattleMoveAnims['mistyterrain'].anim}; -BattleMoveAnims['sweetscent'] = {anim:BattleMoveAnims['mistyterrain'].anim}; -BattleMoveAnims['psychicterrain'] = {anim:BattleMoveAnims['mistyterrain'].anim}; -BattleMoveAnims['iondeluge'] = {anim:BattleMoveAnims['electricterrain'].anim}; -BattleMoveAnims['magneticflux'] = {anim:BattleMoveAnims['electricterrain'].anim}; -BattleMoveAnims['rototiller'] = {anim:BattleMoveAnims['electricterrain'].anim}; -BattleMoveAnims['flowershield'] = {anim:BattleMoveAnims['grassyterrain'].anim}; - -BattleMoveAnims['imprison'] = {anim:BattleMoveAnims['embargo'].anim}; - -BattleMoveAnims['healorder'] = {anim:BattleMoveAnims['recover'].anim}; -BattleMoveAnims['synthesis'] = {anim:BattleMoveAnims['recover'].anim}; - -BattleMoveAnims['floralhealing'] = {anim:BattleMoveAnims['healpulse'].anim}; -BattleMoveAnims['purify'] = {anim:BattleMoveAnims['weatherball'].anim}; - -BattleMoveAnims['pollenpuff'] = {anim:BattleMoveAnims['revelationdance'].anim}; - -BattleMoveAnims['amnesia'] = {anim:BattleMoveAnims['rest'].anim}; -BattleMoveAnims['slackoff'] = {anim:BattleMoveAnims['rest'].anim}; - -BattleMoveAnims['secretpower'] = {anim:BattleMoveAnims['technoblast'].anim}; -BattleMoveAnims['naturalgift'] = {anim:BattleMoveAnims['technoblast'].anim}; - -BattleMoveAnims['firelash'] = {anim:BattleMoveAnims['multiattack'].anim}; - -BattleMoveAnims['fleurcannon'] = {anim:BattleMoveAnims['diamondstorm'].anim}; - -BattleMoveAnims['bloomdoom'] = {anim:BattleMoveAnims['petaldance'].anim}; -BattleMoveAnims['hydrovortex'] = {anim:BattleMoveAnims['originpulse'].anim}; -BattleMoveAnims['breakneckblitz'] = {anim:BattleMoveAnims['gigaimpact'].anim}; -BattleMoveAnims['savagespinout'] = {anim:BattleMoveAnims['electroweb'].anim}; -BattleMoveAnims['maliciousmoonsault'] = {anim:BattleMoveAnims['pulverizingpancake'].anim}; -BattleMoveAnims['devastatingdrake'] = {anim:BattleMoveAnims['dragonpulse'].anim}; -BattleMoveAnims['tectonicrage'] = {anim:BattleMoveAnims['precipiceblades'].anim}; -BattleMoveAnims['subzeroslammer'] = {anim:BattleMoveAnims['sheercold'].anim}; -BattleMoveAnims['shatteredpsyche'] = {anim:BattleMoveAnims['psychic'].anim}; -BattleMoveAnims['maximumpsybreaker'] = {anim:BattleMoveAnims['psychic'].anim}; -BattleMoveAnims['genesissupernova'] = {anim:BattleMoveAnims['psychoboost'].anim}; -BattleMoveAnims['10000000voltthunderbolt'] = {anim:BattleMoveAnims['triattack'].anim}; -BattleMoveAnims['menacingmoonrazemaelstrom'] = {anim:BattleMoveAnims['moongeistbeam'].anim}; -BattleMoveAnims['lightthatburnsthesky'] = {anim:BattleMoveAnims['fusionflare'].anim}; +BattleMoveAnims['acid'] = {anim: BattleMoveAnims['sludge'].anim}; +BattleMoveAnims['acidspray'] = {anim: BattleMoveAnims['sludge'].anim}; +BattleMoveAnims['belch'] = {anim: BattleMoveAnims['gunkshot'].anim}; +BattleMoveAnims['venoshock'] = {anim: BattleMoveAnims['sludgebomb'].anim}; +BattleMoveAnims['venomdrench'] = {anim: BattleMoveAnims['sludge'].anim}; +BattleMoveAnims['poisonsting'] = {anim: BattleMoveAnims['poisonjab'].anim}; +BattleMoveAnims['poisontail'] = {anim: BattleMoveAnims['poisonjab'].anim}; +BattleMoveAnims['gastroacid'] = {anim: BattleMoveAnims['toxic'].anim}; + +BattleMoveAnims['magnitude'] = {anim: BattleMoveAnims['earthquake'].anim}; +BattleMoveAnims['fissure'] = {anim: BattleMoveAnims['earthquake'].anim}; +BattleMoveAnims['landswrath'] = {anim: BattleMoveAnims['earthquake'].anim}; +BattleMoveAnims['stompingtantrum'] = {anim: BattleMoveAnims['bulldoze'].anim}; + +BattleMoveAnims['mindblown'] = {anim: BattleMoveAnims['iceball'].anim}; + +BattleMoveAnims['camouflage'] = {anim: BattleMoveAnims['tailglow'].anim}; +BattleMoveAnims['telekinesis'] = {anim: BattleMoveAnims['kinesis'].anim}; +BattleMoveAnims['foulplay'] = {anim: BattleMoveAnims['psyshock'].anim}; +BattleMoveAnims['psywave'] = {anim: BattleMoveAnims['psybeam'].anim}; +BattleMoveAnims['extrasensory'] = {anim: BattleMoveAnims['psychic'].anim}; +BattleMoveAnims['confusion'] = {anim: BattleMoveAnims['psychic'].anim}; +BattleMoveAnims['miracleeye'] = {anim: BattleMoveAnims['mindreader'].anim}; +BattleMoveAnims['futuresight'] = {anim: BattleMoveAnims['doomdesire'].anim}; + +BattleMoveAnims['glare'] = {anim: BattleMoveAnims['meanlook'].anim}; +BattleMoveAnims['grudge'] = {anim: BattleMoveAnims['meanlook'].anim}; +BattleMoveAnims['scaryface'] = {anim: BattleMoveAnims['meanlook'].anim}; +BattleMoveAnims['disable'] = {anim: BattleMoveAnims['meanlook'].anim}; +BattleMoveAnims['laserfocus'] = {anim: BattleMoveAnims['meanlook'].anim}; +BattleMoveAnims['nightmare'] = {anim: BattleMoveAnims['nightshade'].anim}; + +BattleMoveAnims['captivate'] = {anim: BattleMoveAnims['attract'].anim}; +BattleMoveAnims['charm'] = {anim: BattleMoveAnims['attract'].anim}; +BattleMoveAnims['flatter'] = {anim: BattleMoveAnims['attract'].anim}; + +BattleMoveAnims['armthrust'] = {anim: BattleMoveAnims['smellingsalts'].anim}; + +BattleMoveAnims['phantomforce'] = {anim: BattleMoveAnims['shadowforce'].anim, prepareAnim: BattleMoveAnims['shadowforce'].prepareAnim}; +BattleMoveAnims['shadowstrike'] = {anim: BattleMoveAnims['shadowforce'].anim}; + +BattleMoveAnims['smackdown'] = {anim: BattleMoveAnims['rockblast'].anim}; + +BattleMoveAnims['fairywind'] = {anim: BattleMoveAnims['dazzlinggleam'].anim}; +BattleMoveAnims['dreameater'] = {anim: BattleMoveAnims['drainingkiss'].anim}; +BattleMoveAnims['sweetkiss'] = {anim: BattleMoveAnims['lovelykiss'].anim}; + +BattleMoveAnims['mirrorshot'] = {anim: BattleMoveAnims['flashcannon'].anim}; +BattleMoveAnims['mirrorcoat'] = {anim: BattleMoveAnims['flashcannon'].anim}; +BattleMoveAnims['metalburst'] = {anim: BattleMoveAnims['flashcannon'].anim}; + +BattleMoveAnims['mudslap'] = {anim: BattleMoveAnims['mudshot'].anim}; +BattleMoveAnims['sandattack'] = {anim: BattleMoveAnims['mudshot'].anim}; +BattleMoveAnims['mudsport'] = {anim: BattleMoveAnims['mudbomb'].anim}; + +BattleMoveAnims['spiderweb'] = {anim: BattleMoveAnims['electroweb'].anim}; +BattleMoveAnims['stringshot'] = {anim: BattleMoveAnims['electroweb'].anim}; +BattleMoveAnims['toxicthread'] = {anim: BattleMoveAnims['electroweb'].anim}; + +BattleMoveAnims['hyperfang'] = {anim: BattleMoveAnims['superfang'].anim}; + +BattleMoveAnims['barrage'] = {anim: BattleMoveAnims['magnetbomb'].anim}; +BattleMoveAnims['eggbomb'] = {anim: BattleMoveAnims['magnetbomb'].anim}; +BattleMoveAnims['spitup'] = {anim: BattleMoveAnims['magnetbomb'].anim}; + +BattleMoveAnims['rollingkick'] = {anim: BattleMoveAnims['doublekick'].anim}; +BattleMoveAnims['triplekick'] = {anim: BattleMoveAnims['doublekick'].anim}; + +BattleMoveAnims['aromaticmist'] = {anim: BattleMoveAnims['mistyterrain'].anim}; +BattleMoveAnims['sweetscent'] = {anim: BattleMoveAnims['mistyterrain'].anim}; +BattleMoveAnims['psychicterrain'] = {anim: BattleMoveAnims['mistyterrain'].anim}; +BattleMoveAnims['iondeluge'] = {anim: BattleMoveAnims['electricterrain'].anim}; +BattleMoveAnims['magneticflux'] = {anim: BattleMoveAnims['electricterrain'].anim}; +BattleMoveAnims['rototiller'] = {anim: BattleMoveAnims['electricterrain'].anim}; +BattleMoveAnims['flowershield'] = {anim: BattleMoveAnims['grassyterrain'].anim}; + +BattleMoveAnims['imprison'] = {anim: BattleMoveAnims['embargo'].anim}; + +BattleMoveAnims['healorder'] = {anim: BattleMoveAnims['recover'].anim}; +BattleMoveAnims['synthesis'] = {anim: BattleMoveAnims['recover'].anim}; + +BattleMoveAnims['floralhealing'] = {anim: BattleMoveAnims['healpulse'].anim}; +BattleMoveAnims['purify'] = {anim: BattleMoveAnims['weatherball'].anim}; + +BattleMoveAnims['pollenpuff'] = {anim: BattleMoveAnims['revelationdance'].anim}; + +BattleMoveAnims['amnesia'] = {anim: BattleMoveAnims['rest'].anim}; +BattleMoveAnims['slackoff'] = {anim: BattleMoveAnims['rest'].anim}; + +BattleMoveAnims['secretpower'] = {anim: BattleMoveAnims['technoblast'].anim}; +BattleMoveAnims['naturalgift'] = {anim: BattleMoveAnims['technoblast'].anim}; + +BattleMoveAnims['firelash'] = {anim: BattleMoveAnims['multiattack'].anim}; + +BattleMoveAnims['fleurcannon'] = {anim: BattleMoveAnims['diamondstorm'].anim}; + +BattleMoveAnims['bloomdoom'] = {anim: BattleMoveAnims['petaldance'].anim}; +BattleMoveAnims['hydrovortex'] = {anim: BattleMoveAnims['originpulse'].anim}; +BattleMoveAnims['breakneckblitz'] = {anim: BattleMoveAnims['gigaimpact'].anim}; +BattleMoveAnims['savagespinout'] = {anim: BattleMoveAnims['electroweb'].anim}; +BattleMoveAnims['maliciousmoonsault'] = {anim: BattleMoveAnims['pulverizingpancake'].anim}; +BattleMoveAnims['devastatingdrake'] = {anim: BattleMoveAnims['dragonpulse'].anim}; +BattleMoveAnims['tectonicrage'] = {anim: BattleMoveAnims['precipiceblades'].anim}; +BattleMoveAnims['subzeroslammer'] = {anim: BattleMoveAnims['sheercold'].anim}; +BattleMoveAnims['shatteredpsyche'] = {anim: BattleMoveAnims['psychic'].anim}; +BattleMoveAnims['maximumpsybreaker'] = {anim: BattleMoveAnims['psychic'].anim}; +BattleMoveAnims['genesissupernova'] = {anim: BattleMoveAnims['psychoboost'].anim}; +BattleMoveAnims['10000000voltthunderbolt'] = {anim: BattleMoveAnims['triattack'].anim}; +BattleMoveAnims['menacingmoonrazemaelstrom'] = {anim: BattleMoveAnims['moongeistbeam'].anim}; +BattleMoveAnims['lightthatburnsthesky'] = {anim: BattleMoveAnims['fusionflare'].anim}; diff --git a/src/battle-animations.ts b/src/battle-animations.ts index 08ffc18301..286a892f79 100644 --- a/src/battle-animations.ts +++ b/src/battle-animations.ts @@ -31,80 +31,6 @@ This license DOES NOT extend to any other files in this repository. */ class BattleScene { - setFrameHTML(html: any) { - this.$frame.html(html); - } - setControlsHTML(html: any) { - let $controls = this.$frame.parent().children('.battle-controls'); - $controls.html(html); - } - - // Methods defined in PokemonSprite but need to be called through BattleScene - removeEffect(pokemon: Pokemon, id: ID, instant?: boolean) { - return pokemon.sprite.removeEffect(id, instant); - } - addEffect(pokemon: Pokemon, id: ID, instant?: boolean) { - return pokemon.sprite.addEffect(id, instant); - } - animSummon(pokemon: Pokemon, slot: number, instant?: boolean) { - return pokemon.sprite.animSummon(pokemon, slot, instant); - } - animUnsummon(pokemon: Pokemon, instant?: boolean) { - return pokemon.sprite.animUnsummon(pokemon, instant); - } - animDragIn(pokemon: Pokemon, slot: number) { - return pokemon.sprite.animDragIn(pokemon, slot); - } - animDragOut(pokemon: Pokemon) { - return pokemon.sprite.animDragOut(pokemon); - } - updateStatbar(pokemon: Pokemon, updatePrevhp?: boolean, updateHp?: boolean) { - return pokemon.sprite.updateStatbar(pokemon, updatePrevhp, updateHp); - } - updateStatbarIfExists(pokemon: Pokemon, updatePrevhp?: boolean, updateHp?: boolean) { - return pokemon.sprite.updateStatbarIfExists(pokemon, updatePrevhp, updateHp); - } - animTransform(pokemon: Pokemon, isCustomAnim?: boolean, isPermanent?: boolean) { - return pokemon.sprite.animTransform(pokemon, isCustomAnim, isPermanent); - } - clearEffects(pokemon: Pokemon) { - return pokemon.sprite.clearEffects(); - } - removeTransform(pokemon: Pokemon) { - return pokemon.sprite.removeTransform(); - } - animFaint(pokemon: Pokemon) { - return pokemon.sprite.animFaint(pokemon); - } - animReset(pokemon: Pokemon) { - return pokemon.sprite.animReset(); - } - anim(pokemon: Pokemon, end: ScenePos, transition?: string) { - return pokemon.sprite.anim(end, transition); - } - beforeMove(pokemon: Pokemon) { - return pokemon.sprite.beforeMove(); - } - afterMove(pokemon: Pokemon) { - return pokemon.sprite.afterMove(); - } - updateSpritesForSide(side: Side) { - if (side.missedPokemon && side.missedPokemon.sprite) { - side.missedPokemon.sprite.destroy(); - } - - side.missedPokemon = { - sprite: new PokemonSprite(null, { - x: side.leftof(-100), - y: side.y, - z: side.z, - opacity: 0, - }, this, side.n) - } as Pokemon; - - side.missedPokemon.sprite.isMissedPokemon = true; - } - battle: Battle; animating = true; acceleration = 1; @@ -135,14 +61,14 @@ class BattleScene { $delay: JQuery = null!; $hiddenMessage: JQuery = null!; - sideConditions = [{}, {}] as [{[id: string]: Sprite[]}, {[id: string]: Sprite[]}]; + sideConditions: [{[id: string]: Sprite[]}, {[id: string]: Sprite[]}] = [{}, {}]; preloadDone = 0; preloadNeeded = 0; bgm: string | null = null; backdropImage: string = ''; bgmNum = 0; - preloadCache = {} as {[url: string]: HTMLImageElement}; + preloadCache: {[url: string]: HTMLImageElement} = {}; messagebarOpen = false; interruptionCount = 1; @@ -177,7 +103,7 @@ class BattleScene { let numericId = 0; if (battle.id) { - numericId = parseInt(battle.id.slice(battle.id.lastIndexOf('-') + 1)); + numericId = parseInt(battle.id.slice(battle.id.lastIndexOf('-') + 1), 10); } if (!numericId) { numericId = Math.floor(Math.random() * 1000000); @@ -265,7 +191,7 @@ class BattleScene { this.animating = false; this.$messagebar.empty().css({ opacity: 0, - height: 0 + height: 0, }); } stopAnimation() { @@ -340,7 +266,7 @@ class BattleScene { $effect.animate(endpos, end.time! - start.time); if (after === 'fade') { $effect.animate({ - opacity: 0 + opacity: 0, }, 100); } if (after === 'explode') { @@ -358,14 +284,14 @@ class BattleScene { $effect.css({ background: bg, display: 'block', - opacity: 0 + opacity: 0, }); this.$bgEffect.append($effect); $effect.delay(delay).animate({ - opacity: opacity + opacity, }, 250).delay(duration - 250); $effect.animate({ - opacity: 0 + opacity: 0, }, 250); } @@ -376,8 +302,6 @@ class BattleScene { * The display property is passed through if it exists. */ pos(loc: ScenePos, obj: SpriteData) { - let left, top, scale, width, height; - loc = { x: 0, y: 0, @@ -389,28 +313,28 @@ class BattleScene { if (!loc.xscale && loc.xscale !== 0) loc.xscale = loc.scale; if (!loc.yscale && loc.yscale !== 0) loc.yscale = loc.scale; - left = 210; - top = 245; - scale = 1.5 - 0.5 * ((loc.z!) / 200); + let left = 210; + let top = 245; + let scale = 1.5 - 0.5 * ((loc.z!) / 200); if (scale < .1) scale = .1; left += (410 - 190) * ((loc.z!) / 200); top += (135 - 245) * ((loc.z!) / 200); left += Math.floor(loc.x! * scale); top -= Math.floor(loc.y! * scale /* - loc.x * scale / 4 */); - width = Math.floor(obj.w * scale * loc.xscale!); - height = Math.floor(obj.h * scale * loc.yscale!); + let width = Math.floor(obj.w * scale * loc.xscale!); + let height = Math.floor(obj.h * scale * loc.yscale!); let hoffset = Math.floor((obj.h - (obj.y || 0) * 2) * scale * loc.yscale!); left -= Math.floor(width / 2); top -= Math.floor(hoffset / 2); - let pos = { - left: left, - top: top, - width: width, - height: height, - opacity: loc.opacity - } as JQuery.PlainObject; + let pos: JQuery.PlainObject = { + left, + top, + width, + height, + opacity: loc.opacity, + }; if (loc.display) pos.display = loc.display; return pos; } @@ -419,7 +343,7 @@ class BattleScene { * suitable for passing into `jQuery#animate`. * oldLoc is required for ballistic (jumping) animations. */ - posT(loc: ScenePos, obj: SpriteData, transition?: string, oldLoc?: ScenePos) { + posT(loc: ScenePos, obj: SpriteData, transition?: string, oldLoc?: ScenePos): JQuery.PlainObject { const pos = this.pos(loc, obj); const oldPos = (oldLoc ? this.pos(oldLoc, obj) : null); let transitionMap = { @@ -427,7 +351,7 @@ class BattleScene { top: 'linear', width: 'linear', height: 'linear', - opacity: 'linear' + opacity: 'linear', }; if (transition === 'ballistic') { transitionMap.top = (pos.top < oldPos!.top ? 'ballisticUp' : 'ballisticDown'); @@ -464,8 +388,8 @@ class BattleScene { top: [pos.top, transitionMap.top], width: [pos.width, transitionMap.width], height: [pos.height, transitionMap.height], - opacity: [pos.opacity, transitionMap.opacity] - } as JQuery.PlainObject; + opacity: [pos.opacity, transitionMap.opacity], + }; } waitFor(elem: JQuery) { @@ -502,10 +426,10 @@ class BattleScene { this.$messagebar.css({ display: 'block', opacity: 0, - height: 'auto' + height: 'auto', }); this.$messagebar.animate({ - opacity: 1 + opacity: 1, }, this.battle.messageFadeTime / this.acceleration); } } @@ -518,16 +442,16 @@ class BattleScene { $message.html(message); $message.css({ display: 'block', - opacity: 0 + opacity: 0, }); $message.animate({ - height: 'hide' + height: 'hide', }, 1, () => { $message.appendTo(this.$messagebar); $message.animate({ height: 'show', 'padding-bottom': 4, - opacity: 1 + opacity: 1, }, this.battle.messageFadeTime / this.acceleration); }); this.waitFor($message); @@ -547,7 +471,7 @@ class BattleScene { this.messagebarOpen = false; if (this.animating) { this.$messagebar.delay(this.battle.messageShownTime / this.acceleration).animate({ - opacity: 0 + opacity: 0, }, this.battle.messageFadeTime / this.acceleration); this.waitFor(this.$messagebar); } @@ -674,8 +598,8 @@ class BattleScene { } updateStatbars() { for (const side of this.battle.sides) { - for (const active of side.active) if (active) { - active.sprite.updateStatbar(active); + for (const active of side.active) { + if (active) active.sprite.updateStatbar(active); } } } @@ -703,7 +627,7 @@ class BattleScene { let spriteData = Tools.getSpriteData(pokemon, siden, { gen: this.gen, - noScale: true + noScale: true, }); let y = 0; let x = 0; @@ -781,7 +705,7 @@ class BattleScene { return buf + ' (' + pWeather[1] + ' or ' + pWeather[2] + ' turns)'; } if (pWeather[1]) { - return buf + ' (' + pWeather[1] + ' turn' + (pWeather[1] == 1 ? '' : 's') + ')'; + return buf + ' (' + pWeather[1] + ' turn' + (pWeather[1] === 1 ? '' : 's') + ')'; } return buf; // weather not found } @@ -794,40 +718,40 @@ class BattleScene { } if (this.battle.gen < 7 && this.battle.hardcoreMode) return buf; if (!cond[3]) { - return buf + ' (' + cond[2] + ' turn' + (cond[2] == 1 ? '' : 's') + ')'; + return buf + ' (' + cond[2] + ' turn' + (cond[2] === 1 ? '' : 's') + ')'; } return buf + ' (' + cond[2] + ' or ' + cond[3] + ' turns)'; } weatherLeft() { if (this.battle.gen < 7 && this.battle.hardcoreMode) return ''; - if (this.battle.weatherMinTimeLeft != 0) { + if (this.battle.weatherMinTimeLeft !== 0) { return ' (' + this.battle.weatherMinTimeLeft + ' or ' + this.battle.weatherTimeLeft + ' turns)'; } - if (this.battle.weatherTimeLeft != 0) { - return ' (' + this.battle.weatherTimeLeft + ' turn' + (this.battle.weatherTimeLeft == 1 ? '' : 's') + ')'; + if (this.battle.weatherTimeLeft !== 0) { + return ' (' + this.battle.weatherTimeLeft + ' turn' + (this.battle.weatherTimeLeft === 1 ? '' : 's') + ')'; } return ''; } upkeepWeather() { const isIntense = (this.curWeather === 'desolateland' || this.curWeather === 'primordialsea' || this.curWeather === 'deltastream'); this.$weather.animate({ - opacity: 1.0 + opacity: 1.0, }, 300).animate({ - opacity: isIntense ? 0.9 : 0.5 + opacity: isIntense ? 0.9 : 0.5, }, 300); } updateWeather(instant?: boolean) { if (!this.animating) return; let isIntense = false; - let weatherNameTable = { + const weatherNameTable: {[id: string]: string} = { sunnyday: 'Sun', desolateland: 'Intense Sun', raindance: 'Rain', primordialsea: 'Heavy Rain', sandstorm: 'Sandstorm', hail: 'Hail', - deltastream: 'Strong Winds' - } as {[id: string]: string}; + deltastream: 'Strong Winds', + }; let weather = this.battle.weather; let terrain = '' as ID; for (const pseudoWeatherData of this.battle.pseudoWeather) { @@ -924,7 +848,7 @@ class BattleScene { $prevTurn.animate({ opacity: 0, left: 60, - }, 500, function () { + }, 500, () => { $prevTurn.remove(); }); if (this.battle.turnsSinceMoved > 2) { @@ -1120,7 +1044,7 @@ class BattleScene { x: side.x + 30, y: side.y - 45, z: side.z, - scale: .3 + scale: .3, }, this); this.$spritesFront[siden].append(spike2.$el!); spikeArray.push(spike2); @@ -1131,7 +1055,7 @@ class BattleScene { x: side.x + 50, y: side.y - 40, z: side.z, - scale: .3 + scale: .3, }, this); this.$spritesFront[siden].append(spike3.$el!); spikeArray.push(spike3); @@ -1161,7 +1085,7 @@ class BattleScene { x: side.x - 15, y: side.y - 35, z: side.z, - scale: .3 + scale: .3, }, this); this.$spritesFront[siden].append(tspike2.$el!); tspikeArray.push(tspike2); @@ -1213,13 +1137,13 @@ class BattleScene { display: 'block', opacity: 0, top: pokemon.sprite.top - 5, - left: pokemon.sprite.left - 75 + left: pokemon.sprite.left - 75, }).animate({ - opacity: 1 + opacity: 1, }, 1); $effect.animate({ opacity: 0, - top: pokemon.sprite.top - 65 + top: pokemon.sprite.top - 65, }, 1000, 'swing'); this.wait(this.acceleration < 2 ? 350 : 250); pokemon.sprite.updateStatbar(pokemon); @@ -1233,12 +1157,12 @@ class BattleScene { display: 'block', opacity: 0, top: pokemon.sprite.top + 15, - left: pokemon.sprite.left - 75 + left: pokemon.sprite.left - 75, }).animate({ - opacity: 1 + opacity: 1, }, 1); $effect.delay(800).animate({ - opacity: 0 + opacity: 0, }, 400, 'swing'); this.wait(100); pokemon.sprite.updateStatbar(pokemon); @@ -1253,18 +1177,18 @@ class BattleScene { let w = pokemon.hpWidth(150); let hpcolor = pokemon.getHPColor(); let callback; - if (hpcolor === 'y') callback = function () { - $hp.addClass('hp-yellow'); - }; - if (hpcolor === 'r') callback = function () { - $hp.addClass('hp-yellow hp-red'); - }; + if (hpcolor === 'y') { + callback = () => { $hp.addClass('hp-yellow'); }; + } + if (hpcolor === 'r') { + callback = () => { $hp.addClass('hp-yellow hp-red'); }; + } this.resultAnim(pokemon, this.battle.hardcoreMode ? 'Damage' : '−' + damage, 'bad'); $hp.animate({ width: w, - 'border-right-width': w ? 1 : 0 + 'border-right-width': w ? 1 : 0, }, 350, callback); } healAnim(pokemon: Pokemon, damage: number | string) { @@ -1276,24 +1200,100 @@ class BattleScene { let w = pokemon.hpWidth(150); let hpcolor = pokemon.getHPColor(); let callback; - if (hpcolor === 'g') callback = function () { - $hp.removeClass('hp-yellow hp-red'); - }; - if (hpcolor === 'y') callback = function () { - $hp.removeClass('hp-red'); - }; + if (hpcolor === 'g') { + callback = () => { $hp.removeClass('hp-yellow hp-red'); }; + } + if (hpcolor === 'y') { + callback = () => { $hp.removeClass('hp-red'); }; + } this.resultAnim(pokemon, this.battle.hardcoreMode ? 'Heal' : '+' + damage, 'good'); $hp.animate({ width: w, - 'border-right-width': w ? 1 : 0 + 'border-right-width': w ? 1 : 0, }, 350, callback); } + // Sprite methods + ///////////////////////////////////////////////////////////////////// + + removeEffect(pokemon: Pokemon, id: ID, instant?: boolean) { + return pokemon.sprite.removeEffect(id, instant); + } + addEffect(pokemon: Pokemon, id: ID, instant?: boolean) { + return pokemon.sprite.addEffect(id, instant); + } + animSummon(pokemon: Pokemon, slot: number, instant?: boolean) { + return pokemon.sprite.animSummon(pokemon, slot, instant); + } + animUnsummon(pokemon: Pokemon, instant?: boolean) { + return pokemon.sprite.animUnsummon(pokemon, instant); + } + animDragIn(pokemon: Pokemon, slot: number) { + return pokemon.sprite.animDragIn(pokemon, slot); + } + animDragOut(pokemon: Pokemon) { + return pokemon.sprite.animDragOut(pokemon); + } + updateStatbar(pokemon: Pokemon, updatePrevhp?: boolean, updateHp?: boolean) { + return pokemon.sprite.updateStatbar(pokemon, updatePrevhp, updateHp); + } + updateStatbarIfExists(pokemon: Pokemon, updatePrevhp?: boolean, updateHp?: boolean) { + return pokemon.sprite.updateStatbarIfExists(pokemon, updatePrevhp, updateHp); + } + animTransform(pokemon: Pokemon, isCustomAnim?: boolean, isPermanent?: boolean) { + return pokemon.sprite.animTransform(pokemon, isCustomAnim, isPermanent); + } + clearEffects(pokemon: Pokemon) { + return pokemon.sprite.clearEffects(); + } + removeTransform(pokemon: Pokemon) { + return pokemon.sprite.removeTransform(); + } + animFaint(pokemon: Pokemon) { + return pokemon.sprite.animFaint(pokemon); + } + animReset(pokemon: Pokemon) { + return pokemon.sprite.animReset(); + } + anim(pokemon: Pokemon, end: ScenePos, transition?: string) { + return pokemon.sprite.anim(end, transition); + } + beforeMove(pokemon: Pokemon) { + return pokemon.sprite.beforeMove(); + } + afterMove(pokemon: Pokemon) { + return pokemon.sprite.afterMove(); + } + updateSpritesForSide(side: Side) { + if (side.missedPokemon && side.missedPokemon.sprite) { + side.missedPokemon.sprite.destroy(); + } + + side.missedPokemon = { + sprite: new PokemonSprite(null, { + x: side.leftof(-100), + y: side.y, + z: side.z, + opacity: 0, + }, this, side.n), + } as any; + + side.missedPokemon.sprite.isMissedPokemon = true; + } + // Misc ///////////////////////////////////////////////////////////////////// + setFrameHTML(html: any) { + this.$frame.html(html); + } + setControlsHTML(html: any) { + let $controls = this.$frame.parent().children('.battle-controls'); + $controls.html(html); + } + preloadImage(url: string) { let token = url.replace(/\.(gif|png)$/, '').replace(/\//g, '-'); if (this.preloadCache[token]) { @@ -1312,10 +1312,8 @@ class BattleScene { const url = BattleEffects[i].url; if (url) this.preloadImage(url); } - this.preloadImage(Tools.fxPrefix + 'weather-raindance.jpg'); // rain is used often enough to precache this.preloadImage(Tools.resourcePrefix + 'sprites/xyani/substitute.gif'); this.preloadImage(Tools.resourcePrefix + 'sprites/xyani-back/substitute.gif'); - //this.preloadImage(Tools.fxPrefix + 'bg.jpg'); } preloadBgm(bgmNum = 0) { if (!bgmNum) bgmNum = 1 + this.numericId % 15; @@ -1417,26 +1415,26 @@ class BattleScene { } interface ScenePos { - x?: number, - y?: number, - z?: number, - scale?: number, - xscale?: number, - yscale?: number, - opacity?: number, - time?: number, - display?: string, + x?: number; + y?: number; + z?: number; + scale?: number; + xscale?: number; + yscale?: number; + opacity?: number; + time?: number; + display?: string; } interface InitScenePos { - x: number, - y: number, - z: number, - scale?: number, - xscale?: number, - yscale?: number, - opacity?: number, - time?: number, - display?: string, + x: number; + y: number; + z: number; + scale?: number; + xscale?: number; + yscale?: number; + opacity?: number; + time?: number; + display?: string; } class Sprite { @@ -1451,7 +1449,8 @@ class Sprite { let sp = null; if (spriteData) { sp = spriteData; - let rawHTML = sp.rawHTML || ''; + let rawHTML = sp.rawHTML || + ''; this.$el = $(rawHTML); } else { sp = { @@ -1524,7 +1523,7 @@ class PokemonSprite extends Sprite { left = 0; top = 0; - effects = {} as {[id: string]: Sprite[]}; + effects: {[id: string]: Sprite[]} = {}; constructor(spriteData: SpriteData | null, pos: InitScenePos, scene: BattleScene, siden: number) { super(spriteData, pos, scene); @@ -1596,7 +1595,7 @@ class PokemonSprite extends Sprite { if (!this.scene.animating) return; if (this.$sub) return; const subsp = Tools.getSpriteData('substitute', this.siden, { - gen: this.scene.gen + gen: this.scene.gen, }); this.subsp = subsp; this.$sub = $(''); @@ -1616,12 +1615,12 @@ class PokemonSprite extends Sprite { x: this.x, y: this.y + 50, z: this.z, - opacity: 0 + opacity: 0, }, subsp)); this.$sub.animate(this.scene.pos({ x: this.x, y: this.y, - z: this.z + z: this.z, }, subsp), 500); this.scene.waitFor(this.$sub); } @@ -1642,7 +1641,7 @@ class PokemonSprite extends Sprite { x: this.x, y: this.y - 50, z: this.z, - opacity: 0 + opacity: 0, }, this.subsp!), 500); this.$sub = null; @@ -1658,7 +1657,7 @@ class PokemonSprite extends Sprite { x: this.leftof(-50), y: this.y, z: this.z, - opacity: 0.5 + opacity: 0.5, }, this.subsp!), 300); for (const side of this.scene.battle.sides) { for (const active of side.active) { @@ -1697,7 +1696,7 @@ class PokemonSprite extends Sprite { } else { const $sub = this.$sub; $sub.animate({ - opacity: 0 + opacity: 0, }, () => { $sub.remove(); }); @@ -1762,19 +1761,19 @@ class PokemonSprite extends Sprite { x: this.x, y: this.y, z: this.behind(30), - opacity: .3 + opacity: .3, }, this.sp)); this.$sub.css(this.scene.pos({ x: this.x, y: this.y, - z: this.z + z: this.z, }, this.subsp!)); } else { this.$el.stop(true, false); this.$el.css(this.scene.pos({ x: this.x, y: this.y, - z: this.z + z: this.z, }, this.sp)); } } @@ -1806,7 +1805,7 @@ class PokemonSprite extends Sprite { if (!this.isBackSprite) statbarOffset = 17 * slot; if (!this.isBackSprite && !moreActive && this.sp.pixelated) statbarOffset = 15; if (this.isBackSprite) statbarOffset = -7 * slot; - if (!this.isBackSprite && moreActive == 2) statbarOffset = 14 * slot - 10; + if (!this.isBackSprite && moreActive === 2) statbarOffset = 14 * slot - 10; } if (this.scene.gen <= 2) { statbarOffset += this.isBackSprite ? 1 : 20; @@ -1819,10 +1818,10 @@ class PokemonSprite extends Sprite { let pos = this.scene.pos({ x: this.x, y: this.y, - z: this.z + z: this.z, }, { w: 0, - h: 96 + h: 96, }); pos.top += 40; @@ -1869,13 +1868,13 @@ class PokemonSprite extends Sprite { x: this.x, y: this.y + 30, z: this.behind(50), - scale: .7 + scale: .7, }, { opacity: 1, x: this.x, y: this.y - 10, z: this.z, - time: 300 / this.scene.acceleration + time: 300 / this.scene.acceleration, }, 'ballistic2', 'fade'); if (this.scene.gen <= 4) { this.delay(this.scene.timeOffset + 300 / this.scene.acceleration).anim({ @@ -1905,7 +1904,7 @@ class PokemonSprite extends Sprite { this.$sub!.css(this.scene.pos({ x: this.x, y: this.y, - z: this.z + z: this.z, }, this.subsp!)); this.$el.animate(this.scene.pos({ x: this.x, @@ -1941,7 +1940,7 @@ class PokemonSprite extends Sprite { x: this.leftof(-100), y: this.y, z: this.z, - opacity: 0 + opacity: 0, }, this.sp)); this.delay(300).anim({ x: this.x, @@ -1998,7 +1997,7 @@ class PokemonSprite extends Sprite { this.$statbar = null; $statbar.animate({ left: this.statbarLeft - (this.siden ? -100 : 100), - opacity: 0 + opacity: 0, }, 300 / this.scene.acceleration, () => { $statbar!.remove(); }); @@ -2055,7 +2054,7 @@ class PokemonSprite extends Sprite { this.$statbar = null; $statbar.animate({ left: this.statbarLeft + (this.siden ? 50 : -50), - opacity: 0 + opacity: 0, }, 300 / this.scene.acceleration, () => { $statbar!.remove(); }); @@ -2163,7 +2162,7 @@ class PokemonSprite extends Sprite { x: this.x, y: this.y, z: this.z, - opacity: 1 + opacity: 1, }, sp), 300); }); this.scene.wait(500); @@ -2293,7 +2292,9 @@ class PokemonSprite extends Sprite { if (pokemon.species.indexOf('-Mega') >= 0) symbol = 'mega'; else if (pokemon.species === 'Kyogre-Primal') symbol = 'alpha'; else if (pokemon.species === 'Groudon-Primal') symbol = 'omega'; - if (symbol) buf += ' ' + symbol + ''; + if (symbol) { + buf += ' ' + symbol + ''; + } buf += '
    '; buf += '
    '; @@ -2340,7 +2341,7 @@ class PokemonSprite extends Sprite { let $hp = this.$statbar.find('.hp'); $hp.css({ width: w, - 'border-right-width': (w ? 1 : 0) + 'border-right-width': (w ? 1 : 0), }); if (hpcolor === 'g') $hp.removeClass('hp-yellow hp-red'); else if (hpcolor === 'y') $hp.removeClass('hp-red').addClass('hp-yellow'); @@ -2384,7 +2385,7 @@ class PokemonSprite extends Sprite { status += '' + pokemon.getBoost(stat as BoostStatName) + ' '; } } - let statusTable = { + let statusTable: {[id: string]: string} = { throatchop: 'Throat Chop ', confusion: 'Confused ', healblock: 'Heal Block ', @@ -2459,8 +2460,8 @@ class PokemonSprite extends Sprite { itemremoved: '', // Gen 1 lightscreen: 'Light Screen', - reflect: 'Reflect' - } as {[id: string]: string}; + reflect: 'Reflect', + }; for (let i in pokemon.volatiles) { if (typeof statusTable[i] === 'undefined') status += '[[' + i + ']]'; else status += statusTable[i]; @@ -2518,25 +2519,25 @@ Object.assign($.easing, { }, quadDown(x: number, t: number, b: number, c: number, d: number) { return x * x; - } + }, }); const BattleSound = new class { - effectCache = {} as {[url: string]: any}; + effectCache: {[url: string]: any} = {}; // bgm - bgmCache = {} as {[url: string]: any}; + bgmCache: {[url: string]: any} = {}; bgm: any = null!; // misc soundPlaceholder = { - play: function () { return this; }, - pause: function () { return this; }, - stop: function () { return this; }, - resume: function () { return this; }, - setVolume: function () { return this; }, - onposition: function () { return this; } - } + play() { return this; }, + pause() { return this; }, + stop() { return this; }, + resume() { return this; }, + setVolume() { return this; }, + onposition() { return this; }, + }; // options effectVolume = 50; @@ -2551,7 +2552,7 @@ const BattleSound = new class { this.effectCache[url] = soundManager.createSound({ id: url, url: Tools.resourcePrefix + url, - volume: this.effectVolume + volume: this.effectVolume, }); } catch (e) {} if (!this.effectCache[url]) { @@ -2573,7 +2574,7 @@ const BattleSound = new class { this.bgmCache[url] = soundManager.createSound({ id: url, url: Tools.resourcePrefix + url, - volume: this.bgmVolume + volume: this.bgmVolume, }); } catch (e) {} if (!this.bgmCache[url]) { @@ -2620,7 +2621,7 @@ const BattleSound = new class { // setting setMute(muted: boolean) { muted = !!muted; - if (this.muted == muted) return; + if (this.muted === muted) return; this.muted = muted; if (muted) { if (this.bgm) this.bgm.pause(); @@ -2651,227 +2652,225 @@ interface AnimData { anim(scene: BattleScene, args: PokemonSprite[]): void; prepareAnim?(scene: BattleScene, args: PokemonSprite[]): void; residualAnim?(scene: BattleScene, args: PokemonSprite[]): void; - prepareMessage?(pokemon: Pokemon, target: Pokemon): string; - multihit?: boolean; } type AnimTable = {[k: string]: AnimData}; -var BattleEffects: {[k: string]: SpriteData} = { +const BattleEffects: {[k: string]: SpriteData} = { wisp: { url: 'wisp.png', - w: 100, h: 100 + w: 100, h: 100, }, poisonwisp: { url: 'poisonwisp.png', - w: 100, h: 100 + w: 100, h: 100, }, waterwisp: { url: 'waterwisp.png', - w: 100, h: 100 + w: 100, h: 100, }, mudwisp: { url: 'mudwisp.png', - w: 100, h: 100 + w: 100, h: 100, }, blackwisp: { url: 'blackwisp.png', - w: 100, h: 100 + w: 100, h: 100, }, fireball: { url: 'fireball.png', - w: 64, h: 64 + w: 64, h: 64, }, bluefireball: { url: 'bluefireball.png', - w: 64, h: 64 + w: 64, h: 64, }, icicle: { url: 'icicle.png', // http://opengameart.org/content/icicle-spell - w: 80, h: 60 + w: 80, h: 60, }, lightning: { url: 'lightning.png', // by Pokemon Showdown user SailorCosmos - w: 41, h: 229 + w: 41, h: 229, }, rocks: { url: 'rocks.png', // Pokemon Online - Gilad - w: 100, h: 100 + w: 100, h: 100, }, rock1: { url: 'rock1.png', // Pokemon Online - Gilad - w: 64, h: 80 + w: 64, h: 80, }, rock2: { url: 'rock2.png', // Pokemon Online - Gilad - w: 66, h: 72 + w: 66, h: 72, }, rock3: { url: 'rock3.png', // by Pokemon Showdown user SailorCosmos - w: 66, h: 72 + w: 66, h: 72, }, leaf1: { url: 'leaf1.png', - w: 32, h: 26 + w: 32, h: 26, }, leaf2: { url: 'leaf2.png', - w: 40, h: 26 + w: 40, h: 26, }, bone: { url: 'bone.png', - w: 29, h: 29 + w: 29, h: 29, }, caltrop: { url: 'caltrop.png', // by Pokemon Showdown user SailorCosmos - w: 80, h: 80 + w: 80, h: 80, }, poisoncaltrop: { url: 'poisoncaltrop.png', // by Pokemon Showdown user SailorCosmos - w: 80, h: 80 + w: 80, h: 80, }, shadowball: { url: 'shadowball.png', - w: 100, h: 100 + w: 100, h: 100, }, energyball: { url: 'energyball.png', - w: 100, h: 100 + w: 100, h: 100, }, electroball: { url: 'electroball.png', - w: 100, h: 100 + w: 100, h: 100, }, mistball: { url: 'mistball.png', - w: 100, h: 100 + w: 100, h: 100, }, iceball: { url: 'iceball.png', - w: 100, h: 100 + w: 100, h: 100, }, flareball: { url: 'flareball.png', - w: 100, h: 100 + w: 100, h: 100, }, pokeball: { url: 'pokeball.png', - w: 24, h: 24 + w: 24, h: 24, }, fist: { url: 'fist.png', // by Pokemon Showdown user SailorCosmos - w: 55, h: 49 + w: 55, h: 49, }, fist1: { url: 'fist1.png', - w: 49, h: 55 + w: 49, h: 55, }, foot: { url: 'foot.png', // by Pokemon Showdown user SailorCosmos - w: 50, h: 75 + w: 50, h: 75, }, topbite: { url: 'topbite.png', - w: 108, h: 64 + w: 108, h: 64, }, bottombite: { url: 'bottombite.png', - w: 108, h: 64 + w: 108, h: 64, }, web: { url: 'web.png', // by Pokemon Showdown user SailorCosmos - w: 120, h: 122 + w: 120, h: 122, }, leftclaw: { url: 'leftclaw.png', - w: 44, h: 60 + w: 44, h: 60, }, rightclaw: { url: 'rightclaw.png', - w: 44, h: 60 + w: 44, h: 60, }, leftslash: { url: 'leftslash.png', // by Pokemon Showdown user Modeling Clay - w: 57, h: 56 + w: 57, h: 56, }, rightslash: { url: 'rightslash.png', // by Pokemon Showdown user Modeling Clay - w: 57, h: 56 + w: 57, h: 56, }, leftchop: { url: 'leftchop.png', // by Pokemon Showdown user SailorCosmos - w: 100, h: 130 + w: 100, h: 130, }, rightchop: { url: 'rightchop.png', // by Pokemon Showdown user SailorCosmos - w: 100, h: 130 + w: 100, h: 130, }, angry: { url: 'angry.png', // by Pokemon Showdown user SailorCosmos - w: 30, h: 30 + w: 30, h: 30, }, heart: { url: 'heart.png', // by Pokemon Showdown user SailorCosmos - w: 30, h: 30 + w: 30, h: 30, }, pointer: { url: 'pointer.png', // by Pokemon Showdown user SailorCosmos - w: 100, h: 100 + w: 100, h: 100, }, sword: { url: 'sword.png', // by Pokemon Showdown user SailorCosmos - w: 48, h: 100 + w: 48, h: 100, }, impact: { url: 'impact.png', // by Pokemon Showdown user SailorCosmos - w: 127, h: 119 + w: 127, h: 119, }, stare: { url: 'stare.png', - w: 100, h: 35 + w: 100, h: 35, }, shine: { url: 'shine.png', // by Smogon user Jajoken - w: 127, h: 119 + w: 127, h: 119, }, feather: { url: 'feather.png', // Ripped from http://www.clker.com/clipart-black-and-white-feather.html - w: 100, h: 38 + w: 100, h: 38, }, shell: { url: 'shell.png', // by Smogon user Jajoken - w: 100, h: 91.5 + w: 100, h: 91.5, }, petal: { url: 'petal.png', // by Smogon user Jajoken - w: 60, h: 60 + w: 60, h: 60, }, gear: { url: 'gear.png', // by Smogon user Jajoken - w: 100, h: 100 + w: 100, h: 100, }, alpha: { url: 'alpha.png', // Ripped from Pokemon Global Link - w: 80, h: 80 + w: 80, h: 80, }, omega: { url: 'omega.png', // Ripped from Pokemon Global Link - w: 80, h: 80 + w: 80, h: 80, }, rainbow: { url: 'rainbow.png', - w: 128, h: 128 + w: 128, h: 128, }, zsymbol: { url: 'z-symbol.png', // From http://froggybutt.deviantart.com/art/Pokemon-Z-Move-symbol-633125033 - w: 150, h: 100 + w: 150, h: 100, }, ultra: { url: 'ultra.png', // by Pokemon Showdown user Modeling Clay - w: 113, h: 165 + w: 113, h: 165, }, hitmark: { url: 'hitmarker.png', // by Pokemon Showdown user Ridaz - w: 100, h: 100 + w: 100, h: 100, }, protect: { rawHTML: '