Battle animation improvements

pull/1/head
Flashfyre 2023-04-13 23:04:51 -04:00
parent 791bf3cc49
commit 1b8c8b5a3f
20 changed files with 9333 additions and 13084 deletions

View File

@ -7168,7 +7168,7 @@
"3": [ "3": [
{ {
"frameIndex": 3, "frameIndex": 3,
"resourceName": "PRSFX- Baton Pass.wav", "resourceName": "PRSFX- Baton Pass1.wav",
"volume": 100, "volume": 100,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -7177,7 +7177,7 @@
"17": [ "17": [
{ {
"frameIndex": 17, "frameIndex": 17,
"resourceName": "PRSFX- Baton Pass1.wav", "resourceName": "PRSFX- Baton Pass2.wav",
"volume": 100, "volume": 100,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"

File diff suppressed because it is too large Load Diff

View File

@ -2382,7 +2382,7 @@
}, },
{ {
"frameIndex": 15, "frameIndex": 15,
"resourceName": "PRSFX- Sunny", "resourceName": "PRSFX- Sunny.wav",
"volume": 100, "volume": 100,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"

View File

@ -13913,7 +13913,7 @@
"0": [ "0": [
{ {
"frameIndex": 0, "frameIndex": 0,
"resourceName": "PRSFX- Rain", "resourceName": "PRSFX- Rain.wav",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -13922,7 +13922,7 @@
"17": [ "17": [
{ {
"frameIndex": 17, "frameIndex": 17,
"resourceName": "PRSFX- Rain", "resourceName": "PRSFX- Rain.wav",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"

View File

@ -1637,7 +1637,7 @@
"0": [ "0": [
{ {
"frameIndex": 0, "frameIndex": 0,
"resourceName": "PRSFX- Protect", "resourceName": "PRSFX- Protect.wav",
"volume": 70, "volume": 70,
"pitch": 120, "pitch": 120,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"

View File

@ -1057,7 +1057,7 @@
"2": [ "2": [
{ {
"frameIndex": 2, "frameIndex": 2,
"resourceName": "PRSFX- Doom Desire1", "resourceName": "PRSFX- Doom Desire1.wav",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"

View File

@ -5699,7 +5699,7 @@
"5": [ "5": [
{ {
"frameIndex": 5, "frameIndex": 5,
"resourceName": "PRSFX- Psychic Terrain2", "resourceName": "PRSFX- Psychic Terrain2.wav",
"volume": 80, "volume": 80,
"pitch": 140, "pitch": 140,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -5708,7 +5708,7 @@
"9": [ "9": [
{ {
"frameIndex": 9, "frameIndex": 9,
"resourceName": "PRSFX- Psychic Terrain2", "resourceName": "PRSFX- Psychic Terrain2.wav",
"volume": 80, "volume": 80,
"pitch": 130, "pitch": 130,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -5717,7 +5717,7 @@
"15": [ "15": [
{ {
"frameIndex": 15, "frameIndex": 15,
"resourceName": "PRSFX- Psychic Terrain2", "resourceName": "PRSFX- Psychic Terrain2.wav",
"volume": 80, "volume": 80,
"pitch": 140, "pitch": 140,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -5726,7 +5726,7 @@
"19": [ "19": [
{ {
"frameIndex": 19, "frameIndex": 19,
"resourceName": "PRSFX- Psychic Terrain2", "resourceName": "PRSFX- Psychic Terrain2.wav",
"volume": 80, "volume": 80,
"pitch": 130, "pitch": 130,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -5735,7 +5735,7 @@
"25": [ "25": [
{ {
"frameIndex": 25, "frameIndex": 25,
"resourceName": "PRSFX- Psychic Terrain2", "resourceName": "PRSFX- Psychic Terrain2.wav",
"volume": 80, "volume": 80,
"pitch": 140, "pitch": 140,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -5744,7 +5744,7 @@
"29": [ "29": [
{ {
"frameIndex": 29, "frameIndex": 29,
"resourceName": "PRSFX- Psychic Terrain2", "resourceName": "PRSFX- Psychic Terrain2.wav",
"volume": 80, "volume": 80,
"pitch": 130, "pitch": 130,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -5753,7 +5753,7 @@
"36": [ "36": [
{ {
"frameIndex": 36, "frameIndex": 36,
"resourceName": "PRSFX- Psychic Terrain2", "resourceName": "PRSFX- Psychic Terrain2.wav",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"

File diff suppressed because it is too large Load Diff

View File

@ -3397,7 +3397,7 @@
"4": [ "4": [
{ {
"frameIndex": 4, "frameIndex": 4,
"resourceName": "PRSFX- Freeze Shock1", "resourceName": "PRSFX- Freeze Shock1.wav",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"

View File

@ -3005,7 +3005,7 @@
}, },
{ {
"frameIndex": 0, "frameIndex": 0,
"resourceName": "PRSFX- Fusion Bolt1", "resourceName": "PRSFX- Fusion Bolt1.wav",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -3014,7 +3014,7 @@
"19": [ "19": [
{ {
"frameIndex": 19, "frameIndex": 19,
"resourceName": "PRSFX- Fusion Bolt2", "resourceName": "PRSFX- Fusion Bolt2.wav",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -6030,7 +6030,7 @@
}, },
{ {
"frameIndex": 0, "frameIndex": 0,
"resourceName": "PRSFX- Fusion Bolt1", "resourceName": "PRSFX- Fusion Bolt1.wav",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -6039,7 +6039,7 @@
"19": [ "19": [
{ {
"frameIndex": 19, "frameIndex": 19,
"resourceName": "PRSFX- Fusion Bolt2", "resourceName": "PRSFX- Fusion Bolt2.wav",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"

View File

@ -1400,7 +1400,7 @@
"0": [ "0": [
{ {
"frameIndex": 0, "frameIndex": 0,
"resourceName": "throw", "resourceName": "throw.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -1409,7 +1409,7 @@
"9": [ "9": [
{ {
"frameIndex": 9, "frameIndex": 9,
"resourceName": "Blow4", "resourceName": "Blow4.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -2820,7 +2820,7 @@
"0": [ "0": [
{ {
"frameIndex": 0, "frameIndex": 0,
"resourceName": "throw", "resourceName": "throw.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -2829,7 +2829,7 @@
"9": [ "9": [
{ {
"frameIndex": 9, "frameIndex": 9,
"resourceName": "Blow3", "resourceName": "Blow3.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"

View File

@ -7213,7 +7213,7 @@
"0": [ "0": [
{ {
"frameIndex": 0, "frameIndex": 0,
"resourceName": "Wind8", "resourceName": "Wind8.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -7222,7 +7222,7 @@
"5": [ "5": [
{ {
"frameIndex": 5, "frameIndex": 5,
"resourceName": "Wind7", "resourceName": "Wind7.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -7231,7 +7231,7 @@
"8": [ "8": [
{ {
"frameIndex": 8, "frameIndex": 8,
"resourceName": "Wind7", "resourceName": "Wind7.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -7240,7 +7240,7 @@
"11": [ "11": [
{ {
"frameIndex": 11, "frameIndex": 11,
"resourceName": "Wind8", "resourceName": "Wind8.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -7249,7 +7249,7 @@
"16": [ "16": [
{ {
"frameIndex": 16, "frameIndex": 16,
"resourceName": "Wind7", "resourceName": "Wind7.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -7258,7 +7258,7 @@
"19": [ "19": [
{ {
"frameIndex": 19, "frameIndex": 19,
"resourceName": "Wind7", "resourceName": "Wind7.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -7267,7 +7267,7 @@
"22": [ "22": [
{ {
"frameIndex": 22, "frameIndex": 22,
"resourceName": "Wind8", "resourceName": "Wind8.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -7276,7 +7276,7 @@
"27": [ "27": [
{ {
"frameIndex": 27, "frameIndex": 27,
"resourceName": "Wind7", "resourceName": "Wind7.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -7285,7 +7285,7 @@
"30": [ "30": [
{ {
"frameIndex": 30, "frameIndex": 30,
"resourceName": "Wind7", "resourceName": "Wind7.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"

View File

@ -5944,7 +5944,7 @@
"15": [ "15": [
{ {
"frameIndex": 15, "frameIndex": 15,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -5953,7 +5953,7 @@
"17": [ "17": [
{ {
"frameIndex": 17, "frameIndex": 17,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -5962,7 +5962,7 @@
"19": [ "19": [
{ {
"frameIndex": 19, "frameIndex": 19,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -5971,7 +5971,7 @@
"21": [ "21": [
{ {
"frameIndex": 21, "frameIndex": 21,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -5980,7 +5980,7 @@
"23": [ "23": [
{ {
"frameIndex": 23, "frameIndex": 23,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -5989,7 +5989,7 @@
"25": [ "25": [
{ {
"frameIndex": 25, "frameIndex": 25,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -5998,7 +5998,7 @@
"27": [ "27": [
{ {
"frameIndex": 27, "frameIndex": 27,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -6007,7 +6007,7 @@
"29": [ "29": [
{ {
"frameIndex": 29, "frameIndex": 29,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -6016,7 +6016,7 @@
"31": [ "31": [
{ {
"frameIndex": 31, "frameIndex": 31,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -6025,7 +6025,7 @@
"33": [ "33": [
{ {
"frameIndex": 33, "frameIndex": 33,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -6034,7 +6034,7 @@
"35": [ "35": [
{ {
"frameIndex": 35, "frameIndex": 35,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -6043,7 +6043,7 @@
"37": [ "37": [
{ {
"frameIndex": 37, "frameIndex": 37,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -6052,7 +6052,7 @@
"39": [ "39": [
{ {
"frameIndex": 39, "frameIndex": 39,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -6061,7 +6061,7 @@
"41": [ "41": [
{ {
"frameIndex": 41, "frameIndex": 41,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -6070,7 +6070,7 @@
"43": [ "43": [
{ {
"frameIndex": 43, "frameIndex": 43,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -6079,7 +6079,7 @@
"45": [ "45": [
{ {
"frameIndex": 45, "frameIndex": 45,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -6088,7 +6088,7 @@
"47": [ "47": [
{ {
"frameIndex": 47, "frameIndex": 47,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -6097,7 +6097,7 @@
"49": [ "49": [
{ {
"frameIndex": 49, "frameIndex": 49,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"
@ -6119,7 +6119,7 @@
}, },
{ {
"frameIndex": 51, "frameIndex": 51,
"resourceName": "Blow1", "resourceName": "Blow1.ogg",
"volume": 80, "volume": 80,
"pitch": 100, "pitch": 100,
"eventType": "AnimTimedSoundEvent" "eventType": "AnimTimedSoundEvent"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -18,6 +18,12 @@ enum AnimFocus {
SCREEN SCREEN
} }
enum AnimBlendType {
NORMAL,
ADD,
SUBTRACT
}
export enum ChargeAnim { export enum ChargeAnim {
FLY_CHARGING = 1000, FLY_CHARGING = 1000,
BOUNCE_CHARGING, BOUNCE_CHARGING,
@ -151,7 +157,7 @@ class AnimFrame {
public angle: number; public angle: number;
public mirror: boolean; public mirror: boolean;
public visible: boolean; public visible: boolean;
public blendType: integer; public blendType: AnimBlendType;
public target: AnimFrameTarget; public target: AnimFrameTarget;
public graphicFrame: integer; public graphicFrame: integer;
public opacity: integer; public opacity: integer;
@ -162,7 +168,7 @@ class AnimFrame {
public priority: integer; public priority: integer;
public focus: AnimFocus; public focus: AnimFocus;
constructor(x: number, y: number, zoomX: number, zoomY: number, angle: number, mirror: boolean, visible: boolean, blendType: integer, pattern: integer, constructor(x: number, y: number, zoomX: number, zoomY: number, angle: number, mirror: boolean, visible: boolean, blendType: AnimBlendType, pattern: integer,
opacity: integer, colorR: integer, colorG: integer, colorB: integer, colorA: integer, toneR: integer, toneG: integer, toneB: integer, toneA: integer, opacity: integer, colorR: integer, colorG: integer, colorB: integer, colorA: integer, toneR: integer, toneG: integer, toneB: integer, toneA: integer,
flashR: integer, flashG: integer, flashB: integer, flashA: integer, locked: boolean, priority: integer, focus: AnimFocus) { flashR: integer, flashG: integer, flashB: integer, flashA: integer, locked: boolean, priority: integer, focus: AnimFocus) {
this.x = x; this.x = x;
@ -220,7 +226,7 @@ class AnimTimedSoundEvent extends AnimTimedEvent {
public pitch: number; public pitch: number;
constructor(frameIndex: integer, resourceName: string, source?: any) { constructor(frameIndex: integer, resourceName: string, source?: any) {
super(frameIndex, resourceName); super(frameIndex, resourceName + (resourceName && resourceName.indexOf('.') === -1 ? '.ogg' : ''));
if (source) { if (source) {
this.volume = source.volume; this.volume = source.volume;
@ -232,7 +238,11 @@ class AnimTimedSoundEvent extends AnimTimedEvent {
execute(scene: BattleScene, battleAnim: BattleAnim): integer { execute(scene: BattleScene, battleAnim: BattleAnim): integer {
const soundConfig = { rate: (this.pitch * 0.01), volume: (this.volume * 0.01) }; const soundConfig = { rate: (this.pitch * 0.01), volume: (this.volume * 0.01) };
if (this.resourceName) { if (this.resourceName) {
scene.sound.play(this.resourceName, soundConfig); try {
scene.sound.play(this.resourceName, soundConfig);
} catch (err) {
console.error(err);
}
return Math.ceil((scene.sound.get(this.resourceName).totalDuration * 1000) / 33.33); return Math.ceil((scene.sound.get(this.resourceName).totalDuration * 1000) / 33.33);
} else } else
return Math.ceil(battleAnim.user.cry(soundConfig) / 33.33); return Math.ceil(battleAnim.user.cry(soundConfig) / 33.33);
@ -289,7 +299,7 @@ class AnimTimedUpdateBgEvent extends AnimTimedBgEvent {
execute(scene: BattleScene, moveAnim: MoveAnim): integer { execute(scene: BattleScene, moveAnim: MoveAnim): integer {
const tweenProps = {}; const tweenProps = {};
if (this.bgX !== undefined) if (this.bgX !== undefined)
tweenProps['x'] = (this.bgX * 0.5) - 256; tweenProps['x'] = (this.bgX * 0.5);
if (this.bgY !== undefined) if (this.bgY !== undefined)
tweenProps['y'] = (this.bgY * 0.5) - 284; tweenProps['y'] = (this.bgY * 0.5) - 284;
if (this.opacity !== undefined) if (this.opacity !== undefined)
@ -297,7 +307,7 @@ class AnimTimedUpdateBgEvent extends AnimTimedBgEvent {
if (Object.keys(tweenProps).length) { if (Object.keys(tweenProps).length) {
scene.tweens.add(Object.assign({ scene.tweens.add(Object.assign({
targets: moveAnim.bgSprite, targets: moveAnim.bgSprite,
duration: this.duration * 2, duration: this.duration * 3,
useFrames: true useFrames: true
}, tweenProps)) }, tweenProps))
} }
@ -315,17 +325,19 @@ class AnimTimedAddBgEvent extends AnimTimedBgEvent {
} }
execute(scene: BattleScene, moveAnim: MoveAnim): integer { execute(scene: BattleScene, moveAnim: MoveAnim): integer {
moveAnim.bgSprite = scene.add.tileSprite(this.bgX - 256, this.bgY - 284, 768, 576, this.resourceName); if (moveAnim.bgSprite)
moveAnim.bgSprite.destroy();
moveAnim.bgSprite = scene.add.tileSprite(this.bgX, this.bgY - 284, 768, 576, this.resourceName);
moveAnim.bgSprite.setOrigin(0, 0); moveAnim.bgSprite.setOrigin(0, 0);
moveAnim.bgSprite.setScale(1.25); moveAnim.bgSprite.setScale(1.25);
moveAnim.bgSprite.setAlpha(0); moveAnim.bgSprite.setAlpha(0);
scene.field.add(moveAnim.bgSprite); scene.field.add(moveAnim.bgSprite);
scene.field.moveBelow(moveAnim.bgSprite, scene.getEnemyPokemon()); scene.field.moveAbove(moveAnim.bgSprite, scene.arenaEnemy);
scene.tweens.add({ scene.tweens.add({
targets: moveAnim.bgSprite, targets: moveAnim.bgSprite,
alpha: 1, alpha: 1,
duration: this.duration * 2, duration: this.duration * 3,
useFrames: true useFrames: true
}); });
@ -444,17 +456,14 @@ export function loadCommonAnimAssets(scene: BattleScene, startLoad?: boolean): P
export function loadMoveAnimAssets(scene: BattleScene, moveIds: Moves[], startLoad?: boolean): Promise<void> { export function loadMoveAnimAssets(scene: BattleScene, moveIds: Moves[], startLoad?: boolean): Promise<void> {
return new Promise(resolve => { return new Promise(resolve => {
const moveAnimations = moveIds.map(m => { const moveAnimations = moveIds.map(m => moveAnims.get(m)).flat();
const anims = moveAnims.get(m);
if (anims instanceof Anim)
return anims;
return anims[0];
});
for (let moveId of moveIds) { for (let moveId of moveIds) {
const chargeAttr = allMoves[moveId - 1].getAttrs(ChargeAttr) as ChargeAttr[]; const chargeAttr = allMoves[moveId - 1].getAttrs(ChargeAttr) as ChargeAttr[];
if (chargeAttr.length) { if (chargeAttr.length) {
const moveChargeAnims = chargeAnims.get(chargeAttr[0].chargeAnim); const moveChargeAnims = chargeAnims.get(chargeAttr[0].chargeAnim);
moveAnimations.push(moveChargeAnims instanceof Anim ? moveChargeAnims : moveChargeAnims[0]); moveAnimations.push(moveChargeAnims instanceof Anim ? moveChargeAnims : moveChargeAnims[0]);
if (Array.isArray(moveChargeAnims))
moveAnimations.push(moveChargeAnims[1]);
} }
} }
loadAnimAssets(scene, moveAnimations, startLoad).then(() => resolve()); loadAnimAssets(scene, moveAnimations, startLoad).then(() => resolve());
@ -488,6 +497,12 @@ function loadAnimAssets(scene: BattleScene, anims: Anim[], startLoad?: boolean):
}); });
} }
interface GraphicFrameData {
x: number,
y: number,
angle: number
}
export abstract class BattleAnim { export abstract class BattleAnim {
public user: Pokemon; public user: Pokemon;
public target: Pokemon; public target: Pokemon;
@ -506,6 +521,52 @@ export abstract class BattleAnim {
abstract isReverseCoords(): boolean; abstract isReverseCoords(): boolean;
getGraphicScale(): number {
return 1;
}
private getGraphicFrameData(scene: BattleScene, frames: AnimFrame[]): Map<integer, GraphicFrameData> {
const ret = new Map<integer, GraphicFrameData>();
const isOppAnim = this.isOppAnim();
const user = !isOppAnim ? this.user : this.target;
const target = !isOppAnim ? this.target : this.user;
const isReverseCoords = this.isReverseCoords();
const graphicScale = this.getGraphicScale();
const userInitialX = user.x;
const userInitialY = user.y;
const userHalfHeight = user.getSprite().displayHeight / 2;
const targetInitialX = target.x;
const targetInitialY = target.y;
const targetHalfHeight = target.getSprite().displayHeight / 2;
let g = 0;
for (let frame of frames) {
if (frame.target !== AnimFrameTarget.GRAPHIC)
continue;
const xProgress = frame.focus !== AnimFocus.SCREEN ? Math.min(Math.max(frame.x, 0) / 128, 1) : 0;
const initialX = targetInitialX;
const initialY = targetInitialY;
let xOffset = (!isReverseCoords ? (userInitialX - targetInitialX) : (targetInitialX - userInitialX));
let yOffset = (!isReverseCoords ? (userInitialY - targetInitialY) : (targetInitialY - userInitialY));
const ySpriteOffset = ((userHalfHeight * (1 - xProgress)) + (targetHalfHeight * xProgress)) * -1;
if (graphicScale > 1) {
xOffset -= ((scene.game.canvas.width / 6) * (graphicScale - 1)) / 2;
yOffset -= ((scene.game.canvas.height / 6) * (graphicScale - 1)) / 2;
}
const x = initialX + xOffset * (!isReverseCoords ? 1 : -1) + (frame.x * graphicScale) * (!isReverseCoords ? 1 : -1);
const y = ((initialY + yOffset * (!isReverseCoords || frame.focus === AnimFocus.USER || frame.focus === AnimFocus.SCREEN ? 1 : -1)
+ (frame.y * graphicScale) * (!isReverseCoords || (frame.focus !== AnimFocus.USER_TARGET) ? 1 : -1) + ySpriteOffset));
const angle = -frame.angle * (!isReverseCoords ? 1 : -1);
ret.set(g++, { x: x, y: y, angle: angle });
}
return ret;
}
play(scene: BattleScene, callback?: Function) { play(scene: BattleScene, callback?: Function) {
const isOppAnim = this.isOppAnim(); const isOppAnim = this.isOppAnim();
const user = !isOppAnim ? this.user : this.target; const user = !isOppAnim ? this.user : this.target;
@ -515,52 +576,110 @@ export abstract class BattleAnim {
const userInitialX = user.x; const userInitialX = user.x;
const userInitialY = user.y; const userInitialY = user.y;
const userHalfHeight = user.getSprite().displayHeight / 2;
const targetInitialX = target.x; const targetInitialX = target.x;
const targetInitialY = target.y; const targetInitialY = target.y;
const targetHalfHeight = target.getSprite().displayHeight / 2;
const coordMultiplier = this.isReverseCoords() ? -1 : 1; const isReverseCoords = this.isReverseCoords();
let r = anim.frames.length; let r = anim.frames.length;
let f = 0; let f = 0;
const sprites: Phaser.GameObjects.Sprite[] = []; const sprites: Phaser.GameObjects.Sprite[] = [];
const spritePriorities: integer[] = [];
scene.tweens.addCounter({ scene.tweens.addCounter({
useFrames: true, useFrames: true,
duration: 2, duration: 3,
repeat: anim.frames.length, repeat: anim.frames.length,
onRepeat: () => { onRepeat: () => {
const spriteFrames = anim.frames[f]; const spriteFrames = anim.frames[f];
const frameData = this.getGraphicFrameData(scene, anim.frames[f]);
let g = 0; let g = 0;
for (let frame of spriteFrames) { for (let frame of spriteFrames) {
switch (frame.target) { switch (frame.target) {
case AnimFrameTarget.USER: case AnimFrameTarget.USER:
user.setPosition(userInitialX + frame.x * coordMultiplier, userInitialY + frame.y * coordMultiplier); user.setPosition(userInitialX + frame.x / (!isReverseCoords ? 2 : -2), userInitialY + frame.y / (!isOppAnim ? 2 : -2));
break; break;
case AnimFrameTarget.TARGET: case AnimFrameTarget.TARGET:
target.setPosition(targetInitialX + frame.x * coordMultiplier, targetInitialY + frame.y * coordMultiplier); target.setPosition(targetInitialX + frame.x / (!isReverseCoords ? 2 : -2), targetInitialY + frame.y / (!isOppAnim ? 2 : -2));
break; break;
case AnimFrameTarget.GRAPHIC: case AnimFrameTarget.GRAPHIC:
let isNewSprite = false;
if (g === sprites.length) { if (g === sprites.length) {
const newSprite = scene.add.sprite(0, 0, anim.graphic, 1); const newSprite = scene.add.sprite(0, 0, anim.graphic, 1);
scene.field.add(newSprite);
sprites.push(newSprite); sprites.push(newSprite);
scene.field.add(newSprite);
spritePriorities.push(1);
isNewSprite = true;
}
const graphicIndex = g++;
const moveSprite = sprites[graphicIndex];
if (spritePriorities[graphicIndex] !== frame.priority) {
spritePriorities[graphicIndex] = frame.priority;
const setSpritePriority = (priority: integer) => {
switch (priority) {
case 0:
scene.field.moveBelow(moveSprite, scene.getEnemyPokemon());
break;
case 1:
scene.field.moveTo(moveSprite, scene.field.getAll().length - 1);
break;
case 2:
switch (frame.focus) {
case AnimFocus.USER:
if (this.bgSprite)
scene.field.moveAbove(moveSprite, this.bgSprite);
else
scene.field.moveBelow(moveSprite, this.user);
break;
case AnimFocus.TARGET:
scene.field.moveBelow(moveSprite, this.target);
break;
default:
setSpritePriority(1);
break;
}
break;
case 3:
switch (frame.focus) {
case AnimFocus.USER:
scene.field.moveAbove(moveSprite, this.user);
break;
case AnimFocus.TARGET:
scene.field.moveAbove(moveSprite, this.target);
break;
default:
setSpritePriority(1);
break;
}
break;
default:
setSpritePriority(1);
}
};
setSpritePriority(frame.priority);
} }
const moveSprite = sprites[g++];
moveSprite.setFrame(frame.graphicFrame); moveSprite.setFrame(frame.graphicFrame);
const xProgress = Math.min(Math.max(frame.x, 0) / 128, 1); //console.log(AnimFocus[frame.focus]);
const yOffset = ((userHalfHeight * (1 - xProgress)) + (targetHalfHeight * xProgress)) * -1; const graphicScale = this.getGraphicScale();
moveSprite.setPosition((!isOppAnim ? userInitialX : targetInitialX) + frame.x * coordMultiplier, (!isOppAnim ? userInitialY : targetInitialY) + yOffset + frame.y * coordMultiplier);
moveSprite.setAlpha(frame.opacity); moveSprite.setPosition(frameData.get(graphicIndex).x, frameData.get(graphicIndex).y);
moveSprite.setAngle(-frame.angle * coordMultiplier); moveSprite.setAngle(frameData.get(graphicIndex).angle);
const scaleX = graphicScale * (isReverseCoords === frame.mirror ? 1 : -1);
const scaleY = graphicScale;
moveSprite.setScale(scaleX, scaleY);
moveSprite.setAlpha(frame.opacity / 255);
moveSprite.setBlendMode(frame.blendType === AnimBlendType.NORMAL ? Phaser.BlendModes.NORMAL : frame.blendType === AnimBlendType.ADD ? Phaser.BlendModes.ADD : Phaser.BlendModes.DIFFERENCE);
break; break;
} }
if (frame.target !== AnimFrameTarget.GRAPHIC) { if (frame.target !== AnimFrameTarget.GRAPHIC) {
const pokemon = frame.target === AnimFrameTarget.USER ? user : target; const pokemon = frame.target === AnimFrameTarget.USER ? user : target;
pokemon.setAlpha(frame.opacity); pokemon.setScale(!frame.mirror ? 1 : -1)
pokemon.setAngle(-frame.angle * coordMultiplier); pokemon.setAlpha(frame.opacity / 255);
pokemon.setAngle(-frame.angle * (!isReverseCoords ? 1 : -1));
const zoomScaleX = frame.zoomX / 100; const zoomScaleX = frame.zoomX / 100;
const zoomScaleY = frame.zoomY / 100; const zoomScaleY = frame.zoomY / 100;
const zoomSprite = pokemon.getZoomSprite(); const zoomSprite = pokemon.getZoomSprite();
@ -574,6 +693,7 @@ export abstract class BattleAnim {
} }
if (g < sprites.length) { if (g < sprites.length) {
const removedSprites = sprites.splice(g, sprites.length - g); const removedSprites = sprites.splice(g, sprites.length - g);
spritePriorities.splice(g, sprites.length - g);
for (let rs of removedSprites) for (let rs of removedSprites)
rs.destroy(); rs.destroy();
} }
@ -583,16 +703,22 @@ export abstract class BattleAnim {
onComplete: () => { onComplete: () => {
const cleanUpAndComplete = () => { const cleanUpAndComplete = () => {
user.setPosition(userInitialX, userInitialY); user.setPosition(userInitialX, userInitialY);
user.setScale(1);
user.setAlpha(1); user.setAlpha(1);
user.setAngle(0); user.setAngle(0);
target.setPosition(targetInitialX, targetInitialY); target.setPosition(targetInitialX, targetInitialY);
target.setScale(1);
target.setAlpha(1); target.setAlpha(1);
target.setAngle(0); target.setAngle(0);
if (this.bgSprite)
this.bgSprite.destroy();
if (callback) if (callback)
callback(); callback();
}; };
for (let ms of sprites) for (let ms of sprites) {
ms.destroy(); if (ms)
ms.destroy();
}
if (r) { if (r) {
scene.tweens.addCounter({ scene.tweens.addCounter({
duration: r, duration: r,
@ -650,6 +776,15 @@ export class MoveAnim extends BattleAnim {
isReverseCoords(): boolean { isReverseCoords(): boolean {
return this.user instanceof EnemyPokemon && !this.isOppAnim(); return this.user instanceof EnemyPokemon && !this.isOppAnim();
} }
getGraphicScale(): number {
switch (this.move) {
case Moves.FISSURE:
return 1.25;
}
return 1;
}
} }
export class MoveChargeAnim extends MoveAnim { export class MoveChargeAnim extends MoveAnim {

View File

@ -437,6 +437,10 @@ export class CommandPhase extends BattlePhase {
this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, cursor, true)); this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, cursor, true));
success = true; success = true;
break; break;
case Command.RUN:
//this.scene.unshiftPhase(new MoveAnimTestPhase(this.scene, [ Moves.SING, Moves.FISSURE, Moves.GROWL, Moves.AROMATHERAPY, Moves.PERISH_SONG ]));
//success = true;
break;
} }
if (success) { if (success) {
@ -545,7 +549,7 @@ abstract class MovePhase extends BattlePhase {
console.log(this.pokemon.moveset); console.log(this.pokemon.moveset);
if (this.pokemon.summonData.moveQueue.length && !this.pokemon.summonData.moveQueue.shift().ignorePP) if (this.pokemon.summonData.moveQueue.length && !this.pokemon.summonData.moveQueue.shift().ignorePP)
this.move.ppUsed++; this.move.ppUsed++;
this.scene.unshiftPhase(new MessagePhase(this.scene, `${this.pokemon.name} used\n${this.move.getName()}!`, 500)); this.scene.unshiftPhase(new MessagePhase(this.scene, `${this.pokemon instanceof EnemyPokemon ? 'Foe ' : ''}${this.pokemon.name} used\n${this.move.getName()}!`, 500));
this.scene.unshiftPhase(this.getEffectPhase()); this.scene.unshiftPhase(this.getEffectPhase());
this.end(); this.end();
}; };
@ -632,6 +636,8 @@ abstract class MoveEffectPhase extends PokemonPhase {
const overridden = new Utils.BooleanHolder(false); const overridden = new Utils.BooleanHolder(false);
console.log(this.move.getName());
applyMoveAttrs(OverrideMoveEffectAttr, this.scene, user, target, this.move.getMove(), overridden).then(() => { applyMoveAttrs(OverrideMoveEffectAttr, this.scene, user, target, this.move.getMove(), overridden).then(() => {
if (overridden.value) { if (overridden.value) {
@ -682,7 +688,7 @@ abstract class MoveEffectPhase extends PokemonPhase {
end() { end() {
const user = this.getUserPokemon(); const user = this.getUserPokemon();
if (--user.turnData.hitsLeft && this.getTargetPokemon().hp) if (--user.turnData.hitsLeft >= 1 && this.getTargetPokemon().hp)
this.scene.unshiftPhase(this.getNewHitPhase()); this.scene.unshiftPhase(this.getNewHitPhase());
else { else {
if (user.turnData.hitsTotal > 1) if (user.turnData.hitsTotal > 1)
@ -763,6 +769,42 @@ export class EnemyMoveEffectPhase extends MoveEffectPhase {
} }
} }
export class MoveAnimTestPhase extends BattlePhase {
private moveQueue: Moves[];
constructor(scene: BattleScene, moveQueue?: Moves[]) {
super(scene);
this.moveQueue = moveQueue || Utils.getEnumValues(Moves);
}
start() {
const moveQueue = this.moveQueue.slice(0);
this.playMoveAnim(moveQueue, true);
}
playMoveAnim(moveQueue: Moves[], player: boolean) {
const moveId = player ? moveQueue[0] : moveQueue.shift();
if (moveId === undefined) {
this.playMoveAnim(this.moveQueue.slice(0), true);
return;
}
initMoveAnim(moveId).then(() => {
loadMoveAnimAssets(this.scene, [ moveId ], true)
.then(() => {
new MoveAnim(moveId, player ? this.scene.getPlayerPokemon() : this.scene.getEnemyPokemon(),
player ? this.scene.getEnemyPokemon() : this.scene.getPlayerPokemon()).play(this.scene, () => {
if (player)
this.playMoveAnim(moveQueue, false);
else
this.playMoveAnim(moveQueue, true);
});
});
});
}
}
export class StatChangePhase extends PokemonPhase { export class StatChangePhase extends PokemonPhase {
private stats: BattleStat[]; private stats: BattleStat[];
private levels: integer; private levels: integer;
@ -940,7 +982,7 @@ export class FaintPhase extends PokemonPhase {
} }
const pokemon = this.getPokemon(); const pokemon = this.getPokemon();
pokemon.lapseTags(BattleTagLapseType.FAINT); pokemon.lapseTags(BattleTagLapseType.FAINT);
pokemon.faintCry(() => { pokemon.faintCry(() => {

File diff suppressed because it is too large Load Diff

View File

@ -928,10 +928,10 @@ export class PokemonMove {
public ppUp: integer; public ppUp: integer;
public disableTurns: integer; public disableTurns: integer;
constructor(moveId: Moves, ppUsed: integer, ppUp: integer) { constructor(moveId: Moves, ppUsed?: integer, ppUp?: integer) {
this.moveId = moveId; this.moveId = moveId;
this.ppUsed = ppUsed; this.ppUsed = ppUsed || 0;
this.ppUp = ppUp; this.ppUp = ppUp || 0;
this.disableTurns = 0; this.disableTurns = 0;
} }

View File

@ -1,3 +1,4 @@
import { CommandPhase } from "../battle-phases";
import BattleScene, { Button } from "../battle-scene"; import BattleScene, { Button } from "../battle-scene";
import { addTextObject, TextStyle } from "../text"; import { addTextObject, TextStyle } from "../text";
import { toPokemonUpperCase } from "../utils"; import { toPokemonUpperCase } from "../utils";
@ -67,6 +68,10 @@ export default class CommandUiHandler extends UiHandler {
ui.setMode(Mode.PARTY, PartyUiMode.SWITCH); ui.setMode(Mode.PARTY, PartyUiMode.SWITCH);
success = true; success = true;
break; break;
case 3:
(this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.RUN, 0);
success = true;
break;
} }
} }
} else { } else {