From a3465e30fc8e2c4f689ede5d92f9b09cbdb02fa8 Mon Sep 17 00:00:00 2001 From: Fexty12573 Date: Tue, 5 Aug 2025 14:08:49 +0200 Subject: [PATCH] Document mimic script func --- include/overlay012/ov12_0222E784.h | 2 +- include/overlay012/ov12_02235254.h | 2 +- src/overlay012/ov12_02226998.c | 2 +- src/overlay012/ov12_02226B84.c | 4 +- src/overlay012/ov12_0222AC70.c | 4 +- src/overlay012/ov12_0222E784.c | 143 ++++++++++++++++------------- src/overlay012/ov12_0222E91C.c | 2 +- src/overlay012/ov12_02234E44.c | 2 +- src/overlay012/ov12_02235254.c | 6 +- 9 files changed, 91 insertions(+), 76 deletions(-) diff --git a/include/overlay012/ov12_0222E784.h b/include/overlay012/ov12_0222E784.h index d481958bb0..9e6a1440d0 100644 --- a/include/overlay012/ov12_0222E784.h +++ b/include/overlay012/ov12_0222E784.h @@ -3,6 +3,6 @@ #include "overlay012/battle_anim_system.h" -void ov12_0222E810(BattleAnimSystem *param0); +void BattleAnimScriptFunc_Mimic(BattleAnimSystem *param0); #endif // POKEPLATINUM_OV12_0222E784_H diff --git a/include/overlay012/ov12_02235254.h b/include/overlay012/ov12_02235254.h index f6299df36d..4cee1eb5e0 100644 --- a/include/overlay012/ov12_02235254.h +++ b/include/overlay012/ov12_02235254.h @@ -85,7 +85,7 @@ void BattleAnimSystem_GetCommonData(BattleAnimSystem *param0, BattleAnimScriptFu void BattleAnimUtil_GetBattlerSprites(BattleAnimSystem *param0, int param1, BattleAnimSpriteInfo *param2, int *param3); void BattleAnimUtil_GetPokemonSprites(BattleAnimSystem *param0, int param1, BattleAnimSpriteInfo *param2, int *param3); void *BattleAnimUtil_Alloc(BattleAnimSystem *param0, int param1); -void ov12_02235E80(void *param0); +void BattleAnimUtil_Free(void *param0); static inline BOOL BattleAnimUtil_IsMaskSet(int value, int mask) { diff --git a/src/overlay012/ov12_02226998.c b/src/overlay012/ov12_02226998.c index a4a5ceba15..45a6545aff 100644 --- a/src/overlay012/ov12_02226998.c +++ b/src/overlay012/ov12_02226998.c @@ -75,7 +75,7 @@ static const BattleAnimScriptFunc sBattleAnimScriptFuncs[] = { BattleAnimScriptFunc_Camouflage, ov12_02228B40, BattleAnimScriptFunc_MoveBattler, - ov12_0222E810, + BattleAnimScriptFunc_Mimic, ov12_0222EAA0, ov12_02228E00, ov12_02228EC0, diff --git a/src/overlay012/ov12_02226B84.c b/src/overlay012/ov12_02226B84.c index 2c0c5f1888..10231ee725 100644 --- a/src/overlay012/ov12_02226B84.c +++ b/src/overlay012/ov12_02226B84.c @@ -3165,7 +3165,7 @@ static void ov12_02229A6C(SysTask *param0, void *param1) 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); - ov12_02235E80(v0); + BattleAnimUtil_Free(v0); (v0) = NULL; return; } else { @@ -3310,7 +3310,7 @@ static void ov12_02229DF0(SysTask *param0, void *param1) 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); - ov12_02235E80(v0); + BattleAnimUtil_Free(v0); (v0) = NULL; return; } else { diff --git a/src/overlay012/ov12_0222AC70.c b/src/overlay012/ov12_0222AC70.c index 8cf68f7b9e..c73b18ff40 100644 --- a/src/overlay012/ov12_0222AC70.c +++ b/src/overlay012/ov12_0222AC70.c @@ -2308,7 +2308,7 @@ static void ov12_0222CBFC(SysTask *param0, void *param1) if (ov12_02225D2C(&v1->unk_8C[0], &v1->unk_8C[1], v1->unk_38) == 0) { Sprite_DeleteAndFreeResources(v1->unk_38); BattleAnimSystem_EndAnimTask(v1->unk_10.battleAnimSystem, param0); - ov12_02235E80(v1); + BattleAnimUtil_Free(v1); (v1) = NULL; return; } @@ -2435,7 +2435,7 @@ static void BattleAnimTask_Surf(SysTask *task, void *param) Sprite_DeleteAndFreeResources(ctx->sprites[0]); Sprite_DeleteAndFreeResources(ctx->sprites[1]); BattleAnimSystem_EndAnimTask(ctx->common.battleAnimSystem, task); - ov12_02235E80(ctx); + BattleAnimUtil_Free(ctx); (ctx) = NULL; return; } diff --git a/src/overlay012/ov12_0222E784.c b/src/overlay012/ov12_0222E784.c index 33262155d8..60b26c40ee 100644 --- a/src/overlay012/ov12_0222E784.c +++ b/src/overlay012/ov12_0222E784.c @@ -1,7 +1,7 @@ #include "overlay012/ov12_0222E784.h" -#include -#include +#include "constants/battle.h" +#include "constants/battle/battle_anim.h" #include "overlay012/battle_anim_system.h" #include "overlay012/ov12_02225864.h" @@ -11,87 +11,102 @@ #include "sprite_system.h" #include "sys_task_manager.h" -typedef struct { - BattleAnimScriptFuncCommon unk_00; - BattleAnimSpriteInfo unk_1C; - BattleAnimSpriteInfo unk_30[2]; - s16 unk_58; - s16 unk_5A; - s16 unk_5C; - XYTransformContext unk_60; -} UnkStruct_ov12_0222E784; +enum { + DEFENDER = 0, + DEFENDER_PARTNER, + DEFENDER_COUNT, +}; -static void ov12_0222E784(SysTask *param0, void *param1) +typedef struct MimicContext { + BattleAnimScriptFuncCommon common; + BattleAnimSpriteInfo defenderSprite; + BattleAnimSpriteInfo opponentSprites[DEFENDER_COUNT]; + s16 defenderY; + s16 defenderHeight; + s16 unused; + XYTransformContext scale; +} MimicContext; + +#define MIMIC_SCALE_X 20 +#define MIMIC_SCALE_Y 20 +#define MIMIC_SCALE_FRAMES 10 + +static void BattleAnimTask_Mimic(SysTask *task, void *param) { - UnkStruct_ov12_0222E784 *v0 = (UnkStruct_ov12_0222E784 *)param1; + MimicContext *ctx = param; - switch (v0->unk_00.state) { - case 0: - if (ScaleLerpContext_UpdateXY(&v0->unk_60) == 0) { - ManagedSprite_SetDrawFlag(v0->unk_1C.hwSprite, 0); - ManagedSprite_SetDrawFlag(v0->unk_30[0].hwSprite, 0); - ManagedSprite_SetDrawFlag(v0->unk_30[0].hwSprite, 0); + switch (ctx->common.state) { + case 0: { + if (ScaleLerpContext_UpdateXY(&ctx->scale) == FALSE) { + ManagedSprite_SetDrawFlag(ctx->defenderSprite.hwSprite, FALSE); + ManagedSprite_SetDrawFlag(ctx->opponentSprites[DEFENDER].hwSprite, FALSE); + ManagedSprite_SetDrawFlag(ctx->opponentSprites[DEFENDER].hwSprite, FALSE); - BattleAnimSystem_EndAnimTask(v0->unk_00.battleAnimSystem, param0); - ov12_02235E80(v0); - (v0) = NULL; + BattleAnimSystem_EndAnimTask(ctx->common.battleAnimSystem, task); + BattleAnimUtil_Free(ctx); + ctx = NULL; return; } - { - f32 v1, v2; - - ScaleLerpContext_GetAffineScale(&v0->unk_60, &v1, &v2); - ManagedSprite_SetAffineScale(v0->unk_1C.hwSprite, v1, v2); - BattleAnimUtil_SetSpriteAnchoredPosition(v0->unk_1C.hwSprite, v0->unk_58, v0->unk_5A, v0->unk_60.data[4], 0); - } - break; + f32 scaleX, scaleY; + ScaleLerpContext_GetAffineScale(&ctx->scale, &scaleX, &scaleY); + ManagedSprite_SetAffineScale(ctx->defenderSprite.hwSprite, scaleX, scaleY); + BattleAnimUtil_SetSpriteAnchoredPosition( + ctx->defenderSprite.hwSprite, + ctx->defenderY, + ctx->defenderHeight, + ctx->scale.data[XY_PARAM_CUR_Y], + BATTLE_ANIM_ANCHOR_BOTTOM); + } break; default: return; } - ManagedSprite_TickFrame(v0->unk_1C.hwSprite); - ManagedSprite_TickFrame(v0->unk_30[0].hwSprite); - ManagedSprite_TickFrame(v0->unk_30[1].hwSprite); - SpriteSystem_DrawSprites(v0->unk_00.pokemonSpriteManager); + ManagedSprite_TickFrame(ctx->defenderSprite.hwSprite); + ManagedSprite_TickFrame(ctx->opponentSprites[DEFENDER].hwSprite); + ManagedSprite_TickFrame(ctx->opponentSprites[DEFENDER_PARTNER].hwSprite); + SpriteSystem_DrawSprites(ctx->common.pokemonSpriteManager); } -void ov12_0222E810(BattleAnimSystem *param0) +void BattleAnimScriptFunc_Mimic(BattleAnimSystem *system) { - UnkStruct_ov12_0222E784 *v0 = BattleAnimUtil_Alloc(param0, sizeof(UnkStruct_ov12_0222E784)); + MimicContext *ctx = BattleAnimUtil_Alloc(system, sizeof(MimicContext)); - BattleAnimSystem_GetCommonData(param0, &v0->unk_00); + BattleAnimSystem_GetCommonData(system, &ctx->common); - v0->unk_1C.monSprite = BattleAnimSystem_GetBattlerSprite(v0->unk_00.battleAnimSystem, BattleAnimSystem_GetDefender(v0->unk_00.battleAnimSystem)); - v0->unk_58 = PokemonSprite_GetAttribute(v0->unk_1C.monSprite, MON_SPRITE_Y_CENTER); - v0->unk_5C = v0->unk_58; - v0->unk_5A = BattleAnimSystem_GetBattlerSpriteHeight(v0->unk_00.battleAnimSystem, BattleAnimSystem_GetDefender(v0->unk_00.battleAnimSystem)); - v0->unk_1C.hwSprite = BattleAnimSystem_GetPokemonSprite(param0, 0); - v0->unk_30[0].hwSprite = BattleAnimSystem_GetPokemonSprite(param0, 1); - v0->unk_30[1].hwSprite = BattleAnimSystem_GetPokemonSprite(param0, 2); + ctx->defenderSprite.monSprite = BattleAnimSystem_GetBattlerSprite(ctx->common.battleAnimSystem, BattleAnimSystem_GetDefender(ctx->common.battleAnimSystem)); + ctx->defenderY = PokemonSprite_GetAttribute(ctx->defenderSprite.monSprite, MON_SPRITE_Y_CENTER); + ctx->unused = ctx->defenderY; + ctx->defenderHeight = BattleAnimSystem_GetBattlerSpriteHeight(ctx->common.battleAnimSystem, BattleAnimSystem_GetDefender(ctx->common.battleAnimSystem)); + ctx->defenderSprite.hwSprite = BattleAnimSystem_GetPokemonSprite(system, BATTLE_ANIM_MON_SPRITE_0); + ctx->opponentSprites[DEFENDER].hwSprite = BattleAnimSystem_GetPokemonSprite(system, BATTLE_ANIM_MON_SPRITE_1); + ctx->opponentSprites[DEFENDER_PARTNER].hwSprite = BattleAnimSystem_GetPokemonSprite(system, BATTLE_ANIM_MON_SPRITE_2); - ManagedSprite_SetAffineOverwriteMode(v0->unk_1C.hwSprite, AFFINE_OVERWRITE_MODE_DOUBLE); - ManagedSprite_SetExplicitPriority(v0->unk_1C.hwSprite, BattleAnimSystem_GetPokemonSpritePriority(param0)); - ManagedSprite_SetExplicitPriority(v0->unk_30[0].hwSprite, BattleAnimSystem_GetPokemonSpritePriority(param0)); - ManagedSprite_SetExplicitPriority(v0->unk_30[1].hwSprite, BattleAnimSystem_GetPokemonSpritePriority(param0)); + ManagedSprite_SetAffineOverwriteMode(ctx->defenderSprite.hwSprite, AFFINE_OVERWRITE_MODE_DOUBLE); + ManagedSprite_SetExplicitPriority(ctx->defenderSprite.hwSprite, BattleAnimSystem_GetPokemonSpritePriority(system)); + ManagedSprite_SetExplicitPriority(ctx->opponentSprites[DEFENDER].hwSprite, BattleAnimSystem_GetPokemonSpritePriority(system)); + ManagedSprite_SetExplicitPriority(ctx->opponentSprites[DEFENDER_PARTNER].hwSprite, BattleAnimSystem_GetPokemonSpritePriority(system)); - { - int v1; - - v1 = BattleAnimSystem_GetBattlerType(v0->unk_00.battleAnimSystem, BattleAnimSystem_GetDefender(v0->unk_00.battleAnimSystem)); - - if ((v1 == 3) || (v1 == 4)) { - ManagedSprite_SetPriority(v0->unk_1C.hwSprite, 30); - ManagedSprite_SetPriority(v0->unk_30[0].hwSprite, 50); - ManagedSprite_SetPriority(v0->unk_30[1].hwSprite, 70); - } else { - ManagedSprite_SetPriority(v0->unk_1C.hwSprite, 60); - ManagedSprite_SetPriority(v0->unk_30[0].hwSprite, 70); - ManagedSprite_SetPriority(v0->unk_30[1].hwSprite, 50); - } + int defenderType = BattleAnimSystem_GetBattlerType(ctx->common.battleAnimSystem, BattleAnimSystem_GetDefender(ctx->common.battleAnimSystem)); + if (defenderType == BATTLER_TYPE_ENEMY_SIDE_SLOT_1 || defenderType == BATTLER_TYPE_PLAYER_SIDE_SLOT_2) { + ManagedSprite_SetPriority(ctx->defenderSprite.hwSprite, 30); + ManagedSprite_SetPriority(ctx->opponentSprites[DEFENDER].hwSprite, 50); + ManagedSprite_SetPriority(ctx->opponentSprites[DEFENDER_PARTNER].hwSprite, 70); + } else { + ManagedSprite_SetPriority(ctx->defenderSprite.hwSprite, 60); + ManagedSprite_SetPriority(ctx->opponentSprites[DEFENDER].hwSprite, 70); + ManagedSprite_SetPriority(ctx->opponentSprites[DEFENDER_PARTNER].hwSprite, 50); } - ScaleLerpContext_InitXY(&v0->unk_60, 100, 20, 100, 20, 100, 10); - BattleAnimSystem_StartAnimTask(v0->unk_00.battleAnimSystem, ov12_0222E784, v0); + ScaleLerpContext_InitXY( + &ctx->scale, + BASE_SCALE_XY, + MIMIC_SCALE_X, + BASE_SCALE_XY, + MIMIC_SCALE_Y, + BASE_SCALE_XY, + MIMIC_SCALE_FRAMES); + + BattleAnimSystem_StartAnimTask(ctx->common.battleAnimSystem, BattleAnimTask_Mimic, ctx); } diff --git a/src/overlay012/ov12_0222E91C.c b/src/overlay012/ov12_0222E91C.c index e39ef5b960..d9ad5e9c31 100644 --- a/src/overlay012/ov12_0222E91C.c +++ b/src/overlay012/ov12_0222E91C.c @@ -127,7 +127,7 @@ static void ov12_0222E91C(SysTask *param0, void *param1) } break; default: BattleAnimSystem_EndAnimTask(v0->unk_00.battleAnimSystem, param0); - ov12_02235E80(v0); + BattleAnimUtil_Free(v0); (v0) = NULL; return; } diff --git a/src/overlay012/ov12_02234E44.c b/src/overlay012/ov12_02234E44.c index ca5f38b6ed..9df8ca2f96 100644 --- a/src/overlay012/ov12_02234E44.c +++ b/src/overlay012/ov12_02234E44.c @@ -113,7 +113,7 @@ static void ov12_02234EF0(SysTask *param0, void *param1) Bg_SetOffset(v0->unk_18.bgConfig, 2, 3, 0); GX_SetVisibleWnd(GX_WNDMASK_NONE); BattleAnimSystem_EndAnimTask(v0->unk_18.battleAnimSystem, param0); - ov12_02235E80(v0); + BattleAnimUtil_Free(v0); (v0) = NULL; return; } diff --git a/src/overlay012/ov12_02235254.c b/src/overlay012/ov12_02235254.c index ecfd2da7f5..3ac31dd9ed 100644 --- a/src/overlay012/ov12_02235254.c +++ b/src/overlay012/ov12_02235254.c @@ -919,8 +919,8 @@ void *BattleAnimUtil_Alloc(BattleAnimSystem *system, int size) return ptr; } -void ov12_02235E80(void *param0) +void BattleAnimUtil_Free(void *ptr) { - GF_ASSERT(param0 != NULL); - Heap_Free(param0); + GF_ASSERT(ptr != NULL); + Heap_Free(ptr); }