Document the Party Menu Form Change animation (Overlay 118) (#938)
Some checks are pending
build / build (push) Waiting to run

This commit is contained in:
VicSevenT 2026-02-08 14:59:06 -06:00 committed by GitHub
parent 27b079ab0e
commit 28cb4b855e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
23 changed files with 350 additions and 345 deletions

View File

@ -10,7 +10,6 @@
#include "field/field_system_decl.h"
#include "functypes/funcptr_0207F248.h"
#include "overlay118/struct_ov118_021D0FDC_decl.h"
#include "bag.h"
#include "battle_regulation.h"
@ -22,6 +21,7 @@
#include "grid_menu_cursor_position.h"
#include "menu.h"
#include "message.h"
#include "particle_system.h"
#include "party.h"
#include "pokedex_heightweight.h"
#include "sprite.h"
@ -231,6 +231,16 @@ typedef struct PartyMenuMember {
u8 isPresent;
} PartyMenuMember;
typedef struct PartyMenuFormChange {
int state;
int elapsedFrames;
int framesBeforeFormChange;
int species;
u32 narcIdx;
int partySlot;
ParticleSystem *ps;
} PartyMenuFormChange;
#define PARTY_MENU_MEMBER_PANEL_SIZE_TILES 96
typedef struct PartyOrderSwitchData {
@ -281,8 +291,8 @@ typedef struct PartyMenuApplication {
u8 unk_B13;
u16 monStats[6];
HeightWeightData *heightWeight;
OverlayMetadata *unk_B24;
G3DPipelineBuffers *unk_B28;
PartyMenuFormChange *formChanger;
G3DPipelineBuffers *formChange3DPipeline;
} PartyMenuApplication;
#endif // POKEPLATINUM_PARTY_MENU_DEFS_H

View File

@ -0,0 +1,9 @@
#ifndef POKEPLATINUM_APPLICATIONS_PARTY_MENU_FORM_CHANGE_H
#define POKEPLATINUM_APPLICATIONS_PARTY_MENU_FORM_CHANGE_H
#include "applications/party_menu/defs.h"
void PartyMenuFormChange_Init(PartyMenuApplication *app);
BOOL PartyMenuFormChange_ChangeForm(PartyMenuApplication *app);
#endif // POKEPLATINUM_APPLICATIONS_PARTY_MENU_FORM_CHANGE_H

View File

@ -13,7 +13,7 @@
extern const ApplicationManagerTemplate gPokemonPartyAppTemplate;
void sub_0207EA74(PartyMenuApplication *application, int param1);
void PartyMenu_UpdateFormChangeGraphicsMode(PartyMenuApplication *application, BOOL isTeardown);
u8 sub_0207EF04(PartyMenuApplication *application, u8 param1);
u8 PartyMenu_LoadMember(PartyMenuApplication *application, u8 slot);
const u16 *sub_0207F248(PartyMenuApplication *application);
@ -29,7 +29,7 @@ u32 sub_02081934(void);
u32 sub_02081938(void);
u32 sub_0208193C(void);
void PartyMenu_LoadMemberPanelTilemaps(enum HeapID heapID, u16 *leadMember, u16 *backMembers, u16 *noMember);
void LoadOverlay118(PartyMenuApplication *application);
void UnloadOverlay118(PartyMenuApplication *application);
void PartyMenu_SetupFormChangeAnim(PartyMenuApplication *application);
void PartyMenu_TeardownFormChangeAnim(PartyMenuApplication *application);
#endif // POKEPLATINUM_PARTY_MENU_MAIN_H

View File

@ -1,9 +0,0 @@
#ifndef POKEPLATINUM_OV118_021D0D80_H
#define POKEPLATINUM_OV118_021D0D80_H
#include "applications/party_menu/defs.h"
void ov118_021D0D80(PartyMenuApplication *param0);
int ov118_021D0DBC(PartyMenuApplication *param0);
#endif // POKEPLATINUM_OV118_021D0D80_H

View File

@ -1,6 +0,0 @@
#ifndef POKEPLATINUM_STRUCT_OV118_021D0FDC_DECL_H
#define POKEPLATINUM_STRUCT_OV118_021D0FDC_DECL_H
typedef struct OverlayMetadata_t OverlayMetadata;
#endif // POKEPLATINUM_STRUCT_OV118_021D0FDC_DECL_H

View File

@ -320,7 +320,7 @@ res/prebuilt/application/balloon/graphic/balloon_gra.narc,/application/balloon/g
res/prebuilt/application/wifi_lobby/map_conv/wflby_map.narc,/application/wifi_lobby/map_conv/wflby_map.narc
res/prebuilt/fielddata/tornworld/tw_arc.narc,/fielddata/tornworld/tw_arc.narc
res/prebuilt/fielddata/tornworld/tw_arc_attr.narc,/fielddata/tornworld/tw_arc_attr.narc
res/prebuilt/particledata/pl_pokelist/pokelist_particle.narc,/particledata/pl_pokelist/pokelist_particle.narc
res/graphics/party_menu/form_changes/form_change_effects.narc,/particledata/pl_pokelist/pokelist_particle.narc
res/prebuilt/battle/b_pl_stage/pl_bsdpm.narc,/battle/b_pl_stage/pl_bsdpm.narc
res/trainers/frontier/pl_btdpm.narc,/battle/b_pl_tower/pl_btdpm.narc
res/trainers/frontier/pl_btdtr.narc,/battle/b_pl_tower/pl_btdtr.narc

1 Source File Target File
320 res/prebuilt/application/wifi_lobby/map_conv/wflby_map.narc /application/wifi_lobby/map_conv/wflby_map.narc
321 res/prebuilt/fielddata/tornworld/tw_arc.narc /fielddata/tornworld/tw_arc.narc
322 res/prebuilt/fielddata/tornworld/tw_arc_attr.narc /fielddata/tornworld/tw_arc_attr.narc
323 res/prebuilt/particledata/pl_pokelist/pokelist_particle.narc res/graphics/party_menu/form_changes/form_change_effects.narc /particledata/pl_pokelist/pokelist_particle.narc
324 res/prebuilt/battle/b_pl_stage/pl_bsdpm.narc /battle/b_pl_stage/pl_bsdpm.narc
325 res/trainers/frontier/pl_btdpm.narc /battle/b_pl_tower/pl_btdpm.narc
326 res/trainers/frontier/pl_btdtr.narc /battle/b_pl_tower/pl_btdtr.narc

View File

@ -319,7 +319,7 @@ da56afbb7a3f070d8e14f99c9ba6334f7d9b6c2e *res/field/frontier_scripts/fr_script.n
7fecc969c3a9d6ee05e8157505458927476def4d *res/prebuilt/application/wifi_lobby/map_conv/wflby_map.narc
def7833f7d5b18328cbe9cc5d5331ff634b082cc *res/prebuilt/fielddata/tornworld/tw_arc.narc
bf51c9691b15f9aff257a3e8012dc36bd015619f *res/prebuilt/fielddata/tornworld/tw_arc_attr.narc
ad8bf1d7e289c679e0d2c844ba1700fb2e61fedd *res/prebuilt/particledata/pl_pokelist/pokelist_particle.narc
ad8bf1d7e289c679e0d2c844ba1700fb2e61fedd *res/graphics/party_menu/form_changes/form_change_effects.narc
ecdb14e0bc6619f114549e6126c8b6934cfc3aeb *res/prebuilt/battle/b_pl_stage/pl_bsdpm.narc
2dac84a8a4c8dca13be326dc071ecbd550eb2ee7 *res/trainers/frontier/pl_btdpm.narc
738eeff4bee6a7cfbc8d448f23f58ad52ce76314 *res/trainers/frontier/pl_btdtr.narc

View File

@ -1691,10 +1691,10 @@ Overlay overlay117
Object main.nef.p/src_overlay117_ov117_022666C0.c.o
}
Overlay overlay118
Overlay party_menu_form_change
{
After main
Object main.nef.p/src_overlay118_ov118_021D0D80.c.o
Object main.nef.p/src_applications_party_menu_form_change.c.o
}
Overlay overlay119

View File

@ -115,7 +115,7 @@ eb9d61aa9d3ad877f55af30ff212ecc7094049c5 *overlay111.sbin
dd0e40ce15f9bc1eccf25bc29f481a1835098c7b *overlay115.sbin
248a912b8adc0cb4df962256b8b7b557bbd613af *overlay116.sbin
9a00f7bf15c8b90ba46dafe5ec5e924684b1d270 *overlay117.sbin
babc139fb62af0f7e4320b62089eaed7b2dfa3bb *overlay118.sbin
babc139fb62af0f7e4320b62089eaed7b2dfa3bb *party_menu_form_change.sbin
76b46eb4dd4d8b21665e7a2488cccf060911cc0a *overlay119.sbin
637cf7c59d68702453016a1bf2a1c0d101809912 *library_tv.sbin
67a01b02f9d9c8135e57bf274c6a75bf0c2c9be2 *dw_warp.sbin

View File

@ -0,0 +1,2 @@
giratina.spa
shaymin.spa

Binary file not shown.

View File

@ -0,0 +1,26 @@
form_change_effects_files = files(
'giratina.spa',
'shaymin.spa',
)
form_change_effects_order = files('form_change_effects.order')
form_change_effects_narc = custom_target('form_change_effects_narc',
output: [
'form_change_effects.narc',
'form_change_effects.naix.h',
],
input: copy_gen.process(
form_change_effects_files,
),
command: [
narc_exe, 'create',
'--naix',
'--order', form_change_effects_order,
'--output', '@OUTPUT0@',
'@PRIVATE_DIR@',
]
)
nitrofs_files += form_change_effects_narc
naix_headers += form_change_effects_narc[1]

Binary file not shown.

View File

@ -1,3 +1,5 @@
subdir('form_changes')
party_menu_narc = custom_target('party_menu_graphics.narc',
output: [
'party_menu_graphics.narc',

View File

@ -1,6 +1,5 @@
subdir('pl_etc')
subdir('pl_frontier')
subdir('pl_pokelist')
prebuilt_files = [
'particledata.narc'
@ -8,4 +7,4 @@ prebuilt_files = [
foreach f : prebuilt_files
nitrofs_files += fs.copyfile(f)
endforeach
endforeach

View File

@ -1,7 +0,0 @@
prebuilt_files = [
'pokelist_particle.narc'
]
foreach f : prebuilt_files
nitrofs_files += fs.copyfile(f)
endforeach

View File

@ -990,7 +990,7 @@
]
},
{
"id": "pl_msg_00000453_00202",
"id": "PartyMenu_Text_ChangedForm",
"en_US": "{STRVAR_1 0, 0, 0} changed Forme!"
},
{

View File

@ -0,0 +1,252 @@
#include "applications/party_menu/form_change.h"
#include <nitro.h>
#include "generated/species.h"
#include "applications/party_menu/defs.h"
#include "applications/party_menu/main.h"
#include "applications/party_menu/sprites.h"
#include "applications/party_menu/windows.h"
#include "camera.h"
#include "enums.h"
#include "field_system.h"
#include "gx_layers.h"
#include "heap.h"
#include "message.h"
#include "particle_system.h"
#include "party.h"
#include "pokedex.h"
#include "pokemon.h"
#include "sound_playback.h"
#include "string_gf.h"
#include "string_template.h"
#include "text.h"
#include "unk_0202419C.h"
#include "res/graphics/party_menu/form_changes/form_change_effects.naix.h"
#include "res/text/bank/party_menu.h"
static void PartyMenuFormChange_Free(PartyMenuApplication *app);
static void SetupAnimation(PartyMenuApplication *app);
static void TeardownAnimation(PartyMenuApplication *app);
static void CreateParticleSystem(PartyMenuFormChange *formChanger);
static void LoadParticleResources(PartyMenuFormChange *formChanger);
static int DrawParticleSystem(void);
static void FreeParticleSystem(PartyMenuFormChange *formChanger);
static u32 AllocTexVram(u32 size, BOOL is4x4comp);
static u32 AllocPaletteVram(u32 size, BOOL is4pltt);
static void EmitterCallback(SPLEmitter *emitter);
static const fx32 sPartySlotParticlePositions[][2] = {
{ FX32_CONST(-4.0283203125), FX32_CONST(2.9296875) },
{ FX32_CONST(1.220703125), FX32_CONST(2.8076171875) },
{ FX32_CONST(-4.0283203125), FX32_CONST(1.220703125) },
{ FX32_CONST(1.220703125), FX32_CONST(0.8544921875) },
{ FX32_CONST(-4.0283203125), FX32_CONST(-0.732421875) },
{ FX32_CONST(1.220703125), FX32_CONST(-1.0986328125) }
};
void PartyMenuFormChange_Init(PartyMenuApplication *app)
{
GF_ASSERT(app->formChanger == NULL);
app->formChanger = Heap_Alloc(HEAP_ID_PARTY_MENU, sizeof(PartyMenuFormChange));
MI_CpuClear8(app->formChanger, sizeof(PartyMenuFormChange));
app->formChanger->partySlot = app->currPartySlot;
}
BOOL PartyMenuFormChange_ChangeForm(PartyMenuApplication *app)
{
PartyMenuFormChange *formChanger = app->formChanger;
Pokemon *mon = Party_GetPokemonBySlotIndex(app->partyMenu->party, app->currPartySlot);
switch (formChanger->state) {
case 0:
formChanger->species = Pokemon_GetValue(mon, MON_DATA_SPECIES, NULL);
switch (formChanger->species) {
case SPECIES_GIRATINA:
Pokemon_SetGiratinaFormByHeldItem(mon);
formChanger->framesBeforeFormChange = 65;
formChanger->narcIdx = giratina_spa;
break;
case SPECIES_SHAYMIN:
Pokemon_SetShayminForm(mon, SHAYMIN_FORM_SKY);
formChanger->framesBeforeFormChange = 35;
formChanger->narcIdx = shaymin_spa;
break;
case SPECIES_ROTOM:
default:
GF_ASSERT(0);
break;
}
Pokedex_Capture(SaveData_GetPokedex(FieldSystem_GetSaveData(app->partyMenu->fieldSystem)), mon);
formChanger->state++;
break;
case 1:
case 2:
formChanger->state++;
break;
case 3:
SetupAnimation(app);
formChanger->state++;
break;
case 4:
GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 1);
LoadParticleResources(formChanger);
formChanger->state++;
break;
case 5:
formChanger->elapsedFrames++;
if (formChanger->elapsedFrames == formChanger->framesBeforeFormChange) {
PartyMenu_LoadMemberSpeciesIcon(app, app->currPartySlot);
}
DrawParticleSystem();
if (formChanger->elapsedFrames > formChanger->framesBeforeFormChange && ParticleSystem_GetActiveEmitterCount(formChanger->ps) == 0) {
formChanger->state++;
}
break;
case 6:
TeardownAnimation(app);
formChanger->state++;
break;
case 7:
Pokemon_PlayCry(mon);
formChanger->state++;
break;
case 8:
if (!Sound_IsPokemonCryPlaying()) {
formChanger->state++;
}
break;
case 9: {
String *msg = MessageLoader_GetNewString(app->messageLoader, PartyMenu_Text_ChangedForm);
StringTemplate_SetNickname(app->template, 0, Pokemon_GetBoxPokemon(mon));
StringTemplate_Format(app->template, app->tmpString, msg);
String_Free(msg);
PartyMenu_PrintLongMessage(app, PRINT_MESSAGE_PRELOADED, TRUE);
}
formChanger->state++;
break;
case 10:
if (!Text_IsPrinterActive(app->textPrinterID)) {
PartyMenuFormChange_Free(app);
app->partyMenu->menuSelectionResult = 0;
return TRUE;
}
break;
}
return FALSE;
}
static void PartyMenuFormChange_Free(PartyMenuApplication *app)
{
Heap_Free(app->formChanger);
app->formChanger = NULL;
}
static void SetupAnimation(PartyMenuApplication *app)
{
PartyMenu_UpdateFormChangeGraphicsMode(app, FALSE);
CreateParticleSystem(app->formChanger);
G2_SetBlendAlpha(GX_BLEND_PLANEMASK_NONE, GX_BLEND_ALL, 31, 0);
}
static void TeardownAnimation(PartyMenuApplication *app)
{
FreeParticleSystem(app->formChanger);
PartyMenu_UpdateFormChangeGraphicsMode(app, TRUE);
G2_BlendNone();
}
static void CreateParticleSystem(PartyMenuFormChange *formChanger)
{
ParticleSystem_ZeroAll();
void *heap = Heap_Alloc(HEAP_ID_PARTY_MENU, 0x4800);
formChanger->ps = ParticleSystem_New(AllocTexVram, AllocPaletteVram, heap, 0x4800, TRUE, HEAP_ID_PARTY_MENU);
Camera *camera = ParticleSystem_GetCamera(formChanger->ps);
Camera_SetClipping(FX32_ONE, FX32_CONST(900), camera);
}
static void LoadParticleResources(PartyMenuFormChange *formChanger)
{
void *resource = ParticleSystem_LoadResourceFromNARC(NARC_INDEX_PARTICLEDATA__PL_POKELIST__POKELIST_PARTICLE, formChanger->narcIdx, HEAP_ID_PARTY_MENU);
ParticleSystem_SetResource(formChanger->ps, resource, VRAM_AUTO_RELEASE_TEXTURE_LNK | VRAM_AUTO_RELEASE_PALETTE_LNK, TRUE);
switch (formChanger->species) {
case SPECIES_GIRATINA:
ParticleSystem_CreateEmitterWithCallback(formChanger->ps, 0, EmitterCallback, formChanger);
ParticleSystem_CreateEmitterWithCallback(formChanger->ps, 1, EmitterCallback, formChanger);
ParticleSystem_CreateEmitterWithCallback(formChanger->ps, 2, EmitterCallback, formChanger);
Sound_PlayEffect(SEQ_SE_PL_W467109);
break;
case SPECIES_SHAYMIN:
ParticleSystem_CreateEmitterWithCallback(formChanger->ps, 0, EmitterCallback, formChanger);
ParticleSystem_CreateEmitterWithCallback(formChanger->ps, 1, EmitterCallback, formChanger);
Sound_PlayEffect(SEQ_SE_PL_W363);
break;
}
}
static void EmitterCallback(SPLEmitter *emitter)
{
PartyMenuFormChange *formChanger = ParticleSystem_GetEmitterCallbackParam();
SPLEmitter_SetPosX(emitter, sPartySlotParticlePositions[formChanger->partySlot][0]);
SPLEmitter_SetPosY(emitter, sPartySlotParticlePositions[formChanger->partySlot][1]);
}
static int DrawParticleSystem(void)
{
G3_ResetG3X();
int drawn = ParticleSystem_DrawAll();
if (drawn > 0) {
G3_ResetG3X();
}
ParticleSystem_UpdateAll();
G3_RequestSwapBuffers(GX_SORTMODE_MANUAL, GX_BUFFERMODE_Z);
return drawn;
}
static void FreeParticleSystem(PartyMenuFormChange *formChanger)
{
void *heap = ParticleSystem_GetHeapStart(formChanger->ps);
ParticleSystem_Free(formChanger->ps);
Heap_Free(heap);
}
static u32 AllocTexVram(u32 size, BOOL is4x4comp)
{
NNSGfdTexKey texKey = NNS_GfdAllocTexVram(size, is4x4comp, 0);
GF_ASSERT(texKey != NNS_GFD_ALLOC_ERROR_TEXKEY);
ParticleSystem_RegisterTextureKey(texKey);
return NNS_GfdGetTexKeyAddr(texKey);
}
static u32 AllocPaletteVram(u32 size, BOOL is4pltt)
{
NNSGfdPlttKey plttKey = NNS_GfdAllocPlttVram(size, is4pltt, NNS_GFD_ALLOC_FROM_LOW);
GF_ASSERT(plttKey != NNS_GFD_ALLOC_ERROR_PLTTKEY);
ParticleSystem_RegisterPaletteKey(plttKey);
return NNS_GfdGetPlttKeyAddr(plttKey);
}

View File

@ -13,6 +13,7 @@
#include "generated/pokemon_contest_types.h"
#include "applications/party_menu/defs.h"
#include "applications/party_menu/form_change.h"
#include "applications/party_menu/main.h"
#include "applications/party_menu/sprites.h"
#include "applications/party_menu/unk_02083370.h"
@ -21,7 +22,6 @@
#include "applications/pokemon_summary_screen/main.h"
#include "field/field_system.h"
#include "functypes/funcptr_0207E634.h"
#include "overlay118/ov118_021D0D80.h"
#include "bag.h"
#include "battle_regulation.h"
@ -67,7 +67,7 @@
#include "res/graphics/party_menu/party_menu_graphics.naix.h"
#include "res/text/bank/party_menu.h"
FS_EXTERN_OVERLAY(overlay118);
FS_EXTERN_OVERLAY(party_menu_form_change);
typedef struct MemberPanelTemplate {
u16 panelX;
@ -141,9 +141,9 @@ static u8 CheckDuplicateValues(PartyMenuApplication *application);
static u8 CheckUniqueValues(PartyMenuApplication *application);
static u8 CheckEqualityInArray(PartyMenuApplication *application);
static BOOL ShouldShowSubscreen(PartyMenuApplication *application);
static G3DPipelineBuffers *sub_0207EAD4(enum HeapID heapID);
static void sub_0207EAF4(void);
static void sub_0207EB64(G3DPipelineBuffers *param0);
static G3DPipelineBuffers *InitG3DPipeline(enum HeapID heapID);
static void G3DPipelineCallback(void);
static void FreeG3DPipeline(G3DPipelineBuffers *pipelineBuffers);
static int ProcessMessageResult(PartyMenuApplication *application);
static int HandleOverlayCompletion(PartyMenuApplication *application);
static void DrawMemberPanels_Standard(PartyMenuApplication *application, const MemberPanelTemplate *templates);
@ -451,8 +451,8 @@ static BOOL PartyMenu_Main(ApplicationManager *appMan, int *state)
*state = ProcessWindowInput(v0);
break;
case 31:
if (ov118_021D0DBC(v0) == 1) {
UnloadOverlay118(v0);
if (PartyMenuFormChange_ChangeForm(v0) == 1) {
PartyMenu_TeardownFormChangeAnim(v0);
*state = 25;
} else {
*state = 31;
@ -867,17 +867,17 @@ static void sub_0207EA24(BgConfig *param0)
Heap_FreeExplicit(HEAP_ID_PARTY_MENU, param0);
}
void sub_0207EA74(PartyMenuApplication *application, int param1)
void PartyMenu_UpdateFormChangeGraphicsMode(PartyMenuApplication *application, BOOL isTeardown)
{
if (param1 == 0) {
if (!isTeardown) {
Bg_ToggleLayer(BG_LAYER_MAIN_0, 0);
Bg_FreeTilemapBuffer(application->bgConfig, BG_LAYER_MAIN_0);
GX_SetGraphicsMode(GX_DISPMODE_GRAPHICS, GX_BGMODE_0, GX_BG0_AS_3D);
application->unk_B28 = sub_0207EAD4(HEAP_ID_PARTY_MENU);
application->formChange3DPipeline = InitG3DPipeline(HEAP_ID_PARTY_MENU);
} else {
GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 0);
sub_0207EB64(application->unk_B28);
FreeG3DPipeline(application->formChange3DPipeline);
GX_SetGraphicsMode(GX_DISPMODE_GRAPHICS, GX_BGMODE_0, GX_BG0_AS_2D);
@ -886,26 +886,26 @@ void sub_0207EA74(PartyMenuApplication *application, int param1)
}
}
static G3DPipelineBuffers *sub_0207EAD4(enum HeapID heapID)
static G3DPipelineBuffers *InitG3DPipeline(enum HeapID heapID)
{
return G3DPipeline_Init(heapID, TEXTURE_VRAM_SIZE_128K, PALETTE_VRAM_SIZE_32K, sub_0207EAF4);
return G3DPipeline_Init(heapID, TEXTURE_VRAM_SIZE_128K, PALETTE_VRAM_SIZE_32K, G3DPipelineCallback);
}
static void sub_0207EAF4(void)
static void G3DPipelineCallback(void)
{
G3X_SetShading(GX_SHADING_TOON);
G3X_AntiAlias(1);
G3X_AlphaTest(0, 0);
G3X_AlphaBlend(1);
G3X_EdgeMarking(0);
G3X_SetFog(0, GX_FOGBLEND_COLOR_ALPHA, GX_FOGSLOPE_0x8000, 0);
G3X_AntiAlias(TRUE);
G3X_AlphaTest(FALSE, 0);
G3X_AlphaBlend(TRUE);
G3X_EdgeMarking(FALSE);
G3X_SetFog(FALSE, GX_FOGBLEND_COLOR_ALPHA, GX_FOGSLOPE_0x8000, 0);
G3X_SetClearColor(GX_RGB(0, 0, 0), 0, 0x7fff, 63, 0);
G3_ViewPort(0, 0, 255, 191);
}
static void sub_0207EB64(G3DPipelineBuffers *param0)
static void FreeG3DPipeline(G3DPipelineBuffers *pipelineBuffers)
{
G3DPipelineBuffers_Free(param0);
G3DPipelineBuffers_Free(pipelineBuffers);
}
static void LoadGraphics(PartyMenuApplication *application, NARC *narc)
@ -2632,7 +2632,7 @@ static int ApplyItemEffectOnPokemon(PartyMenuApplication *app)
&& Pokemon_CanShayminSkyForm(Party_GetPokemonBySlotIndex(app->partyMenu->party, app->currPartySlot)) == TRUE) {
app->partyMenu->evoTargetSpecies = 1;
Heap_Free(itemData);
LoadOverlay118(app);
PartyMenu_SetupFormChangeAnim(app);
return 31;
}
@ -2804,7 +2804,7 @@ static int ProcessMessageResult(PartyMenuApplication *application)
if (Text_IsPrinterActive(application->textPrinterID) == 0) {
if (gSystem.pressedKeys & (PAD_BUTTON_A | PAD_BUTTON_B)) {
Window_EraseMessageBox(&application->windows[34], 1);
LoadOverlay118(application);
PartyMenu_SetupFormChangeAnim(application);
return 13;
}
}
@ -2814,8 +2814,8 @@ static int ProcessMessageResult(PartyMenuApplication *application)
static int HandleOverlayCompletion(PartyMenuApplication *application)
{
if (ov118_021D0DBC(application) == 1) {
UnloadOverlay118(application);
if (PartyMenuFormChange_ChangeForm(application) == 1) {
PartyMenu_TeardownFormChangeAnim(application);
return 11;
}
@ -3005,13 +3005,13 @@ void PartyMenu_LoadMemberPanelTilemaps(enum HeapID heapID, u16 *lead, u16 *back,
Heap_Free(nscr);
}
void LoadOverlay118(PartyMenuApplication *application)
void PartyMenu_SetupFormChangeAnim(PartyMenuApplication *application)
{
Overlay_LoadByID(FS_OVERLAY_ID(overlay118), 2);
ov118_021D0D80(application);
Overlay_LoadByID(FS_OVERLAY_ID(party_menu_form_change), OVERLAY_LOAD_ASYNC);
PartyMenuFormChange_Init(application);
}
void UnloadOverlay118(PartyMenuApplication *application)
void PartyMenu_TeardownFormChangeAnim(PartyMenuApplication *application)
{
Overlay_UnloadByID(FS_OVERLAY_ID(overlay118));
Overlay_UnloadByID(FS_OVERLAY_ID(party_menu_form_change));
}

View File

@ -6,11 +6,11 @@
#include "generated/items.h"
#include "applications/party_menu/defs.h"
#include "applications/party_menu/form_change.h"
#include "applications/party_menu/main.h"
#include "applications/party_menu/sprites.h"
#include "applications/party_menu/windows.h"
#include "field/field_system.h"
#include "overlay118/ov118_021D0D80.h"
#include "bag.h"
#include "bg_window.h"
@ -208,7 +208,7 @@ static void sub_020834B0(PartyMenuApplication *param0, int *param1)
MessageLoader_GetString(param0->messageLoader, pl_msg_00000453_00083, param0->tmpString);
}
Window_DrawMessageBoxWithScrollCursor(&param0->windows[34], 1, (1 + 9), 15);
Window_DrawMessageBoxWithScrollCursor(&param0->windows[34], 1, 1 + 9, 15);
Window_FillTilemap(&param0->windows[34], 15);
PartyMenu_AddLongMessagePrinter(param0);
@ -234,7 +234,7 @@ int sub_020836A8(PartyMenuApplication *param0)
if (Text_IsPrinterActive(param0->textPrinterID) == 0) {
if (gSystem.pressedKeys & (PAD_BUTTON_A | PAD_BUTTON_B)) {
Window_EraseMessageBox(&param0->windows[34], 1);
LoadOverlay118(param0);
PartyMenu_SetupFormChangeAnim(param0);
return 19;
}
}
@ -244,8 +244,8 @@ int sub_020836A8(PartyMenuApplication *param0)
int sub_020836E4(PartyMenuApplication *param0)
{
if (ov118_021D0DBC(param0) == 1) {
UnloadOverlay118(param0);
if (PartyMenuFormChange_ChangeForm(param0) == 1) {
PartyMenu_TeardownFormChangeAnim(param0);
return 17;
}

View File

@ -1008,7 +1008,7 @@ pokeplatinum_c = files(
'overlay117/ov117_02266498.c',
'overlay117/ov117_022665FC.c',
'overlay117/ov117_022666C0.c',
'overlay118/ov118_021D0D80.c',
'applications/party_menu/form_change.c',
'overlay119/ov119_021D0D80.c',
'overlay119/ov119_021D191C.c',
'library_tv/library_tv.c',

View File

@ -1,273 +0,0 @@
#include "overlay118/ov118_021D0D80.h"
#include <nitro.h>
#include <string.h>
#include "generated/species.h"
#include "applications/party_menu/defs.h"
#include "applications/party_menu/main.h"
#include "applications/party_menu/sprites.h"
#include "applications/party_menu/windows.h"
#include "camera.h"
#include "enums.h"
#include "field_system.h"
#include "gx_layers.h"
#include "heap.h"
#include "message.h"
#include "particle_system.h"
#include "party.h"
#include "pokedex.h"
#include "pokemon.h"
#include "sound_playback.h"
#include "spl.h"
#include "string_gf.h"
#include "string_template.h"
#include "text.h"
#include "unk_0202419C.h"
typedef struct OverlayMetadata_t {
int unk_00;
int unk_04;
int unk_08;
int unk_0C;
u32 unk_10;
int unk_14;
ParticleSystem *unk_18;
} OverlayMetadata;
static void ov118_021D0F70(PartyMenuApplication *param0);
static void ov118_021D0F88(PartyMenuApplication *param0);
static void ov118_021D0FB8(PartyMenuApplication *param0);
static void ov118_021D0FDC(OverlayMetadata *param0);
static void ov118_021D1028(OverlayMetadata *param0);
static int ov118_021D10E8(void);
static void ov118_021D110C(OverlayMetadata *param0);
static u32 ov118_021D1128(u32 param0, BOOL param1);
static u32 ov118_021D114C(u32 param0, BOOL param1);
static void ov118_021D10B0(SPLEmitter *param0);
static const fx32 Unk_ov118_021D1170[][2] = {
{ 0xFFFFFFFFFFFFBF8C, 0x2EE0 },
{ 0x1388, 0x2CEC },
{ 0xFFFFFFFFFFFFBF8C, 0x1388 },
{ 0x1388, 0xDAC },
{ 0xFFFFFFFFFFFFBF8C, 0xFFFFFFFFFFFFF448 },
{ 0x1388, 0xFFFFFFFFFFFFEE6C }
};
void ov118_021D0D80(PartyMenuApplication *param0)
{
GF_ASSERT(param0->unk_B24 == NULL);
param0->unk_B24 = Heap_Alloc(HEAP_ID_PARTY_MENU, sizeof(OverlayMetadata));
MI_CpuClear8(param0->unk_B24, sizeof(OverlayMetadata));
param0->unk_B24->unk_14 = param0->currPartySlot;
}
int ov118_021D0DBC(PartyMenuApplication *param0)
{
OverlayMetadata *v0 = param0->unk_B24;
Pokemon *v1 = Party_GetPokemonBySlotIndex(param0->partyMenu->party, param0->currPartySlot);
switch (v0->unk_00) {
case 0: {
v0->unk_0C = Pokemon_GetValue(v1, MON_DATA_SPECIES, NULL);
switch (v0->unk_0C) {
case SPECIES_GIRATINA:
Pokemon_SetGiratinaFormByHeldItem(v1);
v0->unk_08 = 65;
v0->unk_10 = 0;
break;
case SPECIES_SHAYMIN:
Pokemon_SetShayminForm(v1, SHAYMIN_FORM_SKY);
v0->unk_08 = 35;
v0->unk_10 = 1;
break;
case SPECIES_ROTOM:
default:
GF_ASSERT(0);
break;
}
Pokedex_Capture(SaveData_GetPokedex(FieldSystem_GetSaveData(param0->partyMenu->fieldSystem)), v1);
}
v0->unk_00++;
break;
case 1:
case 2:
v0->unk_00++;
break;
case 3:
ov118_021D0F88(param0);
v0->unk_00++;
break;
case 4:
GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 1);
ov118_021D1028(v0);
v0->unk_00++;
break;
case 5:
v0->unk_04++;
if (v0->unk_04 == v0->unk_08) {
PartyMenu_LoadMemberSpeciesIcon(param0, param0->currPartySlot);
}
ov118_021D10E8();
if ((v0->unk_04 > v0->unk_08) && (ParticleSystem_GetActiveEmitterCount(v0->unk_18) == 0)) {
v0->unk_00++;
}
break;
case 6:
ov118_021D0FB8(param0);
v0->unk_00++;
break;
case 7:
Pokemon_PlayCry(v1);
v0->unk_00++;
break;
case 8:
if (Sound_IsPokemonCryPlaying() == 0) {
v0->unk_00++;
}
break;
case 9: {
String *v2;
v2 = MessageLoader_GetNewString(param0->messageLoader, 202);
StringTemplate_SetNickname(param0->template, 0, Pokemon_GetBoxPokemon(v1));
StringTemplate_Format(param0->template, param0->tmpString, v2);
String_Free(v2);
PartyMenu_PrintLongMessage(param0, PRINT_MESSAGE_PRELOADED, TRUE);
}
v0->unk_00++;
break;
case 10:
if (Text_IsPrinterActive(param0->textPrinterID) == 0) {
ov118_021D0F70(param0);
param0->partyMenu->menuSelectionResult = 0;
return 1;
}
break;
}
return 0;
}
static void ov118_021D0F70(PartyMenuApplication *param0)
{
Heap_Free(param0->unk_B24);
param0->unk_B24 = NULL;
}
static void ov118_021D0F88(PartyMenuApplication *param0)
{
sub_0207EA74(param0, 0);
ov118_021D0FDC(param0->unk_B24);
G2_SetBlendAlpha(GX_BLEND_PLANEMASK_NONE, GX_BLEND_ALL, 31, 0);
}
static void ov118_021D0FB8(PartyMenuApplication *param0)
{
ov118_021D110C(param0->unk_B24);
sub_0207EA74(param0, 1);
G2_BlendNone();
}
static void ov118_021D0FDC(OverlayMetadata *param0)
{
void *v0;
Camera *camera;
ParticleSystem_ZeroAll();
v0 = Heap_Alloc(HEAP_ID_PARTY_MENU, 0x4800);
param0->unk_18 = ParticleSystem_New(ov118_021D1128, ov118_021D114C, v0, 0x4800, 1, HEAP_ID_PARTY_MENU);
camera = ParticleSystem_GetCamera(param0->unk_18);
Camera_SetClipping(FX32_ONE, FX32_ONE * 900, camera);
}
static void ov118_021D1028(OverlayMetadata *param0)
{
void *v0 = ParticleSystem_LoadResourceFromNARC(185, param0->unk_10, 12);
ParticleSystem_SetResource(param0->unk_18, v0, (1 << 1) | (1 << 3), 1);
switch (param0->unk_0C) {
case SPECIES_GIRATINA:
ParticleSystem_CreateEmitterWithCallback(param0->unk_18, 0, ov118_021D10B0, param0);
ParticleSystem_CreateEmitterWithCallback(param0->unk_18, 1, ov118_021D10B0, param0);
ParticleSystem_CreateEmitterWithCallback(param0->unk_18, 2, ov118_021D10B0, param0);
Sound_PlayEffect(SEQ_SE_PL_W467109);
break;
case SPECIES_SHAYMIN:
ParticleSystem_CreateEmitterWithCallback(param0->unk_18, 0, ov118_021D10B0, param0);
ParticleSystem_CreateEmitterWithCallback(param0->unk_18, 1, ov118_021D10B0, param0);
Sound_PlayEffect(SEQ_SE_PL_W363);
break;
}
}
static void ov118_021D10B0(SPLEmitter *param0)
{
OverlayMetadata *v0 = ParticleSystem_GetEmitterCallbackParam();
SPLEmitter_SetPosX(param0, Unk_ov118_021D1170[v0->unk_14][0]);
SPLEmitter_SetPosY(param0, Unk_ov118_021D1170[v0->unk_14][1]);
}
static int ov118_021D10E8(void)
{
int v0;
G3_ResetG3X();
v0 = ParticleSystem_DrawAll();
if (v0 > 0) {
G3_ResetG3X();
}
ParticleSystem_UpdateAll();
G3_RequestSwapBuffers(GX_SORTMODE_MANUAL, GX_BUFFERMODE_Z);
return v0;
}
static void ov118_021D110C(OverlayMetadata *param0)
{
void *v0 = ParticleSystem_GetHeapStart(param0->unk_18);
ParticleSystem_Free(param0->unk_18);
Heap_Free(v0);
}
static u32 ov118_021D1128(u32 param0, BOOL param1)
{
NNSGfdTexKey v0;
v0 = NNS_GfdAllocTexVram(param0, param1, 0);
GF_ASSERT(v0 != NNS_GFD_ALLOC_ERROR_TEXKEY);
ParticleSystem_RegisterTextureKey(v0);
return NNS_GfdGetTexKeyAddr(v0);
}
static u32 ov118_021D114C(u32 param0, BOOL param1)
{
NNSGfdPlttKey v0;
v0 = NNS_GfdAllocPlttVram(param0, param1, NNS_GFD_ALLOC_FROM_LOW);
GF_ASSERT(v0 != NNS_GFD_ALLOC_ERROR_PLTTKEY);
ParticleSystem_RegisterPaletteKey(v0);
return NNS_GfdGetPlttKeyAddr(v0);
}