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 {
CAMERA_PROJECTION_PERSPECTIVE = 0,
CAMERA_PROJECTION_ORTHOGRAPHIC,
CAMERA_PROJECTION_COUNT
};
typedef struct CameraAngle {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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: {

View File

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

View File

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

View File

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

View File

@ -3,11 +3,14 @@
#include <nitro.h>
#include <string.h>
#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)

View File

@ -1,5 +1,6 @@
#include "particle_system.h"
#include "nitro/fx/fx_trig.h"
#include <nitro.h>
#include <string.h>
@ -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,