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`
This commit is contained in:
Guangcong Luo 2025-04-02 04:32:45 +00:00
parent cf2ef91360
commit 399289a3f7
5 changed files with 134 additions and 1066 deletions

View File

@ -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',

File diff suppressed because it is too large Load Diff

View File

@ -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;
}
}

View File

@ -8,7 +8,7 @@ function dirindex_intro() {
?>
<h1 style="font-size: 12pt;">April Fool's front sprites</h1>
<p>These are the front sprites. You can also <a href="../afd-back/">view the back sprites</a>.</p>
<p>&raquo; <a href="//www.pokemonshowdown.com/files/pokemon-showdown-afd-2020.zip"><strong>pokemon-showdown-afd-2020.zip</strong></a></p>
<p>&raquo; <a href="//www.pokemonshowdown.com/files/pokemon-showdown-afd-2020.zip"><strong><i class="fa fa-file-archive-o"></i> pokemon-showdown-afd-2020.zip</strong></a></p>
<?php
}

View File

@ -353,68 +353,21 @@ export class BattleLog {
}
}
addAFDMessage(args: Args, kwArgs: KWArgs = {}) {
if (Dex.afdMode !== true) return;
if (!Dex.afdMode) return;
if (!this.battleParser || !this.scene) return;
// return true to skip the default message
const messageFromArgs = (args1: Args, kwArgs1: KWArgs = {}, noSectionBreak?: boolean) => {
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('<div class="broadcast-red" style="font-size:10pt">Needed that one alive? Buy <strong>Max Revive DLC</strong>, yours for only $9.99!<br /> <u>CLICK HERE!</u></div>');
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('<div class="broadcast-red" style="font-size:10pt">Crit mattered? Buy <strong>Crit Insurance DLC</strong>, yours for only $4.99!<br /> <u>CLICK HERE!</u></div>');
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 <strong>' + move.name + '</strong>!');
// 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('<div class="chat"><strong style="' + BattleLog.hashColor(toUserid(name)) + '" class="username" data-name="' + BattleLog.escapeHTML(name) + '">' + BattleLog.escapeHTML(name) + ':</strong> <em>' + button + '</em></div>');
// 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('<div class="broadcast-red" style="font-size:10pt">Needed that one alive? Buy <strong>Max Revive DLC</strong>, yours for only $9.99!<br /> <u>CLICK HERE!</u></div>');
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('<div class="broadcast-red" style="font-size:10pt">Crit mattered? Buy <strong>Crit Insurance DLC</strong>, yours for only $4.99!<br /> <u>CLICK HERE!</u></div>');
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 <strong>' + move.name + '</strong>!');
// 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('<div class="chat"><strong style="' + BattleLog.hashColor(toUserid(name)) + '" class="username" data-name="' + BattleLog.escapeHTML(name) + '">' + BattleLog.escapeHTML(name) + ':</strong> <em>' + button + '</em></div>');
// 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) {