Document move emitter a2b linear script func

This commit is contained in:
Fexty12573 2025-08-05 22:45:54 +02:00
parent cb2aad96fa
commit db561b9cf9
12 changed files with 547 additions and 523 deletions

View File

@ -16,6 +16,7 @@
enum CameraProjection { enum CameraProjection {
CAMERA_PROJECTION_PERSPECTIVE = 0, CAMERA_PROJECTION_PERSPECTIVE = 0,
CAMERA_PROJECTION_ORTHOGRAPHIC, CAMERA_PROJECTION_ORTHOGRAPHIC,
CAMERA_PROJECTION_COUNT
}; };
typedef struct CameraAngle { typedef struct CameraAngle {

View File

@ -105,6 +105,7 @@
#define BATTLER_TYPE_ENEMY_SIDE_SLOT_1 3 #define BATTLER_TYPE_ENEMY_SIDE_SLOT_1 3
#define BATTLER_TYPE_PLAYER_SIDE_SLOT_2 4 #define BATTLER_TYPE_PLAYER_SIDE_SLOT_2 4
#define BATTLER_TYPE_ENEMY_SIDE_SLOT_2 5 #define BATTLER_TYPE_ENEMY_SIDE_SLOT_2 5
#define BATTLER_TYPE_MAX 6
#define BATTLE_SIDE_PLAYER 0 #define BATTLE_SIDE_PLAYER 0
#define BATTLE_SIDE_ENEMY 1 #define BATTLE_SIDE_ENEMY 1

View File

@ -1,7 +1,9 @@
#ifndef POKEPLATINUM_CONSTANTS_BATTLE_ANIM_H #ifndef POKEPLATINUM_CONSTANTS_BATTLE_ANIM_H
#define POKEPLATINUM_CONSTANTS_BATTLE_ANIM_H #define POKEPLATINUM_CONSTANTS_BATTLE_ANIM_H
// clang-format off
#include "constants/battle.h"
// clang-format off
#define BATTLE_ANIM_VAR_BG_MOVE_STEP_X 0 //< Step size for background movement in X direction (BATTLE_BG_SWITCH_FLAG_MOVE) #define BATTLE_ANIM_VAR_BG_MOVE_STEP_X 0 //< Step size for background movement in X direction (BATTLE_BG_SWITCH_FLAG_MOVE)
#define BATTLE_ANIM_VAR_BG_MOVE_STEP_Y 1 //< Step size for background movement in Y direction (BATTLE_BG_SWITCH_FLAG_MOVE) #define BATTLE_ANIM_VAR_BG_MOVE_STEP_Y 1 //< Step size for background movement in Y direction (BATTLE_BG_SWITCH_FLAG_MOVE)
#define BATTLE_ANIM_VAR_BG_MOVE_START_X 2 //< Starting position for background movement on X axis (BATTLE_BG_SWITCH_FLAG_MOVE) #define BATTLE_ANIM_VAR_BG_MOVE_START_X 2 //< Starting position for background movement on X axis (BATTLE_BG_SWITCH_FLAG_MOVE)
@ -103,6 +105,11 @@
#define BATTLE_ANIM_MON_SPRITE_4 4 #define BATTLE_ANIM_MON_SPRITE_4 4
#define BATTLE_ANIM_MON_SPRITE_F(N) (1 << (N)) #define BATTLE_ANIM_MON_SPRITE_F(N) (1 << (N))
// Arbitrary scaling factor to convert particle world coordinates to screen coordinates
#define BATTLE_PARTICLE_PIXEL_FACTOR 172
#define BATTLE_PARTICLE_WORLD_TO_SCREEN(X) ((X) / BATTLE_PARTICLE_PIXEL_FACTOR)
#define BATTLE_PARTICLE_SCREEN_TO_WORLD(X) ((X) * BATTLE_PARTICLE_PIXEL_FACTOR)
// Default positions for battler sprites, lines up with BATTLER_TYPE_* // Default positions for battler sprites, lines up with BATTLER_TYPE_*
#define BATTLER_POS_SOLO_PLAYER_X 64 #define BATTLER_POS_SOLO_PLAYER_X 64
#define BATTLER_POS_SOLO_PLAYER_Y 112 #define BATTLER_POS_SOLO_PLAYER_Y 112
@ -123,6 +130,9 @@
#define CONTESTANT_POS_ENEMY_X 80 #define CONTESTANT_POS_ENEMY_X 80
#define CONTESTANT_POS_ENEMY_Y 42 #define CONTESTANT_POS_ENEMY_Y 42
#define CONTESTANT_TYPE_PLAYER (BATTLER_TYPE_MAX + BATTLER_TYPE_SOLO_PLAYER)
#define CONTESTANT_TYPE_ENEMY (BATTLER_TYPE_MAX + BATTLER_TYPE_SOLO_ENEMY)
#define BASE_SCALE_XY 100 #define BASE_SCALE_XY 100
// Script function specific constants // Script function specific constants
@ -142,5 +152,12 @@
#define SCALE_BATTLER_SPRITE_HOLD(frames) ((frames) >> 16) #define SCALE_BATTLER_SPRITE_HOLD(frames) ((frames) >> 16)
#define SCALE_BATTLER_SPRITE_CYCLES(frames) ((frames) & 0xFFFF) #define SCALE_BATTLER_SPRITE_CYCLES(frames) ((frames) & 0xFFFF)
#define EMITTER_ANIMATION_MODE_ATK_TO_DEF 0 //< Animation from attacker to defender
#define EMITTER_ANIMATION_MODE_DEF_TO_ATK 1 //< Animation from defender to attacker
#define EMITTER_ANIMATION_DEFAULT_FRAMES 0xFF
#define EMITTER_ANIMATION_PARAMS(skipFrames, maxFrames) (((skipFrames & 0xFFFF) << 16) | (maxFrames & 0xFFFF))
#define EMITTER_ANIMATION_SKIP_FRAMES(params) ((params & 0xFFFF0000) >> 16)
#define EMITTER_ANIMATION_MAX_FRAMES(params) ((params) & 0x0000FFFF)
// clang-format on // clang-format on
#endif // POKEPLATINUM_CONSTANTS_BATTLE_ANIM_H #endif // POKEPLATINUM_CONSTANTS_BATTLE_ANIM_H

View File

@ -33,7 +33,7 @@ void ov12_02229304(BattleAnimSystem *param0);
void ov12_02229638(BattleAnimSystem *param0); void ov12_02229638(BattleAnimSystem *param0);
void ov12_02229810(BattleAnimSystem *param0); void ov12_02229810(BattleAnimSystem *param0);
void ov12_02229908(BattleAnimSystem *param0); void ov12_02229908(BattleAnimSystem *param0);
void ov12_02229B28(BattleAnimSystem *param0); void BattleAnimScriptFunc_MoveEmitterA2BLinear(BattleAnimSystem *param0);
void ov12_02229C5C(BattleAnimSystem *param0); void ov12_02229C5C(BattleAnimSystem *param0);
void ov12_02229E54(BattleAnimSystem *param0); void ov12_02229E54(BattleAnimSystem *param0);
void ov12_0222A00C(BattleAnimSystem *param0); void ov12_0222A00C(BattleAnimSystem *param0);

View File

@ -48,7 +48,7 @@ int BattleAnimUtil_GetAlliedBattler(BattleAnimSystem *param0, int param1);
int BattleAnimUtil_GetOpposingBattlerType(int param0); int BattleAnimUtil_GetOpposingBattlerType(int param0);
void BattleAnimUtil_GetBattlerTypeDefaultPos(int param0, BOOL param1, Point2D *param2); void BattleAnimUtil_GetBattlerTypeDefaultPos(int param0, BOOL param1, Point2D *param2);
void BattleAnimUtil_GetBattlerDefaultPos(BattleAnimSystem *param0, int param1, Point2D *param2); void BattleAnimUtil_GetBattlerDefaultPos(BattleAnimSystem *param0, int param1, Point2D *param2);
void ov12_02235448(int param0, VecFx32 *param1, int param2, int param3); void BattleAnimUtil_GetBattlerTypeWorldPos_Normal(int param0, VecFx32 *param1, BOOL isContest, enum CameraProjection projection);
void ov12_02235458(int param0, VecFx32 *param1, int param2, int param3); void ov12_02235458(int param0, VecFx32 *param1, int param2, int param3);
void ov12_02235468(int param0, VecFx32 *param1, int param2, int param3); void ov12_02235468(int param0, VecFx32 *param1, int param2, int param3);
void ov12_02235478(int param0, VecFx32 *param1, int param2, int param3); void ov12_02235478(int param0, VecFx32 *param1, int param2, int param3);
@ -60,7 +60,7 @@ void ov12_022354C8(int param0, VecFx32 *param1, int param2, int param3);
void ov12_022354D8(int param0, VecFx32 *param1, int param2, int param3); void ov12_022354D8(int param0, VecFx32 *param1, int param2, int param3);
void ov12_022354E8(int param0, VecFx32 *param1, int param2, int param3); void ov12_022354E8(int param0, VecFx32 *param1, int param2, int param3);
void ov12_022354F8(int param0, VecFx32 *param1, int param2, int param3); void ov12_022354F8(int param0, VecFx32 *param1, int param2, int param3);
void ov12_02235508(BattleAnimSystem *param0, int param1, VecFx32 *param2); void BattleAnimUtil_GetBattlerWorldPos_Normal(BattleAnimSystem *param0, int param1, VecFx32 *param2);
void ov12_02235538(BattleAnimSystem *param0, int param1, VecFx32 *param2); void ov12_02235538(BattleAnimSystem *param0, int param1, VecFx32 *param2);
void ov12_02235568(BattleAnimSystem *param0, int param1, VecFx32 *param2); void ov12_02235568(BattleAnimSystem *param0, int param1, VecFx32 *param2);
void ov12_02235598(BattleAnimSystem *param0, int param1, VecFx32 *param2); void ov12_02235598(BattleAnimSystem *param0, int param1, VecFx32 *param2);

View File

@ -76,15 +76,15 @@ void ov12_022238E0(SPLEmitter *param0)
int v10; int v10;
if (BattleAnimUtil_GetBattlerSide(v0, v2) == 0x3) { if (BattleAnimUtil_GetBattlerSide(v0, v2) == 0x3) {
ov12_02235508(v0, v2, &v5); BattleAnimUtil_GetBattlerWorldPos_Normal(v0, v2, &v5);
} else { } else {
v8 = BattleAnimUtil_GetBattlerType(v0, v2); v8 = BattleAnimUtil_GetBattlerType(v0, v2);
v9 = BattleAnimUtil_GetOpposingBattlerType(v8); v9 = BattleAnimUtil_GetOpposingBattlerType(v8);
v10 = ParticleSystem_GetCameraProjection(v1); v10 = ParticleSystem_GetCameraProjection(v1);
v4 = BattleAnimSystem_IsContest(v0); v4 = BattleAnimSystem_IsContest(v0);
ov12_02235448(v9, &v5, v4, v10); BattleAnimUtil_GetBattlerTypeWorldPos_Normal(v9, &v5, v4, v10);
ov12_02235448(v8, &v6, v4, v10); BattleAnimUtil_GetBattlerTypeWorldPos_Normal(v8, &v6, v4, v10);
} }
} }
@ -127,7 +127,7 @@ void ov12_02223998(SPLEmitter *param0)
v2 = BattleAnimSystem_GetDefender(v0); v2 = BattleAnimSystem_GetDefender(v0);
v1 = BattleAnimSystem_GetCurrentParticleSystem(v0); v1 = BattleAnimSystem_GetCurrentParticleSystem(v0);
ov12_02235508(v0, 0, &v3); BattleAnimUtil_GetBattlerWorldPos_Normal(v0, 0, &v3);
SPLEmitter_SetPosX(param0, v3.x); SPLEmitter_SetPosX(param0, v3.x);
SPLEmitter_SetPosY(param0, v3.y); SPLEmitter_SetPosY(param0, v3.y);
@ -146,7 +146,7 @@ void ov12_022239F4(SPLEmitter *param0)
v0 = ParticleSystem_GetEmitterCallbackParam(); v0 = ParticleSystem_GetEmitterCallbackParam();
v1 = BattleAnimSystem_GetDefender(v0); v1 = BattleAnimSystem_GetDefender(v0);
ov12_02235508(v0, v1, &v2); BattleAnimUtil_GetBattlerWorldPos_Normal(v0, v1, &v2);
SPLEmitter_SetPosX(param0, v2.x); SPLEmitter_SetPosX(param0, v2.x);
SPLEmitter_SetPosY(param0, v2.y); SPLEmitter_SetPosY(param0, v2.y);
@ -162,7 +162,7 @@ void ov12_02223A38(SPLEmitter *param0)
v0 = ParticleSystem_GetEmitterCallbackParam(); v0 = ParticleSystem_GetEmitterCallbackParam();
v1 = BattleAnimSystem_GetAttacker(v0); v1 = BattleAnimSystem_GetAttacker(v0);
ov12_02235508(v0, v1, &v2); BattleAnimUtil_GetBattlerWorldPos_Normal(v0, v1, &v2);
SPLEmitter_SetPosX(param0, v2.x); SPLEmitter_SetPosX(param0, v2.x);
SPLEmitter_SetPosY(param0, v2.y); SPLEmitter_SetPosY(param0, v2.y);
@ -180,7 +180,7 @@ void ov12_02223A7C(SPLEmitter *param0)
v1 = BattleAnimSystem_GetAttacker(v0); v1 = BattleAnimSystem_GetAttacker(v0);
v2 = BattleAnimSystem_GetDefender(v0); v2 = BattleAnimSystem_GetDefender(v0);
ov12_02235508(v0, v1, &v3); BattleAnimUtil_GetBattlerWorldPos_Normal(v0, v1, &v3);
SPLEmitter_SetPosX(param0, v3.x); SPLEmitter_SetPosX(param0, v3.x);
SPLEmitter_SetPosY(param0, v3.y); SPLEmitter_SetPosY(param0, v3.y);
@ -209,7 +209,7 @@ void ov12_02223AC8(SPLEmitter *param0)
v4 = 1; v4 = 1;
} }
ov12_02235448(v4, &v1, BattleAnimSystem_IsContest(v0), v3); BattleAnimUtil_GetBattlerTypeWorldPos_Normal(v4, &v1, BattleAnimSystem_IsContest(v0), v3);
SPLEmitter_SetPosX(param0, v1.x); SPLEmitter_SetPosX(param0, v1.x);
SPLEmitter_SetPosY(param0, v1.y); SPLEmitter_SetPosY(param0, v1.y);
@ -239,7 +239,7 @@ void ov12_02223B30(SPLEmitter *param0)
v5 = 1; v5 = 1;
} }
ov12_02235448(v5, &v1, BattleAnimSystem_IsContest(v0), v4); BattleAnimUtil_GetBattlerTypeWorldPos_Normal(v5, &v1, BattleAnimSystem_IsContest(v0), v4);
SPLEmitter_SetPosX(param0, v1.x); SPLEmitter_SetPosX(param0, v1.x);
SPLEmitter_SetPosY(param0, v1.y); SPLEmitter_SetPosY(param0, v1.y);
@ -346,10 +346,10 @@ static void ov12_02223CD4(BattleAnimSystem *param0, SPLEmitter *param1, int para
v0.z = 0 * param5; v0.z = 0 * param5;
break; break;
case 3: case 3:
ov12_02235508(param0, param3, &v0); BattleAnimUtil_GetBattlerWorldPos_Normal(param0, param3, &v0);
break; break;
case 4: case 4:
ov12_02235508(param0, param2, &v0); BattleAnimUtil_GetBattlerWorldPos_Normal(param0, param2, &v0);
break; break;
case 5: { case 5: {
int v1[4] = { 0, 0, 0, 0 }; int v1[4] = { 0, 0, 0, 0 };
@ -386,10 +386,10 @@ static void ov12_02223DA4(BattleAnimSystem *param0, SPLEmitter *param1, int para
v0.z = 0 * param5; v0.z = 0 * param5;
break; break;
case 3: case 3:
ov12_02235508(param0, param3, &v0); BattleAnimUtil_GetBattlerWorldPos_Normal(param0, param3, &v0);
break; break;
case 4: case 4:
ov12_02235508(param0, param2, &v0); BattleAnimUtil_GetBattlerWorldPos_Normal(param0, param2, &v0);
break; break;
case 5: { case 5: {
int v1[4] = { 0, 0, 0, 0 }; int v1[4] = { 0, 0, 0, 0 };
@ -489,7 +489,7 @@ static void ov12_02223E74(BattleAnimSystem *param0, SPLEmitter *param1, int para
VecFx32 v14; VecFx32 v14;
ov12_0222325C(param0, v13, 3); ov12_0222325C(param0, v13, 3);
ov12_02235508(param0, param2, &v14); BattleAnimUtil_GetBattlerWorldPos_Normal(param0, param2, &v14);
if ((v13[0] == 0) && (v13[1] == 0) && (v13[2] == 0)) { if ((v13[0] == 0) && (v13[1] == 0) && (v13[2] == 0)) {
v1 = v14; v1 = v14;

View File

@ -72,7 +72,7 @@ static void ov12_02224260(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1, V
v3 = 1; v3 = 1;
} }
ov12_02235448(v3, param2, BattleAnimSystem_IsContest(v0), v2); BattleAnimUtil_GetBattlerTypeWorldPos_Normal(v3, param2, BattleAnimSystem_IsContest(v0), v2);
} }
static void ov12_022242A0(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1, VecFx32 *param2) static void ov12_022242A0(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1, VecFx32 *param2)
@ -97,7 +97,7 @@ static void ov12_022242A0(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1, V
v4 = 1; v4 = 1;
} }
ov12_02235448(v4, param2, BattleAnimSystem_IsContest(v0), v3); BattleAnimUtil_GetBattlerTypeWorldPos_Normal(v4, param2, BattleAnimSystem_IsContest(v0), v3);
} }
static void ov12_022242E0(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1) static void ov12_022242E0(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1)
@ -108,10 +108,10 @@ static void ov12_022242E0(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1)
case 0: case 0:
break; break;
case 1: case 1:
ov12_02235508(param1->unk_00, param1->unk_24, &v0); BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_24, &v0);
break; break;
case 2: case 2:
ov12_02235508(param1->unk_00, param1->unk_28, &v0); BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_28, &v0);
break; break;
case 6: case 6:
ov12_02235538(param1->unk_00, param1->unk_24, &v0); ov12_02235538(param1->unk_00, param1->unk_24, &v0);
@ -188,19 +188,19 @@ static void ov12_022242E0(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1)
v0.y *= param1->unk_08; v0.y *= param1->unk_08;
} break; } break;
case 4: case 4:
ov12_02235508(param1->unk_00, param1->unk_24, &v0); BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_24, &v0);
ov12_02225094(param1, &v0); ov12_02225094(param1, &v0);
break; break;
case 5: case 5:
ov12_02235508(param1->unk_00, param1->unk_28, &v0); BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_28, &v0);
ov12_02225094(param1, &v0); ov12_02225094(param1, &v0);
break; break;
case 100: case 100:
ov12_02235508(param1->unk_00, param1->unk_24, &v0); BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_24, &v0);
ov12_02225008(param1, param1->unk_24, &v0); ov12_02225008(param1, param1->unk_24, &v0);
break; break;
case 101: case 101:
ov12_02235508(param1->unk_00, param1->unk_28, &v0); BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_28, &v0);
ov12_02225008(param1, param1->unk_28, &v0); ov12_02225008(param1, param1->unk_28, &v0);
break; break;
case 12: case 12:
@ -218,7 +218,7 @@ static void ov12_022242E0(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1)
VEC_Set(&v0, -5000, -6000, 0); VEC_Set(&v0, -5000, -6000, 0);
break; break;
case 34: case 34:
ov12_02235508(param1->unk_00, param1->unk_24, &v0); BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_24, &v0);
break; break;
case 31: { case 31: {

View File

@ -136,10 +136,10 @@ static BOOL ov12_02225200(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1)
v1.z *= param1->unk_08; v1.z *= param1->unk_08;
} break; } break;
case 2: case 2:
ov12_02235508(param1->unk_00, param1->unk_24, &v1); BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_24, &v1);
break; break;
case 3: case 3:
ov12_02235508(param1->unk_00, param1->unk_28, &v1); BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_28, &v1);
break; break;
case 0xFF: case 0xFF:
break; break;
@ -290,17 +290,17 @@ static BOOL ov12_02225444(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1)
v1.z *= param1->unk_08; v1.z *= param1->unk_08;
} break; } break;
case 4: case 4:
ov12_02235508(param1->unk_00, param1->unk_28, &v1); BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_28, &v1);
v1.x = (v1.x * v0[2]) / v0[3]; v1.x = (v1.x * v0[2]) / v0[3];
v1.y = (v1.y * v0[2]) / v0[3]; v1.y = (v1.y * v0[2]) / v0[3];
v1.z = (v1.z * v0[2]) / v0[3]; v1.z = (v1.z * v0[2]) / v0[3];
break; break;
case 2: case 2:
ov12_02235508(param1->unk_00, param1->unk_24, &v1); BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_24, &v1);
break; break;
case 3: case 3:
ov12_02235508(param1->unk_00, param1->unk_28, &v1); BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_28, &v1);
break; break;
case 0xFF: case 0xFF:
break; break;

