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:
Kris Johnson 2023-11-13 14:52:40 -07:00 committed by GitHub
parent 626ececf17
commit e0e2ea0964
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 338 additions and 105 deletions

BIN
fx/moon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

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

View File

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