From 399289a3f7e61e49e73cac3816bf867efd02112c Mon Sep 17 00:00:00 2001 From: Guangcong Luo Date: Wed, 2 Apr 2025 04:32:45 +0000 Subject: [PATCH] April Fool's 2025 updates The main new joke is #2337, but I made a number of other tweaks. In particular: - Bringing back some text from AFD 2019, and adding some more - Showing the Taunt and Chilly Reception jokes in `/afd sprites` --- build-tools/update | 1 + play.pokemonshowdown.com/data/text-afd.js | 1017 +---------------- play.pokemonshowdown.com/js/client-chat.js | 2 +- .../sprites/afd/index.php | 2 +- play.pokemonshowdown.com/src/battle-log.ts | 178 +-- 5 files changed, 134 insertions(+), 1066 deletions(-) diff --git a/build-tools/update b/build-tools/update index e253e495d..96616c77c 100755 --- a/build-tools/update +++ b/build-tools/update @@ -112,6 +112,7 @@ compiledFiles += compiler.compileToFile( 'play.pokemonshowdown.com/src/battle-log-misc.js', 'caches/pokemon-showdown/server/chat-formatter.ts', 'play.pokemonshowdown.com/data/text.js', + 'play.pokemonshowdown.com/data/text-afd.js', 'play.pokemonshowdown.com/src/battle-text-parser.ts', ], 'play.pokemonshowdown.com/js/battledata.js', diff --git a/play.pokemonshowdown.com/data/text-afd.js b/play.pokemonshowdown.com/data/text-afd.js index 8335cb02e..ac47a558b 100644 --- a/play.pokemonshowdown.com/data/text-afd.js +++ b/play.pokemonshowdown.com/data/text-afd.js @@ -1,37 +1,43 @@ exports.BattleTextAFD = { default: { - startBattle: "[TRAINER], in combination with [TRAINER], shall commence battling forthwith!", - winBattle: "**[TRAINER]** is victorious!", - tieBattle: "The feud between [TRAINER] and [TRAINER] remains unresolved!", + // April Fool's 2019 + // April Fool's 2025: tone down the most common text + // (I think the jokes work best as a surprise, when most of the + // text is the same as before.) - pokemon: "[NICKNAME]", - opposingPokemon: "a villainous [NICKNAME]", - team: "your faithful alliance", - opposingTeam: "the forces of evil", - party: "your ally Pok\u00E9mon", - opposingParty: "the opposing Pok\u00E9mon", + // startBattle: "[TRAINER] and [TRAINER] commence battle!", + // winBattle: "**[TRAINER]** is victorious!", + // tieBattle: "The feud between [TRAINER] and [TRAINER] remains unresolved!", - turn: "== Phase [NUMBER] ==", - switchIn: "[TRAINER] would have us contend with [FULLNAME]!", - switchInOwn: "[FULLNAME]! Honor demands your presence!", - switchOut: "[TRAINER] has other plans for [NICKNAME]!", - switchOutOwn: "[NICKNAME], the time for retreat is upon us!", - drag: "[FULLNAME] was not planning to be available today!", - faint: "[POKEMON] is no longer with us. F.", - swap: "[POKEMON] and [TARGET] switched places!", - swapCenter: "[POKEMON] moved to the center!", + // pokemon: "[NICKNAME]", + // opposingPokemon: "a villainous [NICKNAME]", + // team: "your faithful alliance", + // opposingTeam: "the forces of evil", + // party: "our blessed allies", + // opposingParty: "the barbarous opposition", - zEffect: " [POKEMON] isn't holding back anymore!", - move: "[POKEMON]'s **[MOVE]** will be unleashed!", - abilityActivation: " [[POKEMON]'s [ABILITY]]", + // turn: "== Phase [NUMBER] ==", + // switchIn: "[TRAINER] would have us contend with [FULLNAME]!", + // switchInOwn: "[FULLNAME]! Honor demands your presence!", + // switchOut: "[TRAINER] has other plans for [NICKNAME]!", + // switchOutOwn: "[NICKNAME], the time for retreat is upon us!", + // drag: "[FULLNAME] was unprepared to join us!", + // faint: "[POKEMON]'s service has concluded.", + // swap: "[POKEMON] and [TARGET] switched places!", + // swapCenter: "[POKEMON] moved to the center!", + + // zEffect: " [POKEMON] isn't holding back anymore!", + // move: "[POKEMON] unleashes **[MOVE]**!", + // abilityActivation: " [[POKEMON]'s [ABILITY]]", mega: " [POKEMON]'s [ITEM] glows!", megaNoItem: " [POKEMON]'s lack of Mega Stone glows!", megaGen6: " [POKEMON]'s [ITEM] glows!", - transformMega: "[POKEMON] is no longer a child!", - primal: "[POKEMON]'s Primal Reversion! It was cured of its amnesia!", + transformMega: "[POKEMON] thinks it's a big deal!", + primal: "[POKEMON]'s reversion! It got nostalgic about the old days!", zPower: " [POKEMON] is about to stop holding back!", zBroken: " [POKEMON]'s shields are failing!", + terastallize: " [POKEMON] is cosplaying as [TYPE]-type!", // 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` @@ -122,6 +128,13 @@ exports.BattleTextAFD = { hitCount: " Hit [NUMBER] times!", hitCountSingular: " Hit 1 time!", }, + dynamax: { + // April Fool's 2020 + start: " ([POKEMON]'s Tinymax!)", + end: " ([POKEMON] returned to normal!)", + block: " The move was blocked by the power of Tinymax!", + fail: " [POKEMON] shook its head. It seems like it can't use this move...", + }, // stats hp: { @@ -162,54 +175,6 @@ exports.BattleTextAFD = { statName: "stats", }, - // 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!", @@ -248,916 +213,6 @@ exports.BattleTextAFD = { trapped: { start: " [POKEMON] can no longer escape!", }, - dynamax: { - // April Fool's 2020 - start: " ([POKEMON]'s Tinymax!)", - end: " ([POKEMON] returned to normal!)", - block: " The move was blocked by the power of Tinymax!", - fail: " [POKEMON] shook its head. It seems like it can't use this move...", - }, - - // weather - sandstorm: { - weatherName: "Sandstorm", - start: " A sandstorm kicked up!", - end: " The sandstorm subsided.", - upkeep: " The sandstorm is raging.", - damage: " [POKEMON] is buffeted by the sandstorm!", - }, - sunnyday: { - weatherName: "Sun", - start: " The sunlight turned harsh!", - end: " The sunlight faded.", - upkeep: " (The sunlight is strong!)", - }, - raindance: { - weatherName: "Rain", - start: " It started to rain!", - end: " The rain stopped.", - upkeep: " (Rain continues to fall!)", - }, - hail: { - weatherName: "Hail", - start: " It started to hail!", - end: " The hail stopped.", - upkeep: " The hail is crashing down.", - damage: " [POKEMON] is buffeted by the hail!", - }, - desolateland: { - weatherName: "Intense Sun", - start: " The sunlight turned extremely harsh!", - end: " The extremely harsh sunlight faded.", - 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.", - heal: " [POKEMON]'s HP was restored.", - }, - 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\u00E9mon'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]!", - }, - crash: { - damage: " [POKEMON] kept going and crashed!", - }, - 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: { - megaNoItem: " [TRAINER]'s fervent wish has reached [POKEMON]!", - }, - 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: { - activate: " 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: { - activate: " [POKEMON]'s [MOVE] lost all of its PP due to the 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: "#crash", - }, - 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: "#crash", - }, - 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 - startGen1: " [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: { - activate: " 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\u00E9mon 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\u00E9mon, 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 - startGen1: " [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: " Sneaky pebbles loom around [TEAM]!", - end: " Sneaky pebbles disappeared from around [TEAM]!", - damage: " Sneaky pebbles bamboozle [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.", - upkeep: " [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: " [NICKNAME]'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: " [POKEMON] is protected by an aromatic veil!", - }, - aurabreak: { - start: " [POKEMON] reversed all other Pok\u00E9mon'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: { - block: " [SOURCE] cannot use [MOVE]!", - }, - darkaura: { - start: " [POKEMON] is radiating a dark aura!", - }, - dazzling: { - block: "#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: " [POKEMON] 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', - }, - mindblown: { - damage: " ([POKEMON] cut its own HP to power up its move!)", - }, - 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: { - block: "#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: " [POKEMON] 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!", - }, }; exports.BattleTextNotAFD = exports.BattleText; -//exports.BattleText = exports.BattleTextAFD; diff --git a/play.pokemonshowdown.com/js/client-chat.js b/play.pokemonshowdown.com/js/client-chat.js index 06fee30b7..40e450360 100644 --- a/play.pokemonshowdown.com/js/client-chat.js +++ b/play.pokemonshowdown.com/js/client-chat.js @@ -1249,7 +1249,7 @@ this.add('/afd sprites - Enable April Fools\' Day sprites.'); this.add('/afd default - Set April Fools\' Day to default (full on April 1st, off otherwise).'); this.add('/afd off - Disable April Fools\' Day jokes until the next refresh, and set /afd default.'); - this.add('/afd never - Disable April Fools\' Day permanently.'); + this.add('/afd never - Disable April Fools\' Day jokes permanently.'); return false; } } diff --git a/play.pokemonshowdown.com/sprites/afd/index.php b/play.pokemonshowdown.com/sprites/afd/index.php index cf2bc1605..1b26d50fb 100644 --- a/play.pokemonshowdown.com/sprites/afd/index.php +++ b/play.pokemonshowdown.com/sprites/afd/index.php @@ -8,7 +8,7 @@ function dirindex_intro() { ?>