View File

@ -82,7 +82,7 @@ static const BattleAnimScriptFunc sBattleAnimScriptFuncs[] = {
BattleAnimScriptFunc_MoveBattlerToDefaultPos, BattleAnimScriptFunc_MoveBattlerToDefaultPos,
BattleAnimScriptFunc_FadePokemonSprite, BattleAnimScriptFunc_FadePokemonSprite,
ov12_02229304, ov12_02229304,
ov12_02229B28, BattleAnimScriptFunc_MoveEmitterA2BLinear,
ov12_02229E54, ov12_02229E54,
ov12_02229638, ov12_02229638,
ov12_02229810, ov12_02229810,

View File

@ -500,19 +500,19 @@ typedef struct FadePokemonSpriteContext {
#define FADE_POKEMON_SPRITE_VAR_COLOR 5 #define FADE_POKEMON_SPRITE_VAR_COLOR 5
typedef struct { typedef struct {
BattleAnimScriptFuncCommon unk_00; BattleAnimScriptFuncCommon common;
BattleAnimSpriteInfo unk_1C; BattleAnimSpriteInfo spriteInfo;
int unk_30; int xOffset;
int unk_34; int yOffset;
int unk_38; int width;
int unk_3C; int height;
s16 unk_40; s16 unused;
s16 unk_42; s16 step;
int unk_44; int stepFrames;
int unk_48; int mode;
int unk_4C; int timer;
int unk_50; int y;
int unk_54; int drawHeight;
} UnkStruct_ov12_02229278; } UnkStruct_ov12_02229278;
typedef struct { typedef struct {
@ -559,28 +559,41 @@ typedef struct {
int unk_2C; int unk_2C;
} UnkStruct_ov12_0222988C; } UnkStruct_ov12_0222988C;
typedef struct { // -------------------------------------------------------------------
int unk_00; // Emitter Animation
s16 unk_04; // -------------------------------------------------------------------
s16 unk_06; typedef struct EmitterAnimationContext {
int emitterID;
s16 startDelay;
s16 frames;
int unk_08; int unk_08;
Point2D unk_0C; Point2D offset;
int unk_10; int mode;
int unk_14; int startBattler;
int unk_18; int endBattler;
int unk_1C; int frame; // Never actually used properly so doesn't do anything
int unk_20; int skipFrames; // Number of steps/frames to skip before updating the emitter
int unk_24; int maxFrames;
int unk_28; int timer;
int unk_2C; int angle;
int unk_30; BOOL curve;
ParticleSystem *unk_34; ParticleSystem *particleSys;
SPLEmitter *unk_38; SPLEmitter *emitter;
BattleAnimScriptFuncCommon unk_3C; BattleAnimScriptFuncCommon common;
BattleAnimSpriteInfo unk_58[4]; BattleAnimSpriteInfo unk_58[4];
XYTransformContext unk_A8[2]; XYTransformContext pos[2];
ValueLerpContext unk_F0; ValueLerpContext unused;
} UnkStruct_ov12_02229980; } EmitterAnimationContext;
#define EMITTER_ANIMATION_VAR_EMITTER_ID 0
#define EMITTER_ANIMATION_VAR_OFFSET_X 1
#define EMITTER_ANIMATION_VAR_OFFSET_Y 2
#define EMITTER_ANIMATION_VAR_START_DELAY 3
#define EMITTER_ANIMATION_VAR_FRAMES 4
#define EMITTER_ANIMATION_VAR_5 5
#define EMITTER_ANIMATION_VAR_MODE 6
#define EMITTER_ANIMATION_VAR_PARAMS 7
#define EMITTER_ANIMATION_VAR_CURVE 8
typedef struct { typedef struct {
int unk_00; int unk_00;
@ -2705,103 +2718,100 @@ static void ov12_02229278(SysTask *param0, void *param1)
{ {
UnkStruct_ov12_02229278 *v0 = (UnkStruct_ov12_02229278 *)param1; UnkStruct_ov12_02229278 *v0 = (UnkStruct_ov12_02229278 *)param1;
switch (v0->unk_00.state) { switch (v0->common.state) {
case 0: { case 0: {
if ((++v0->unk_4C) < v0->unk_44) { if (++v0->timer < v0->stepFrames) {
return; return;
} }
v0->unk_4C = 0; v0->timer = 0;
if (v0->unk_48 == 0) { if (v0->mode == 0) {
if (v0->unk_54 < 0) { if (v0->drawHeight < 0) {
v0->unk_54 = 0; v0->drawHeight = 0;
} }
if (v0->unk_54 == 0) { if (v0->drawHeight == 0) {
v0->unk_00.state++; v0->common.state++;
} }
} else { } else {
if (v0->unk_54 > 80) { if (v0->drawHeight > 80) {
v0->unk_54 = 80; v0->drawHeight = 80;
} }
if (v0->unk_54 == 80) { if (v0->drawHeight == 80) {
v0->unk_00.state++; v0->common.state++;
} }
} }
PokemonSprite_SetAttribute(v0->unk_1C.monSprite, MON_SPRITE_DRAW_HEIGHT, v0->unk_54); PokemonSprite_SetAttribute(v0->spriteInfo.monSprite, MON_SPRITE_DRAW_HEIGHT, v0->drawHeight);
PokemonSprite_SetAttribute(v0->unk_1C.monSprite, MON_SPRITE_Y_CENTER, v0->unk_50); PokemonSprite_SetAttribute(v0->spriteInfo.monSprite, MON_SPRITE_Y_CENTER, v0->y);
v0->unk_50 -= v0->unk_42; v0->y -= v0->step;
v0->unk_54 += v0->unk_42; v0->drawHeight += v0->step;
} break; } break;
default: default:
ResetMonScale(v0->unk_1C.monSprite); ResetMonScale(v0->spriteInfo.monSprite);
BattleAnimSystem_EndAnimTask(v0->unk_00.battleAnimSystem, param0); BattleAnimSystem_EndAnimTask(v0->common.battleAnimSystem, param0);
Heap_Free(v0); Heap_Free(v0);
break; break;
} }
} }
void ov12_02229304(BattleAnimSystem *param0) void ov12_02229304(BattleAnimSystem *system)
{ {
UnkStruct_ov12_02229278 *v0 = BattleAnimUtil_Alloc(param0, sizeof(UnkStruct_ov12_02229278)); UnkStruct_ov12_02229278 *ctx = BattleAnimUtil_Alloc(system, sizeof(UnkStruct_ov12_02229278));
BattleAnimSystem_GetCommonData(param0, &v0->unk_00); BattleAnimSystem_GetCommonData(system, &ctx->common);
{ int target = BattleAnimSystem_GetScriptVar(system, 0);
int v1 = BattleAnimSystem_GetScriptVar(param0, 0); int count;
int v2; BattleAnimUtil_GetBattlerSprites(system, target, &ctx->spriteInfo, &count);
int v3;
BattleAnimUtil_GetBattlerSprites(param0, v1, &(v0->unk_1C), &v2); int battler;
switch (target) {
switch (v1) { case BATTLE_ANIM_ATTACKER:
case 0x2: battler = BattleAnimSystem_GetAttacker(system);
v3 = BattleAnimSystem_GetAttacker(param0); break;
break; case BATTLE_ANIM_ATTACKER_PARTNER:
case 0x4: battler = BattleAnimUtil_GetAlliedBattler(system, BattleAnimSystem_GetAttacker(system));
v3 = BattleAnimUtil_GetAlliedBattler(param0, BattleAnimSystem_GetAttacker(param0)); break;
break; case BATTLE_ANIM_DEFENDER:
case 0x8: battler = BattleAnimSystem_GetDefender(system);
v3 = BattleAnimSystem_GetDefender(param0); break;
break; case BATTLE_ANIM_DEFENDER_PARTNER:
case 0x10: battler = BattleAnimUtil_GetAlliedBattler(system, BattleAnimSystem_GetDefender(system));
v3 = BattleAnimUtil_GetAlliedBattler(param0, BattleAnimSystem_GetDefender(param0)); break;
break; default:
default: GF_ASSERT(FALSE);
GF_ASSERT(0); break;
break;
}
v0->unk_48 = BattleAnimSystem_GetScriptVar(param0, 1);
if (v0->unk_48 == 0) {
v0->unk_50 = PokemonSprite_GetAttribute(v0->unk_1C.monSprite, MON_SPRITE_Y_CENTER);
v0->unk_54 = 80 - PokemonSprite_GetAttribute(v0->unk_1C.monSprite, MON_SPRITE_DRAW_HEIGHT);
v0->unk_40 = BattleAnimSystem_GetScriptVar(param0, 2);
v0->unk_42 = BattleAnimSystem_GetScriptVar(param0, 3);
v0->unk_42 *= -1;
} else {
v0->unk_50 = PokemonSprite_GetAttribute(v0->unk_1C.monSprite, MON_SPRITE_Y_CENTER);
v0->unk_54 = PokemonSprite_GetAttribute(v0->unk_1C.monSprite, MON_SPRITE_DRAW_HEIGHT);
v0->unk_40 = BattleAnimSystem_GetScriptVar(param0, 2);
v0->unk_42 = BattleAnimSystem_GetScriptVar(param0, 3);
}
v0->unk_30 = 0;
v0->unk_34 = 0;
v0->unk_38 = 80;
v0->unk_3C = 80 - BattleAnimSystem_GetBattlerSpriteHeight(param0, v3);
v0->unk_44 = BattleAnimSystem_GetScriptVar(param0, 4);
v0->unk_4C = 0;
PokemonSprite_SetPartialDraw(v0->unk_1C.monSprite, v0->unk_30, v0->unk_34, v0->unk_38, v0->unk_3C);
} }
BattleAnimSystem_StartAnimTask(v0->unk_00.battleAnimSystem, ov12_02229278, v0); ctx->mode = BattleAnimSystem_GetScriptVar(system, 1);
if (ctx->mode == 0) {
ctx->y = PokemonSprite_GetAttribute(ctx->spriteInfo.monSprite, MON_SPRITE_Y_CENTER);
ctx->drawHeight = MON_SPRITE_FRAME_HEIGHT - PokemonSprite_GetAttribute(ctx->spriteInfo.monSprite, MON_SPRITE_DRAW_HEIGHT);
ctx->unused = BattleAnimSystem_GetScriptVar(system, 2);
ctx->step = BattleAnimSystem_GetScriptVar(system, 3);
ctx->step *= -1;
} else {
ctx->y = PokemonSprite_GetAttribute(ctx->spriteInfo.monSprite, MON_SPRITE_Y_CENTER);
ctx->drawHeight = PokemonSprite_GetAttribute(ctx->spriteInfo.monSprite, MON_SPRITE_DRAW_HEIGHT);
ctx->unused = BattleAnimSystem_GetScriptVar(system, 2);
ctx->step = BattleAnimSystem_GetScriptVar(system, 3);
}
ctx->xOffset = 0;
ctx->yOffset = 0;
ctx->width = MON_SPRITE_FRAME_WIDTH;
ctx->height = MON_SPRITE_FRAME_HEIGHT - BattleAnimSystem_GetBattlerSpriteHeight(system, battler);
ctx->stepFrames = BattleAnimSystem_GetScriptVar(system, 4);
ctx->timer = 0;
PokemonSprite_SetPartialDraw(ctx->spriteInfo.monSprite, ctx->xOffset, ctx->yOffset, ctx->width, ctx->height);
BattleAnimSystem_StartAnimTask(ctx->common.battleAnimSystem, ov12_02229278, ctx);
} }
static int ov12_02229454(BattleAnimSystem *param0, int param1) static int ov12_02229454(BattleAnimSystem *param0, int param1)
@ -3109,145 +3119,140 @@ void ov12_02229908(BattleAnimSystem *param0)
} }
} }
static void ov12_02229980(BattleAnimSystem *param0, UnkStruct_ov12_02229980 *param1) static void EmitterAnimationContext_Init(BattleAnimSystem *system, EmitterAnimationContext *ctx)
{ {
param1->unk_00 = BattleAnimSystem_GetScriptVar(param0, 0); ctx->emitterID = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_EMITTER_ID);
param1->unk_0C.x = BattleAnimSystem_GetScriptVar(param0, 1); ctx->offset.x = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_OFFSET_X);
param1->unk_0C.y = BattleAnimSystem_GetScriptVar(param0, 2); ctx->offset.y = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_OFFSET_Y);
param1->unk_04 = BattleAnimSystem_GetScriptVar(param0, 3); ctx->startDelay = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_START_DELAY);
param1->unk_06 = BattleAnimSystem_GetScriptVar(param0, 4); ctx->frames = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_FRAMES);
param1->unk_08 = BattleAnimSystem_GetScriptVar(param0, 5); ctx->unk_08 = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_5);
param1->unk_10 = BattleAnimSystem_GetScriptVar(param0, 6); ctx->mode = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_MODE);
param1->unk_30 = BattleAnimSystem_GetScriptVar(param0, 8); ctx->curve = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_CURVE);
{ int params = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_PARAMS);
int v0 = BattleAnimSystem_GetScriptVar(param0, 7);
param1->unk_1C = 0; ctx->frame = 0;
param1->unk_20 = (v0 & 0xFFFF0000) >> 16; ctx->skipFrames = EMITTER_ANIMATION_SKIP_FRAMES(params);
param1->unk_24 = (v0 & 0xFFFF); ctx->maxFrames = EMITTER_ANIMATION_MAX_FRAMES(params);
if (param1->unk_20 == 0) { if (ctx->skipFrames == 0) {
param1->unk_20 = 0; ctx->skipFrames = 0;
}
if (param1->unk_24 == 0) {
param1->unk_24 = 0xFF;
}
} }
param1->unk_38 = BattleAnimSystem_GetEmitter(param0, param1->unk_00); if (ctx->maxFrames == 0) {
param1->unk_34 = BattleAnimSystem_GetCurrentParticleSystem(param0); ctx->maxFrames = EMITTER_ANIMATION_DEFAULT_FRAMES;
}
if (param1->unk_10 == 0) { ctx->emitter = BattleAnimSystem_GetEmitter(system, ctx->emitterID);
param1->unk_14 = BattleAnimSystem_GetAttacker(param0); ctx->particleSys = BattleAnimSystem_GetCurrentParticleSystem(system);
param1->unk_18 = BattleAnimSystem_GetDefender(param0);
} else if (param1->unk_10 == 1) { if (ctx->mode == EMITTER_ANIMATION_MODE_ATK_TO_DEF) {
param1->unk_14 = BattleAnimSystem_GetDefender(param0); ctx->startBattler = BattleAnimSystem_GetAttacker(system);
param1->unk_18 = BattleAnimSystem_GetAttacker(param0); ctx->endBattler = BattleAnimSystem_GetDefender(system);
} else if (ctx->mode == EMITTER_ANIMATION_MODE_DEF_TO_ATK) {
ctx->startBattler = BattleAnimSystem_GetDefender(system);
ctx->endBattler = BattleAnimSystem_GetAttacker(system);
} else { } else {
GF_ASSERT("FALSE"); GF_ASSERT("FALSE"); // bruh
} }
if (param1->unk_38 == NULL) { if (ctx->emitter == NULL) {
GF_ASSERT(0); GF_ASSERT(FALSE);
} }
} }
static BOOL ov12_02229A50(SPLEmitter *param0) static BOOL IsEmitterActive(SPLEmitter *emitter)
{ {
BOOL v0 = 0; BOOL active = FALSE;
SPLParticle *particle = emitter->particles.first;
{ int age;
SPLParticle *v1; int lifeTime;
int v2; while (particle != NULL) {
int v3; age = particle->age;
lifeTime = particle->lifeTime;
v1 = param0->particles.first; particle = particle->next;
while (v1 != NULL) {
v2 = v1->age;
v3 = v1->lifeTime;
v1 = v1->next;
}
if (v2 != v3) {
v0 = 1;
}
} }
return v0; // If the youngest particle is still alive, the emitter is active
if (age != lifeTime) {
active = TRUE;
}
return active;
} }
static void ov12_02229A6C(SysTask *param0, void *param1) static void BattleAnimTask_MoveEmitterA2BLinear(SysTask *task, void *param)
{ {
UnkStruct_ov12_02229980 *v0 = param1; EmitterAnimationContext *ctx = param;
BOOL v1 = ov12_02229A50(v0->unk_38); BOOL emitterActive = IsEmitterActive(ctx->emitter);
if (v0->unk_28 < v0->unk_04) { if (ctx->timer < ctx->startDelay) {
v0->unk_28++; ctx->timer++;
return; return;
} }
if ((PosLerpContext_Update(&v0->unk_A8[0]) == 0) && (v1 == 0)) { if (PosLerpContext_Update(&ctx->pos[0]) == FALSE && emitterActive == FALSE) {
ParticleSystem_DeleteEmitter(v0->unk_34, v0->unk_38); ParticleSystem_DeleteEmitter(ctx->particleSys, ctx->emitter);
BattleAnimSystem_EndAnimTask(v0->unk_3C.battleAnimSystem, param0); BattleAnimSystem_EndAnimTask(ctx->common.battleAnimSystem, task);
BattleAnimUtil_Free(v0); BattleAnimUtil_Free(ctx);
(v0) = NULL; ctx = NULL;
return; return;
} else { } else {
if (((v0->unk_20 > v0->unk_1C) || (v0->unk_24 < v0->unk_1C)) && (v0->unk_24 != 255)) { if ((ctx->skipFrames > ctx->frame || ctx->maxFrames < ctx->frame) && ctx->maxFrames != EMITTER_ANIMATION_DEFAULT_FRAMES) {
return; return;
} }
SPLEmitter_SetPosX(v0->unk_38, v0->unk_A8[0].x * 172); SPLEmitter_SetPosX(ctx->emitter, BATTLE_PARTICLE_SCREEN_TO_WORLD(ctx->pos[0].x));
SPLEmitter_SetPosY(v0->unk_38, v0->unk_A8[0].y * 172); SPLEmitter_SetPosY(ctx->emitter, BATTLE_PARTICLE_SCREEN_TO_WORLD(ctx->pos[0].y));
if (v0->unk_30) { if (ctx->curve) {
v0->unk_2C += (360 / (v0->unk_06)); ctx->angle += 360 / (ctx->frames);
SPLEmitter_SetPosY(v0->unk_38, (v0->unk_A8[0].y * 172) + CalcSineDegrees_Wraparound(v0->unk_2C)); SPLEmitter_SetPosY(ctx->emitter, BATTLE_PARTICLE_SCREEN_TO_WORLD(ctx->pos[0].y) + CalcSineDegrees_Wraparound(ctx->angle));
} }
} }
} }
void ov12_02229B28(BattleAnimSystem *param0) void BattleAnimScriptFunc_MoveEmitterA2BLinear(BattleAnimSystem *system)
{ {
int v0; EmitterAnimationContext *ctx = BattleAnimUtil_Alloc(system, sizeof(EmitterAnimationContext));
VecFx32 v1;
VecFx32 v2;
UnkStruct_ov12_02229980 *v3 = BattleAnimUtil_Alloc(param0, sizeof(UnkStruct_ov12_02229980));
BattleAnimSystem_GetCommonData(param0, &v3->unk_3C); BattleAnimSystem_GetCommonData(system, &ctx->common);
ov12_02229980(param0, v3); EmitterAnimationContext_Init(system, ctx);
v0 = BattleAnimUtil_GetTransformDirectionX(param0, BattleAnimSystem_GetAttacker(param0)); int dir = BattleAnimUtil_GetTransformDirectionX(system, BattleAnimSystem_GetAttacker(system));
ov12_02235508(param0, v3->unk_14, &v1); VecFx32 startPos, endPos;
ov12_02235508(param0, v3->unk_18, &v2); BattleAnimUtil_GetBattlerWorldPos_Normal(system, ctx->startBattler, &startPos);
PosLerpContext_Init(&v3->unk_A8[0], v1.x / 172, (v2.x / 172) + (v3->unk_0C.x * v0), v1.y / 172, (v2.y / 172) + (v3->unk_0C.y * v0), v3->unk_06); BattleAnimUtil_GetBattlerWorldPos_Normal(system, ctx->endBattler, &endPos);
if (v0 > 0) { PosLerpContext_Init(
ValueLerpContext_Init(&v3->unk_F0, ((20 * 0xffff) / 360) * v0, ((130 * 0xffff) / 360) * v0, 10); &ctx->pos[0],
BATTLE_PARTICLE_WORLD_TO_SCREEN(startPos.x),
BATTLE_PARTICLE_WORLD_TO_SCREEN(endPos.x) + (ctx->offset.x * dir),
BATTLE_PARTICLE_WORLD_TO_SCREEN(startPos.y),
BATTLE_PARTICLE_WORLD_TO_SCREEN(endPos.y) + (ctx->offset.y * dir),
ctx->frames);
if (dir > 0) {
ValueLerpContext_Init(&ctx->unused, DEG_TO_IDX(20) * dir, DEG_TO_IDX(130) * dir, 10);
} else { } else {
ValueLerpContext_Init(&v3->unk_F0, ((90 * 0xffff) / 360) * v0, ((130 * 0xffff) / 360) * v0, 10); ValueLerpContext_Init(&ctx->unused, DEG_TO_IDX(90) * dir, DEG_TO_IDX(130) * dir, 10);
} }
{ for (int i = 0; i < ctx->skipFrames; i++) {
int v4; PosLerpContext_Update(&ctx->pos[0]);
for (v4 = 0; v4 < v3->unk_20; v4++) {
PosLerpContext_Update(&v3->unk_A8[0]);
}
if (v3->unk_24 != 0xFF) {
v3->unk_1C = v3->unk_24 + 1;
}
SPLEmitter_SetPosX(v3->unk_38, v3->unk_A8[0].x * 172);
SPLEmitter_SetPosY(v3->unk_38, v3->unk_A8[0].y * 172);
} }
BattleAnimSystem_StartAnimTask(v3->unk_3C.battleAnimSystem, ov12_02229A6C, v3); if (ctx->maxFrames != EMITTER_ANIMATION_DEFAULT_FRAMES) {
ctx->frame = ctx->maxFrames + 1;
}
SPLEmitter_SetPosX(ctx->emitter, BATTLE_PARTICLE_SCREEN_TO_WORLD(ctx->pos[0].x));
SPLEmitter_SetPosY(ctx->emitter, BATTLE_PARTICLE_SCREEN_TO_WORLD(ctx->pos[0].y));
BattleAnimSystem_StartAnimTask(ctx->common.battleAnimSystem, BattleAnimTask_MoveEmitterA2BLinear, ctx);
} }
void ov12_02229C5C(BattleAnimSystem *param0) void ov12_02229C5C(BattleAnimSystem *param0)
@ -3255,51 +3260,51 @@ void ov12_02229C5C(BattleAnimSystem *param0)
VecFx32 v0; VecFx32 v0;
VecFx32 v1; VecFx32 v1;
int v2; int v2;
UnkStruct_ov12_02229980 *v3 = BattleAnimUtil_Alloc(param0, sizeof(UnkStruct_ov12_02229980)); EmitterAnimationContext *v3 = BattleAnimUtil_Alloc(param0, sizeof(EmitterAnimationContext));
BattleAnimSystem_GetCommonData(param0, &v3->unk_3C); BattleAnimSystem_GetCommonData(param0, &v3->common);
v3->unk_00 = BattleAnimSystem_GetScriptVar(param0, 0); v3->emitterID = BattleAnimSystem_GetScriptVar(param0, 0);
v3->unk_10 = BattleAnimSystem_GetScriptVar(param0, 1); v3->mode = BattleAnimSystem_GetScriptVar(param0, 1);
v2 = BattleAnimSystem_GetScriptVar(param0, 2); v2 = BattleAnimSystem_GetScriptVar(param0, 2);
v3->unk_06 = BattleAnimSystem_GetScriptVar(param0, 3); v3->frames = BattleAnimSystem_GetScriptVar(param0, 3);
v3->unk_04 = BattleAnimSystem_GetScriptVar(param0, 4); v3->startDelay = BattleAnimSystem_GetScriptVar(param0, 4);
v3->unk_28 = 0; v3->timer = 0;
{ {
int v4 = BattleAnimSystem_GetScriptVar(param0, 5); int v4 = BattleAnimSystem_GetScriptVar(param0, 5);
v3->unk_1C = 0; v3->frame = 0;
v3->unk_20 = (v4 & 0xFFFF0000) >> 16; v3->skipFrames = (v4 & 0xFFFF0000) >> 16;
v3->unk_24 = (v4 & 0xFFFF); v3->maxFrames = (v4 & 0xFFFF);
if (v3->unk_20 == 0) { if (v3->skipFrames == 0) {
v3->unk_20 = 0; v3->skipFrames = 0;
} }
if (v3->unk_24 == 0) { if (v3->maxFrames == 0) {
v3->unk_24 = 0xFF; v3->maxFrames = 0xFF;
} }
} }
v3->unk_38 = BattleAnimSystem_GetEmitter(param0, v3->unk_00); v3->emitter = BattleAnimSystem_GetEmitter(param0, v3->emitterID);
v3->unk_34 = BattleAnimSystem_GetCurrentParticleSystem(param0); v3->particleSys = BattleAnimSystem_GetCurrentParticleSystem(param0);
if (v3->unk_10 == 0) { if (v3->mode == 0) {
v3->unk_14 = BattleAnimSystem_GetAttacker(param0); v3->startBattler = BattleAnimSystem_GetAttacker(param0);
v3->unk_18 = BattleAnimSystem_GetAttacker(param0); v3->endBattler = BattleAnimSystem_GetAttacker(param0);
} else { } else {
v3->unk_14 = BattleAnimSystem_GetDefender(param0); v3->startBattler = BattleAnimSystem_GetDefender(param0);
v3->unk_18 = BattleAnimSystem_GetDefender(param0); v3->endBattler = BattleAnimSystem_GetDefender(param0);
} }
if (v3->unk_38 == NULL) { if (v3->emitter == NULL) {
GF_ASSERT(0); GF_ASSERT(0);
} }
ov12_02235508(param0, v3->unk_14, &v0); BattleAnimUtil_GetBattlerWorldPos_Normal(param0, v3->startBattler, &v0);
ov12_02235508(param0, v3->unk_18, &v1); BattleAnimUtil_GetBattlerWorldPos_Normal(param0, v3->endBattler, &v1);
if (v2 == 0) { if (v2 == 0) {
ov12_02235748(&v0); ov12_02235748(&v0);
@ -3309,40 +3314,40 @@ void ov12_02229C5C(BattleAnimSystem *param0)
v1.x = v0.x; v1.x = v0.x;
} }
PosLerpContext_Init(&v3->unk_A8[0], v0.x / 172, v1.x / 172, v0.y / 172, v1.y / 172, v3->unk_06); PosLerpContext_Init(&v3->pos[0], v0.x / 172, v1.x / 172, v0.y / 172, v1.y / 172, v3->frames);
{ {
int v5; int v5;
for (v5 = 0; v5 < v3->unk_20; v5++) { for (v5 = 0; v5 < v3->skipFrames; v5++) {
PosLerpContext_Update(&v3->unk_A8[0]); PosLerpContext_Update(&v3->pos[0]);
} }
if (v3->unk_24 != 0xFF) { if (v3->maxFrames != 0xFF) {
v3->unk_1C = v3->unk_24 + 1; v3->frame = v3->maxFrames + 1;
} }
SPLEmitter_SetPosX(v3->unk_38, v3->unk_A8[0].x * 172); SPLEmitter_SetPosX(v3->emitter, v3->pos[0].x * 172);
SPLEmitter_SetPosY(v3->unk_38, v3->unk_A8[0].y * 172); SPLEmitter_SetPosY(v3->emitter, v3->pos[0].y * 172);
} }
BattleAnimSystem_StartAnimTask(v3->unk_3C.battleAnimSystem, ov12_02229A6C, v3); BattleAnimSystem_StartAnimTask(v3->common.battleAnimSystem, BattleAnimTask_MoveEmitterA2BLinear, v3);
} }
static void ov12_02229DF0(SysTask *param0, void *param1) static void ov12_02229DF0(SysTask *param0, void *param1)
{ {
UnkStruct_ov12_02229980 *v0 = param1; EmitterAnimationContext *v0 = param1;
BOOL v1 = ov12_02229A50(v0->unk_38); BOOL v1 = IsEmitterActive(v0->emitter);
if ((ov12_02225CE4(&v0->unk_A8[0], &v0->unk_A8[1]) == 0) && (v1 == 0)) { if ((ov12_02225CE4(&v0->pos[0], &v0->pos[1]) == 0) && (v1 == 0)) {
ParticleSystem_DeleteEmitter(v0->unk_34, v0->unk_38); ParticleSystem_DeleteEmitter(v0->particleSys, v0->emitter);
BattleAnimSystem_EndAnimTask(v0->unk_3C.battleAnimSystem, param0); BattleAnimSystem_EndAnimTask(v0->common.battleAnimSystem, param0);
BattleAnimUtil_Free(v0); BattleAnimUtil_Free(v0);
(v0) = NULL; (v0) = NULL;
return; return;
} else { } else {
SPLEmitter_SetPosX(v0->unk_38, v0->unk_A8[0].x * 172); SPLEmitter_SetPosX(v0->emitter, v0->pos[0].x * 172);
SPLEmitter_SetPosY(v0->unk_38, v0->unk_A8[0].y * 172); SPLEmitter_SetPosY(v0->emitter, v0->pos[0].y * 172);
} }
} }
@ -3351,45 +3356,45 @@ void ov12_02229E54(BattleAnimSystem *param0)
int v0; int v0;
VecFx32 v1; VecFx32 v1;
VecFx32 v2; VecFx32 v2;
UnkStruct_ov12_02229980 *v3 = BattleAnimUtil_Alloc(param0, sizeof(UnkStruct_ov12_02229980)); EmitterAnimationContext *v3 = BattleAnimUtil_Alloc(param0, sizeof(EmitterAnimationContext));
BattleAnimSystem_GetCommonData(param0, &v3->unk_3C); BattleAnimSystem_GetCommonData(param0, &v3->common);
ov12_02229980(param0, v3); EmitterAnimationContext_Init(param0, v3);
v0 = BattleAnimUtil_GetTransformDirectionX(param0, BattleAnimSystem_GetAttacker(param0)); v0 = BattleAnimUtil_GetTransformDirectionX(param0, BattleAnimSystem_GetAttacker(param0));
ov12_02235508(param0, v3->unk_14, &v1); BattleAnimUtil_GetBattlerWorldPos_Normal(param0, v3->startBattler, &v1);
ov12_02235508(param0, v3->unk_18, &v2); BattleAnimUtil_GetBattlerWorldPos_Normal(param0, v3->endBattler, &v2);
ov12_02225C98(&v3->unk_A8[0], &v3->unk_A8[1], v1.x / 172, (v2.x / 172) + (v3->unk_0C.x * v0), v1.y / 172, (v2.y / 172) + (v3->unk_0C.y * v0), v3->unk_06, v3->unk_08 * -FX32_ONE); ov12_02225C98(&v3->pos[0], &v3->pos[1], v1.x / 172, (v2.x / 172) + (v3->offset.x * v0), v1.y / 172, (v2.y / 172) + (v3->offset.y * v0), v3->frames, v3->unk_08 * -FX32_ONE);
if (v0 > 0) { if (v0 > 0) {
ValueLerpContext_Init(&v3->unk_F0, ((20 * 0xffff) / 360) * v0, ((130 * 0xffff) / 360) * v0, 10); ValueLerpContext_Init(&v3->unused, ((20 * 0xffff) / 360) * v0, ((130 * 0xffff) / 360) * v0, 10);
} else { } else {
ValueLerpContext_Init(&v3->unk_F0, ((90 * 0xffff) / 360) * v0, ((130 * 0xffff) / 360) * v0, 10); ValueLerpContext_Init(&v3->unused, ((90 * 0xffff) / 360) * v0, ((130 * 0xffff) / 360) * v0, 10);
} }
{ {
int v4; int v4;
for (v4 = 0; v4 < v3->unk_20; v4++) { for (v4 = 0; v4 < v3->skipFrames; v4++) {
ov12_02225CE4(&v3->unk_A8[0], &v3->unk_A8[1]); ov12_02225CE4(&v3->pos[0], &v3->pos[1]);
} }
if (v3->unk_24 != 0xFF) { if (v3->maxFrames != 0xFF) {
v3->unk_1C = v3->unk_24 + 1; v3->frame = v3->maxFrames + 1;
} }
SPLEmitter_SetPosX(v3->unk_38, v3->unk_A8[0].x * 172); SPLEmitter_SetPosX(v3->emitter, v3->pos[0].x * 172);
SPLEmitter_SetPosY(v3->unk_38, v3->unk_A8[0].y * 172); SPLEmitter_SetPosY(v3->emitter, v3->pos[0].y * 172);
} }
BattleAnimSystem_StartAnimTask(v3->unk_3C.battleAnimSystem, ov12_02229DF0, v3); BattleAnimSystem_StartAnimTask(v3->common.battleAnimSystem, ov12_02229DF0, v3);
} }
static void ov12_02229F9C(SysTask *param0, void *param1) static void ov12_02229F9C(SysTask *param0, void *param1)
{ {
UnkStruct_ov12_02229F9C *v0 = param1; UnkStruct_ov12_02229F9C *v0 = param1;
BOOL v1 = ov12_02229A50(v0->unk_38); BOOL v1 = IsEmitterActive(v0->unk_38);
if ((RevolutionContext_Update(&v0->unk_58) == 0) && (v1 == 0)) { if ((RevolutionContext_Update(&v0->unk_58) == 0) && (v1 == 0)) {
ParticleSystem_DeleteEmitter(v0->unk_34, v0->unk_38); ParticleSystem_DeleteEmitter(v0->unk_34, v0->unk_38);
@ -3428,7 +3433,7 @@ void ov12_0222A00C(BattleAnimSystem *param0)
v0->unk_24 = BattleAnimSystem_GetDefender(param0); v0->unk_24 = BattleAnimSystem_GetDefender(param0);
} }
ov12_02235508(param0, v0->unk_24, &v0->unk_88); BattleAnimUtil_GetBattlerWorldPos_Normal(param0, v0->unk_24, &v0->unk_88);
v0->unk_38 = BattleAnimSystem_GetEmitter(param0, v0->unk_00); v0->unk_38 = BattleAnimSystem_GetEmitter(param0, v0->unk_00);
v0->unk_34 = BattleAnimSystem_GetParticleSystem(param0, BattleAnimSystem_GetScriptVar(param0, 9)); v0->unk_34 = BattleAnimSystem_GetParticleSystem(param0, BattleAnimSystem_GetScriptVar(param0, 9));

View File

@ -3,11 +3,14 @@
#include <nitro.h> #include <nitro.h>
#include <string.h> #include <string.h>
#include "constants/battle.h"
#include "constants/battle/battle_anim.h" #include "constants/battle/battle_anim.h"
#include "overlay012/battle_anim_system.h" #include "overlay012/battle_anim_system.h"
#include "overlay012/ov12_02235254.h" #include "overlay012/ov12_02235254.h"
#include "camera.h"
#include "fx_util.h"
#include "heap.h" #include "heap.h"
#include "inlines.h" #include "inlines.h"
#include "math_util.h" #include "math_util.h"
@ -168,228 +171,226 @@ void BattleAnimUtil_GetBattlerDefaultPos(BattleAnimSystem *system, int battler,
BattleAnimUtil_GetBattlerTypeDefaultPos(battlerType, isContest, pos); BattleAnimUtil_GetBattlerTypeDefaultPos(battlerType, isContest, pos);
} }
static void ov12_022353CC(int param0, VecFx32 *param1, int param2, int param3, int param4) static void BattleAnimUtil_GetBattlerTypeWorldPosInternal(int battlerType, VecFx32 *outPos, int isContest, int projection, int posType)
{ {
int v0; const VecFx32 particlePositions[][12 * CAMERA_PROJECTION_COUNT] = {
const VecFx32 *v1; [BATTLER_TYPE_SOLO_PLAYER] = {
const VecFx32 v2[][24] = { VEC_FX32(-2.3477, -1.334, 0.0156),
{ VEC_FX32(-2.5, -1.5625, 0.0156),
{ -9616, -5464, 0x40 }, VEC_FX32(-0.9688, -0.8125, 0.0156),
{ -10240, -6400, 0x40 }, VEC_FX32(-1.6035, -0.9766, 0.0156),
{ -3968, -3328, 0x40 }, VEC_FX32(-0.9688, -0.8125, 0.0156),
{ -6568, -4000, 0x40 }, VEC_FX32(-1.6406, -1.414, 0.0156),
{ -3968, -3328, 0x40 }, VEC_FX32(-2.1074, -1.6934, 0),
{ -6720, -5792, 0x40 }, VEC_FX32(-2.1074, -1.6934, 0),
{ -8632, -6936, 0x0 }, VEC_FX32(-3.0625, -0.9375, 0),
{ -8632, -6936, 0x0 }, VEC_FX32(-3.0625, -0.9375, 0),
{ -12544, -3840, 0x0 }, VEC_FX32(-2.3516, -1.4297, 0),
{ -12544, -3840, 0x0 }, VEC_FX32(-2.3516, -1.4297, 0),
{ -9632, -5856, 0x0 }, VEC_FX32(-1.0117, -1.2695, 0),
{ -9632, -5856, 0x0 }, VEC_FX32(-1.0117, -1.2695, 0),
{ -4144, -5200, 0x0 }, VEC_FX32(-3.0469, -1.0469, 0),
{ -4144, -5200, 0x0 }, VEC_FX32(-3.0469, -1.0469, 0),
{ -12480, -4288, 0x0 }, VEC_FX32(-0.4375, -1.0312, 0),
{ -12480, -4288, 0x0 }, VEC_FX32(-0.4375, -1.0312, 0),
{ -1792, -4224, 0x0 }, VEC_FX32(-2.0312, -1.0156, 0),
{ -1792, -4224, 0x0 }, VEC_FX32(-2.0312, -1.0156, 0),
{ -8320, -4160, 0x0 }, VEC_FX32(2.2168, 1.3516, 0),
{ -8320, -4160, 0x0 }, VEC_FX32(2.2168, 1.3516, 0),
{ 0x2378, 0x15A0, 0x0 }, VEC_FX32(-1.5254, -0.7188, 0),
{ 0x2378, 0x15A0, 0x0 }, VEC_FX32(-1.5254, -0.7188, 0),
{ -6248, -2944, 0x0 },
{ -6248, -2944, 0x0 },
}, },
{ [BATTLER_TYPE_SOLO_ENEMY] = {
{ 0x2B30, 0x1130, -5248 }, VEC_FX32(2.6992, 1.0742, -1.2812),
{ 0x2800, 0xC00, -5248 }, VEC_FX32(2.5, 0.75, -1.2812),
{ 0x2480, 0x880, -5248 }, VEC_FX32(2.2812, 0.5312, -1.2812),
{ 0x2260, 0x1940, -5248 }, VEC_FX32(2.1484, 1.5781, -1.2812),
{ 0x2480, 0x880, -5248 }, VEC_FX32(2.2812, 0.5312, -1.2812),
{ 0x38C0, 0x1F60, -5248 }, VEC_FX32(3.5469, 1.961, -1.2812),
{ 0x3268, 0x13F4, 0x0 }, VEC_FX32(3.1504, 1.247, 0),
{ 0x3268, 0x13F4, 0x0 }, VEC_FX32(3.1504, 1.247, 0),
{ 0x1538, 0x1A18, 0x0 }, VEC_FX32(1.3262, 1.6309, 0),
{ 0x1538, 0x1A18, 0x0 }, VEC_FX32(1.3262, 1.6309, 0),
{ 0x3358, 0x2C08, 0x0 }, VEC_FX32(3.209, 2.752, 0),
{ 0x3358, 0x2C08, 0x0 }, VEC_FX32(3.209, 2.752, 0),
{ 0x40D0, 0x1430, 0x0 }, VEC_FX32(4.0508, 1.2617, 0),
{ 0x40D0, 0x1430, 0x0 }, VEC_FX32(4.0508, 1.2617, 0),
{ 0x3380, 0x1DC0, 0x0 }, VEC_FX32(3.2188, 1.8594, 0),
{ 0x3380, 0x1DC0, 0x0 }, VEC_FX32(3.2188, 1.8594, 0),
{ 0x4200, 0xD00, 0x0 }, VEC_FX32(4.125, 0.8125, 0),
{ 0x4200, 0xD00, 0x0 }, VEC_FX32(4.125, 0.8125, 0),
{ 0x2A80, 0x1180, 0x0 }, VEC_FX32(2.6562, 1.0938, 0),
{ 0x2A80, 0x1180, 0x0 }, VEC_FX32(2.6562, 1.0938, 0),
{ -6936, -4832, 0x0 }, VEC_FX32(-1.6934, -1.1797, 0),
{ -6936, -4832, 0x0 }, VEC_FX32(-1.6934, -1.1797, 0),
{ 0x2058, 0x1538, 0x0 }, VEC_FX32(2.0215, 1.3262, 0),
{ 0x2058, 0x1538, 0x0 }, VEC_FX32(2.0215, 1.3262, 0),
}, },
{ [BATTLER_TYPE_PLAYER_SIDE_SLOT_1] = {
{ -14936, -5032, 0x40 }, VEC_FX32(-3.6465, -1.2285, 0.0156),
{ -15360, -6272, 0x40 }, VEC_FX32(-3.75, -1.5312, 0.0156),
{ -9856, -3200, 0x40 }, VEC_FX32(-2.4062, -0.7812, 0.0156),
{ -11400, -2944, 0x40 }, VEC_FX32(-2.7832, -0.7188, 0.0156),
{ -9856, -3200, 0x40 }, VEC_FX32(-2.4062, -0.7812, 0.0156),
{ -9856, -3200, 0x40 }, VEC_FX32(-2.4062, -0.7812, 0.0156),
{ -9456, -3104, 0x0 }, VEC_FX32(-2.3086, -0.7578, 0),
{ -9456, -3104, 0x0 }, VEC_FX32(-2.3086, -0.7578, 0),
{ -17856, -3624, 0x0 }, VEC_FX32(-4.3594, -0.8848, 0),
{ -17856, -3624, 0x0 }, VEC_FX32(-4.3594, -0.8848, 0),
{ -12592, -2976, 0x0 }, VEC_FX32(-3.0742, -0.7266, 0),
{ -12592, -2976, 0x0 }, VEC_FX32(-3.0742, -0.7266, 0),
{ -6366, -3776, 0x0 }, VEC_FX32(-1.5542, -0.9219, 0),
{ -6366, -3776, 0x0 }, VEC_FX32(-1.5542, -0.9219, 0),
{ -14912, -2176, 0x0 }, VEC_FX32(-3.6406, -0.5312, 0),
{ -14912, -2176, 0x0 }, VEC_FX32(-3.6406, -0.5312, 0),
{ -6080, -5504, 0x0 }, VEC_FX32(-1.4844, -1.3438, 0),
{ -6080, -5504, 0x0 }, VEC_FX32(-1.4844, -1.3438, 0),
{ -12032, -3200, 0x0 }, VEC_FX32(-2.9375, -0.7812, 0),
{ -12032, -3200, 0x0 }, VEC_FX32(-2.9375, -0.7812, 0),
{ 0x2A48, 0x1D40, 0x0 }, VEC_FX32(2.6426, 1.8281, 0),
{ 0x2A48, 0x1D40, 0x0 }, VEC_FX32(2.6426, 1.8281, 0),
{ -9856, -3200, 0x0 }, VEC_FX32(-2.4062, -0.7812, 0),
{ -9856, -3200, 0x0 }, VEC_FX32(-2.4062, -0.7812, 0),
}, },
{ [BATTLER_TYPE_ENEMY_SIDE_SLOT_1] = {
{ 0x1CC8, 0x1748, -5248 }, VEC_FX32(1.7988, 1.455, -1.2812),
{ 0x3500, 0xB80, -5248 }, VEC_FX32(3.3125, 0.7188, -1.2812),
{ 0x3500, 0xB80, -5248 }, VEC_FX32(3.3125, 0.7188, -1.2812),
{ 0x3170, 0x1668, -5248 }, VEC_FX32(3.0898, 1.4004, -1.2812),
{ 0x3500, 0xB80, -5248 }, VEC_FX32(3.3125, 0.7188, -1.2812),
{ 0x3500, 0xB80, -5248 }, VEC_FX32(3.3125, 0.7188, -1.2812),
{ 0x4640, 0x18C0, 0x0 }, VEC_FX32(4.3906, 1.5469, 0),
{ 0x4640, 0x18C0, 0x0 }, VEC_FX32(4.3906, 1.5469, 0),
{ 0x1F58, 0x1778, 0x0 }, VEC_FX32(1.959, 1.4668, 0),
{ 0x1F58, 0x1778, 0x0 }, VEC_FX32(1.959, 1.4668, 0),
{ 0x3310, 0x1840, 0x0 }, VEC_FX32(3.1914, 1.5156, 0),
{ 0x3310, 0x1840, 0x0 }, VEC_FX32(3.1914, 1.5156, 0),
{ 0x4400, 0x1440, 0x0 }, VEC_FX32(4.25, 1.2656, 0),
{ 0x4400, 0x1440, 0x0 }, VEC_FX32(4.25, 1.2656, 0),
{ 0x3F00, 0x1CC0, 0x0 }, VEC_FX32(3.9375, 1.7969, 0),
{ 0x3F00, 0x1CC0, 0x0 }, VEC_FX32(3.9375, 1.7969, 0),
{ 0x50C0, 0xD98, 0x0 }, VEC_FX32(5.0469, 0.8496, 0),
{ 0x50C0, 0xD98, 0x0 }, VEC_FX32(5.0469, 0.8496, 0),
{ 0x3480, 0x1520, 0x0 }, VEC_FX32(3.2812, 1.3203, 0),
{ 0x3480, 0x1520, 0x0 }, VEC_FX32(3.2812, 1.3203, 0),
{ -9536, -3120, 0xAA8 }, VEC_FX32(-2.3281, -0.7617, 0.666),
{ -9536, -3120, 0xAA8 }, VEC_FX32(-2.3281, -0.7617, 0.666),
{ 0x3500, 0xB80, 0x0 }, VEC_FX32(3.3125, 0.7188, 0),
{ 0x3500, 0xB80, 0x0 }, VEC_FX32(3.3125, 0.7188, 0),
}, },
{ [BATTLER_TYPE_PLAYER_SIDE_SLOT_2] = {
{ -5364, -6568, -0x400 }, VEC_FX32(-1.3096, -1.6035, -0.25),
{ -7552, -6912, -0x400 }, VEC_FX32(-1.8438, -1.6875, -0.25),
{ -2308, -5632, -0x400 }, VEC_FX32(-0.5635, -1.375, -0.25),
{ -2984, -5272, -0x400 }, VEC_FX32(-0.7285, -1.287, -0.25),
{ -2308, -5632, -0x400 }, VEC_FX32(-0.5635, -1.375, -0.25),
{ -2308, -5632, -0x400 }, VEC_FX32(-0.5635, -1.375, -0.25),
{ -2480, -5568, 0x0 }, VEC_FX32(-0.6055, -1.3594, 0),
{ -2480, -5568, 0x0 }, VEC_FX32(-0.6055, -1.3594, 0),
{ -8200, -4776, 0x0 }, VEC_FX32(-2.002, -1.166, 0),
{ -8200, -4776, 0x0 }, VEC_FX32(-2.002, -1.166, 0),
{ -5600, -6480, 0x0 }, VEC_FX32(-1.3672, -1.582, 0),
{ -5600, -6480, 0x0 }, VEC_FX32(-1.3672, -1.582, 0),
{ -632, -5176, 0x0 }, VEC_FX32(-0.1543, -1.2637, 0),
{ -632, -5176, 0x0 }, VEC_FX32(-0.1543, -1.2637, 0),
{ -8448, -8384, 0x0 }, VEC_FX32(-2.0625, -2.0469, 0),
{ -8448, -8384, 0x0 }, VEC_FX32(-2.0625, -2.0469, 0),
{ 0x200, -6528, 0x0 }, VEC_FX32(0.125, -1.5938, 0),
{ 0x200, -6528, 0x0 }, VEC_FX32(0.125, -1.5938, 0),
{ -6848, -6144, 0x0 }, VEC_FX32(-1.6719, -1.5, 0),
{ -6848, -6144, 0x0 }, VEC_FX32(-1.6719, -1.5, 0),
{ 0x1420, 0x1D40, 0x0 }, VEC_FX32(1.2578, 1.8281, 0),
{ 0x1420, 0x1D40, 0x0 }, VEC_FX32(1.2578, 1.8281, 0),
{ -2308, -5632, 0x0 }, VEC_FX32(-0.5635, -1.375, 0),
{ -2308, -5632, 0x0 }, VEC_FX32(-0.5635, -1.375, 0),
}, },
{ [BATTLER_TYPE_ENEMY_SIDE_SLOT_2] = {
{ 0x3B50, 0x1148, -0x1cb0 }, VEC_FX32(3.707, 1.08, -1.793),
{ 0x1B00, 0x1000, -0x1cb0 }, VEC_FX32(1.6875, 1.0, -1.793),
{ 0x1B00, 0x1000, -0x1cb0 }, VEC_FX32(1.6875, 1.0, -1.793),
{ 0x1AF8, 0x2048, -0x1cb0 }, VEC_FX32(1.6855, 2.0176, -1.793),
{ 0x1B00, 0x1000, -0x1cb0 }, VEC_FX32(1.6875, 1.0, -1.793),
{ 0x1B00, 0x1000, -0x1cb0 }, VEC_FX32(1.6875, 1.0, -1.793),
{ 0x3210, 0x15E0, 0x0 }, VEC_FX32(3.129, 1.3672, 0),
{ 0x3210, 0x15E0, 0x0 }, VEC_FX32(3.129, 1.3672, 0),
{ 0x7D8, 0x1258, 0x0 }, VEC_FX32(0.4902, 1.1465, 0),
{ 0x7D8, 0x1258, 0x0 }, VEC_FX32(0.4902, 1.1465, 0),
{ 0x1F58, 0x18A8, 0x0 }, VEC_FX32(1.959, 1.541, 0),
{ 0x1F58, 0x18A8, 0x0 }, VEC_FX32(1.959, 1.541, 0),
{ 0x2E08, 0x1808, 0x0 }, VEC_FX32(2.877, 1.502, 0),
{ 0x2E08, 0x1808, 0x0 }, VEC_FX32(2.877, 1.502, 0),
{ 0x2700, 0x2500, 0x0 }, VEC_FX32(2.4375, 2.3125, 0),
{ 0x2700, 0x2500, 0x0 }, VEC_FX32(2.4375, 2.3125, 0),
{ 0x3640, 0xD98, 0x0 }, VEC_FX32(3.3906, 0.8496, 0),
{ 0x3640, 0xD98, 0x0 }, VEC_FX32(3.3906, 0.8496, 0),
{ 0x1840, 0x1540, 0x0 }, VEC_FX32(1.5156, 1.3281, 0),
{ 0x1840, 0x1540, 0x0 }, VEC_FX32(1.5156, 1.3281, 0),
{ -5408, -6000, 0x0 }, VEC_FX32(-1.3203, -1.4648, 0),
{ -5408, -6000, 0x0 }, VEC_FX32(-1.3203, -1.4648, 0),
{ 0x1B00, 0x1000, 0x0 }, VEC_FX32(1.6875, 1.0, 0),
{ 0x1B00, 0x1000, 0x0 }, VEC_FX32(1.6875, 1.0, 0),
}, },
{ [CONTESTANT_TYPE_PLAYER] = {
{ 0x1CC8, -5032, 0x40 }, VEC_FX32(1.7988, -1.2285, 0.0156),
{ 0x3500, -6272, 0x40 }, VEC_FX32(3.3125, -1.5312, 0.0156),
{ 0x3500, -3200, 0x40 }, VEC_FX32(3.3125, -0.7812, 0.0156),
{ 0x3170, -2944, 0x40 }, VEC_FX32(3.0898, -0.7188, 0.0156),
{ 0x3500, -3200, 0x40 }, VEC_FX32(3.3125, -0.7812, 0.0156),
{ 0x3500, -3200, 0x40 }, VEC_FX32(3.3125, -0.7812, 0.0156),
{ 0x3500, -3200, 0x0 }, VEC_FX32(3.3125, -0.7812, 0),
{ 0x3500, -3200, 0x0 }, VEC_FX32(3.3125, -0.7812, 0),
{ 0x1D90, -3200, 0x0 }, VEC_FX32(1.8477, -0.7812, 0),
{ 0x1D90, -3200, 0x0 }, VEC_FX32(1.8477, -0.7812, 0),
{ 0x3500, -3200, 0x0 }, VEC_FX32(3.3125, -0.7812, 0),
{ 0x3500, -3200, 0x0 }, VEC_FX32(3.3125, -0.7812, 0),
{ 0x3500, -3200, 0x0 }, VEC_FX32(3.3125, -0.7812, 0),
{ 0x3500, -3200, 0x0 }, VEC_FX32(3.3125, -0.7812, 0),
{ 0x3500, -3200, 0x0 }, VEC_FX32(3.3125, -0.7812, 0),
{ 0x3500, -3200, 0x0 }, VEC_FX32(3.3125, -0.7812, 0),
{ 0x3500, -3200, 0x0 }, VEC_FX32(3.3125, -0.7812, 0),
{ 0x3500, -3200, 0x0 }, VEC_FX32(3.3125, -0.7812, 0),
{ 0x3500, -3200, 0x0 }, VEC_FX32(3.3125, -0.7812, 0),
{ 0x3500, -3200, 0x0 }, VEC_FX32(3.3125, -0.7812, 0),
{ -9536, 0x1D40, 0x0 }, VEC_FX32(-2.3281, 1.8281, 0),
{ -9536, 0x1D40, 0x0 }, VEC_FX32(-2.3281, 1.8281, 0),
{ 0x3500, -3200, 0x0 }, VEC_FX32(3.3125, -0.7812, 0),
{ 0x3500, -2944, 0x0 }, VEC_FX32(3.3125, -0.7188, 0),
}, },
{ [CONTESTANT_TYPE_ENEMY] = {
{ -5364, 0x1148, -5248 }, VEC_FX32(-1.3096, 1.08, -1.2812),
{ -7552, 0x1000, -5248 }, VEC_FX32(-1.8438, 1.0, -1.2812),
{ -2308, 0x1000, -5248 }, VEC_FX32(-0.5635, 1.0, -1.2812),
{ -2984, 0x2048, -5248 }, VEC_FX32(-0.7285, 2.0176, -1.2812),
{ -2308, 0x1000, -5248 }, VEC_FX32(-0.5635, 1.0, -1.2812),
{ -2308, 0x1000, -5248 }, VEC_FX32(-0.5635, 1.0, -1.2812),
{ -2480, 0x15E0, 0x0 }, VEC_FX32(-0.6055, 1.3672, 0),
{ -2480, 0x15E0, 0x0 }, VEC_FX32(-0.6055, 1.3672, 0),
{ -8200, 0x1258, 0x0 }, VEC_FX32(-2.002, 1.1465, 0),
{ -8200, 0x1258, 0x0 }, VEC_FX32(-2.002, 1.1465, 0),
{ -5600, 0x18A8, 0x0 }, VEC_FX32(-1.3672, 1.541, 0),
{ -5600, 0x18A8, 0x0 }, VEC_FX32(-1.3672, 1.541, 0),
{ -632, 0x1808, 0x0 }, VEC_FX32(-0.1543, 1.502, 0),
{ -632, 0x1808, 0x0 }, VEC_FX32(-0.1543, 1.502, 0),
{ -8448, 0x2500, 0x0 }, VEC_FX32(-2.0625, 2.3125, 0),
{ -8448, 0x2500, 0x0 }, VEC_FX32(-2.0625, 2.3125, 0),
{ 0x200, 0xD98, 0x0 }, VEC_FX32(0.125, 0.8496, 0),
{ 0x200, 0xD98, 0x0 }, VEC_FX32(0.125, 0.8496, 0),
{ -6848, 0x1540, 0x0 }, VEC_FX32(-1.6719, 1.3281, 0),
{ -6848, 0x1540, 0x0 }, VEC_FX32(-1.6719, 1.3281, 0),
{ 0x1420, -6000, 0xAA8 }, VEC_FX32(1.2578, -1.4648, 0.666),
{ 0x1420, -5408, 0xAA8 }, VEC_FX32(1.2578, -1.3203, 0.666),
{ -2308, 0x1000, 0x0 }, VEC_FX32(-0.5635, 1.0, 0),
{ -2984, 0x2048, 0x0 }, VEC_FX32(-0.7285, 2.0176, 0),
}, },
}; };
if (param2 == 1) { if (isContest == TRUE) {
switch (param0) { switch (battlerType) {
case 0: case BATTLER_TYPE_SOLO_PLAYER:
param0 = 5 + 1; battlerType = CONTESTANT_TYPE_PLAYER;
break; break;
case 1: case BATTLER_TYPE_SOLO_ENEMY:
param0 = 5 + 2; battlerType = CONTESTANT_TYPE_ENEMY;
break; break;
default: default:
GF_ASSERT(FALSE); GF_ASSERT(FALSE);
@ -397,82 +398,80 @@ static void ov12_022353CC(int param0, VecFx32 *param1, int param2, int param3, i
} }
} }
v0 = param3 + (param4 * 2); int index = projection + (posType * CAMERA_PROJECTION_COUNT);
v1 = &v2[param0][v0]; const VecFx32 *pos = &particlePositions[battlerType][index];
VEC_Set(param1, v1->x, v1->y, v1->z); VEC_Set(outPos, pos->x, pos->y, pos->z);
} }
void ov12_02235448(int param0, VecFx32 *param1, int param2, int param3) void BattleAnimUtil_GetBattlerTypeWorldPos_Normal(int battlerType, VecFx32 *pos, BOOL isContest, enum CameraProjection projection)
{ {
ov12_022353CC(param0, param1, param2, param3, 0); BattleAnimUtil_GetBattlerTypeWorldPosInternal(battlerType, pos, isContest, projection, 0);
} }
void ov12_02235458(int param0, VecFx32 *param1, int param2, int param3) void ov12_02235458(int battlerType, VecFx32 *pos, int isContest, int projection)
{ {
ov12_022353CC(param0, param1, param2, param3, 1); BattleAnimUtil_GetBattlerTypeWorldPosInternal(battlerType, pos, isContest, projection, 1);
} }
void ov12_02235468(int param0, VecFx32 *param1, int param2, int param3) void ov12_02235468(int param0, VecFx32 *param1, int param2, int param3)
{ {
ov12_022353CC(param0, param1, param2, param3, 2); BattleAnimUtil_GetBattlerTypeWorldPosInternal(param0, param1, param2, param3, 2);
} }
void ov12_02235478(int param0, VecFx32 *param1, int param2, int param3) void ov12_02235478(int param0, VecFx32 *param1, int param2, int param3)
{ {
ov12_022353CC(param0, param1, param2, param3, 3); BattleAnimUtil_GetBattlerTypeWorldPosInternal(param0, param1, param2, param3, 3);
} }
void ov12_02235488(int param0, VecFx32 *param1, int param2, int param3) void ov12_02235488(int param0, VecFx32 *param1, int param2, int param3)
{ {
ov12_022353CC(param0, param1, param2, param3, 4); BattleAnimUtil_GetBattlerTypeWorldPosInternal(param0, param1, param2, param3, 4);
} }
void ov12_02235498(int param0, VecFx32 *param1, int param2, int param3) void ov12_02235498(int param0, VecFx32 *param1, int param2, int param3)
{ {
ov12_022353CC(param0, param1, param2, param3, 5); BattleAnimUtil_GetBattlerTypeWorldPosInternal(param0, param1, param2, param3, 5);
} }
void ov12_022354A8(int param0, VecFx32 *param1, int param2, int param3) void ov12_022354A8(int param0, VecFx32 *param1, int param2, int param3)
{ {
ov12_022353CC(param0, param1, param2, param3, 6); BattleAnimUtil_GetBattlerTypeWorldPosInternal(param0, param1, param2, param3, 6);
} }
void ov12_022354B8(int param0, VecFx32 *param1, int param2, int param3) void ov12_022354B8(int param0, VecFx32 *param1, int param2, int param3)
{ {
ov12_022353CC(param0, param1, param2, param3, 7); BattleAnimUtil_GetBattlerTypeWorldPosInternal(param0, param1, param2, param3, 7);
} }
void ov12_022354C8(int param0, VecFx32 *param1, int param2, int param3) void ov12_022354C8(int param0, VecFx32 *param1, int param2, int param3)
{ {
ov12_022353CC(param0, param1, param2, param3, 8); BattleAnimUtil_GetBattlerTypeWorldPosInternal(param0, param1, param2, param3, 8);
} }
void ov12_022354D8(int param0, VecFx32 *param1, int param2, int param3) void ov12_022354D8(int param0, VecFx32 *param1, int param2, int param3)
{ {
ov12_022353CC(param0, param1, param2, param3, 9); BattleAnimUtil_GetBattlerTypeWorldPosInternal(param0, param1, param2, param3, 9);
} }
void ov12_022354E8(int param0, VecFx32 *param1, int param2, int param3) void ov12_022354E8(int param0, VecFx32 *param1, int param2, int param3)
{ {
ov12_022353CC(param0, param1, param2, param3, 10); BattleAnimUtil_GetBattlerTypeWorldPosInternal(param0, param1, param2, param3, 10);
} }
void ov12_022354F8(int param0, VecFx32 *param1, int param2, int param3) void ov12_022354F8(int param0, VecFx32 *param1, int param2, int param3)
{ {
ov12_022353CC(param0, param1, param2, param3, 11); BattleAnimUtil_GetBattlerTypeWorldPosInternal(param0, param1, param2, param3, 11);
} }
void ov12_02235508(BattleAnimSystem *param0, int param1, VecFx32 *param2) void BattleAnimUtil_GetBattlerWorldPos_Normal(BattleAnimSystem *system, int battler, VecFx32 *pos)
{ {
int v0, v1; ParticleSystem *ps = BattleAnimSystem_GetCurrentParticleSystem(system);
int v2; enum CameraProjection projection = ParticleSystem_GetCameraProjection(ps);
ParticleSystem *v3 = BattleAnimSystem_GetCurrentParticleSystem(param0); int battlerType = BattleAnimUtil_GetBattlerType(system, battler);
v2 = ParticleSystem_GetCameraProjection(v3); BOOL isContest = BattleAnimSystem_IsContest(system);
v0 = BattleAnimUtil_GetBattlerType(param0, param1);
v1 = BattleAnimSystem_IsContest(param0);
ov12_02235448(v0, param2, v1, v2); BattleAnimUtil_GetBattlerTypeWorldPos_Normal(battlerType, pos, isContest, projection);
} }
void ov12_02235538(BattleAnimSystem *param0, int param1, VecFx32 *param2) void ov12_02235538(BattleAnimSystem *param0, int param1, VecFx32 *param2)
@ -616,7 +615,7 @@ void ov12_02235748(VecFx32 *param0)
void ov12_02235758(int param0, VecFx32 *param1, int param2, int param3) void ov12_02235758(int param0, VecFx32 *param1, int param2, int param3)
{ {
ov12_02235448(param0, param1, param2, param3); BattleAnimUtil_GetBattlerTypeWorldPos_Normal(param0, param1, param2, param3);
} }
void ov12_02235760(int param0, VecFx32 *param1) void ov12_02235760(int param0, VecFx32 *param1)

View File

@ -1,5 +1,6 @@
#include "particle_system.h" #include "particle_system.h"
#include "nitro/fx/fx_trig.h"
#include <nitro.h> #include <nitro.h>
#include <string.h> #include <string.h>
@ -125,7 +126,7 @@ ParticleSystem *ParticleSystem_New(SPLTexVRAMAllocFunc texAllocFunc, SPLPalVRAMA
particleSystem->camera = Camera_Alloc(heapID); particleSystem->camera = Camera_Alloc(heapID);
VEC_Set(&particleSystem->unused1, 0, 0, 0); VEC_Set(&particleSystem->unused1, 0, 0, 0);
particleSystem->cameraFov = 8192; particleSystem->cameraFov = FX_DEG_TO_IDX(FX32_CONST(45.0f));
Camera_InitWithTargetAndPosition( Camera_InitWithTargetAndPosition(
&sParticleSystemDefaultCameraTarget, &sParticleSystemDefaultCameraTarget,