mirror of
https://github.com/smogon/pokemon-showdown-client.git
synced 2026-03-21 17:50:29 -05:00
Add some new move animations (#2185)
* strt new nims * Add moon image to other moon-y moves * oopz * build fix
This commit is contained in:
parent
626ececf17
commit
e0e2ea0964
BIN
fx/moon.png
Normal file
BIN
fx/moon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.7 KiB |
|
|
@ -1532,10 +1532,6 @@ export const BattleMoveAnims: AnimTable = {
|
|||
},
|
||||
orderup: {
|
||||
anim(scene, [attacker, defender]) {
|
||||
let xstep = (defender.x - attacker.x) / 5;
|
||||
let ystep = (defender.y - attacker.y) / 5;
|
||||
let zstep = (defender.z - attacker.z) / 5;
|
||||
|
||||
const tatsugiriSprite = {
|
||||
url: `https://${Config.routes.client}/sprites/gen5/tatsugiri${['-droopy', '-stretchy', ''][Math.floor(Math.random() * 3)]}.png`,
|
||||
w: 96,
|
||||
|
|
@ -1546,118 +1542,24 @@ export const BattleMoveAnims: AnimTable = {
|
|||
x: defender.x,
|
||||
y: defender.y + 250,
|
||||
z: defender.z,
|
||||
scale: 1,
|
||||
scale: 2,
|
||||
opacity: 1,
|
||||
time: 0,
|
||||
}, {
|
||||
y: defender.y,
|
||||
scale: 0.5,
|
||||
scale: 1,
|
||||
time: 300,
|
||||
}, 'linear');
|
||||
scene.showEffect(tatsugiriSprite, {
|
||||
x: defender.x,
|
||||
y: defender.y,
|
||||
z: defender.z,
|
||||
scale: 0.5,
|
||||
scale: 1,
|
||||
opacity: 1,
|
||||
time: 300,
|
||||
}, {
|
||||
time: 900,
|
||||
time: 600,
|
||||
}, 'linear');
|
||||
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,
|
||||
}, {
|
||||
scale: 2,
|
||||
opacity: 0,
|
||||
time: 40 * i + 800,
|
||||
}, 'linear');
|
||||
scene.showEffect('poisonwisp', {
|
||||
x: attacker.x + xstep * (i + 1),
|
||||
y: attacker.y + ystep * (i + 1),
|
||||
z: attacker.z + zstep * (i + 1),
|
||||
scale: 0.5,
|
||||
opacity: 0.3,
|
||||
time: 20 * i,
|
||||
}, {
|
||||
scale: 2,
|
||||
opacity: 0,
|
||||
time: 40 * i + 800,
|
||||
}, 'linear');
|
||||
}
|
||||
scene.showEffect('shadowball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y,
|
||||
z: attacker.behind(-15),
|
||||
scale: 0.5,
|
||||
opacity: 0.6,
|
||||
}, {
|
||||
scale: 0.6,
|
||||
opacity: 0.2,
|
||||
time: 700,
|
||||
}, 'linear', 'fade');
|
||||
|
||||
scene.showEffect('shadowball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y,
|
||||
z: attacker.z,
|
||||
scale: 0.3,
|
||||
opacity: 0.1,
|
||||
time: 300,
|
||||
}, {
|
||||
x: defender.x,
|
||||
y: defender.y,
|
||||
z: defender.z,
|
||||
scale: 1,
|
||||
time: 500,
|
||||
}, 'linear', 'explode');
|
||||
scene.showEffect('shadowball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y,
|
||||
z: attacker.z,
|
||||
scale: 0.3,
|
||||
opacity: 0.1,
|
||||
time: 400,
|
||||
}, {
|
||||
x: defender.x,
|
||||
y: defender.y,
|
||||
z: defender.z,
|
||||
scale: 1,
|
||||
time: 600,
|
||||
}, 'linear', 'explode');
|
||||
scene.showEffect('shadowball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y,
|
||||
z: attacker.z,
|
||||
scale: 0.3,
|
||||
opacity: 0.1,
|
||||
time: 500,
|
||||
}, {
|
||||
x: defender.x,
|
||||
y: defender.y,
|
||||
z: defender.z,
|
||||
scale: 1,
|
||||
time: 700,
|
||||
}, 'linear', 'explode');
|
||||
scene.showEffect('shadowball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y,
|
||||
z: attacker.z,
|
||||
scale: 0.3,
|
||||
opacity: 0.1,
|
||||
time: 600,
|
||||
}, {
|
||||
x: defender.x,
|
||||
y: defender.y,
|
||||
z: defender.z,
|
||||
scale: 1,
|
||||
time: 800,
|
||||
}, 'linear', 'explode');
|
||||
},
|
||||
},
|
||||
dragonpulse: {
|
||||
|
|
@ -3721,6 +3623,17 @@ export const BattleMoveAnims: AnimTable = {
|
|||
moonlight: {
|
||||
anim(scene, [attacker]) {
|
||||
scene.backgroundEffect(`url('https://${Config.routes.client}/fx/bg-space.jpg')`, 800, 0.6);
|
||||
scene.showEffect('moon', {
|
||||
x: attacker.x,
|
||||
y: attacker.y + 150,
|
||||
z: attacker.z,
|
||||
scale: 1,
|
||||
opacity: 0,
|
||||
time: 200,
|
||||
}, {
|
||||
opacity: 0.8,
|
||||
time: 900,
|
||||
}, 'accel', 'fade');
|
||||
scene.showEffect('shine', {
|
||||
x: attacker.x + 40,
|
||||
y: attacker.y - 40,
|
||||
|
|
@ -6140,6 +6053,237 @@ export const BattleMoveAnims: AnimTable = {
|
|||
}, 'swing');
|
||||
},
|
||||
},
|
||||
bloodmoon: {
|
||||
anim(scene, [attacker, defender]) {
|
||||
let xstep = (defender.x - attacker.x) / 5;
|
||||
let ystep = (defender.x - 100 - attacker.x) / 5;
|
||||
let zstep = (defender.z - attacker.z) / 5;
|
||||
|
||||
scene.backgroundEffect('#000000', 1700, 0.8);
|
||||
|
||||
scene.showEffect('moon', {
|
||||
x: attacker.x,
|
||||
y: attacker.y,
|
||||
z: attacker.z,
|
||||
scale: 1,
|
||||
opacity: 0,
|
||||
time: 0,
|
||||
}, {
|
||||
x: attacker.x,
|
||||
y: attacker.y + 100,
|
||||
z: attacker.z,
|
||||
scale: 1,
|
||||
opacity: 0.9,
|
||||
time: 0,
|
||||
}, 'decel');
|
||||
scene.showEffect('flareball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y,
|
||||
z: attacker.z,
|
||||
scale: 1.5,
|
||||
opacity: 0,
|
||||
time: 0,
|
||||
}, {
|
||||
x: attacker.x,
|
||||
y: attacker.y + 100,
|
||||
z: attacker.z,
|
||||
scale: 1.5,
|
||||
opacity: 0.7,
|
||||
time: 0,
|
||||
}, 'decel', '', {filter: 'hue-rotate(-45deg)'});
|
||||
scene.showEffect('flareball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y + 100,
|
||||
z: attacker.z,
|
||||
scale: 2.5,
|
||||
opacity: 1,
|
||||
time: 500,
|
||||
}, {
|
||||
scale: 3,
|
||||
opacity: 0,
|
||||
time: 1300,
|
||||
}, 'decel', '', {filter: 'hue-rotate(-45deg)'});
|
||||
for (let i = 0; i < 5; i++) {
|
||||
scene.showEffect('flareball', {
|
||||
x: attacker.x + xstep * (i + 1),
|
||||
y: (attacker.y + 100) + ystep * (i + 1),
|
||||
z: attacker.z + zstep * (i + 1),
|
||||
scale: 1.5,
|
||||
opacity: 1,
|
||||
time: 40 * i + 700,
|
||||
}, {
|
||||
scale: 1,
|
||||
opacity: 0,
|
||||
time: 60 * i + 1500,
|
||||
}, 'linear', '', {filter: 'hue-rotate(-45deg)'});
|
||||
}
|
||||
scene.showEffect('flareball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y + 100,
|
||||
z: attacker.z,
|
||||
scale: 0.4,
|
||||
opacity: 0.6,
|
||||
time: 800,
|
||||
}, {
|
||||
x: defender.x + 30,
|
||||
y: defender.y + 30,
|
||||
z: defender.z,
|
||||
scale: 0.6,
|
||||
opacity: 0.3,
|
||||
time: 1000,
|
||||
}, 'linear', 'explode', {filter: 'hue-rotate(-45deg)'});
|
||||
scene.showEffect('flareball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y + 100,
|
||||
z: attacker.z,
|
||||
scale: 0.4,
|
||||
opacity: 0.6,
|
||||
time: 875,
|
||||
}, {
|
||||
x: defender.x + 20,
|
||||
y: defender.y - 30,
|
||||
z: defender.z,
|
||||
scale: 0.6,
|
||||
opacity: 0.3,
|
||||
time: 1075,
|
||||
}, 'linear', 'explode', {filter: 'hue-rotate(-45deg)'});
|
||||
scene.showEffect('flareball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y + 100,
|
||||
z: attacker.z,
|
||||
scale: 0.4,
|
||||
opacity: 0.6,
|
||||
time: 950,
|
||||
}, {
|
||||
x: defender.x - 30,
|
||||
y: defender.y,
|
||||
z: defender.z,
|
||||
scale: 0.6,
|
||||
opacity: 0.3,
|
||||
time: 1150,
|
||||
}, 'linear', 'explode', {filter: 'hue-rotate(-45deg)'});
|
||||
scene.showEffect('flareball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y + 100,
|
||||
z: attacker.z,
|
||||
scale: 0.4,
|
||||
opacity: 0.6,
|
||||
time: 1025,
|
||||
}, {
|
||||
x: defender.x - 10,
|
||||
y: defender.y + 10,
|
||||
z: defender.z,
|
||||
scale: 0.6,
|
||||
opacity: 0.3,
|
||||
time: 1225,
|
||||
}, 'linear', 'explode', {filter: 'hue-rotate(-45deg)'});
|
||||
scene.showEffect('flareball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y + 100,
|
||||
z: attacker.z,
|
||||
scale: 0.4,
|
||||
opacity: 0.6,
|
||||
time: 1100,
|
||||
}, {
|
||||
x: defender.x + 10,
|
||||
y: defender.y - 10,
|
||||
z: defender.z,
|
||||
scale: 0.6,
|
||||
opacity: 0.3,
|
||||
time: 1300,
|
||||
}, 'linear', 'explode', {filter: 'hue-rotate(-45deg)'});
|
||||
scene.showEffect('flareball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y + 100,
|
||||
z: attacker.z,
|
||||
scale: 0.4,
|
||||
opacity: 0.6,
|
||||
time: 1175,
|
||||
}, {
|
||||
x: defender.x - 20,
|
||||
y: defender.y,
|
||||
z: defender.z,
|
||||
scale: 0.6,
|
||||
opacity: 0.3,
|
||||
time: 1375,
|
||||
}, 'linear', 'explode', {filter: 'hue-rotate(-45deg)'});
|
||||
scene.showEffect('flareball', {
|
||||
x: defender.x,
|
||||
y: defender.y - 50,
|
||||
z: defender.z,
|
||||
scale: 1,
|
||||
xscale: 3,
|
||||
opacity: 0.5,
|
||||
time: 1375,
|
||||
}, {
|
||||
scale: 3,
|
||||
xscale: 8,
|
||||
opacity: 0.1,
|
||||
time: 1675,
|
||||
}, 'linear', 'explode', {filter: 'hue-rotate(-45deg)'});
|
||||
scene.showEffect('flareball', {
|
||||
x: defender.x,
|
||||
y: defender.y,
|
||||
z: defender.behind(5),
|
||||
scale: 0,
|
||||
opacity: 1,
|
||||
time: 1175,
|
||||
}, {
|
||||
scale: 8,
|
||||
opacity: 0,
|
||||
time: 1375,
|
||||
}, 'linear', '', {filter: 'hue-rotate(-45deg)'});
|
||||
scene.showEffect('flareball', {
|
||||
x: defender.x,
|
||||
y: defender.y,
|
||||
z: defender.behind(10),
|
||||
scale: 0,
|
||||
opacity: 1,
|
||||
time: 1275,
|
||||
}, {
|
||||
scale: 8,
|
||||
opacity: 0,
|
||||
time: 1675,
|
||||
}, 'linear', '', {filter: 'hue-rotate(-45deg)'});
|
||||
|
||||
defender.delay(775);
|
||||
defender.anim({
|
||||
z: defender.behind(5),
|
||||
time: 75,
|
||||
}, 'swing');
|
||||
defender.anim({
|
||||
time: 75,
|
||||
}, 'swing');
|
||||
defender.anim({
|
||||
z: defender.behind(5),
|
||||
time: 75,
|
||||
}, 'swing');
|
||||
defender.anim({
|
||||
time: 75,
|
||||
}, 'swing');
|
||||
defender.anim({
|
||||
z: defender.behind(5),
|
||||
time: 75,
|
||||
}, 'swing');
|
||||
defender.anim({
|
||||
time: 75,
|
||||
}, 'swing');
|
||||
defender.anim({
|
||||
z: defender.behind(5),
|
||||
time: 75,
|
||||
}, 'swing');
|
||||
defender.anim({
|
||||
time: 75,
|
||||
}, 'swing');
|
||||
defender.anim({
|
||||
z: defender.behind(10),
|
||||
time: 300,
|
||||
}, 'decel');
|
||||
defender.anim({
|
||||
time: 300,
|
||||
}, 'swing');
|
||||
},
|
||||
},
|
||||
gigatonhammer: {
|
||||
anim(scene, [attacker, defender]) {
|
||||
scene.showEffect('shadowball', {
|
||||
|
|
@ -16172,6 +16316,55 @@ export const BattleMoveAnims: AnimTable = {
|
|||
}, 'ballistic', 'explode');
|
||||
},
|
||||
},
|
||||
syrupbomb: {
|
||||
anim(scene, [attacker, defender]) {
|
||||
const imageType = {filter: attacker.sp.shiny ? 'hue-rotate(-45deg)' : 'hue-rotate(30deg)'};
|
||||
scene.showEffect('flareball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y,
|
||||
z: attacker.z,
|
||||
scale: 0.1,
|
||||
opacity: 0,
|
||||
}, {
|
||||
x: defender.x,
|
||||
y: defender.y,
|
||||
z: defender.z,
|
||||
scale: 0.7,
|
||||
opacity: 1,
|
||||
time: 400,
|
||||
}, 'ballistic', 'explode', imageType);
|
||||
scene.showEffect('flareball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y,
|
||||
z: attacker.z,
|
||||
scale: 0.1,
|
||||
opacity: 0,
|
||||
time: 100,
|
||||
}, {
|
||||
x: defender.x + 40,
|
||||
y: defender.y - 20,
|
||||
z: defender.z,
|
||||
scale: 0.7,
|
||||
opacity: 1,
|
||||
time: 500,
|
||||
}, 'ballistic', 'explode', imageType);
|
||||
scene.showEffect('flareball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y,
|
||||
z: attacker.z,
|
||||
scale: 0.1,
|
||||
opacity: 0,
|
||||
time: 200,
|
||||
}, {
|
||||
x: defender.x - 30,
|
||||
y: defender.y - 10,
|
||||
z: defender.z,
|
||||
scale: 0.7,
|
||||
opacity: 1,
|
||||
time: 600,
|
||||
}, 'ballistic', 'explode', imageType);
|
||||
},
|
||||
},
|
||||
mudbomb: {
|
||||
anim(scene, [attacker, defender]) {
|
||||
scene.showEffect('mudwisp', {
|
||||
|
|
@ -18953,6 +19146,20 @@ export const BattleMoveAnims: AnimTable = {
|
|||
moonblast: {
|
||||
anim(scene, [attacker, defender]) {
|
||||
scene.backgroundEffect(`url('https://${Config.routes.client}/fx/bg-space.jpg')`, 800, 0.6);
|
||||
scene.showEffect('moon', {
|
||||
x: attacker.x,
|
||||
y: attacker.y,
|
||||
z: attacker.z,
|
||||
scale: 0.9,
|
||||
opacity: 0.3,
|
||||
}, {
|
||||
x: defender.x,
|
||||
y: defender.y,
|
||||
z: defender.z,
|
||||
scale: 0.9,
|
||||
opacity: 0.6,
|
||||
time: 500,
|
||||
}, 'linear', 'explode');
|
||||
scene.showEffect('mistball', {
|
||||
x: attacker.x,
|
||||
y: attacker.y,
|
||||
|
|
@ -34875,7 +35082,7 @@ 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['lunardance'] = {anim: BattleMoveAnims['moonlight'].anim};
|
||||
|
||||
BattleMoveAnims['brickbreak'] = {anim: BattleMoveAnims['karatechop'].anim};
|
||||
BattleMoveAnims['throatchop'] = {anim: BattleMoveAnims['karatechop'].anim};
|
||||
|
|
@ -35153,7 +35360,25 @@ BattleMoveAnims['stoneaxe'] = {
|
|||
BattleOtherAnims.slashattack.anim(scene, [attacker, defender]);
|
||||
},
|
||||
};
|
||||
BattleMoveAnims['terablast'] = {anim: BattleMoveAnims['swift'].anim}; // placeholder
|
||||
BattleMoveAnims['terablast'] = {anim: BattleMoveAnims['scald'].anim};
|
||||
BattleMoveAnims['terablastbug'] = {anim: BattleMoveAnims['bugbuzz'].anim};
|
||||
BattleMoveAnims['terablastdark'] = {anim: BattleMoveAnims['darkpulse'].anim};
|
||||
BattleMoveAnims['terablastdragon'] = {anim: BattleMoveAnims['dragonpulse'].anim};
|
||||
BattleMoveAnims['terablastelectric'] = {anim: BattleMoveAnims['thunderbolt'].anim};
|
||||
BattleMoveAnims['terablastfairy'] = {anim: BattleMoveAnims['moonblast'].anim};
|
||||
BattleMoveAnims['terablastfighting'] = {anim: BattleMoveAnims['focusblast'].anim};
|
||||
BattleMoveAnims['terablastfire'] = {anim: BattleMoveAnims['flamethrower'].anim};
|
||||
BattleMoveAnims['terablastflying'] = {anim: BattleMoveAnims['aeroblast'].anim};
|
||||
BattleMoveAnims['terablastghost'] = {anim: BattleMoveAnims['infernalparade'].anim};
|
||||
BattleMoveAnims['terablastgrass'] = {anim: BattleMoveAnims['seedflare'].anim};
|
||||
BattleMoveAnims['terablastground'] = {anim: BattleMoveAnims['earthpower'].anim};
|
||||
BattleMoveAnims['terablastice'] = {anim: BattleMoveAnims['icebeam'].anim};
|
||||
BattleMoveAnims['terablastnormal'] = {anim: BattleMoveAnims['technoblast'].anim};
|
||||
BattleMoveAnims['terablastpoison'] = {anim: BattleMoveAnims['sludgebomb'].anim};
|
||||
BattleMoveAnims['terablastpsychic'] = {anim: BattleMoveAnims['psychic'].anim};
|
||||
BattleMoveAnims['terablastrock'] = {anim: BattleMoveAnims['powergem'].anim};
|
||||
BattleMoveAnims['terablaststeel'] = {anim: BattleMoveAnims['flashcannon'].anim};
|
||||
BattleMoveAnims['terablastwater'] = {anim: BattleMoveAnims['hydropump'].anim};
|
||||
BattleMoveAnims['tidyup'] = {anim: BattleMoveAnims['bulkup'].anim};
|
||||
BattleMoveAnims['trailblaze'] = {anim: BattleMoveAnims['powerwhip'].anim};
|
||||
BattleMoveAnims['tripledive'] = {anim: BattleMoveAnims['dive'].anim};
|
||||
|
|
|
|||
|
|
@ -263,7 +263,10 @@ export class BattleScene implements BattleSceneStub {
|
|||
addSprite(sprite: PokemonSprite) {
|
||||
if (sprite.$el) this.$sprites[+sprite.isFrontSprite].append(sprite.$el);
|
||||
}
|
||||
showEffect(effect: string | SpriteData, start: ScenePos, end: ScenePos, transition: string, after?: string) {
|
||||
showEffect(
|
||||
effect: string | SpriteData, start: ScenePos, end: ScenePos,
|
||||
transition: string, after?: string, additionalCss?: JQuery.PlainObject
|
||||
) {
|
||||
if (typeof effect === 'string') effect = BattleEffects[effect] as SpriteData;
|
||||
if (!start.time) start.time = 0;
|
||||
if (!end.time) end.time = start.time + 500;
|
||||
|
|
@ -279,6 +282,7 @@ export class BattleScene implements BattleSceneStub {
|
|||
|
||||
let $effect = $('<img src="' + effect.url + '" style="display:block;position:absolute" />');
|
||||
this.$fx.append($effect);
|
||||
if (additionalCss) $effect.css(additionalCss);
|
||||
$effect = this.$fx.children().last();
|
||||
|
||||
if (start.time) {
|
||||
|
|
@ -2983,6 +2987,10 @@ const BattleEffects: {[k: string]: SpriteData} = {
|
|||
url: 'flareball.png',
|
||||
w: 100, h: 100,
|
||||
},
|
||||
moon: {
|
||||
url: 'moon.png', // by Kalalokki
|
||||
w: 100, h: 100,
|
||||
},
|
||||
pokeball: {
|
||||
url: 'pokeball.png',
|
||||
w: 24, h: 24,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user