April Fool's front sprites

These are the front sprites. You can also view the back sprites.

-

» pokemon-showdown-afd-2020.zip

+

» pokemon-showdown-afd-2020.zip

{ - this.messageFromLog(this.battleParser!.parseArgs(args1, kwArgs1, noSectionBreak)); + const messageFromArgs = (args1: Args, kwArgs1: KWArgs = {}) => { + this.messageFromLog(this.battleParser!.parseArgs(args1, kwArgs1, true)); }; - if (args[0] === 'faint') { - // April Fool's 2018 (DLC) - if (!Config.server.afdFaint) { - messageFromArgs(args, kwArgs); - this.message('
Needed that one alive? Buy Max Revive DLC, yours for only $9.99!
CLICK HERE!
'); - Config.server.afdFaint = true; - return true; - } - } else if (args[0] === '-crit') { - // April Fool's 2018 (DLC) - if (!Config.server.afdCrit) { - messageFromArgs(args, kwArgs); - this.message('
Crit mattered? Buy Crit Insurance DLC, yours for only $4.99!
CLICK HERE!
'); - Config.server.afdCrit = true; - return true; - } - } else if (args[0] === 'move') { + // Taunt and Chilly Reception messages (below) will appear in ALL AFD modes. + + if (args[0] === 'move') { if (kwArgs.from) return false; const moveid = toID(args[2]); - if (moveid === 'earthquake') { - // April Fool's 2013 - if (this.scene.animating && 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, () => { - $('body').css({ - position: 'static', - }); - }); - } - messageFromArgs(['move', args[1], 'Fissure']); - this.messageFromLog('Just kidding! It was **Earthquake**!'); - return true; - } else if (moveid === 'taunt') { + if (moveid === 'taunt') { // April Fool's 2013, expanded in 2025 messageFromArgs(args, kwArgs); const quotes = [ @@ -481,35 +434,6 @@ export class BattleLog { // give time to read this.scene.wait(3 * this.scene.battle.messageFadeTime / this.scene.acceleration); return true; - // } else if (move.id === 'metronome' || move.id === 'sleeptalk' || move.id === 'assist') { - // // April Fool's 2014 - NOT UPDATED TO NEW BATTLE LOG - // 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 if (moveid === 'stealthrock') { - // April Fool's 2016 - const 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', - ]; - messageFromArgs(['move', args[1], srNames[Math.floor(Math.random() * srNames.length)]]); - return true; - } else if (moveid === 'extremespeed') { - // April Fool's 2018 - messageFromArgs(args, kwArgs); - const fastWords = ['H-Hayai', 'Masaka', 'Its fast']; - this.messageFromLog(`**${fastWords[Math.floor(Math.random() * fastWords.length)]}**`); - return true; - } else if (moveid === 'aerialace') { - // April Fool's 2018 - messageFromArgs(['move', args[1], 'Tsubame Gaeshi']); - return true; } } else if (args[0] === '-prepare') { const moveid = toID(args[2]); @@ -850,6 +774,94 @@ export class BattleLog { return true; } } + + // !!! EVERYTHING BELOW THIS LINE DOESN'T HAPPEN IN `/afd sprites` MODE + if (Dex.afdMode !== true) return; + + if (args[0] === 'faint') { + // April Fool's 2018 (DLC) + if (!Config.server.afdFaint) { + messageFromArgs(args, kwArgs); + this.message('
Needed that one alive? Buy Max Revive DLC, yours for only $9.99!
CLICK HERE!
'); + Config.server.afdFaint = true; + return true; + } + } else if (args[0] === '-crit') { + // April Fool's 2018 (DLC) + if (!Config.server.afdCrit) { + messageFromArgs(args, kwArgs); + this.message('
Crit mattered? Buy Crit Insurance DLC, yours for only $4.99!
CLICK HERE!
'); + Config.server.afdCrit = true; + return true; + } + } else if (args[0] === 'move') { + if (kwArgs.from) return false; + + const moveid = toID(args[2]); + if (moveid === 'earthquake') { + // April Fool's 2013 + if (this.scene.animating && 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, () => { + $('body').css({ + position: 'static', + }); + }); + } + messageFromArgs(['move', args[1], 'Fissure']); + this.messageFromLog('Just kidding! It was **Earthquake**!'); + return true; + // } else if (move.id === 'metronome' || move.id === 'sleeptalk' || move.id === 'assist') { + // // April Fool's 2014 - NOT UPDATED TO NEW BATTLE LOG + // 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 if (moveid === 'stealthrock') { + // April Fool's 2016 + const 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', + ]; + messageFromArgs(['move', args[1], srNames[Math.floor(Math.random() * srNames.length)]]); + return true; + } else if (moveid === 'extremespeed') { + // April Fool's 2018 + messageFromArgs(args, kwArgs); + const fastWords = ['H-Hayai', 'Masaka', 'Its fast']; + this.messageFromLog(`**${fastWords[Math.floor(Math.random() * fastWords.length)]}**`); + return true; + } else if (moveid === 'aerialace') { + // April Fool's 2018 + messageFromArgs(['move', args[1], 'Tsubame Gaeshi']); + return true; + } + } return false; } messageFromLog(line: string) {