From db561b9cf973c75dcc1261b6f616632bc1dfaf82 Mon Sep 17 00:00:00 2001 From: Fexty12573 Date: Tue, 5 Aug 2025 22:45:54 +0200 Subject: [PATCH] Document move emitter a2b linear script func --- include/camera.h | 1 + include/constants/battle.h | 1 + include/constants/battle/battle_anim.h | 19 +- include/overlay012/ov12_02226B84.h | 2 +- include/overlay012/ov12_02235254.h | 4 +- src/overlay012/ov12_0222389C.c | 28 +- src/overlay012/ov12_0222421C.c | 18 +- src/overlay012/ov12_02225104.c | 10 +- src/overlay012/ov12_02226998.c | 2 +- src/overlay012/ov12_02226B84.c | 511 +++++++++++++------------ src/overlay012/ov12_02235254.c | 471 ++++++++++++----------- src/particle_system.c | 3 +- 12 files changed, 547 insertions(+), 523 deletions(-) diff --git a/include/camera.h b/include/camera.h index 3fc7be6183..82371bad90 100644 --- a/include/camera.h +++ b/include/camera.h @@ -16,6 +16,7 @@ enum CameraProjection { CAMERA_PROJECTION_PERSPECTIVE = 0, CAMERA_PROJECTION_ORTHOGRAPHIC, + CAMERA_PROJECTION_COUNT }; typedef struct CameraAngle { diff --git a/include/constants/battle.h b/include/constants/battle.h index c067029152..310ed8b233 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -105,6 +105,7 @@ #define BATTLER_TYPE_ENEMY_SIDE_SLOT_1 3 #define BATTLER_TYPE_PLAYER_SIDE_SLOT_2 4 #define BATTLER_TYPE_ENEMY_SIDE_SLOT_2 5 +#define BATTLER_TYPE_MAX 6 #define BATTLE_SIDE_PLAYER 0 #define BATTLE_SIDE_ENEMY 1 diff --git a/include/constants/battle/battle_anim.h b/include/constants/battle/battle_anim.h index 6246bcef8b..fc21d47790 100644 --- a/include/constants/battle/battle_anim.h +++ b/include/constants/battle/battle_anim.h @@ -1,7 +1,9 @@ #ifndef 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_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) @@ -103,6 +105,11 @@ #define BATTLE_ANIM_MON_SPRITE_4 4 #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_* #define BATTLER_POS_SOLO_PLAYER_X 64 #define BATTLER_POS_SOLO_PLAYER_Y 112 @@ -123,6 +130,9 @@ #define CONTESTANT_POS_ENEMY_X 80 #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 // Script function specific constants @@ -142,5 +152,12 @@ #define SCALE_BATTLER_SPRITE_HOLD(frames) ((frames) >> 16) #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 #endif // POKEPLATINUM_CONSTANTS_BATTLE_ANIM_H diff --git a/include/overlay012/ov12_02226B84.h b/include/overlay012/ov12_02226B84.h index 504460368e..54e3d58188 100644 --- a/include/overlay012/ov12_02226B84.h +++ b/include/overlay012/ov12_02226B84.h @@ -33,7 +33,7 @@ void ov12_02229304(BattleAnimSystem *param0); void ov12_02229638(BattleAnimSystem *param0); void ov12_02229810(BattleAnimSystem *param0); void ov12_02229908(BattleAnimSystem *param0); -void ov12_02229B28(BattleAnimSystem *param0); +void BattleAnimScriptFunc_MoveEmitterA2BLinear(BattleAnimSystem *param0); void ov12_02229C5C(BattleAnimSystem *param0); void ov12_02229E54(BattleAnimSystem *param0); void ov12_0222A00C(BattleAnimSystem *param0); diff --git a/include/overlay012/ov12_02235254.h b/include/overlay012/ov12_02235254.h index 0f93ee43d7..30b3b388fe 100644 --- a/include/overlay012/ov12_02235254.h +++ b/include/overlay012/ov12_02235254.h @@ -48,7 +48,7 @@ int BattleAnimUtil_GetAlliedBattler(BattleAnimSystem *param0, int param1); int BattleAnimUtil_GetOpposingBattlerType(int param0); void BattleAnimUtil_GetBattlerTypeDefaultPos(int param0, BOOL 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_02235468(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_022354E8(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_02235568(BattleAnimSystem *param0, int param1, VecFx32 *param2); void ov12_02235598(BattleAnimSystem *param0, int param1, VecFx32 *param2); diff --git a/src/overlay012/ov12_0222389C.c b/src/overlay012/ov12_0222389C.c index a3725a77dc..2475953468 100644 --- a/src/overlay012/ov12_0222389C.c +++ b/src/overlay012/ov12_0222389C.c @@ -76,15 +76,15 @@ void ov12_022238E0(SPLEmitter *param0) int v10; if (BattleAnimUtil_GetBattlerSide(v0, v2) == 0x3) { - ov12_02235508(v0, v2, &v5); + BattleAnimUtil_GetBattlerWorldPos_Normal(v0, v2, &v5); } else { v8 = BattleAnimUtil_GetBattlerType(v0, v2); v9 = BattleAnimUtil_GetOpposingBattlerType(v8); v10 = ParticleSystem_GetCameraProjection(v1); v4 = BattleAnimSystem_IsContest(v0); - ov12_02235448(v9, &v5, v4, v10); - ov12_02235448(v8, &v6, v4, v10); + BattleAnimUtil_GetBattlerTypeWorldPos_Normal(v9, &v5, v4, v10); + BattleAnimUtil_GetBattlerTypeWorldPos_Normal(v8, &v6, v4, v10); } } @@ -127,7 +127,7 @@ void ov12_02223998(SPLEmitter *param0) v2 = BattleAnimSystem_GetDefender(v0); v1 = BattleAnimSystem_GetCurrentParticleSystem(v0); - ov12_02235508(v0, 0, &v3); + BattleAnimUtil_GetBattlerWorldPos_Normal(v0, 0, &v3); SPLEmitter_SetPosX(param0, v3.x); SPLEmitter_SetPosY(param0, v3.y); @@ -146,7 +146,7 @@ void ov12_022239F4(SPLEmitter *param0) v0 = ParticleSystem_GetEmitterCallbackParam(); v1 = BattleAnimSystem_GetDefender(v0); - ov12_02235508(v0, v1, &v2); + BattleAnimUtil_GetBattlerWorldPos_Normal(v0, v1, &v2); SPLEmitter_SetPosX(param0, v2.x); SPLEmitter_SetPosY(param0, v2.y); @@ -162,7 +162,7 @@ void ov12_02223A38(SPLEmitter *param0) v0 = ParticleSystem_GetEmitterCallbackParam(); v1 = BattleAnimSystem_GetAttacker(v0); - ov12_02235508(v0, v1, &v2); + BattleAnimUtil_GetBattlerWorldPos_Normal(v0, v1, &v2); SPLEmitter_SetPosX(param0, v2.x); SPLEmitter_SetPosY(param0, v2.y); @@ -180,7 +180,7 @@ void ov12_02223A7C(SPLEmitter *param0) v1 = BattleAnimSystem_GetAttacker(v0); v2 = BattleAnimSystem_GetDefender(v0); - ov12_02235508(v0, v1, &v3); + BattleAnimUtil_GetBattlerWorldPos_Normal(v0, v1, &v3); SPLEmitter_SetPosX(param0, v3.x); SPLEmitter_SetPosY(param0, v3.y); @@ -209,7 +209,7 @@ void ov12_02223AC8(SPLEmitter *param0) 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_SetPosY(param0, v1.y); @@ -239,7 +239,7 @@ void ov12_02223B30(SPLEmitter *param0) 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_SetPosY(param0, v1.y); @@ -346,10 +346,10 @@ static void ov12_02223CD4(BattleAnimSystem *param0, SPLEmitter *param1, int para v0.z = 0 * param5; break; case 3: - ov12_02235508(param0, param3, &v0); + BattleAnimUtil_GetBattlerWorldPos_Normal(param0, param3, &v0); break; case 4: - ov12_02235508(param0, param2, &v0); + BattleAnimUtil_GetBattlerWorldPos_Normal(param0, param2, &v0); break; case 5: { 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; break; case 3: - ov12_02235508(param0, param3, &v0); + BattleAnimUtil_GetBattlerWorldPos_Normal(param0, param3, &v0); break; case 4: - ov12_02235508(param0, param2, &v0); + BattleAnimUtil_GetBattlerWorldPos_Normal(param0, param2, &v0); break; case 5: { int v1[4] = { 0, 0, 0, 0 }; @@ -489,7 +489,7 @@ static void ov12_02223E74(BattleAnimSystem *param0, SPLEmitter *param1, int para VecFx32 v14; 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)) { v1 = v14; diff --git a/src/overlay012/ov12_0222421C.c b/src/overlay012/ov12_0222421C.c index b698d8cddb..4091eec2f1 100644 --- a/src/overlay012/ov12_0222421C.c +++ b/src/overlay012/ov12_0222421C.c @@ -72,7 +72,7 @@ static void ov12_02224260(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1, V 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) @@ -97,7 +97,7 @@ static void ov12_022242A0(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1, V 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) @@ -108,10 +108,10 @@ static void ov12_022242E0(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1) case 0: break; case 1: - ov12_02235508(param1->unk_00, param1->unk_24, &v0); + BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_24, &v0); break; case 2: - ov12_02235508(param1->unk_00, param1->unk_28, &v0); + BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_28, &v0); break; case 6: 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; } break; 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); break; 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); break; 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); break; 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); break; case 12: @@ -218,7 +218,7 @@ static void ov12_022242E0(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1) VEC_Set(&v0, -5000, -6000, 0); break; case 34: - ov12_02235508(param1->unk_00, param1->unk_24, &v0); + BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_24, &v0); break; case 31: { diff --git a/src/overlay012/ov12_02225104.c b/src/overlay012/ov12_02225104.c index c3246b2761..92ef4287c0 100644 --- a/src/overlay012/ov12_02225104.c +++ b/src/overlay012/ov12_02225104.c @@ -136,10 +136,10 @@ static BOOL ov12_02225200(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1) v1.z *= param1->unk_08; } break; case 2: - ov12_02235508(param1->unk_00, param1->unk_24, &v1); + BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_24, &v1); break; case 3: - ov12_02235508(param1->unk_00, param1->unk_28, &v1); + BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_28, &v1); break; case 0xFF: break; @@ -290,17 +290,17 @@ static BOOL ov12_02225444(SPLEmitter *param0, UnkStruct_ov12_02225640 *param1) v1.z *= param1->unk_08; } break; 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.y = (v1.y * v0[2]) / v0[3]; v1.z = (v1.z * v0[2]) / v0[3]; break; case 2: - ov12_02235508(param1->unk_00, param1->unk_24, &v1); + BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_24, &v1); break; case 3: - ov12_02235508(param1->unk_00, param1->unk_28, &v1); + BattleAnimUtil_GetBattlerWorldPos_Normal(param1->unk_00, param1->unk_28, &v1); break; case 0xFF: break; diff --git a/src/overlay012/ov12_02226998.c b/src/overlay012/ov12_02226998.c index db762d9c7d..03e889c915 100644 --- a/src/overlay012/ov12_02226998.c +++ b/src/overlay012/ov12_02226998.c @@ -82,7 +82,7 @@ static const BattleAnimScriptFunc sBattleAnimScriptFuncs[] = { BattleAnimScriptFunc_MoveBattlerToDefaultPos, BattleAnimScriptFunc_FadePokemonSprite, ov12_02229304, - ov12_02229B28, + BattleAnimScriptFunc_MoveEmitterA2BLinear, ov12_02229E54, ov12_02229638, ov12_02229810, diff --git a/src/overlay012/ov12_02226B84.c b/src/overlay012/ov12_02226B84.c index 6b762599ab..65e9bc01cc 100644 --- a/src/overlay012/ov12_02226B84.c +++ b/src/overlay012/ov12_02226B84.c @@ -500,19 +500,19 @@ typedef struct FadePokemonSpriteContext { #define FADE_POKEMON_SPRITE_VAR_COLOR 5 typedef struct { - BattleAnimScriptFuncCommon unk_00; - BattleAnimSpriteInfo unk_1C; - int unk_30; - int unk_34; - int unk_38; - int unk_3C; - s16 unk_40; - s16 unk_42; - int unk_44; - int unk_48; - int unk_4C; - int unk_50; - int unk_54; + BattleAnimScriptFuncCommon common; + BattleAnimSpriteInfo spriteInfo; + int xOffset; + int yOffset; + int width; + int height; + s16 unused; + s16 step; + int stepFrames; + int mode; + int timer; + int y; + int drawHeight; } UnkStruct_ov12_02229278; typedef struct { @@ -559,28 +559,41 @@ typedef struct { int unk_2C; } UnkStruct_ov12_0222988C; -typedef struct { - int unk_00; - s16 unk_04; - s16 unk_06; +// ------------------------------------------------------------------- +// Emitter Animation +// ------------------------------------------------------------------- +typedef struct EmitterAnimationContext { + int emitterID; + s16 startDelay; + s16 frames; int unk_08; - Point2D unk_0C; - int unk_10; - int unk_14; - int unk_18; - int unk_1C; - int unk_20; - int unk_24; - int unk_28; - int unk_2C; - int unk_30; - ParticleSystem *unk_34; - SPLEmitter *unk_38; - BattleAnimScriptFuncCommon unk_3C; + Point2D offset; + int mode; + int startBattler; + int endBattler; + int frame; // Never actually used properly so doesn't do anything + int skipFrames; // Number of steps/frames to skip before updating the emitter + int maxFrames; + int timer; + int angle; + BOOL curve; + ParticleSystem *particleSys; + SPLEmitter *emitter; + BattleAnimScriptFuncCommon common; BattleAnimSpriteInfo unk_58[4]; - XYTransformContext unk_A8[2]; - ValueLerpContext unk_F0; -} UnkStruct_ov12_02229980; + XYTransformContext pos[2]; + ValueLerpContext unused; +} 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 { int unk_00; @@ -2705,103 +2718,100 @@ static void ov12_02229278(SysTask *param0, void *param1) { UnkStruct_ov12_02229278 *v0 = (UnkStruct_ov12_02229278 *)param1; - switch (v0->unk_00.state) { + switch (v0->common.state) { case 0: { - if ((++v0->unk_4C) < v0->unk_44) { + if (++v0->timer < v0->stepFrames) { return; } - v0->unk_4C = 0; + v0->timer = 0; - if (v0->unk_48 == 0) { - if (v0->unk_54 < 0) { - v0->unk_54 = 0; + if (v0->mode == 0) { + if (v0->drawHeight < 0) { + v0->drawHeight = 0; } - if (v0->unk_54 == 0) { - v0->unk_00.state++; + if (v0->drawHeight == 0) { + v0->common.state++; } } else { - if (v0->unk_54 > 80) { - v0->unk_54 = 80; + if (v0->drawHeight > 80) { + v0->drawHeight = 80; } - if (v0->unk_54 == 80) { - v0->unk_00.state++; + if (v0->drawHeight == 80) { + v0->common.state++; } } - PokemonSprite_SetAttribute(v0->unk_1C.monSprite, MON_SPRITE_DRAW_HEIGHT, v0->unk_54); - PokemonSprite_SetAttribute(v0->unk_1C.monSprite, MON_SPRITE_Y_CENTER, v0->unk_50); + PokemonSprite_SetAttribute(v0->spriteInfo.monSprite, MON_SPRITE_DRAW_HEIGHT, v0->drawHeight); + PokemonSprite_SetAttribute(v0->spriteInfo.monSprite, MON_SPRITE_Y_CENTER, v0->y); - v0->unk_50 -= v0->unk_42; - v0->unk_54 += v0->unk_42; + v0->y -= v0->step; + v0->drawHeight += v0->step; } break; default: - ResetMonScale(v0->unk_1C.monSprite); - BattleAnimSystem_EndAnimTask(v0->unk_00.battleAnimSystem, param0); + ResetMonScale(v0->spriteInfo.monSprite); + BattleAnimSystem_EndAnimTask(v0->common.battleAnimSystem, param0); Heap_Free(v0); 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 v1 = BattleAnimSystem_GetScriptVar(param0, 0); - int v2; - int v3; + int target = BattleAnimSystem_GetScriptVar(system, 0); + int count; + BattleAnimUtil_GetBattlerSprites(system, target, &ctx->spriteInfo, &count); - BattleAnimUtil_GetBattlerSprites(param0, v1, &(v0->unk_1C), &v2); - - switch (v1) { - case 0x2: - v3 = BattleAnimSystem_GetAttacker(param0); - break; - case 0x4: - v3 = BattleAnimUtil_GetAlliedBattler(param0, BattleAnimSystem_GetAttacker(param0)); - break; - case 0x8: - v3 = BattleAnimSystem_GetDefender(param0); - break; - case 0x10: - v3 = BattleAnimUtil_GetAlliedBattler(param0, BattleAnimSystem_GetDefender(param0)); - break; - default: - GF_ASSERT(0); - 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); + int battler; + switch (target) { + case BATTLE_ANIM_ATTACKER: + battler = BattleAnimSystem_GetAttacker(system); + break; + case BATTLE_ANIM_ATTACKER_PARTNER: + battler = BattleAnimUtil_GetAlliedBattler(system, BattleAnimSystem_GetAttacker(system)); + break; + case BATTLE_ANIM_DEFENDER: + battler = BattleAnimSystem_GetDefender(system); + break; + case BATTLE_ANIM_DEFENDER_PARTNER: + battler = BattleAnimUtil_GetAlliedBattler(system, BattleAnimSystem_GetDefender(system)); + break; + default: + GF_ASSERT(FALSE); + break; } - 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) @@ -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); - param1->unk_0C.x = BattleAnimSystem_GetScriptVar(param0, 1); - param1->unk_0C.y = BattleAnimSystem_GetScriptVar(param0, 2); - param1->unk_04 = BattleAnimSystem_GetScriptVar(param0, 3); - param1->unk_06 = BattleAnimSystem_GetScriptVar(param0, 4); - param1->unk_08 = BattleAnimSystem_GetScriptVar(param0, 5); - param1->unk_10 = BattleAnimSystem_GetScriptVar(param0, 6); - param1->unk_30 = BattleAnimSystem_GetScriptVar(param0, 8); + ctx->emitterID = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_EMITTER_ID); + ctx->offset.x = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_OFFSET_X); + ctx->offset.y = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_OFFSET_Y); + ctx->startDelay = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_START_DELAY); + ctx->frames = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_FRAMES); + ctx->unk_08 = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_5); + ctx->mode = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_MODE); + ctx->curve = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_CURVE); - { - int v0 = BattleAnimSystem_GetScriptVar(param0, 7); + int params = BattleAnimSystem_GetScriptVar(system, EMITTER_ANIMATION_VAR_PARAMS); - param1->unk_1C = 0; - param1->unk_20 = (v0 & 0xFFFF0000) >> 16; - param1->unk_24 = (v0 & 0xFFFF); + ctx->frame = 0; + ctx->skipFrames = EMITTER_ANIMATION_SKIP_FRAMES(params); + ctx->maxFrames = EMITTER_ANIMATION_MAX_FRAMES(params); - if (param1->unk_20 == 0) { - param1->unk_20 = 0; - } - - if (param1->unk_24 == 0) { - param1->unk_24 = 0xFF; - } + if (ctx->skipFrames == 0) { + ctx->skipFrames = 0; } - param1->unk_38 = BattleAnimSystem_GetEmitter(param0, param1->unk_00); - param1->unk_34 = BattleAnimSystem_GetCurrentParticleSystem(param0); + if (ctx->maxFrames == 0) { + ctx->maxFrames = EMITTER_ANIMATION_DEFAULT_FRAMES; + } - if (param1->unk_10 == 0) { - param1->unk_14 = BattleAnimSystem_GetAttacker(param0); - param1->unk_18 = BattleAnimSystem_GetDefender(param0); - } else if (param1->unk_10 == 1) { - param1->unk_14 = BattleAnimSystem_GetDefender(param0); - param1->unk_18 = BattleAnimSystem_GetAttacker(param0); + ctx->emitter = BattleAnimSystem_GetEmitter(system, ctx->emitterID); + ctx->particleSys = BattleAnimSystem_GetCurrentParticleSystem(system); + + if (ctx->mode == EMITTER_ANIMATION_MODE_ATK_TO_DEF) { + ctx->startBattler = BattleAnimSystem_GetAttacker(system); + 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 { - GF_ASSERT("FALSE"); + GF_ASSERT("FALSE"); // bruh } - if (param1->unk_38 == NULL) { - GF_ASSERT(0); + if (ctx->emitter == NULL) { + 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; - { - SPLParticle *v1; - int v2; - int v3; - - v1 = param0->particles.first; - - while (v1 != NULL) { - v2 = v1->age; - v3 = v1->lifeTime; - v1 = v1->next; - } - - if (v2 != v3) { - v0 = 1; - } + int age; + int lifeTime; + while (particle != NULL) { + age = particle->age; + lifeTime = particle->lifeTime; + particle = particle->next; } - 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; - BOOL v1 = ov12_02229A50(v0->unk_38); + EmitterAnimationContext *ctx = param; + BOOL emitterActive = IsEmitterActive(ctx->emitter); - if (v0->unk_28 < v0->unk_04) { - v0->unk_28++; + if (ctx->timer < ctx->startDelay) { + ctx->timer++; return; } - if ((PosLerpContext_Update(&v0->unk_A8[0]) == 0) && (v1 == 0)) { - ParticleSystem_DeleteEmitter(v0->unk_34, v0->unk_38); - BattleAnimSystem_EndAnimTask(v0->unk_3C.battleAnimSystem, param0); - BattleAnimUtil_Free(v0); - (v0) = NULL; + if (PosLerpContext_Update(&ctx->pos[0]) == FALSE && emitterActive == FALSE) { + ParticleSystem_DeleteEmitter(ctx->particleSys, ctx->emitter); + BattleAnimSystem_EndAnimTask(ctx->common.battleAnimSystem, task); + BattleAnimUtil_Free(ctx); + ctx = NULL; return; } 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; } - SPLEmitter_SetPosX(v0->unk_38, v0->unk_A8[0].x * 172); - SPLEmitter_SetPosY(v0->unk_38, v0->unk_A8[0].y * 172); + 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)); - if (v0->unk_30) { - v0->unk_2C += (360 / (v0->unk_06)); - SPLEmitter_SetPosY(v0->unk_38, (v0->unk_A8[0].y * 172) + CalcSineDegrees_Wraparound(v0->unk_2C)); + if (ctx->curve) { + ctx->angle += 360 / (ctx->frames); + 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; - VecFx32 v1; - VecFx32 v2; - UnkStruct_ov12_02229980 *v3 = BattleAnimUtil_Alloc(param0, sizeof(UnkStruct_ov12_02229980)); + EmitterAnimationContext *ctx = BattleAnimUtil_Alloc(system, sizeof(EmitterAnimationContext)); - BattleAnimSystem_GetCommonData(param0, &v3->unk_3C); - ov12_02229980(param0, v3); + BattleAnimSystem_GetCommonData(system, &ctx->common); + 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); - ov12_02235508(param0, v3->unk_18, &v2); - 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); + VecFx32 startPos, endPos; + BattleAnimUtil_GetBattlerWorldPos_Normal(system, ctx->startBattler, &startPos); + BattleAnimUtil_GetBattlerWorldPos_Normal(system, ctx->endBattler, &endPos); - if (v0 > 0) { - ValueLerpContext_Init(&v3->unk_F0, ((20 * 0xffff) / 360) * v0, ((130 * 0xffff) / 360) * v0, 10); + PosLerpContext_Init( + &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 { - 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); } - { - int v4; - - 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); + for (int i = 0; i < ctx->skipFrames; i++) { + PosLerpContext_Update(&ctx->pos[0]); } - 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) @@ -3255,51 +3260,51 @@ void ov12_02229C5C(BattleAnimSystem *param0) VecFx32 v0; VecFx32 v1; int v2; - UnkStruct_ov12_02229980 *v3 = BattleAnimUtil_Alloc(param0, sizeof(UnkStruct_ov12_02229980)); - BattleAnimSystem_GetCommonData(param0, &v3->unk_3C); + EmitterAnimationContext *v3 = BattleAnimUtil_Alloc(param0, sizeof(EmitterAnimationContext)); + BattleAnimSystem_GetCommonData(param0, &v3->common); - v3->unk_00 = BattleAnimSystem_GetScriptVar(param0, 0); - v3->unk_10 = BattleAnimSystem_GetScriptVar(param0, 1); + v3->emitterID = BattleAnimSystem_GetScriptVar(param0, 0); + v3->mode = BattleAnimSystem_GetScriptVar(param0, 1); v2 = BattleAnimSystem_GetScriptVar(param0, 2); - v3->unk_06 = BattleAnimSystem_GetScriptVar(param0, 3); - v3->unk_04 = BattleAnimSystem_GetScriptVar(param0, 4); - v3->unk_28 = 0; + v3->frames = BattleAnimSystem_GetScriptVar(param0, 3); + v3->startDelay = BattleAnimSystem_GetScriptVar(param0, 4); + v3->timer = 0; { int v4 = BattleAnimSystem_GetScriptVar(param0, 5); - v3->unk_1C = 0; - v3->unk_20 = (v4 & 0xFFFF0000) >> 16; - v3->unk_24 = (v4 & 0xFFFF); + v3->frame = 0; + v3->skipFrames = (v4 & 0xFFFF0000) >> 16; + v3->maxFrames = (v4 & 0xFFFF); - if (v3->unk_20 == 0) { - v3->unk_20 = 0; + if (v3->skipFrames == 0) { + v3->skipFrames = 0; } - if (v3->unk_24 == 0) { - v3->unk_24 = 0xFF; + if (v3->maxFrames == 0) { + v3->maxFrames = 0xFF; } } - v3->unk_38 = BattleAnimSystem_GetEmitter(param0, v3->unk_00); - v3->unk_34 = BattleAnimSystem_GetCurrentParticleSystem(param0); + v3->emitter = BattleAnimSystem_GetEmitter(param0, v3->emitterID); + v3->particleSys = BattleAnimSystem_GetCurrentParticleSystem(param0); - if (v3->unk_10 == 0) { - v3->unk_14 = BattleAnimSystem_GetAttacker(param0); - v3->unk_18 = BattleAnimSystem_GetAttacker(param0); + if (v3->mode == 0) { + v3->startBattler = BattleAnimSystem_GetAttacker(param0); + v3->endBattler = BattleAnimSystem_GetAttacker(param0); } else { - v3->unk_14 = BattleAnimSystem_GetDefender(param0); - v3->unk_18 = BattleAnimSystem_GetDefender(param0); + v3->startBattler = BattleAnimSystem_GetDefender(param0); + v3->endBattler = BattleAnimSystem_GetDefender(param0); } - if (v3->unk_38 == NULL) { + if (v3->emitter == NULL) { GF_ASSERT(0); } - ov12_02235508(param0, v3->unk_14, &v0); - ov12_02235508(param0, v3->unk_18, &v1); + BattleAnimUtil_GetBattlerWorldPos_Normal(param0, v3->startBattler, &v0); + BattleAnimUtil_GetBattlerWorldPos_Normal(param0, v3->endBattler, &v1); if (v2 == 0) { ov12_02235748(&v0); @@ -3309,40 +3314,40 @@ void ov12_02229C5C(BattleAnimSystem *param0) 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; - for (v5 = 0; v5 < v3->unk_20; v5++) { - PosLerpContext_Update(&v3->unk_A8[0]); + for (v5 = 0; v5 < v3->skipFrames; v5++) { + PosLerpContext_Update(&v3->pos[0]); } - if (v3->unk_24 != 0xFF) { - v3->unk_1C = v3->unk_24 + 1; + if (v3->maxFrames != 0xFF) { + v3->frame = v3->maxFrames + 1; } - SPLEmitter_SetPosX(v3->unk_38, v3->unk_A8[0].x * 172); - SPLEmitter_SetPosY(v3->unk_38, v3->unk_A8[0].y * 172); + SPLEmitter_SetPosX(v3->emitter, v3->pos[0].x * 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) { - UnkStruct_ov12_02229980 *v0 = param1; - BOOL v1 = ov12_02229A50(v0->unk_38); + EmitterAnimationContext *v0 = param1; + BOOL v1 = IsEmitterActive(v0->emitter); - if ((ov12_02225CE4(&v0->unk_A8[0], &v0->unk_A8[1]) == 0) && (v1 == 0)) { - ParticleSystem_DeleteEmitter(v0->unk_34, v0->unk_38); - BattleAnimSystem_EndAnimTask(v0->unk_3C.battleAnimSystem, param0); + if ((ov12_02225CE4(&v0->pos[0], &v0->pos[1]) == 0) && (v1 == 0)) { + ParticleSystem_DeleteEmitter(v0->particleSys, v0->emitter); + BattleAnimSystem_EndAnimTask(v0->common.battleAnimSystem, param0); BattleAnimUtil_Free(v0); (v0) = NULL; return; } else { - SPLEmitter_SetPosX(v0->unk_38, v0->unk_A8[0].x * 172); - SPLEmitter_SetPosY(v0->unk_38, v0->unk_A8[0].y * 172); + SPLEmitter_SetPosX(v0->emitter, v0->pos[0].x * 172); + SPLEmitter_SetPosY(v0->emitter, v0->pos[0].y * 172); } } @@ -3351,45 +3356,45 @@ void ov12_02229E54(BattleAnimSystem *param0) int v0; VecFx32 v1; 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); - ov12_02229980(param0, v3); + BattleAnimSystem_GetCommonData(param0, &v3->common); + EmitterAnimationContext_Init(param0, v3); v0 = BattleAnimUtil_GetTransformDirectionX(param0, BattleAnimSystem_GetAttacker(param0)); - ov12_02235508(param0, v3->unk_14, &v1); - ov12_02235508(param0, v3->unk_18, &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); + BattleAnimUtil_GetBattlerWorldPos_Normal(param0, v3->startBattler, &v1); + BattleAnimUtil_GetBattlerWorldPos_Normal(param0, v3->endBattler, &v2); + 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) { - 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 { - 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; - for (v4 = 0; v4 < v3->unk_20; v4++) { - ov12_02225CE4(&v3->unk_A8[0], &v3->unk_A8[1]); + for (v4 = 0; v4 < v3->skipFrames; v4++) { + ov12_02225CE4(&v3->pos[0], &v3->pos[1]); } - if (v3->unk_24 != 0xFF) { - v3->unk_1C = v3->unk_24 + 1; + if (v3->maxFrames != 0xFF) { + v3->frame = v3->maxFrames + 1; } - SPLEmitter_SetPosX(v3->unk_38, v3->unk_A8[0].x * 172); - SPLEmitter_SetPosY(v3->unk_38, v3->unk_A8[0].y * 172); + SPLEmitter_SetPosX(v3->emitter, v3->pos[0].x * 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) { 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)) { ParticleSystem_DeleteEmitter(v0->unk_34, v0->unk_38); @@ -3428,7 +3433,7 @@ void ov12_0222A00C(BattleAnimSystem *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_34 = BattleAnimSystem_GetParticleSystem(param0, BattleAnimSystem_GetScriptVar(param0, 9)); diff --git a/src/overlay012/ov12_02235254.c b/src/overlay012/ov12_02235254.c index 01e9fd446d..0b684f4779 100644 --- a/src/overlay012/ov12_02235254.c +++ b/src/overlay012/ov12_02235254.c @@ -3,11 +3,14 @@ #include #include +#include "constants/battle.h" #include "constants/battle/battle_anim.h" #include "overlay012/battle_anim_system.h" #include "overlay012/ov12_02235254.h" +#include "camera.h" +#include "fx_util.h" #include "heap.h" #include "inlines.h" #include "math_util.h" @@ -168,228 +171,226 @@ void BattleAnimUtil_GetBattlerDefaultPos(BattleAnimSystem *system, int battler, 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 *v1; - const VecFx32 v2[][24] = { - { - { -9616, -5464, 0x40 }, - { -10240, -6400, 0x40 }, - { -3968, -3328, 0x40 }, - { -6568, -4000, 0x40 }, - { -3968, -3328, 0x40 }, - { -6720, -5792, 0x40 }, - { -8632, -6936, 0x0 }, - { -8632, -6936, 0x0 }, - { -12544, -3840, 0x0 }, - { -12544, -3840, 0x0 }, - { -9632, -5856, 0x0 }, - { -9632, -5856, 0x0 }, - { -4144, -5200, 0x0 }, - { -4144, -5200, 0x0 }, - { -12480, -4288, 0x0 }, - { -12480, -4288, 0x0 }, - { -1792, -4224, 0x0 }, - { -1792, -4224, 0x0 }, - { -8320, -4160, 0x0 }, - { -8320, -4160, 0x0 }, - { 0x2378, 0x15A0, 0x0 }, - { 0x2378, 0x15A0, 0x0 }, - { -6248, -2944, 0x0 }, - { -6248, -2944, 0x0 }, + const VecFx32 particlePositions[][12 * CAMERA_PROJECTION_COUNT] = { + [BATTLER_TYPE_SOLO_PLAYER] = { + VEC_FX32(-2.3477, -1.334, 0.0156), + VEC_FX32(-2.5, -1.5625, 0.0156), + VEC_FX32(-0.9688, -0.8125, 0.0156), + VEC_FX32(-1.6035, -0.9766, 0.0156), + VEC_FX32(-0.9688, -0.8125, 0.0156), + VEC_FX32(-1.6406, -1.414, 0.0156), + VEC_FX32(-2.1074, -1.6934, 0), + VEC_FX32(-2.1074, -1.6934, 0), + VEC_FX32(-3.0625, -0.9375, 0), + VEC_FX32(-3.0625, -0.9375, 0), + VEC_FX32(-2.3516, -1.4297, 0), + VEC_FX32(-2.3516, -1.4297, 0), + VEC_FX32(-1.0117, -1.2695, 0), + VEC_FX32(-1.0117, -1.2695, 0), + VEC_FX32(-3.0469, -1.0469, 0), + VEC_FX32(-3.0469, -1.0469, 0), + VEC_FX32(-0.4375, -1.0312, 0), + VEC_FX32(-0.4375, -1.0312, 0), + VEC_FX32(-2.0312, -1.0156, 0), + VEC_FX32(-2.0312, -1.0156, 0), + VEC_FX32(2.2168, 1.3516, 0), + VEC_FX32(2.2168, 1.3516, 0), + VEC_FX32(-1.5254, -0.7188, 0), + VEC_FX32(-1.5254, -0.7188, 0), }, - { - { 0x2B30, 0x1130, -5248 }, - { 0x2800, 0xC00, -5248 }, - { 0x2480, 0x880, -5248 }, - { 0x2260, 0x1940, -5248 }, - { 0x2480, 0x880, -5248 }, - { 0x38C0, 0x1F60, -5248 }, - { 0x3268, 0x13F4, 0x0 }, - { 0x3268, 0x13F4, 0x0 }, - { 0x1538, 0x1A18, 0x0 }, - { 0x1538, 0x1A18, 0x0 }, - { 0x3358, 0x2C08, 0x0 }, - { 0x3358, 0x2C08, 0x0 }, - { 0x40D0, 0x1430, 0x0 }, - { 0x40D0, 0x1430, 0x0 }, - { 0x3380, 0x1DC0, 0x0 }, - { 0x3380, 0x1DC0, 0x0 }, - { 0x4200, 0xD00, 0x0 }, - { 0x4200, 0xD00, 0x0 }, - { 0x2A80, 0x1180, 0x0 }, - { 0x2A80, 0x1180, 0x0 }, - { -6936, -4832, 0x0 }, - { -6936, -4832, 0x0 }, - { 0x2058, 0x1538, 0x0 }, - { 0x2058, 0x1538, 0x0 }, + [BATTLER_TYPE_SOLO_ENEMY] = { + VEC_FX32(2.6992, 1.0742, -1.2812), + VEC_FX32(2.5, 0.75, -1.2812), + VEC_FX32(2.2812, 0.5312, -1.2812), + VEC_FX32(2.1484, 1.5781, -1.2812), + VEC_FX32(2.2812, 0.5312, -1.2812), + VEC_FX32(3.5469, 1.961, -1.2812), + VEC_FX32(3.1504, 1.247, 0), + VEC_FX32(3.1504, 1.247, 0), + VEC_FX32(1.3262, 1.6309, 0), + VEC_FX32(1.3262, 1.6309, 0), + VEC_FX32(3.209, 2.752, 0), + VEC_FX32(3.209, 2.752, 0), + VEC_FX32(4.0508, 1.2617, 0), + VEC_FX32(4.0508, 1.2617, 0), + VEC_FX32(3.2188, 1.8594, 0), + VEC_FX32(3.2188, 1.8594, 0), + VEC_FX32(4.125, 0.8125, 0), + VEC_FX32(4.125, 0.8125, 0), + VEC_FX32(2.6562, 1.0938, 0), + VEC_FX32(2.6562, 1.0938, 0), + VEC_FX32(-1.6934, -1.1797, 0), + VEC_FX32(-1.6934, -1.1797, 0), + VEC_FX32(2.0215, 1.3262, 0), + VEC_FX32(2.0215, 1.3262, 0), }, - { - { -14936, -5032, 0x40 }, - { -15360, -6272, 0x40 }, - { -9856, -3200, 0x40 }, - { -11400, -2944, 0x40 }, - { -9856, -3200, 0x40 }, - { -9856, -3200, 0x40 }, - { -9456, -3104, 0x0 }, - { -9456, -3104, 0x0 }, - { -17856, -3624, 0x0 }, - { -17856, -3624, 0x0 }, - { -12592, -2976, 0x0 }, - { -12592, -2976, 0x0 }, - { -6366, -3776, 0x0 }, - { -6366, -3776, 0x0 }, - { -14912, -2176, 0x0 }, - { -14912, -2176, 0x0 }, - { -6080, -5504, 0x0 }, - { -6080, -5504, 0x0 }, - { -12032, -3200, 0x0 }, - { -12032, -3200, 0x0 }, - { 0x2A48, 0x1D40, 0x0 }, - { 0x2A48, 0x1D40, 0x0 }, - { -9856, -3200, 0x0 }, - { -9856, -3200, 0x0 }, + [BATTLER_TYPE_PLAYER_SIDE_SLOT_1] = { + VEC_FX32(-3.6465, -1.2285, 0.0156), + VEC_FX32(-3.75, -1.5312, 0.0156), + VEC_FX32(-2.4062, -0.7812, 0.0156), + VEC_FX32(-2.7832, -0.7188, 0.0156), + VEC_FX32(-2.4062, -0.7812, 0.0156), + VEC_FX32(-2.4062, -0.7812, 0.0156), + VEC_FX32(-2.3086, -0.7578, 0), + VEC_FX32(-2.3086, -0.7578, 0), + VEC_FX32(-4.3594, -0.8848, 0), + VEC_FX32(-4.3594, -0.8848, 0), + VEC_FX32(-3.0742, -0.7266, 0), + VEC_FX32(-3.0742, -0.7266, 0), + VEC_FX32(-1.5542, -0.9219, 0), + VEC_FX32(-1.5542, -0.9219, 0), + VEC_FX32(-3.6406, -0.5312, 0), + VEC_FX32(-3.6406, -0.5312, 0), + VEC_FX32(-1.4844, -1.3438, 0), + VEC_FX32(-1.4844, -1.3438, 0), + VEC_FX32(-2.9375, -0.7812, 0), + VEC_FX32(-2.9375, -0.7812, 0), + VEC_FX32(2.6426, 1.8281, 0), + VEC_FX32(2.6426, 1.8281, 0), + VEC_FX32(-2.4062, -0.7812, 0), + VEC_FX32(-2.4062, -0.7812, 0), }, - { - { 0x1CC8, 0x1748, -5248 }, - { 0x3500, 0xB80, -5248 }, - { 0x3500, 0xB80, -5248 }, - { 0x3170, 0x1668, -5248 }, - { 0x3500, 0xB80, -5248 }, - { 0x3500, 0xB80, -5248 }, - { 0x4640, 0x18C0, 0x0 }, - { 0x4640, 0x18C0, 0x0 }, - { 0x1F58, 0x1778, 0x0 }, - { 0x1F58, 0x1778, 0x0 }, - { 0x3310, 0x1840, 0x0 }, - { 0x3310, 0x1840, 0x0 }, - { 0x4400, 0x1440, 0x0 }, - { 0x4400, 0x1440, 0x0 }, - { 0x3F00, 0x1CC0, 0x0 }, - { 0x3F00, 0x1CC0, 0x0 }, - { 0x50C0, 0xD98, 0x0 }, - { 0x50C0, 0xD98, 0x0 }, - { 0x3480, 0x1520, 0x0 }, - { 0x3480, 0x1520, 0x0 }, - { -9536, -3120, 0xAA8 }, - { -9536, -3120, 0xAA8 }, - { 0x3500, 0xB80, 0x0 }, - { 0x3500, 0xB80, 0x0 }, + [BATTLER_TYPE_ENEMY_SIDE_SLOT_1] = { + VEC_FX32(1.7988, 1.455, -1.2812), + VEC_FX32(3.3125, 0.7188, -1.2812), + VEC_FX32(3.3125, 0.7188, -1.2812), + VEC_FX32(3.0898, 1.4004, -1.2812), + VEC_FX32(3.3125, 0.7188, -1.2812), + VEC_FX32(3.3125, 0.7188, -1.2812), + VEC_FX32(4.3906, 1.5469, 0), + VEC_FX32(4.3906, 1.5469, 0), + VEC_FX32(1.959, 1.4668, 0), + VEC_FX32(1.959, 1.4668, 0), + VEC_FX32(3.1914, 1.5156, 0), + VEC_FX32(3.1914, 1.5156, 0), + VEC_FX32(4.25, 1.2656, 0), + VEC_FX32(4.25, 1.2656, 0), + VEC_FX32(3.9375, 1.7969, 0), + VEC_FX32(3.9375, 1.7969, 0), + VEC_FX32(5.0469, 0.8496, 0), + VEC_FX32(5.0469, 0.8496, 0), + VEC_FX32(3.2812, 1.3203, 0), + VEC_FX32(3.2812, 1.3203, 0), + VEC_FX32(-2.3281, -0.7617, 0.666), + VEC_FX32(-2.3281, -0.7617, 0.666), + VEC_FX32(3.3125, 0.7188, 0), + VEC_FX32(3.3125, 0.7188, 0), }, - { - { -5364, -6568, -0x400 }, - { -7552, -6912, -0x400 }, - { -2308, -5632, -0x400 }, - { -2984, -5272, -0x400 }, - { -2308, -5632, -0x400 }, - { -2308, -5632, -0x400 }, - { -2480, -5568, 0x0 }, - { -2480, -5568, 0x0 }, - { -8200, -4776, 0x0 }, - { -8200, -4776, 0x0 }, - { -5600, -6480, 0x0 }, - { -5600, -6480, 0x0 }, - { -632, -5176, 0x0 }, - { -632, -5176, 0x0 }, - { -8448, -8384, 0x0 }, - { -8448, -8384, 0x0 }, - { 0x200, -6528, 0x0 }, - { 0x200, -6528, 0x0 }, - { -6848, -6144, 0x0 }, - { -6848, -6144, 0x0 }, - { 0x1420, 0x1D40, 0x0 }, - { 0x1420, 0x1D40, 0x0 }, - { -2308, -5632, 0x0 }, - { -2308, -5632, 0x0 }, + [BATTLER_TYPE_PLAYER_SIDE_SLOT_2] = { + VEC_FX32(-1.3096, -1.6035, -0.25), + VEC_FX32(-1.8438, -1.6875, -0.25), + VEC_FX32(-0.5635, -1.375, -0.25), + VEC_FX32(-0.7285, -1.287, -0.25), + VEC_FX32(-0.5635, -1.375, -0.25), + VEC_FX32(-0.5635, -1.375, -0.25), + VEC_FX32(-0.6055, -1.3594, 0), + VEC_FX32(-0.6055, -1.3594, 0), + VEC_FX32(-2.002, -1.166, 0), + VEC_FX32(-2.002, -1.166, 0), + VEC_FX32(-1.3672, -1.582, 0), + VEC_FX32(-1.3672, -1.582, 0), + VEC_FX32(-0.1543, -1.2637, 0), + VEC_FX32(-0.1543, -1.2637, 0), + VEC_FX32(-2.0625, -2.0469, 0), + VEC_FX32(-2.0625, -2.0469, 0), + VEC_FX32(0.125, -1.5938, 0), + VEC_FX32(0.125, -1.5938, 0), + VEC_FX32(-1.6719, -1.5, 0), + VEC_FX32(-1.6719, -1.5, 0), + VEC_FX32(1.2578, 1.8281, 0), + VEC_FX32(1.2578, 1.8281, 0), + VEC_FX32(-0.5635, -1.375, 0), + VEC_FX32(-0.5635, -1.375, 0), }, - { - { 0x3B50, 0x1148, -0x1cb0 }, - { 0x1B00, 0x1000, -0x1cb0 }, - { 0x1B00, 0x1000, -0x1cb0 }, - { 0x1AF8, 0x2048, -0x1cb0 }, - { 0x1B00, 0x1000, -0x1cb0 }, - { 0x1B00, 0x1000, -0x1cb0 }, - { 0x3210, 0x15E0, 0x0 }, - { 0x3210, 0x15E0, 0x0 }, - { 0x7D8, 0x1258, 0x0 }, - { 0x7D8, 0x1258, 0x0 }, - { 0x1F58, 0x18A8, 0x0 }, - { 0x1F58, 0x18A8, 0x0 }, - { 0x2E08, 0x1808, 0x0 }, - { 0x2E08, 0x1808, 0x0 }, - { 0x2700, 0x2500, 0x0 }, - { 0x2700, 0x2500, 0x0 }, - { 0x3640, 0xD98, 0x0 }, - { 0x3640, 0xD98, 0x0 }, - { 0x1840, 0x1540, 0x0 }, - { 0x1840, 0x1540, 0x0 }, - { -5408, -6000, 0x0 }, - { -5408, -6000, 0x0 }, - { 0x1B00, 0x1000, 0x0 }, - { 0x1B00, 0x1000, 0x0 }, + [BATTLER_TYPE_ENEMY_SIDE_SLOT_2] = { + VEC_FX32(3.707, 1.08, -1.793), + VEC_FX32(1.6875, 1.0, -1.793), + VEC_FX32(1.6875, 1.0, -1.793), + VEC_FX32(1.6855, 2.0176, -1.793), + VEC_FX32(1.6875, 1.0, -1.793), + VEC_FX32(1.6875, 1.0, -1.793), + VEC_FX32(3.129, 1.3672, 0), + VEC_FX32(3.129, 1.3672, 0), + VEC_FX32(0.4902, 1.1465, 0), + VEC_FX32(0.4902, 1.1465, 0), + VEC_FX32(1.959, 1.541, 0), + VEC_FX32(1.959, 1.541, 0), + VEC_FX32(2.877, 1.502, 0), + VEC_FX32(2.877, 1.502, 0), + VEC_FX32(2.4375, 2.3125, 0), + VEC_FX32(2.4375, 2.3125, 0), + VEC_FX32(3.3906, 0.8496, 0), + VEC_FX32(3.3906, 0.8496, 0), + VEC_FX32(1.5156, 1.3281, 0), + VEC_FX32(1.5156, 1.3281, 0), + VEC_FX32(-1.3203, -1.4648, 0), + VEC_FX32(-1.3203, -1.4648, 0), + VEC_FX32(1.6875, 1.0, 0), + VEC_FX32(1.6875, 1.0, 0), }, - { - { 0x1CC8, -5032, 0x40 }, - { 0x3500, -6272, 0x40 }, - { 0x3500, -3200, 0x40 }, - { 0x3170, -2944, 0x40 }, - { 0x3500, -3200, 0x40 }, - { 0x3500, -3200, 0x40 }, - { 0x3500, -3200, 0x0 }, - { 0x3500, -3200, 0x0 }, - { 0x1D90, -3200, 0x0 }, - { 0x1D90, -3200, 0x0 }, - { 0x3500, -3200, 0x0 }, - { 0x3500, -3200, 0x0 }, - { 0x3500, -3200, 0x0 }, - { 0x3500, -3200, 0x0 }, - { 0x3500, -3200, 0x0 }, - { 0x3500, -3200, 0x0 }, - { 0x3500, -3200, 0x0 }, - { 0x3500, -3200, 0x0 }, - { 0x3500, -3200, 0x0 }, - { 0x3500, -3200, 0x0 }, - { -9536, 0x1D40, 0x0 }, - { -9536, 0x1D40, 0x0 }, - { 0x3500, -3200, 0x0 }, - { 0x3500, -2944, 0x0 }, + [CONTESTANT_TYPE_PLAYER] = { + VEC_FX32(1.7988, -1.2285, 0.0156), + VEC_FX32(3.3125, -1.5312, 0.0156), + VEC_FX32(3.3125, -0.7812, 0.0156), + VEC_FX32(3.0898, -0.7188, 0.0156), + VEC_FX32(3.3125, -0.7812, 0.0156), + VEC_FX32(3.3125, -0.7812, 0.0156), + VEC_FX32(3.3125, -0.7812, 0), + VEC_FX32(3.3125, -0.7812, 0), + VEC_FX32(1.8477, -0.7812, 0), + VEC_FX32(1.8477, -0.7812, 0), + VEC_FX32(3.3125, -0.7812, 0), + VEC_FX32(3.3125, -0.7812, 0), + VEC_FX32(3.3125, -0.7812, 0), + VEC_FX32(3.3125, -0.7812, 0), + VEC_FX32(3.3125, -0.7812, 0), + VEC_FX32(3.3125, -0.7812, 0), + VEC_FX32(3.3125, -0.7812, 0), + VEC_FX32(3.3125, -0.7812, 0), + VEC_FX32(3.3125, -0.7812, 0), + VEC_FX32(3.3125, -0.7812, 0), + VEC_FX32(-2.3281, 1.8281, 0), + VEC_FX32(-2.3281, 1.8281, 0), + VEC_FX32(3.3125, -0.7812, 0), + VEC_FX32(3.3125, -0.7188, 0), }, - { - { -5364, 0x1148, -5248 }, - { -7552, 0x1000, -5248 }, - { -2308, 0x1000, -5248 }, - { -2984, 0x2048, -5248 }, - { -2308, 0x1000, -5248 }, - { -2308, 0x1000, -5248 }, - { -2480, 0x15E0, 0x0 }, - { -2480, 0x15E0, 0x0 }, - { -8200, 0x1258, 0x0 }, - { -8200, 0x1258, 0x0 }, - { -5600, 0x18A8, 0x0 }, - { -5600, 0x18A8, 0x0 }, - { -632, 0x1808, 0x0 }, - { -632, 0x1808, 0x0 }, - { -8448, 0x2500, 0x0 }, - { -8448, 0x2500, 0x0 }, - { 0x200, 0xD98, 0x0 }, - { 0x200, 0xD98, 0x0 }, - { -6848, 0x1540, 0x0 }, - { -6848, 0x1540, 0x0 }, - { 0x1420, -6000, 0xAA8 }, - { 0x1420, -5408, 0xAA8 }, - { -2308, 0x1000, 0x0 }, - { -2984, 0x2048, 0x0 }, + [CONTESTANT_TYPE_ENEMY] = { + VEC_FX32(-1.3096, 1.08, -1.2812), + VEC_FX32(-1.8438, 1.0, -1.2812), + VEC_FX32(-0.5635, 1.0, -1.2812), + VEC_FX32(-0.7285, 2.0176, -1.2812), + VEC_FX32(-0.5635, 1.0, -1.2812), + VEC_FX32(-0.5635, 1.0, -1.2812), + VEC_FX32(-0.6055, 1.3672, 0), + VEC_FX32(-0.6055, 1.3672, 0), + VEC_FX32(-2.002, 1.1465, 0), + VEC_FX32(-2.002, 1.1465, 0), + VEC_FX32(-1.3672, 1.541, 0), + VEC_FX32(-1.3672, 1.541, 0), + VEC_FX32(-0.1543, 1.502, 0), + VEC_FX32(-0.1543, 1.502, 0), + VEC_FX32(-2.0625, 2.3125, 0), + VEC_FX32(-2.0625, 2.3125, 0), + VEC_FX32(0.125, 0.8496, 0), + VEC_FX32(0.125, 0.8496, 0), + VEC_FX32(-1.6719, 1.3281, 0), + VEC_FX32(-1.6719, 1.3281, 0), + VEC_FX32(1.2578, -1.4648, 0.666), + VEC_FX32(1.2578, -1.3203, 0.666), + VEC_FX32(-0.5635, 1.0, 0), + VEC_FX32(-0.7285, 2.0176, 0), }, }; - if (param2 == 1) { - switch (param0) { - case 0: - param0 = 5 + 1; + if (isContest == TRUE) { + switch (battlerType) { + case BATTLER_TYPE_SOLO_PLAYER: + battlerType = CONTESTANT_TYPE_PLAYER; break; - case 1: - param0 = 5 + 2; + case BATTLER_TYPE_SOLO_ENEMY: + battlerType = CONTESTANT_TYPE_ENEMY; break; default: GF_ASSERT(FALSE); @@ -397,82 +398,80 @@ static void ov12_022353CC(int param0, VecFx32 *param1, int param2, int param3, i } } - v0 = param3 + (param4 * 2); - v1 = &v2[param0][v0]; + int index = projection + (posType * CAMERA_PROJECTION_COUNT); + 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) { - 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) { - 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) { - 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) { - 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) { - 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) { - 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) { - 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) { - 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) { - 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) { - 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; - int v2; - ParticleSystem *v3 = BattleAnimSystem_GetCurrentParticleSystem(param0); - v2 = ParticleSystem_GetCameraProjection(v3); - v0 = BattleAnimUtil_GetBattlerType(param0, param1); - v1 = BattleAnimSystem_IsContest(param0); + ParticleSystem *ps = BattleAnimSystem_GetCurrentParticleSystem(system); + enum CameraProjection projection = ParticleSystem_GetCameraProjection(ps); + int battlerType = BattleAnimUtil_GetBattlerType(system, battler); + BOOL isContest = BattleAnimSystem_IsContest(system); - ov12_02235448(v0, param2, v1, v2); + BattleAnimUtil_GetBattlerTypeWorldPos_Normal(battlerType, pos, isContest, projection); } 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) { - ov12_02235448(param0, param1, param2, param3); + BattleAnimUtil_GetBattlerTypeWorldPos_Normal(param0, param1, param2, param3); } void ov12_02235760(int param0, VecFx32 *param1) diff --git a/src/particle_system.c b/src/particle_system.c index f221d128ea..afd7a0bb5b 100644 --- a/src/particle_system.c +++ b/src/particle_system.c @@ -1,5 +1,6 @@ #include "particle_system.h" +#include "nitro/fx/fx_trig.h" #include #include @@ -125,7 +126,7 @@ ParticleSystem *ParticleSystem_New(SPLTexVRAMAllocFunc texAllocFunc, SPLPalVRAMA particleSystem->camera = Camera_Alloc(heapID); VEC_Set(&particleSystem->unused1, 0, 0, 0); - particleSystem->cameraFov = 8192; + particleSystem->cameraFov = FX_DEG_TO_IDX(FX32_CONST(45.0f)); Camera_InitWithTargetAndPosition( &sParticleSystemDefaultCameraTarget,