Document Battle Frontier Records App (Overlay 110) (#1000)

This commit is contained in:
VicSevenT 2026-03-15 15:55:32 -05:00 committed by GitHub
parent 3d24f842f1
commit c559905b9e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
32 changed files with 1867 additions and 1711 deletions

View File

@ -4235,11 +4235,11 @@
.short \arg0
.endm
.macro ScrCmd_2C8 arg0, arg1, arg2
.macro OpenFrontierRecordsApp challengeType, facility, species
.short 712
.short \arg0
.short \arg1
.short \arg2
.short \challengeType
.short \facility
.short \species
.endm
.macro InitPersistedMapFeaturesForEternaGym
@ -4360,13 +4360,13 @@
.short \species
.endm
.macro ScrCmd_2DE arg0, arg1, arg2, arg3, arg4
.macro ShowBattleHallRecordMonSelectionMenu challengeType, letterGroup, result, listPos, cursorPos
.short 734
.short \arg0
.short \arg1
.short \arg2
.short \arg3
.short \arg4
.short \challengeType
.short \letterGroup
.short \result
.short \listPos
.short \cursorPos
.endm
.macro CalcAmitySquareBerryAndAccessoryManOptionID destBerryAndAccessoryManOptionID

View File

@ -14,7 +14,7 @@ TEXT_BANK_BALL_SEAL_NAMES
TEXT_BANK_BALL_SEAL_NAMES_PLURAL
TEXT_BANK_MAIN_MENU_ALERTS
TEXT_BANK_UNK_0015
TEXT_BANK_BATTLE_TOWER_RECORDS
TEXT_BANK_BATTLE_FRONTIER_RECORDS
TEXT_BANK_BG_EVENTS
TEXT_BANK_POKEMON_STORAGE_SYSTEM
TEXT_BANK_BOX_MESSAGES

View File

@ -0,0 +1,10 @@
#ifndef POKEPLATINUM_APPLICATIONS_FRONTIER_RECORDS_MAIN_H
#define POKEPLATINUM_APPLICATIONS_FRONTIER_RECORDS_MAIN_H
#include "overlay_manager.h"
int BattleFrontierRecordsApp_Init(ApplicationManager *appMan, int *state);
int BattleFrontierRecordsApp_Main(ApplicationManager *appMan, int *state);
int BattleFrontierRecordsApp_Exit(ApplicationManager *appMan, int *state);
#endif // POKEPLATINUM_APPLICATIONS_FRONTIER_RECORDS_MAIN_H

View File

@ -0,0 +1,50 @@
#ifndef POKEPLATINUM_APPLICATIONS_FRONTIER_RECORDS_WINDOWS_H
#define POKEPLATINUM_APPLICATIONS_FRONTIER_RECORDS_WINDOWS_H
#include "bg_window.h"
#define WINDOW_GROUP_FACTORY 0
#define WINDOW_GROUP_HALL 1
#define WINDOW_GROUP_CASTLE 2
#define WINDOW_GROUP_ARCADE 3
#define WINDOW_GROUP_TOWER 4
// Common to all facilities
#define WINDOW_HEADER 0
// Factory
#define WINDOW_FACTORY_LEVEL_50_HEADER 1
#define WINDOW_FACTORY_LEVEL_50_LATEST 2
#define WINDOW_FACTORY_LEVEL_50_RECORD 3
#define WINDOW_FACTORY_OPEN_LEVEL_HEADER 4
#define WINDOW_FACTORY_OPEN_LEVEL_LATEST 5
#define WINDOW_FACTORY_OPEN_LEVEL_RECORD 6
// Hall
#define WINDOW_HALL_MON_NAME 1
#define WINDOW_HALL_LATEST 2
#define WINDOW_HALL_RECORD 3
// Castle
#define WINDOW_CASTLE_POINTS 1
#define WINDOW_CASTLES_LATEST 2
#define WINDOW_CASTLES_RECORD 3
// Arcade
#define WINDOW_ARCADE_LATEST 1
#define WINDOW_ARCADE_RECORD 2
// Tower
#define WINDOW_TOWER_MULTI_W_TRAINER 1
#define WINDOW_TOWER_SOLO_LATEST 2
#define WINDOW_TOWER_SOLO_RECORD 3
#define WINDOW_TOWER_MULTI_LATEST 4
#define WINDOW_TOWER_MULTI_RECORD 5
#define WINDOW_TOWER_MULTI_W_FRIEND 6
#define WINDOW_TOWER_W_FRIEND_LATEST 7
#define WINDOW_TOWER_W_FRIEND_RECORD 8
void FrontierRecordsApp_InitWindows(BgConfig *bgConfig, Window *window, u8 facility);
void FrontierRecordsApp_FreeWindows(Window *windows, u8 facility);
#endif // POKEPLATINUM_APPLICATIONS_FRONTIER_RECORDS_WINDOWS_H

View File

@ -6,6 +6,12 @@
#define FRONTIER_CHALLENGE_MULTI 2
#define FRONTIER_CHALLENGE_MULTI_WFC 3
#define FRONTIER_RECORDS_APP_TOWER 1
#define FRONTIER_RECORDS_APP_FACTORY 2
#define FRONTIER_RECORDS_APP_CASTLE 4
#define FRONTIER_RECORDS_APP_HALL 5
#define FRONTIER_RECORDS_APP_ARCADE 6
#define BATTLES_PER_ROUND_ARCADE 7
#define ARCADE_PARTY_SIZE_SOLO 3

View File

@ -116,7 +116,7 @@ enum HeapID {
HEAP_ID_111,
HEAP_ID_112,
HEAP_ID_113,
HEAP_ID_114,
HEAP_ID_FRONTIER_RECORD_APP,
HEAP_ID_115,
HEAP_ID_116,
HEAP_ID_117,
@ -137,6 +137,7 @@ enum HeapSize {
HEAP_SIZE_BATTLE_HALL_APP = 0x20000,
HEAP_SIZE_BATTLE_FACTORY_APP = 0x20000,
HEAP_SIZE_BATTLE_ARCADE_APP = 0x20000,
HEAP_SIZE_FRONTIER_RECORDS_APP = 0x20000,
HEAP_SIZE_BAG = 0x30000,
HEAP_SIZE_PRE_POKETCH_SUBSCREEN = 0x18000,

View File

@ -60,6 +60,8 @@
#define BATTLE_ARCADE_APP_MAIN_TILES 120
#define BATTLE_ARCADE_APP_SUB_TILEMAP 121
#define BATTLE_ARCADE_APP_SUB_TILES 122
#define BATTLE_FRONTIER_RECORDS_APP_TILEMAP 123
#define BATTLE_FRONTIER_RECORDS_APP_TILES 124
#define BATTLE_FRONTIER_APP_SUB_SCREEN_TILES 125
#define BATTLE_FRONTIER_APP_SUB_SCREEN_TILEMAP 126
#define BATTLE_FACTORY_PLTT 129
@ -77,6 +79,7 @@
#define BATTLE_ARCADE_CORRIDOR_PLTT 143
#define Battle_ARCADE_APP_SUB_PLTT 168
#define BATTLE_ARCADE_BATTLE_ROOM_HP_SCREEN_PLTT 169
#define BATTLE_FRONTIER_RECORDS_APP_PLTT 170
#define BATTLE_FRONTIER_APP_SUB_SCREEN_PLTT 171
#endif

View File

@ -3,7 +3,7 @@
#include "field_script_context.h"
BOOL ScrCmd_2DE(ScriptContext *param0);
BOOL ScrCmd_ShowBattleHallRecordMonSelectionMenu(ScriptContext *ctx);
BOOL ScrCmd_JudgeStats(ScriptContext *ctx);
BOOL ScrCmd_31D(ScriptContext *param0);
BOOL ScrCmd_TryRevertPokemonForm(ScriptContext *param0);
@ -17,13 +17,13 @@ BOOL ScrCmd_GetPartyMonForm2(ScriptContext *ctx);
BOOL ScrCmd_30F(ScriptContext *param0);
BOOL ScrCmd_Dummy316(ScriptContext *ctx);
BOOL ScrCmd_32C(ScriptContext *param0);
BOOL ScrCmd_32D(ScriptContext *param0);
BOOL ScrCmd_32E(ScriptContext *param0);
BOOL ScrCmd_331(ScriptContext *param0);
BOOL ScrCmd_332(ScriptContext *param0);
BOOL ScrCmd_338(ScriptContext *param0);
BOOL ScrCmd_339(ScriptContext *param0);
BOOL ScrCmd_32D(ScriptContext *ctx);
BOOL ScrCmd_32E(ScriptContext *ctx);
BOOL ScrCmd_331(ScriptContext *ctx);
BOOL ScrCmd_332(ScriptContext *ctx);
BOOL ScrCmd_338(ScriptContext *ctx);
BOOL ScrCmd_339(ScriptContext *ctx);
BOOL ScrCmd_LogLinkInfoInWiFiHistory(ScriptContext *ctx);
BOOL ScrCmd_333(ScriptContext *param0);
BOOL ScrCmd_333(ScriptContext *ctx);
#endif // POKEPLATINUM_OV5_021F6454_H

View File

@ -1,6 +0,0 @@
#ifndef POKEPLATINUM_STRUCT_OV5_021F6704_DECL_H
#define POKEPLATINUM_STRUCT_OV5_021F6704_DECL_H
typedef struct UnkStruct_ov5_021F6704_t UnkStruct_ov5_021F6704;
#endif // POKEPLATINUM_STRUCT_OV5_021F6704_DECL_H

View File

@ -1,10 +0,0 @@
#ifndef POKEPLATINUM_OV110_021D0D80_H
#define POKEPLATINUM_OV110_021D0D80_H
#include "overlay_manager.h"
int ov110_021D0D80(ApplicationManager *appMan, int *param1);
int ov110_021D0E9C(ApplicationManager *appMan, int *param1);
int ov110_021D0EF0(ApplicationManager *appMan, int *param1);
#endif // POKEPLATINUM_OV110_021D0D80_H

View File

@ -1,9 +0,0 @@
#ifndef POKEPLATINUM_OV110_021D2124_H
#define POKEPLATINUM_OV110_021D2124_H
#include "bg_window.h"
void ov110_021D2124(BgConfig *param0, Window *param1, u8 param2);
void ov110_021D216C(Window *param0, u8 param1);
#endif // POKEPLATINUM_OV110_021D2124_H

View File

@ -113,7 +113,7 @@ enum ScriptContextType {
#define SCRIPT_ID_OFFSET_MYSTERY_GIFT_DELIVERYMAN 10200
#define SCRIPT_ID_OFFSET_COUNTERPART_TALK 10300
#define SCRIPT_ID_OFFSET_POKEMON_CENTER_DAILY_TRAINERS 10400
#define SCRIPT_ID_OFFSET_BATTLE_TOWER_RECORDS 10450
#define SCRIPT_ID_OFFSET_BATTLE_FRONTIER_RECORDS 10450
#define SCRIPT_ID_OFFSET_SCRATCH_OFF_CARDS 10490
#define FLAG_OFFSET_HIDDEN_ITEMS 730

View File

@ -5,9 +5,9 @@
typedef struct {
SaveData *saveData;
u8 unk_04;
u8 unk_05;
u16 unk_06;
} UnkStruct_0203E564;
u8 challengeType;
u8 facility;
u16 species;
} FrontierRecordsAppArgs;
#endif // POKEPLATINUM_STRUCT_0203E564_H

View File

@ -104,7 +104,7 @@ BOOL sub_0203E348(FieldSystem *fieldSystem, UnkStruct_0203E348 *param1);
void sub_0203E414(FieldTask *task, int slotMachineID);
void AccessoryShop_Init(FieldTask *task);
void *FieldSystem_ShowDiploma(FieldSystem *fieldSystem, enum HeapID heapID, BOOL isNatDex);
void *sub_0203E564(FieldSystem *fieldSystem, u8 param1, u8 param2, u16 param3, enum HeapID heapID);
void *FieldSystem_OpenBattleFrontierRecord(FieldSystem *fieldSystem, u8 param1, u8 param2, u16 param3, enum HeapID heapID);
void *sub_0203E608(FieldSystem *fieldSystem, enum HeapID heapID);
void *FieldSystem_OpenSummaryScreenTeachMove(int unused, FieldSystem *fieldSystem, u16 partySlot, u16 move);
void sub_0203E6C0(FieldSystem *fieldSystem, int param1, int param2);

View File

@ -1617,11 +1617,11 @@ Overlay overlay109
Object main.nef.p/src_overlay109_ov109_021D3D50.c.o
}
Overlay overlay110
Overlay frontier_records_app
{
After main
Object main.nef.p/src_overlay110_ov110_021D0D80.c.o
Object main.nef.p/src_overlay110_ov110_021D2124.c.o
Object main.nef.p/src_applications_frontier_records_main.c.o
Object main.nef.p/src_applications_frontier_records_windows.c.o
}
Overlay overlay111

View File

@ -107,7 +107,7 @@ c3a66997e55fb3e761d521136a42f07f4761f5da *battle_hall_app.sbin
f8d3fd65261098ff45b3a31319c904b520814fa2 *battle_castle_app.sbin
901f6afe6c1b0b54dc42af812f13560758814d2b *battle_arcade_app.sbin
5acaa19b61120f72d546a83e36c361b2e383c0bd *overlay109.sbin
1626b234bbd0915fc1bd57d0b67c59c86f1138bd *overlay110.sbin
1626b234bbd0915fc1bd57d0b67c59c86f1138bd *frontier_records_app.sbin
eb9d61aa9d3ad877f55af30ff212ecc7094049c5 *overlay111.sbin
535bf2a3127064fc977a45611ff44e0473be597a *overlay112.sbin
0d92a7c86aa0582c60730ab45884ce4beed765d8 *overlay113.sbin

View File

@ -533,7 +533,7 @@ scr_seq_files = files(
'scripts_safari_game.s',
'scripts_vs_seeker.s',
'scripts_scratch_off_cards.s',
'scripts_battle_tower_records.s',
'scripts_battle_frontier_records.s',
'scripts_day_care_common.s',
'scripts_init_jubilife_city.s',
'scripts_init_jubilife_city_mart.s',

View File

@ -498,7 +498,7 @@ scripts_unk_0496
scripts_safari_game
scripts_vs_seeker
scripts_scratch_off_cards
scripts_battle_tower_records
scripts_battle_frontier_records
scripts_day_care_common
scripts_init_jubilife_city
scripts_init_jubilife_city_mart

View File

@ -0,0 +1,203 @@
#include "macros/scrcmd.inc"
#include "constants/battle_frontier.h"
#include "constants/menu.h"
#include "res/text/bank/battle_frontier_records.h"
ScriptEntry FrontierRecords_BattleTower
ScriptEntry FrontierRecords_BattleTowerDupe
ScriptEntry FrontierRecords_BattleFactory
ScriptEntry FrontierRecords_BattleHall
ScriptEntry FrontierRecords_BattleCastle
ScriptEntry FrontierRecords_BattleArcade
ScriptEntryEnd
FrontierRecords_BattleTower:
PlayFanfare SEQ_SE_CONFIRM
LockAll
SetVar VAR_0x8000, FRONTIER_RECORDS_APP_TOWER
GoTo FrontierRecords_BattleTowerMenus
End
FrontierRecords_BattleTowerMenus:
Call FrontierRecords_WhichRecord
Call FrontierRecords_SelectChallengeType
SetVar VAR_0x8008, VAR_0x8001
GoToIfEq VAR_0x8008, 3, FrontierRecords_CloseAndExit
GoToIfEq VAR_0x8008, MENU_CANCEL, FrontierRecords_CloseAndExit
Call FrontierRecords_OpenRecordDisplay
GoTo FrontierRecords_BattleTowerMenus
End
FrontierRecords_BattleTowerDupe:
PlayFanfare SEQ_SE_CONFIRM
LockAll
SetVar VAR_0x8000, FRONTIER_RECORDS_APP_TOWER
GoTo FrontierRecords_BattleTowerMenusDupe
End
FrontierRecords_BattleTowerMenusDupe:
Call FrontierRecords_WhichRecord
Call FrontierRecords_SelectChallengeType
SetVar VAR_0x8008, VAR_0x8001
GoToIfEq VAR_0x8008, 3, FrontierRecords_CloseAndExit
GoToIfEq VAR_0x8008, MENU_CANCEL, FrontierRecords_CloseAndExit
Call FrontierRecords_OpenRecordDisplay
GoTo FrontierRecords_BattleTowerMenusDupe
End
FrontierRecords_BattleFactory:
PlayFanfare SEQ_SE_CONFIRM
LockAll
SetVar VAR_0x8000, FRONTIER_RECORDS_APP_FACTORY
GoTo FrontierRecords_BattleFactoryMenus
End
FrontierRecords_BattleFactoryMenus:
Call FrontierRecords_WhichRecord
Call FrontierRecords_SelectChallengeType
SetVar VAR_0x8008, VAR_0x8001
GoToIfEq VAR_0x8008, 3, FrontierRecords_CloseAndExit
GoToIfEq VAR_0x8008, MENU_CANCEL, FrontierRecords_CloseAndExit
Call FrontierRecords_OpenRecordDisplay
GoTo FrontierRecords_BattleFactoryMenus
End
FrontierRecords_BattleHall:
PlayFanfare SEQ_SE_CONFIRM
LockAll
SetVar VAR_0x8000, FRONTIER_RECORDS_APP_HALL
GoTo FrontierRecords_BattleHallMenus
End
FrontierRecords_BattleHallMenus:
Call FrontierRecords_WhichRecord
Call FrontierRecords_SelectChallengeType
SetVar VAR_0x8008, VAR_0x8001
GoToIfEq VAR_0x8008, 3, FrontierRecords_CloseAndExit
GoToIfEq VAR_0x8008, MENU_CANCEL, FrontierRecords_CloseAndExit
ScrCmd_2CC 1, VAR_0x8001, VAR_RESULT
GoToIfEq VAR_RESULT, 0, _0174
ScrCmd_2CC 2, VAR_0x8001, VAR_RESULT
BufferSpeciesNameFromVar 0, VAR_RESULT, 0, 0
Message BattleFrontierRecords_Text_OnChallengeNow
GoTo _017F
End
_0174:
Message BattleFrontierRecords_Text_WhichPokemon
GoTo _017F
End
_017F:
SetVar VAR_0x8002, 0
SetVar VAR_0x8004, 0
SetVar VAR_0x8005, 0
GoTo _0199
End
_0199:
Call FrontierRecords_SelectStartingLetters
GoToIfEq VAR_0x8002, 9, FrontierRecords_BattleHallMenus
GoToIfEq VAR_0x8002, MENU_CANCEL, FrontierRecords_BattleHallMenus
SetVar VAR_0x8003, 0
SetVar VAR_0x8006, 0
SetVar VAR_0x8007, 0
GoTo _01D3
End
_01D3:
ShowBattleHallRecordMonSelectionMenu VAR_0x8001, VAR_0x8002, VAR_0x8003, VAR_0x8006, VAR_0x8007
GoToIfEq VAR_0x8003, MENU_CANCEL, _0199
Call FrontierRecords_OpenRecordDisplay
Message BattleFrontierRecords_Text_WhichPokemon
GoTo _01D3
End
FrontierRecords_BattleCastle:
PlayFanfare SEQ_SE_CONFIRM
LockAll
SetVar VAR_0x8000, FRONTIER_RECORDS_APP_CASTLE
GoTo FrontierRecords_BattleCastleMenus
End
FrontierRecords_BattleCastleMenus:
Call FrontierRecords_WhichRecord
Call FrontierRecords_SelectChallengeType
SetVar VAR_0x8008, VAR_0x8001
GoToIfEq VAR_0x8008, 3, FrontierRecords_CloseAndExit
GoToIfEq VAR_0x8008, MENU_CANCEL, FrontierRecords_CloseAndExit
Call FrontierRecords_OpenRecordDisplay
GoTo FrontierRecords_BattleCastleMenus
End
FrontierRecords_BattleArcade:
PlayFanfare SEQ_SE_CONFIRM
LockAll
SetVar VAR_0x8000, FRONTIER_RECORDS_APP_ARCADE
GoTo FrontierRecords_BattleArcadeMenus
End
FrontierRecords_BattleArcadeMenus:
Call FrontierRecords_WhichRecord
Call FrontierRecords_SelectChallengeType
SetVar VAR_0x8008, VAR_0x8001
GoToIfEq VAR_0x8008, 3, FrontierRecords_CloseAndExit
GoToIfEq VAR_0x8008, MENU_CANCEL, FrontierRecords_CloseAndExit
Call FrontierRecords_OpenRecordDisplay
GoTo FrontierRecords_BattleArcadeMenus
End
FrontierRecords_WhichRecord:
Message BattleFrontierRecords_Text_WhichRecord
Return
FrontierRecords_SelectChallengeType:
InitLocalTextMenu 31, 9, 0, VAR_0x8001
SetMenuXOriginToRight
AddMenuEntryImm BattleFrontierRecords_Text_Single, FRONTIER_CHALLENGE_SINGLE
AddMenuEntryImm BattleFrontierRecords_Text_Double, FRONTIER_CHALLENGE_DOUBLE
AddMenuEntryImm BattleFrontierRecords_Text_Multi, FRONTIER_CHALLENGE_MULTI
AddMenuEntryImm BattleFrontierRecords_Text_Cancel, 3
ShowMenu
Return
FrontierRecords_SelectStartingLetters:
InitLocalTextListMenu 25, 1, 0, VAR_0x8002
AddListMenuEntry BattleFrontierRecords_Text_ABC, 0
AddListMenuEntry BattleFrontierRecords_Text_DEF, 1
AddListMenuEntry BattleFrontierRecords_Text_GHI, 2
AddListMenuEntry BattleFrontierRecords_Text_JKL, 3
AddListMenuEntry BattleFrontierRecords_Text_MNO, 4
AddListMenuEntry BattleFrontierRecords_Text_PQR, 5
AddListMenuEntry BattleFrontierRecords_Text_STU, 6
AddListMenuEntry BattleFrontierRecords_Text_VWX, 7
AddListMenuEntry BattleFrontierRecords_Text_YZ, 8
AddListMenuEntry BattleFrontierRecords_Text_Exit, 9
ShowListMenuRememberCursor VAR_0x8004, VAR_0x8005
Return
FrontierRecords_CloseAndExit:
CloseMessage
GoTo FrontierRecords_Exit
End
FrontierRecords_Exit:
ReleaseAll
End
FrontierRecords_OpenRecordDisplay:
FadeScreenOut
WaitFadeScreen
CloseMessage
Call FrontierRecords_OpenApp
Return
FrontierRecords_OpenApp:
OpenFrontierRecordsApp VAR_0x8001, VAR_0x8000, VAR_0x8003
ReturnToField
FadeScreenIn
WaitFadeScreen
Return
.balign 4, 0

View File

@ -1,201 +0,0 @@
#include "macros/scrcmd.inc"
#include "res/text/bank/battle_tower_records.h"
ScriptEntry _001A
ScriptEntry _0068
ScriptEntry _00B6
ScriptEntry _0104
ScriptEntry _01FD
ScriptEntry _024B
ScriptEntryEnd
_001A:
PlayFanfare SEQ_SE_CONFIRM
LockAll
SetVar VAR_0x8000, 1
GoTo _002E
End
_002E:
Call _0299
Call _029E
SetVar VAR_0x8008, VAR_0x8001
GoToIfEq VAR_0x8008, 3, _031D
GoToIfEq VAR_0x8008, -2, _031D
Call _032B
GoTo _002E
End
_0068:
PlayFanfare SEQ_SE_CONFIRM
LockAll
SetVar VAR_0x8000, 1
GoTo _007C
End
_007C:
Call _0299
Call _029E
SetVar VAR_0x8008, VAR_0x8001
GoToIfEq VAR_0x8008, 3, _031D
GoToIfEq VAR_0x8008, -2, _031D
Call _032B
GoTo _007C
End
_00B6:
PlayFanfare SEQ_SE_CONFIRM
LockAll
SetVar VAR_0x8000, 2
GoTo _00CA
End
_00CA:
Call _0299
Call _029E
SetVar VAR_0x8008, VAR_0x8001
GoToIfEq VAR_0x8008, 3, _031D
GoToIfEq VAR_0x8008, -2, _031D
Call _032B
GoTo _00CA
End
_0104:
PlayFanfare SEQ_SE_CONFIRM
LockAll
SetVar VAR_0x8000, 5
GoTo _0118
End
_0118:
Call _0299
Call _029E
SetVar VAR_0x8008, VAR_0x8001
GoToIfEq VAR_0x8008, 3, _031D
GoToIfEq VAR_0x8008, -2, _031D
ScrCmd_2CC 1, VAR_0x8001, VAR_RESULT
GoToIfEq VAR_RESULT, 0, _0174
ScrCmd_2CC 2, VAR_0x8001, VAR_RESULT
BufferSpeciesNameFromVar 0, VAR_RESULT, 0, 0
Message 7
GoTo _017F
End
_0174:
Message 6
GoTo _017F
End
_017F:
SetVar VAR_0x8002, 0
SetVar VAR_0x8004, 0
SetVar VAR_0x8005, 0
GoTo _0199
End
_0199:
Call _02BD
GoToIfEq VAR_0x8002, 9, _0118
GoToIfEq VAR_0x8002, -2, _0118
SetVar VAR_0x8003, 0
SetVar VAR_0x8006, 0
SetVar VAR_0x8007, 0
GoTo _01D3
End
_01D3:
ScrCmd_2DE VAR_0x8001, VAR_0x8002, VAR_0x8003, VAR_0x8006, VAR_0x8007
GoToIfEq VAR_0x8003, -2, _0199
Call _032B
Message 6
GoTo _01D3
End
_01FD:
PlayFanfare SEQ_SE_CONFIRM
LockAll
SetVar VAR_0x8000, 4
GoTo _0211
End
_0211:
Call _0299
Call _029E
SetVar VAR_0x8008, VAR_0x8001
GoToIfEq VAR_0x8008, 3, _031D
GoToIfEq VAR_0x8008, -2, _031D
Call _032B
GoTo _0211
End
_024B:
PlayFanfare SEQ_SE_CONFIRM
LockAll
SetVar VAR_0x8000, 6
GoTo _025F
End
_025F:
Call _0299
Call _029E
SetVar VAR_0x8008, VAR_0x8001
GoToIfEq VAR_0x8008, 3, _031D
GoToIfEq VAR_0x8008, -2, _031D
Call _032B
GoTo _025F
End
_0299:
Message 0
Return
_029E:
InitLocalTextMenu 31, 9, 0, VAR_0x8001
SetMenuXOriginToRight
AddMenuEntryImm 1, 0
AddMenuEntryImm 2, 1
AddMenuEntryImm 3, 2
AddMenuEntryImm 4, 3
ShowMenu
Return
_02BD:
InitLocalTextListMenu 25, 1, 0, VAR_0x8002
AddListMenuEntry 8, 0
AddListMenuEntry 9, 1
AddListMenuEntry 10, 2
AddListMenuEntry 11, 3
AddListMenuEntry 12, 4
AddListMenuEntry 13, 5
AddListMenuEntry 14, 6
AddListMenuEntry 15, 7
AddListMenuEntry 16, 8
AddListMenuEntry 5, 9
ShowListMenuRememberCursor VAR_0x8004, VAR_0x8005
Return
_031D:
CloseMessage
GoTo _0327
End
_0327:
ReleaseAll
End
_032B:
FadeScreenOut
WaitFadeScreen
CloseMessage
Call _0341
Return
_0341:
ScrCmd_2C8 VAR_0x8001, VAR_0x8000, VAR_0x8003
ReturnToField
FadeScreenIn
WaitFadeScreen
Return
.balign 4, 0

View File

@ -0,0 +1,184 @@
{
"key": 14833,
"messages": [
{
"id": "BattleFrontierRecords_Text_WhichRecord",
"en_US": "Which record would you like to see?"
},
{
"id": "BattleFrontierRecords_Text_Single",
"en_US": "SINGLE"
},
{
"id": "BattleFrontierRecords_Text_Double",
"en_US": "DOUBLE"
},
{
"id": "BattleFrontierRecords_Text_Multi",
"en_US": "MULTI"
},
{
"id": "BattleFrontierRecords_Text_Cancel",
"en_US": "CANCEL"
},
{
"id": "BattleFrontierRecords_Text_Exit",
"en_US": "EXIT"
},
{
"id": "BattleFrontierRecords_Text_WhichPokemon",
"en_US": [
"Which Pokémons record would you like\n",
"to see?\r"
]
},
{
"id": "BattleFrontierRecords_Text_OnChallengeNow",
"en_US": "{STRVAR_1 0, 0, 0} is on a challenge now!"
},
{
"id": "BattleFrontierRecords_Text_ABC",
"en_US": "ABC"
},
{
"id": "BattleFrontierRecords_Text_DEF",
"en_US": "DEF"
},
{
"id": "BattleFrontierRecords_Text_GHI",
"en_US": "GHI"
},
{
"id": "BattleFrontierRecords_Text_JKL",
"en_US": "JKL"
},
{
"id": "BattleFrontierRecords_Text_MNO",
"en_US": "MNO"
},
{
"id": "BattleFrontierRecords_Text_PQR",
"en_US": "PQR"
},
{
"id": "BattleFrontierRecords_Text_STU",
"en_US": "STU"
},
{
"id": "BattleFrontierRecords_Text_VWX",
"en_US": "VWX"
},
{
"id": "BattleFrontierRecords_Text_YZ",
"en_US": "YZ"
},
{
"id": "BattleFrontierRecords_Text_Dummy1",
"garbage": 1
},
{
"id": "BattleFrontierRecords_Text_Cancel2",
"en_US": "CANCEL"
},
{
"id": "BattleFrontierRecords_Text_Dummy3",
"garbage": 5
},
{
"id": "BattleFrontierRecords_Text_Dummy4",
"garbage": 3
},
{
"id": "BattleFrontierRecords_Text_BattleTower",
"en_US": "Battle Tower"
},
{
"id": "BattleFrontierRecords_Text_BattleFactory",
"en_US": "Battle Factory"
},
{
"id": "BattleFrontierRecords_Text_BattleCastle",
"en_US": "Battle Castle"
},
{
"id": "BattleFrontierRecords_Text_BattleHall",
"en_US": "Battle Hall"
},
{
"id": "BattleFrontierRecords_Text_BattleArcade",
"en_US": "Battle Arcade"
},
{
"id": "BattleFrontierRecords_Text_SingleRecord",
"en_US": "Single Record"
},
{
"id": "BattleFrontierRecords_Text_DoubleRecord",
"en_US": "Double Record"
},
{
"id": "BattleFrontierRecords_Text_MultiRecord",
"en_US": "Multi Record"
},
{
"id": "BattleFrontierRecords_Text_Prev",
"en_US": "PREV"
},
{
"id": "BattleFrontierRecords_Text_Current",
"en_US": "CURRENT"
},
{
"id": "BattleFrontierRecords_Text_Record",
"en_US": "RECORD"
},
{
"id": "BattleFrontierRecords_Text_MultiWithTrainer",
"en_US": "Multi w/Trainer"
},
{
"id": "BattleFrontierRecords_Text_MultiWithFriend",
"en_US": "Multi w/friend"
},
{
"id": "BattleFrontierRecords_Text_Level50",
"en_US": "Level 50"
},
{
"id": "BattleFrontierRecords_Text_OpenLevel",
"en_US": "Open Level"
},
{
"id": "BattleFrontierRecords_Text_RentalTrade",
"en_US": "Rental/Trade"
},
{
"id": "BattleFrontierRecords_Text_CastlePoints",
"en_US": "Castle Points"
},
{
"id": "BattleFrontierRecords_Text_WinStreak",
"en_US": "Win streak: {STRVAR_1 53, 0, 0}"
},
{
"id": "BattleFrontierRecords_Text_MonsRecord",
"en_US": "{STRVAR_1 0, 0, 0}s record"
},
{
"id": "BattleFrontierRecords_Text_Number",
"en_US": "{STRVAR_1 53, 0, 0}"
},
{
"id": "BattleFrontierRecords_Text_CP",
"en_US": "{STRVAR_1 53, 0, 0} CP"
},
{
"id": "BattleFrontierRecords_Text_WinStreakTemplate",
"en_US": "Win streak: {STRVAR_1 53, 0, 0}"
},
{
"id": "BattleFrontierRecords_Text_GamesCleared",
"en_US": "Games cleared: {STRVAR_1 53, 0, 0}"
}
]
}

View File

@ -1,184 +0,0 @@
{
"key": 14833,
"messages": [
{
"id": "pl_msg_00000016_00000",
"en_US": "Which record would you like to see?"
},
{
"id": "pl_msg_00000016_00001",
"en_US": "SINGLE"
},
{
"id": "pl_msg_00000016_00002",
"en_US": "DOUBLE"
},
{
"id": "pl_msg_00000016_00003",
"en_US": "MULTI"
},
{
"id": "pl_msg_00000016_00004",
"en_US": "CANCEL"
},
{
"id": "pl_msg_00000016_00005",
"en_US": "EXIT"
},
{
"id": "pl_msg_00000016_00006",
"en_US": [
"Which Pokémons record would you like\n",
"to see?\r"
]
},
{
"id": "pl_msg_00000016_00007",
"en_US": "{STRVAR_1 0, 0, 0} is on a challenge now!"
},
{
"id": "pl_msg_00000016_00008",
"en_US": "ABC"
},
{
"id": "pl_msg_00000016_00009",
"en_US": "DEF"
},
{
"id": "pl_msg_00000016_00010",
"en_US": "GHI"
},
{
"id": "pl_msg_00000016_00011",
"en_US": "JKL"
},
{
"id": "pl_msg_00000016_00012",
"en_US": "MNO"
},
{
"id": "pl_msg_00000016_00013",
"en_US": "PQR"
},
{
"id": "pl_msg_00000016_00014",
"en_US": "STU"
},
{
"id": "pl_msg_00000016_00015",
"en_US": "VWX"
},
{
"id": "pl_msg_00000016_00016",
"en_US": "YZ"
},
{
"id": "pl_msg_00000016_00017",
"garbage": 1
},
{
"id": "pl_msg_00000016_00018",
"en_US": "CANCEL"
},
{
"id": "pl_msg_00000016_00019",
"garbage": 5
},
{
"id": "pl_msg_00000016_00020",
"garbage": 3
},
{
"id": "pl_msg_00000016_00021",
"en_US": "Battle Tower"
},
{
"id": "pl_msg_00000016_00022",
"en_US": "Battle Factory"
},
{
"id": "pl_msg_00000016_00023",
"en_US": "Battle Castle"
},
{
"id": "pl_msg_00000016_00024",
"en_US": "Battle Hall"
},
{
"id": "pl_msg_00000016_00025",
"en_US": "Battle Arcade"
},
{
"id": "pl_msg_00000016_00026",
"en_US": "Single Record"
},
{
"id": "pl_msg_00000016_00027",
"en_US": "Double Record"
},
{
"id": "pl_msg_00000016_00028",
"en_US": "Multi Record"
},
{
"id": "pl_msg_00000016_00029",
"en_US": "PREV"
},
{
"id": "pl_msg_00000016_00030",
"en_US": "CURRENT"
},
{
"id": "pl_msg_00000016_00031",
"en_US": "RECORD"
},
{
"id": "pl_msg_00000016_00032",
"en_US": "Multi w/Trainer"
},
{
"id": "pl_msg_00000016_00033",
"en_US": "Multi w/friend"
},
{
"id": "pl_msg_00000016_00034",
"en_US": "Level 50"
},
{
"id": "pl_msg_00000016_00035",
"en_US": "Open Level"
},
{
"id": "pl_msg_00000016_00036",
"en_US": "Rental/Trade"
},
{
"id": "pl_msg_00000016_00037",
"en_US": "Castle Points"
},
{
"id": "pl_msg_00000016_00038",
"en_US": "Win streak: {STRVAR_1 53, 0, 0}"
},
{
"id": "pl_msg_00000016_00039",
"en_US": "{STRVAR_1 0, 0, 0}s record"
},
{
"id": "pl_msg_00000016_00040",
"en_US": "{STRVAR_1 53, 0, 0}"
},
{
"id": "pl_msg_00000016_00041",
"en_US": "{STRVAR_1 53, 0, 0} CP"
},
{
"id": "pl_msg_00000016_00042",
"en_US": "Win streak: {STRVAR_1 53, 0, 0}"
},
{
"id": "pl_msg_00000016_00043",
"en_US": "Games cleared: {STRVAR_1 53, 0, 0}"
}
]
}

View File

@ -50,7 +50,7 @@
"en_US": "EXIT"
},
{
"id": "pl_msg_00000361_00012",
"id": "MenuEntries_Text_ListMenu_Exit",
"en_US": "EXIT"
},
{

View File

@ -0,0 +1,840 @@
#include "applications/frontier/records/main.h"
#include <nitro.h>
#include <string.h>
#include "constants/battle_frontier.h"
#include "struct_decls/struct_0202D750_decl.h"
#include "struct_decls/struct_020308A0_decl.h"
#include "struct_defs/battle_frontier.h"
#include "struct_defs/struct_0203E564.h"
#include "applications/frontier/records/windows.h"
#include "battle_tower_modes.h"
#include "bg_window.h"
#include "font.h"
#include "game_options.h"
#include "graphics.h"
#include "gx_layers.h"
#include "heap.h"
#include "message.h"
#include "narc.h"
#include "narc_frontier_bg.h"
#include "overlay_manager.h"
#include "palette.h"
#include "save_player.h"
#include "savedata.h"
#include "screen_fade.h"
#include "string_gf.h"
#include "string_template.h"
#include "system.h"
#include "text.h"
#include "unk_0202D05C.h"
#include "unk_0202FF4C.h"
#include "unk_020302D0.h"
#include "unk_02030494.h"
#include "unk_0203061C.h"
#include "unk_02030880.h"
#include "unk_0205DFC4.h"
#include "res/graphics/poketch/poketch.naix"
#include "res/text/bank/battle_frontier_records.h"
typedef struct FrontierRecordsApp {
ApplicationManager *appMan;
u8 subState;
u8 challengeType;
u8 facility;
u8 unk_07;
u16 species;
u16 unk_0A;
BgConfig *bgConfig;
Window windows[16];
MessageLoader *msgLoader;
StringTemplate *strTemplate;
String *displayStr;
String *fmtStr;
PaletteData *plttData;
const Options *options;
SaveData *saveData;
BattleFrontier *frontier;
} FrontierRecordsApp;
static BOOL State_FadeInApp(FrontierRecordsApp *app);
static BOOL State_ViewRecord(FrontierRecordsApp *app);
static BOOL State_FadeOutApp(FrontierRecordsApp *app);
static void VBlankCallback(void *data);
static void SetGXBanks(void);
static void InitBackgrounds(BgConfig *bgConfig);
static void LoadBackgrounds(FrontierRecordsApp *app);
static void FreeBackgrounds(BgConfig *app);
static void ChangeState(FrontierRecordsApp *app, int *state, int newState);
static u8 GetWindowGroup(u8 facility);
static void LoadMainBackground(FrontierRecordsApp *app, enum BgLayer bgLayer);
static void LoadMainBackgroundPalette(void);
static void LoadSubBackground(FrontierRecordsApp *app, enum BgLayer bgLayer);
static u8 PrintMessage(FrontierRecordsApp *app, Window *window, int entryID, u32 x, u32 y, u8 fgColor, u8 shadowColor, u8 bgColor, u8 font, u8 fillBackground, int alignment);
static u8 PrintBasicMessage(FrontierRecordsApp *app, Window *window, int entryID, u8 font);
static void SetStringTemplateNumber(FrontierRecordsApp *app, u32 idx, s32 num);
static void DisplayRecords(FrontierRecordsApp *app);
static void DisplayBattleFactoryLevel50Record(FrontierRecordsApp *app);
static void DisplayBattleFactoryOpenLevelRecord(FrontierRecordsApp *app);
static u32 GetBattleFactoryLatestStreakEntryID(FrontierRecordsApp *app, u8 openLevel);
static void DispalyBattleHallRecord(FrontierRecordsApp *app);
static void SetStringTemplateSpecies(FrontierRecordsApp *app);
static void DisplayBattleCastleRecord(FrontierRecordsApp *app);
static u32 GetBattleCastleLatestStreakEntryID(FrontierRecordsApp *app);
static void DisplayBattleArcadeRecord(FrontierRecordsApp *app);
static u32 GetBattleArcadeLatestStreakEntryID(FrontierRecordsApp *app);
static void DisplayBattleTowerSoloRecord(FrontierRecordsApp *app);
static void DisplayBattleTowerMultiRecord(FrontierRecordsApp *app);
static u32 GetBattleTowerLatestStreakEntryID(FrontierRecordsApp *app, u8 towerMode);
int BattleFrontierRecordsApp_Init(ApplicationManager *appMan, int *state)
{
SetVBlankCallback(NULL, NULL);
SetHBlankCallback(NULL, NULL);
GXLayers_DisableEngineALayers();
GXLayers_DisableEngineBLayers();
GX_SetVisiblePlane(0);
GXS_SetVisiblePlane(0);
Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_FRONTIER_RECORD_APP, HEAP_SIZE_FRONTIER_RECORDS_APP);
FrontierRecordsApp *app = ApplicationManager_NewData(appMan, sizeof(FrontierRecordsApp), HEAP_ID_FRONTIER_RECORD_APP);
memset(app, 0, sizeof(FrontierRecordsApp));
app->appMan = appMan;
app->bgConfig = BgConfig_New(HEAP_ID_FRONTIER_RECORD_APP);
FrontierRecordsAppArgs *args = ApplicationManager_Args(appMan);
app->saveData = args->saveData;
app->frontier = SaveData_GetBattleFrontier(app->saveData);
app->challengeType = args->challengeType;
app->facility = args->facility;
app->species = args->species;
app->options = SaveData_GetOptions(app->saveData);
LoadBackgrounds(app);
app->msgLoader = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_BATTLE_FRONTIER_RECORDS, HEAP_ID_FRONTIER_RECORD_APP);
app->strTemplate = StringTemplate_Default(HEAP_ID_FRONTIER_RECORD_APP);
app->displayStr = String_Init(800, HEAP_ID_FRONTIER_RECORD_APP);
app->fmtStr = String_Init(800, HEAP_ID_FRONTIER_RECORD_APP);
Font_LoadTextPalette(0, 13 * PALETTE_SIZE_BYTES, HEAP_ID_FRONTIER_RECORD_APP);
Font_LoadScreenIndicatorsPalette(0, 12 * PALETTE_SIZE_BYTES, HEAP_ID_FRONTIER_RECORD_APP);
FrontierRecordsApp_InitWindows(app->bgConfig, app->windows, GetWindowGroup(app->facility));
SetVBlankCallback(VBlankCallback, app);
*state = 0;
return TRUE;
}
int BattleFrontierRecordsApp_Main(ApplicationManager *appMan, int *state)
{
FrontierRecordsApp *app = ApplicationManager_Data(appMan);
switch (*state) {
case 0:
if (State_FadeInApp(app) == TRUE) {
ChangeState(app, state, 1);
}
break;
case 1:
if (State_ViewRecord(app) == TRUE) {
ChangeState(app, state, 2);
}
break;
case 2:
if (State_FadeOutApp(app) == TRUE) {
return TRUE;
}
break;
}
return FALSE;
}
int BattleFrontierRecordsApp_Exit(ApplicationManager *appMan, int *state)
{
FrontierRecordsApp *app = ApplicationManager_Data(appMan);
PaletteData_FreeBuffer(app->plttData, PLTTBUF_MAIN_OBJ);
PaletteData_FreeBuffer(app->plttData, PLTTBUF_MAIN_BG);
PaletteData_Free(app->plttData);
app->plttData = NULL;
MessageLoader_Free(app->msgLoader);
StringTemplate_Free(app->strTemplate);
String_Free(app->displayStr);
String_Free(app->fmtStr);
FrontierRecordsApp_FreeWindows(app->windows, GetWindowGroup(app->facility));
FreeBackgrounds(app->bgConfig);
ApplicationManager_FreeData(appMan);
SetVBlankCallback(NULL, NULL);
Heap_Destroy(HEAP_ID_FRONTIER_RECORD_APP);
return TRUE;
}
static BOOL State_FadeInApp(FrontierRecordsApp *app)
{
switch (app->subState) {
case 0:
app->subState++;
break;
case 1:
StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_IN, FADE_TYPE_BRIGHTNESS_IN, COLOR_BLACK, 6, 3, HEAP_ID_FRONTIER_RECORD_APP);
DisplayRecords(app);
app->subState++;
break;
case 2:
if (IsScreenFadeDone() == TRUE) {
return TRUE;
}
break;
}
return FALSE;
}
static BOOL State_ViewRecord(FrontierRecordsApp *app)
{
switch (app->subState) {
case 0:
app->subState++;
break;
case 1:
if (JOY_HELD(PAD_BUTTON_A) || JOY_HELD(PAD_BUTTON_B)) {
return TRUE;
}
break;
}
return FALSE;
}
static BOOL State_FadeOutApp(FrontierRecordsApp *app)
{
switch (app->subState) {
case 0:
StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_BLACK, 6, 1, HEAP_ID_FRONTIER_RECORD_APP);
app->subState++;
break;
case 1:
if (IsScreenFadeDone() == TRUE) {
return TRUE;
}
break;
}
return FALSE;
}
static void VBlankCallback(void *data)
{
FrontierRecordsApp *app = data;
if (app->plttData != NULL) {
PaletteData_CommitFadedBuffers(app->plttData);
}
Bg_RunScheduledUpdates(app->bgConfig);
OS_SetIrqCheckFlag(OS_IE_V_BLANK);
}
static void SetGXBanks(void)
{
GXBanks banks = {
GX_VRAM_BG_128_A,
GX_VRAM_BGEXTPLTT_NONE,
GX_VRAM_SUB_BG_128_C,
GX_VRAM_SUB_BGEXTPLTT_NONE,
GX_VRAM_OBJ_128_B,
GX_VRAM_OBJEXTPLTT_NONE,
GX_VRAM_SUB_OBJ_16_I,
GX_VRAM_SUB_OBJEXTPLTT_NONE,
GX_VRAM_TEX_NONE,
GX_VRAM_TEXPLTT_NONE
};
GXLayers_SetBanks(&banks);
}
static void InitBackgrounds(BgConfig *bgConfig)
{
GraphicsModes graphicsModes = {
GX_DISPMODE_GRAPHICS,
GX_BGMODE_0,
GX_BGMODE_0,
GX_BG0_AS_2D
};
SetAllGraphicsModes(&graphicsModes);
BgTemplate bgTemplate = {
.x = 0,
.y = 0,
.bufferSize = 0x800,
.baseTile = 0,
.screenSize = BG_SCREEN_SIZE_256x256,
.colorMode = GX_BG_COLORMODE_16,
.screenBase = GX_BG_SCRBASE_0x0000,
.charBase = GX_BG_CHARBASE_0x04000,
.bgExtPltt = GX_BG_EXTPLTT_01,
.priority = 0,
.areaOver = 0,
.mosaic = FALSE,
};
Bg_InitFromTemplate(bgConfig, BG_LAYER_MAIN_0, &bgTemplate, BG_TYPE_STATIC);
Bg_ClearTilesRange(BG_LAYER_MAIN_0, 32, 0, HEAP_ID_FRONTIER_RECORD_APP);
Bg_ClearTilemap(bgConfig, BG_LAYER_MAIN_0);
BgTemplate bgTemplate2 = {
.x = 0,
.y = 0,
.bufferSize = 0x800,
.baseTile = 0,
.screenSize = BG_SCREEN_SIZE_256x256,
.colorMode = GX_BG_COLORMODE_16,
.screenBase = GX_BG_SCRBASE_0x1000,
.charBase = GX_BG_CHARBASE_0x0c000,
.bgExtPltt = GX_BG_EXTPLTT_01,
.priority = 0,
.areaOver = 0,
.mosaic = FALSE,
};
Bg_InitFromTemplate(bgConfig, BG_LAYER_MAIN_2, &bgTemplate2, BG_TYPE_STATIC);
Bg_ClearTilesRange(BG_LAYER_MAIN_2, 32, 0, HEAP_ID_FRONTIER_RECORD_APP);
Bg_ClearTilemap(bgConfig, BG_LAYER_MAIN_2);
BgTemplate bgTemplateSub = {
.x = 0,
.y = 0,
.bufferSize = 0x800,
.baseTile = 0,
.screenSize = BG_SCREEN_SIZE_256x256,
.colorMode = GX_BG_COLORMODE_16,
.screenBase = GX_BG_SCRBASE_0x3000,
.charBase = GX_BG_CHARBASE_0x04000,
.bgExtPltt = GX_BG_EXTPLTT_01,
.priority = 0,
.areaOver = 0,
.mosaic = FALSE,
};
Bg_InitFromTemplate(bgConfig, BG_LAYER_SUB_2, &bgTemplateSub, BG_TYPE_STATIC);
Bg_ClearTilesRange(BG_LAYER_SUB_2, 32, 0, HEAP_ID_FRONTIER_RECORD_APP);
Bg_ClearTilemap(bgConfig, BG_LAYER_SUB_2);
G2_SetBG0Priority(0);
GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, TRUE);
GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG2, TRUE);
}
static void LoadBackgrounds(FrontierRecordsApp *app)
{
SetGXBanks();
InitBackgrounds(app->bgConfig);
app->plttData = PaletteData_New(HEAP_ID_FRONTIER_RECORD_APP);
PaletteData_AllocBuffer(app->plttData, PLTTBUF_MAIN_OBJ, PALETTE_SIZE_BYTES * SLOTS_PER_PALETTE, HEAP_ID_FRONTIER_RECORD_APP);
PaletteData_AllocBuffer(app->plttData, PLTTBUF_MAIN_BG, PALETTE_SIZE_BYTES * SLOTS_PER_PALETTE, HEAP_ID_FRONTIER_RECORD_APP);
LoadMainBackground(app, BG_LAYER_MAIN_2);
LoadMainBackgroundPalette();
LoadSubBackground(app, BG_LAYER_SUB_2);
}
static void FreeBackgrounds(BgConfig *app)
{
GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1 | GX_PLANEMASK_BG2 | GX_PLANEMASK_BG3 | GX_PLANEMASK_OBJ, FALSE);
GXLayers_EngineBToggleLayers(GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1 | GX_PLANEMASK_BG2 | GX_PLANEMASK_BG3 | GX_PLANEMASK_OBJ, FALSE);
Bg_FreeTilemapBuffer(app, BG_LAYER_MAIN_0);
Bg_FreeTilemapBuffer(app, BG_LAYER_MAIN_2);
Bg_FreeTilemapBuffer(app, BG_LAYER_SUB_2);
Heap_Free(app);
}
static void ChangeState(FrontierRecordsApp *app, int *state, int newState)
{
app->subState = 0;
*state = newState;
}
static u8 GetWindowGroup(u8 facility)
{
u8 windowGroup = 0;
switch (facility) {
case FRONTIER_RECORDS_APP_FACTORY:
case 3:
windowGroup = WINDOW_GROUP_FACTORY;
break;
case FRONTIER_RECORDS_APP_HALL:
windowGroup = WINDOW_GROUP_HALL;
break;
case FRONTIER_RECORDS_APP_CASTLE:
windowGroup = WINDOW_GROUP_CASTLE;
break;
case FRONTIER_RECORDS_APP_ARCADE:
windowGroup = WINDOW_GROUP_ARCADE;
break;
case FRONTIER_RECORDS_APP_TOWER:
windowGroup = WINDOW_GROUP_TOWER;
break;
}
return windowGroup;
}
static void LoadMainBackground(FrontierRecordsApp *app, enum BgLayer bgLayer)
{
NARC *narc = NARC_ctor(NARC_INDEX_RESOURCE__ENG__FRONTIER_GRAPHIC__FRONTIER_BG, HEAP_ID_FRONTIER_RECORD_APP);
Graphics_LoadTilesToBgLayerFromOpenNARC(narc, BATTLE_FRONTIER_RECORDS_APP_TILES, app->bgConfig, bgLayer, 0, 0, TRUE, HEAP_ID_FRONTIER_RECORD_APP);
Graphics_LoadTilemapToBgLayerFromOpenNARC(narc, BATTLE_FRONTIER_RECORDS_APP_TILEMAP, app->bgConfig, bgLayer, 0, 0, TRUE, HEAP_ID_FRONTIER_RECORD_APP);
NARC_dtor(narc);
}
static void LoadMainBackgroundPalette(void)
{
NNSG2dPaletteData *plttData;
void *pltt = Graphics_GetPlttData(NARC_INDEX_RESOURCE__ENG__FRONTIER_GRAPHIC__FRONTIER_BG, BATTLE_FRONTIER_RECORDS_APP_PLTT, &plttData, HEAP_ID_FRONTIER_RECORD_APP);
DC_FlushRange(plttData->pRawData, PALETTE_SIZE_BYTES * 2);
GX_LoadBGPltt(plttData->pRawData, 0, PALETTE_SIZE_BYTES * 2);
Heap_Free(pltt);
}
static void LoadSubBackground(FrontierRecordsApp *app, enum BgLayer bgLayer)
{
NARC *narc = NARC_ctor(NARC_INDEX_GRAPHIC__POKETCH, HEAP_ID_FRONTIER_RECORD_APP);
Graphics_LoadTilesToBgLayerFromOpenNARC(narc, unavailable_bg_tiles_NCGR_lz, app->bgConfig, bgLayer, 0, 0, TRUE, HEAP_ID_FRONTIER_RECORD_APP);
Graphics_LoadTilemapToBgLayerFromOpenNARC(narc, unavailable_NSCR_lz, app->bgConfig, bgLayer, 0, 0, TRUE, HEAP_ID_FRONTIER_RECORD_APP);
Graphics_LoadPaletteFromOpenNARC(narc, NARC_INDEX_GRAPHIC__POKETCH, PAL_LOAD_SUB_BG, generic_bg_tiles_NCLR, PALETTE_SIZE_BYTES, HEAP_ID_FRONTIER_RECORD_APP);
NARC_dtor(narc);
}
static u8 PrintMessage(FrontierRecordsApp *app, Window *window, int entryID, u32 x, u32 y, u8 fgColor, u8 shadowColor, u8 bgColor, u8 font, u8 fillBackground, int alignment)
{
if (fillBackground) {
Window_FillTilemap(window, bgColor);
}
MessageLoader_GetString(app->msgLoader, entryID, app->fmtStr);
StringTemplate_Format(app->strTemplate, app->displayStr, app->fmtStr);
switch (alignment) {
case TEXT_ALIGN_CENTER:
x -= (Font_CalcStringWidth(FONT_SYSTEM, app->displayStr, 0) + 1) / 2;
break;
case TEXT_ALIGN_RIGHT:
x -= Font_CalcStringWidth(FONT_SYSTEM, app->displayStr, 0);
break;
}
return Text_AddPrinterWithParamsAndColor(window, font, app->displayStr, x, y, TEXT_SPEED_INSTANT, TEXT_COLOR(fgColor, shadowColor, bgColor), NULL);
}
static u8 PrintBasicMessage(FrontierRecordsApp *app, Window *window, int entryID, u8 font)
{
return PrintMessage(app, window, entryID, 0, 0, 1, 2, 0, FONT_SYSTEM, font, TEXT_ALIGN_LEFT);
}
static void SetStringTemplateNumber(FrontierRecordsApp *app, u32 idx, s32 num)
{
StringTemplate_SetNumber(app->strTemplate, idx, num, 4, PADDING_MODE_SPACES, CHARSET_MODE_EN);
}
static void DisplayRecords(FrontierRecordsApp *app)
{
switch (app->facility) {
case FRONTIER_RECORDS_APP_FACTORY:
case 3:
DisplayBattleFactoryLevel50Record(app);
DisplayBattleFactoryOpenLevelRecord(app);
break;
case FRONTIER_RECORDS_APP_HALL:
DispalyBattleHallRecord(app);
break;
case FRONTIER_RECORDS_APP_CASTLE:
DisplayBattleCastleRecord(app);
break;
case FRONTIER_RECORDS_APP_ARCADE:
DisplayBattleArcadeRecord(app);
break;
case FRONTIER_RECORDS_APP_TOWER:
if (app->challengeType == FRONTIER_CHALLENGE_SINGLE || app->challengeType == FRONTIER_CHALLENGE_DOUBLE) {
DisplayBattleTowerSoloRecord(app);
} else {
DisplayBattleTowerMultiRecord(app);
}
break;
default:
DisplayBattleArcadeRecord(app);
break;
}
}
static void DisplayBattleFactoryLevel50Record(FrontierRecordsApp *app)
{
Window_FillTilemap(&app->windows[WINDOW_HEADER], 0);
PrintMessage(app, &app->windows[WINDOW_HEADER], BattleFrontierRecords_Text_BattleFactory, 8, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_LEFT);
int entryID;
u32 x;
if (app->challengeType == FRONTIER_CHALLENGE_SINGLE) {
entryID = BattleFrontierRecords_Text_SingleRecord;
x = 216;
} else if (app->challengeType == FRONTIER_CHALLENGE_DOUBLE) {
entryID = BattleFrontierRecords_Text_DoubleRecord;
x = 216;
} else {
entryID = BattleFrontierRecords_Text_MultiRecord;
x = 216;
}
PrintMessage(app, &app->windows[WINDOW_HEADER], entryID, x, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_RIGHT);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_HEADER]);
PrintBasicMessage(app, &app->windows[WINDOW_FACTORY_LEVEL_50_HEADER], BattleFrontierRecords_Text_Level50, FONT_MESSAGE);
PrintMessage(app, &app->windows[WINDOW_FACTORY_LEVEL_50_HEADER], BattleFrontierRecords_Text_RentalTrade, 224, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_RIGHT);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_FACTORY_LEVEL_50_HEADER]);
PrintBasicMessage(app, &app->windows[WINDOW_FACTORY_LEVEL_50_LATEST], GetBattleFactoryLatestStreakEntryID(app, FALSE), FONT_MESSAGE);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E430(0, app->challengeType), 0xFF));
PrintMessage(app, &app->windows[WINDOW_FACTORY_LEVEL_50_LATEST], BattleFrontierRecords_Text_WinStreak, 112, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_CENTER);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E488(0, app->challengeType), 0xFF));
PrintMessage(app, &app->windows[WINDOW_FACTORY_LEVEL_50_LATEST], BattleFrontierRecords_Text_Number, 224, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_RIGHT);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_FACTORY_LEVEL_50_LATEST]);
PrintBasicMessage(app, &app->windows[WINDOW_FACTORY_LEVEL_50_RECORD], BattleFrontierRecords_Text_Record, FONT_MESSAGE);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E45C(0, app->challengeType), 0xFF));
PrintMessage(app, &app->windows[WINDOW_FACTORY_LEVEL_50_RECORD], BattleFrontierRecords_Text_WinStreak, 112, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_CENTER);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E4B4(0, app->challengeType), 0xFF));
PrintMessage(app, &app->windows[WINDOW_FACTORY_LEVEL_50_RECORD], BattleFrontierRecords_Text_Number, 224, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_RIGHT);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_FACTORY_LEVEL_50_RECORD]);
}
static void DisplayBattleFactoryOpenLevelRecord(FrontierRecordsApp *app)
{
PrintBasicMessage(app, &app->windows[WINDOW_FACTORY_OPEN_LEVEL_HEADER], BattleFrontierRecords_Text_OpenLevel, FONT_MESSAGE);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_FACTORY_OPEN_LEVEL_HEADER]);
PrintBasicMessage(app, &app->windows[WINDOW_FACTORY_OPEN_LEVEL_LATEST], GetBattleFactoryLatestStreakEntryID(app, TRUE), FONT_MESSAGE);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E430(1, app->challengeType), 0xFF));
PrintMessage(app, &app->windows[WINDOW_FACTORY_OPEN_LEVEL_LATEST], BattleFrontierRecords_Text_WinStreak, 112, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_CENTER);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E488(1, app->challengeType), 0xFF));
PrintMessage(app, &app->windows[WINDOW_FACTORY_OPEN_LEVEL_LATEST], BattleFrontierRecords_Text_Number, 224, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_RIGHT);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_FACTORY_OPEN_LEVEL_LATEST]);
PrintBasicMessage(app, &app->windows[WINDOW_FACTORY_OPEN_LEVEL_RECORD], BattleFrontierRecords_Text_Record, FONT_MESSAGE);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E45C(1, app->challengeType), 0xFF));
PrintMessage(app, &app->windows[WINDOW_FACTORY_OPEN_LEVEL_RECORD], BattleFrontierRecords_Text_WinStreak, 112, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_CENTER);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E4B4(1, app->challengeType), 0xFF));
PrintMessage(app, &app->windows[WINDOW_FACTORY_OPEN_LEVEL_RECORD], BattleFrontierRecords_Text_Number, 224, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_RIGHT);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_FACTORY_OPEN_LEVEL_RECORD]);
}
static u32 GetBattleFactoryLatestStreakEntryID(FrontierRecordsApp *app, u8 openLevel)
{
u32 v1 = !openLevel ? 102 : 104;
u8 streakIsActive;
if (app->challengeType == FRONTIER_CHALLENGE_MULTI_WFC) {
streakIsActive = sub_02030698(SaveData_GetBattleFrontier(app->saveData), v1, sub_0205E6A8(v1));
} else {
streakIsActive = sub_020300E0(sub_020300F4(app->saveData), 10, (openLevel * 4) + app->challengeType, NULL);
}
if (streakIsActive == TRUE) {
return BattleFrontierRecords_Text_Current;
}
return BattleFrontierRecords_Text_Prev;
}
static void DispalyBattleHallRecord(FrontierRecordsApp *app)
{
Window_FillTilemap(&app->windows[WINDOW_HEADER], 0);
PrintMessage(app, &app->windows[WINDOW_HEADER], BattleFrontierRecords_Text_BattleHall, 8, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_LEFT);
int entryID;
u32 x;
if (app->challengeType == FRONTIER_CHALLENGE_SINGLE) {
entryID = BattleFrontierRecords_Text_SingleRecord;
x = 216;
} else if (app->challengeType == FRONTIER_CHALLENGE_DOUBLE) {
entryID = BattleFrontierRecords_Text_DoubleRecord;
x = 216;
} else {
entryID = BattleFrontierRecords_Text_MultiRecord;
x = 216;
}
PrintMessage(app, &app->windows[WINDOW_HEADER], entryID, x, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_RIGHT);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_HEADER]);
SetStringTemplateSpecies(app);
PrintMessage(app, &app->windows[WINDOW_HALL_MON_NAME], BattleFrontierRecords_Text_MonsRecord, 0, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_LEFT);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_HALL_MON_NAME]);
PrintBasicMessage(app, &app->windows[WINDOW_HALL_LATEST], BattleFrontierRecords_Text_Prev, FONT_MESSAGE);
u16 streak;
if (app->species != sub_02030698(SaveData_GetBattleFrontier(app->saveData), sub_0205E55C(app->challengeType), sub_0205E6A8(sub_0205E55C(app->challengeType)))) {
streak = 0;
} else {
streak = sub_02030698(app->frontier, sub_0205E50C(app->challengeType), 0xFF);
}
SetStringTemplateNumber(app, 0, streak);
PrintMessage(app, &app->windows[WINDOW_HALL_LATEST], BattleFrontierRecords_Text_WinStreak, 112, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_CENTER);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_HALL_LATEST]);
PrintBasicMessage(app, &app->windows[WINDOW_HALL_RECORD], BattleFrontierRecords_Text_Record, FONT_MESSAGE);
int resultCode;
BattleFrontierStage *frontierStage = sub_020308A0(app->saveData, HEAP_ID_FIELD2, &resultCode);
if (resultCode != LOAD_RESULT_OK) {
streak = 0;
} else {
streak = sub_020308BC(app->saveData, frontierStage, sub_0205E584(app->challengeType), app->species);
}
if (frontierStage != NULL) {
Heap_Free(frontierStage);
}
SetStringTemplateNumber(app, 0, streak);
PrintMessage(app, &app->windows[WINDOW_HALL_RECORD], BattleFrontierRecords_Text_WinStreak, 112, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_CENTER);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_HALL_RECORD]);
}
static void SetStringTemplateSpecies(FrontierRecordsApp *app)
{
MessageLoader *loader = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_SPECIES_NAME, HEAP_ID_FRONTIER_RECORD_APP);
String *string = MessageLoader_GetNewString(loader, app->species);
MessageLoader_Free(loader);
StringTemplate_SetString(app->strTemplate, 0, string, 0, 0, GAME_LANGUAGE);
String_Free(string);
}
static void DisplayBattleCastleRecord(FrontierRecordsApp *app)
{
Window_FillTilemap(&app->windows[WINDOW_HEADER], 0);
PrintMessage(app, &app->windows[WINDOW_HEADER], BattleFrontierRecords_Text_BattleCastle, 8, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_LEFT);
int entryID;
u32 x;
if (app->challengeType == FRONTIER_CHALLENGE_SINGLE) {
entryID = BattleFrontierRecords_Text_SingleRecord;
x = 216;
} else if (app->challengeType == FRONTIER_CHALLENGE_DOUBLE) {
entryID = BattleFrontierRecords_Text_DoubleRecord;
x = 216;
} else {
entryID = BattleFrontierRecords_Text_MultiRecord;
x = 216;
}
PrintMessage(app, &app->windows[WINDOW_HEADER], entryID, x, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_RIGHT);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_HEADER]);
PrintMessage(app, &app->windows[WINDOW_CASTLE_POINTS], BattleFrontierRecords_Text_CastlePoints, 96, 0, 1, 2, 0, FONT_SYSTEM, TRUE, TEXT_ALIGN_RIGHT);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_CASTLE_POINTS]);
PrintBasicMessage(app, &app->windows[WINDOW_CASTLES_LATEST], GetBattleCastleLatestStreakEntryID(app), FONT_MESSAGE);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E5E0(app->challengeType), 0xFF));
PrintMessage(app, &app->windows[WINDOW_CASTLES_LATEST], BattleFrontierRecords_Text_WinStreakTemplate, 112, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_CENTER);
SetStringTemplateNumber(app, 0, sub_02030698(SaveData_GetBattleFrontier(app->saveData), sub_0205E630(app->challengeType), sub_0205E6A8(sub_0205E630(app->challengeType))));
PrintMessage(app, &app->windows[WINDOW_CASTLES_LATEST], BattleFrontierRecords_Text_CP, 224, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_RIGHT);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_CASTLES_LATEST]);
PrintBasicMessage(app, &app->windows[WINDOW_CASTLES_RECORD], BattleFrontierRecords_Text_Record, FONT_MESSAGE);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E608(app->challengeType), 0xFF));
PrintMessage(app, &app->windows[WINDOW_CASTLES_RECORD], BattleFrontierRecords_Text_WinStreakTemplate, 112, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_CENTER);
SetStringTemplateNumber(app, 0, sub_02030698(SaveData_GetBattleFrontier(app->saveData), sub_0205E680(app->challengeType), sub_0205E6A8(sub_0205E680(app->challengeType))));
PrintMessage(app, &app->windows[WINDOW_CASTLES_RECORD], BattleFrontierRecords_Text_CP, 224, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_RIGHT);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_CASTLES_RECORD]);
}
static u32 GetBattleCastleLatestStreakEntryID(FrontierRecordsApp *app)
{
u8 isActive;
if (app->challengeType == FRONTIER_CHALLENGE_MULTI_WFC) {
isActive = sub_02030698(SaveData_GetBattleFrontier(app->saveData), 108, sub_0205E6A8(108));
} else {
isActive = sub_02030470(sub_0203041C(app->saveData), 9, app->challengeType, 0, NULL);
}
if (isActive == 1) {
return BattleFrontierRecords_Text_Current;
}
return BattleFrontierRecords_Text_Prev;
}
static void DisplayBattleArcadeRecord(FrontierRecordsApp *app)
{
Window_FillTilemap(&app->windows[WINDOW_HEADER], 0);
PrintMessage(app, &app->windows[WINDOW_HEADER], BattleFrontierRecords_Text_BattleArcade, 8, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_LEFT);
int entryID;
u32 x;
if (app->challengeType == FRONTIER_CHALLENGE_SINGLE) {
entryID = BattleFrontierRecords_Text_SingleRecord;
x = 216;
} else if (app->challengeType == FRONTIER_CHALLENGE_DOUBLE) {
entryID = BattleFrontierRecords_Text_DoubleRecord;
x = 216;
} else {
entryID = BattleFrontierRecords_Text_MultiRecord;
x = 216;
}
PrintMessage(app, &app->windows[WINDOW_HEADER], entryID, x, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_RIGHT);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_HEADER]);
PrintBasicMessage(app, &app->windows[WINDOW_ARCADE_LATEST], GetBattleArcadeLatestStreakEntryID(app), FONT_MESSAGE);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E700(app->challengeType), 0xFF));
PrintMessage(app, &app->windows[WINDOW_ARCADE_LATEST], BattleFrontierRecords_Text_GamesCleared, 112, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_CENTER);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_ARCADE_LATEST]);
PrintBasicMessage(app, &app->windows[WINDOW_ARCADE_RECORD], 31, FONT_MESSAGE);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E728(app->challengeType), 0xFF));
PrintMessage(app, &app->windows[WINDOW_ARCADE_RECORD], BattleFrontierRecords_Text_GamesCleared, 112, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_CENTER);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_ARCADE_RECORD]);
}
static u32 GetBattleArcadeLatestStreakEntryID(FrontierRecordsApp *app)
{
u8 isActive;
if (app->challengeType == FRONTIER_CHALLENGE_MULTI_WFC) {
isActive = sub_02030698(SaveData_GetBattleFrontier(app->saveData), 110, sub_0205E6A8(110));
} else {
isActive = sub_02030600(sub_020305B8(app->saveData), 8, app->challengeType, 0, NULL);
}
if (isActive == 1) {
return BattleFrontierRecords_Text_Current;
}
return BattleFrontierRecords_Text_Prev;
}
static void DisplayBattleTowerSoloRecord(FrontierRecordsApp *app)
{
Window_FillTilemap(&app->windows[WINDOW_HEADER], 0);
PrintMessage(app, &app->windows[WINDOW_HEADER], BattleFrontierRecords_Text_BattleTower, 8, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_LEFT);
int entryID;
u32 x;
if (app->challengeType == FRONTIER_CHALLENGE_SINGLE) {
entryID = BattleFrontierRecords_Text_SingleRecord;
x = 216;
} else {
entryID = BattleFrontierRecords_Text_DoubleRecord;
x = 216;
}
PrintMessage(app, &app->windows[WINDOW_HEADER], entryID, x, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_RIGHT);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_HEADER]);
PrintBasicMessage(app, &app->windows[WINDOW_TOWER_SOLO_LATEST], GetBattleTowerLatestStreakEntryID(app, app->challengeType), FONT_MESSAGE);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E750(app->challengeType), 0xFF));
PrintMessage(app, &app->windows[WINDOW_TOWER_SOLO_LATEST], BattleFrontierRecords_Text_WinStreak, 112, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_CENTER);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_TOWER_SOLO_LATEST]);
PrintBasicMessage(app, &app->windows[WINDOW_TOWER_SOLO_RECORD], 31, FONT_MESSAGE);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E790(app->challengeType), 0xFF));
PrintMessage(app, &app->windows[WINDOW_TOWER_SOLO_RECORD], BattleFrontierRecords_Text_WinStreak, 112, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_CENTER);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_TOWER_SOLO_RECORD]);
}
static void DisplayBattleTowerMultiRecord(FrontierRecordsApp *app)
{
Window_FillTilemap(&app->windows[WINDOW_HEADER], 0);
PrintMessage(app, &app->windows[WINDOW_HEADER], BattleFrontierRecords_Text_BattleTower, 8, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_LEFT);
PrintMessage(app, &app->windows[WINDOW_HEADER], BattleFrontierRecords_Text_MultiRecord, 216, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_RIGHT);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_HEADER]);
PrintBasicMessage(app, &app->windows[WINDOW_TOWER_MULTI_W_TRAINER], BattleFrontierRecords_Text_MultiWithTrainer, FONT_MESSAGE);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_TOWER_MULTI_W_TRAINER]);
PrintBasicMessage(app, &app->windows[WINDOW_TOWER_MULTI_LATEST], GetBattleTowerLatestStreakEntryID(app, app->challengeType), FONT_MESSAGE);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E750(app->challengeType), 0xFF));
PrintMessage(app, &app->windows[WINDOW_TOWER_MULTI_LATEST], BattleFrontierRecords_Text_WinStreak, 112, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_CENTER);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_TOWER_MULTI_LATEST]);
PrintBasicMessage(app, &app->windows[WINDOW_TOWER_MULTI_RECORD], BattleFrontierRecords_Text_Record, FONT_MESSAGE);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E790(app->challengeType), 0xFF));
PrintMessage(app, &app->windows[WINDOW_TOWER_MULTI_RECORD], BattleFrontierRecords_Text_WinStreak, 112, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_CENTER);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_TOWER_MULTI_RECORD]);
PrintBasicMessage(app, &app->windows[WINDOW_TOWER_MULTI_W_FRIEND], BattleFrontierRecords_Text_MultiWithFriend, FONT_MESSAGE);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_TOWER_MULTI_W_FRIEND]);
PrintBasicMessage(app, &app->windows[WINDOW_TOWER_W_FRIEND_LATEST], GetBattleTowerLatestStreakEntryID(app, BATTLE_TOWER_MODE_LINK_MULTI), FONT_MESSAGE);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E750(3), 0xFF));
PrintMessage(app, &app->windows[WINDOW_TOWER_W_FRIEND_LATEST], BattleFrontierRecords_Text_WinStreak, 112, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_CENTER);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_TOWER_W_FRIEND_LATEST]);
PrintBasicMessage(app, &app->windows[WINDOW_TOWER_W_FRIEND_RECORD], BattleFrontierRecords_Text_Record, FONT_MESSAGE);
SetStringTemplateNumber(app, 0, sub_02030698(app->frontier, sub_0205E790(3), 0xFF));
PrintMessage(app, &app->windows[WINDOW_TOWER_W_FRIEND_RECORD], BattleFrontierRecords_Text_WinStreak, 112, 0, 1, 2, 0, FONT_SYSTEM, FALSE, TEXT_ALIGN_CENTER);
Window_ScheduleCopyToVRAM(&app->windows[WINDOW_TOWER_W_FRIEND_RECORD]);
}
static u32 GetBattleTowerLatestStreakEntryID(FrontierRecordsApp *app, u8 towerMode)
{
UnkStruct_0202D750 *v2 = sub_0202D750(app->saveData);
u16 v0;
switch (towerMode) {
case BATTLE_TOWER_MODE_SINGLE:
v0 = 8;
break;
case BATTLE_TOWER_MODE_DOUBLE:
v0 = 9;
break;
case BATTLE_TOWER_MODE_MULTI:
v0 = 10;
break;
case BATTLE_TOWER_MODE_LINK_MULTI:
v0 = 11;
break;
case BATTLE_TOWER_MODE_WIFI:
v0 = 12;
break;
case BATTLE_TOWER_MODE_6:
v0 = 15;
break;
default:
v0 = 8;
break;
}
int isActive = sub_0202D414(v2, v0, 0);
if (isActive == TRUE) {
return BattleFrontierRecords_Text_Current;
}
return BattleFrontierRecords_Text_Prev;
}

View File

@ -0,0 +1,295 @@
#include "applications/frontier/records/windows.h"
#include <nitro.h>
#include "bg_window.h"
static const WindowTemplate sFactoryWinTemplates[] = {
[WINDOW_HEADER] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 2,
.width = 30,
.height = 2,
.palette = 13,
.baseTile = 1,
},
[WINDOW_FACTORY_LEVEL_50_HEADER] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 7,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 61,
},
[WINDOW_FACTORY_LEVEL_50_LATEST] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 10,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 117,
},
[WINDOW_FACTORY_LEVEL_50_RECORD] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 12,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 173,
},
[WINDOW_FACTORY_OPEN_LEVEL_HEADER] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 15,
.width = 16,
.height = 2,
.palette = 13,
.baseTile = 229,
},
[WINDOW_FACTORY_OPEN_LEVEL_LATEST] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 18,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 261,
},
[WINDOW_FACTORY_OPEN_LEVEL_RECORD] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 20,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 317,
},
};
static const WindowTemplate sHallWinTemplates[] = {
[WINDOW_HEADER] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 2,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 1,
},
[WINDOW_HALL_MON_NAME] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 7,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 57,
},
[WINDOW_HALL_LATEST] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 10,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 113,
},
[WINDOW_HALL_RECORD] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 13,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 169,
},
};
static const WindowTemplate sCastleWinTemplates[] = {
[WINDOW_HEADER] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 2,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 1,
},
[WINDOW_CASTLE_POINTS] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 18,
.tilemapTop = 7,
.width = 12,
.height = 2,
.palette = 13,
.baseTile = 57,
},
[WINDOW_CASTLES_LATEST] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 10,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 81,
},
[WINDOW_CASTLES_RECORD] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 13,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 137,
},
};
static const WindowTemplate sArcadeWinTemplates[] = {
[WINDOW_HEADER] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 2,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 1,
},
[WINDOW_ARCADE_LATEST] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 8,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 57,
},
[WINDOW_ARCADE_RECORD] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 11,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 113,
},
};
static const WindowTemplate sTowerWinTemplates[] = {
[WINDOW_HEADER] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 2,
.width = 30,
.height = 2,
.palette = 13,
.baseTile = 1,
},
[WINDOW_TOWER_MULTI_W_TRAINER] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 7,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 61,
},
[WINDOW_TOWER_SOLO_LATEST] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 7,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 117,
},
[WINDOW_TOWER_SOLO_RECORD] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 10,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 173,
},
[WINDOW_TOWER_MULTI_LATEST] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 10,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 117,
},
[WINDOW_TOWER_MULTI_RECORD] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 12,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 173,
},
[WINDOW_TOWER_MULTI_W_FRIEND] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 15,
.width = 16,
.height = 2,
.palette = 13,
.baseTile = 229,
},
[WINDOW_TOWER_W_FRIEND_LATEST] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 18,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 261,
},
[WINDOW_TOWER_W_FRIEND_RECORD] = {
.bgLayer = BG_LAYER_MAIN_0,
.tilemapLeft = 2,
.tilemapTop = 20,
.width = 28,
.height = 2,
.palette = 13,
.baseTile = 317,
},
};
static const struct {
const WindowTemplate *templates;
u32 count;
} sWinTemplates[] = {
[WINDOW_GROUP_FACTORY] = { sFactoryWinTemplates, NELEMS(sFactoryWinTemplates) },
[WINDOW_GROUP_HALL] = { sHallWinTemplates, NELEMS(sHallWinTemplates) },
[WINDOW_GROUP_CASTLE] = { sCastleWinTemplates, NELEMS(sCastleWinTemplates) },
[WINDOW_GROUP_ARCADE] = { sArcadeWinTemplates, NELEMS(sArcadeWinTemplates) },
[WINDOW_GROUP_TOWER] = { sTowerWinTemplates, NELEMS(sTowerWinTemplates) }
};
void FrontierRecordsApp_InitWindows(BgConfig *bgConfig, Window *window, u8 facility)
{
const WindowTemplate *templates = sWinTemplates[facility].templates;
u32 numTemplates = sWinTemplates[facility].count;
for (u8 i = 0; i < numTemplates; i++) {
Window_AddFromTemplate(bgConfig, &window[i], &templates[i]);
Window_FillTilemap(&window[i], 0);
}
}
void FrontierRecordsApp_FreeWindows(Window *windows, u8 facility)
{
u16 i;
u32 numTemplates = sWinTemplates[facility].count;
for (i = 0; i < numTemplates; i++) {
Window_Remove(&windows[i]);
}
}

View File

@ -974,8 +974,8 @@ pokeplatinum_c = files(
'applications/frontier/battle_arcade/windows.c',
'overlay109/ov109_021D0D80.c',
'overlay109/ov109_021D3D50.c',
'overlay110/ov110_021D0D80.c',
'overlay110/ov110_021D2124.c',
'applications/frontier/records/main.c',
'applications/frontier/records/windows.c',
'overlay111/ov111_021D0D80.c',
'overlay111/ov111_021D2F80.c',
'overlay111/ov111_021D33F4.c',

View File

@ -3,6 +3,9 @@
#include <nitro.h>
#include <string.h>
#include "constants/field_base_tiles.h"
#include "constants/menu.h"
#include "constants/scrcmd.h"
#include "generated/game_records.h"
#include "generated/items.h"
#include "generated/species.h"
@ -15,7 +18,6 @@
#include "field/field_system.h"
#include "overlay005/ov5_021EB1A0.h"
#include "overlay005/ov5_021ECE40.h"
#include "overlay005/struct_ov5_021F6704_decl.h"
#include "bag.h"
#include "berry_patch_graphics.h"
@ -55,323 +57,294 @@
#include "vars_flags.h"
#include "res/text/bank/battle_tower.h"
#include "res/text/bank/menu_entries.h"
#define MAX_LIST_ENTRIES 120
typedef struct {
s16 unk_00;
s16 unk_02;
} UnkStruct_ov5_02200C90;
struct UnkStruct_ov5_021F6704_t {
typedef struct BattleHallRecordSelector {
FieldSystem *fieldSystem;
SysTask *unk_04;
Window unk_08;
Window *unk_18;
String *unk_1C[120];
MessageLoader *unk_1FC;
StringTemplate *unk_200;
u8 unk_204;
u8 unk_205;
u8 unk_206;
u8 unk_207_0 : 1;
u8 unk_207_1 : 1;
u8 unk_207_2 : 6;
u8 unk_208;
u8 unk_209;
u8 unk_20A;
u8 unk_20B;
u16 *unk_20C;
u16 *unk_210;
u16 *unk_214;
u16 *unk_218;
ListMenuTemplate unk_21C;
ListMenu *unk_23C;
u16 unk_240;
u16 unk_242;
StringList unk_244[120];
u16 unk_604[120];
u16 unk_6F4;
};
SysTask *task;
Window window;
Window *unusedWin;
String *strs[MAX_LIST_ENTRIES];
MessageLoader *msgLoader;
StringTemplate *strTemplate;
u8 startupDelay;
u8 unused[2];
u8 alwaysTrue : 1;
u8 alwaysFalse : 1;
u8 tilemapLeft;
u8 tilemapTop;
u8 unused2;
u8 numOptions;
u32 unused3;
u16 *resultPtr;
u16 *listPos;
u16 *cursorPos;
ListMenuTemplate menuTemplate;
ListMenu *listMenu;
u32 unused4;
StringList strList[MAX_LIST_ENTRIES];
u16 unused5[MAX_LIST_ENTRIES];
u16 menuPos;
} BattleHallRecordSelector;
static BattleHallRecordSelector *BattleHallRecordSelecter_New(FieldSystem *fieldSystem, u8 tilemapLeft, u8 tilemapTop, u8 menuPosInit, u8 alwaysTrue, u16 *resultPtr, StringTemplate *strTemplate, Window *unused, MessageLoader *msgLoader, u16 *listPos, u16 *cursorPos);
static void BattleHallRecordSelector_Init(FieldSystem *fieldSystem, BattleHallRecordSelector *selector, u8 tilemapLeft, u8 tilemapTop, u8 menuPosInit, u8 alwaysTrue, u16 *resultPtr, StringTemplate *strTemplate, Window *unused, MessageLoader *msgLoader, u16 *listPos, u16 *cursorPos);
static void BattleHallRecordSelector_OpenMenu(BattleHallRecordSelector *selector);
static void BattleHallRecordSelector_Process(SysTask *task, void *context);
static BOOL BattleHallRecordSelector_WaitForSelection(ScriptContext *ctx);
static void BattleHallRecordSelector_Free(BattleHallRecordSelector *selector);
static u16 *BattleHallRecordSelector_GetSpeciesList(enum HeapID heapID, int fileIndex, int *numElements);
static void BattleHallRecordSelector_AddOption(BattleHallRecordSelector *selector, u32 entryID, u32 unused, u32 value);
static void BattleHallRecordSelector_UpdateMessageLoader(BattleHallRecordSelector *selector, MessageLoader *msgLoader);
static void BattleHallRecordSelector_AddToMenu(BattleHallRecordSelector *selector, u32 entryID, u32 unused, u32 value);
static void BattleHallRecordSelector_InitListMenuTemplate(BattleHallRecordSelector *selector);
static void UpdateItemColor(ListMenu *menu, u32 item, u8 yOffset);
static void UpdateListPosition(ListMenu *listMenu, u32 item, u8 onInit);
static u16 *ov5_021F65FC(enum HeapID heapID, int fileIndex, int *pokedexLength);
BOOL ScrCmd_2DE(ScriptContext *ctx);
static BOOL ov5_021F65D4(ScriptContext *ctx);
static void ov5_021F70CC(Pokemon *param0, int *param1, int *param2);
BOOL ScrCmd_300(ScriptContext *ctx);
BOOL ScrCmd_301(ScriptContext *ctx);
BOOL ScrCmd_30F(ScriptContext *ctx);
BOOL ScrCmd_2F1(ScriptContext *ctx);
static void ov5_021F661C(UnkStruct_ov5_021F6704 *param0, MessageLoader *param1);
static void ov5_021F6624(FieldSystem *fieldSystem, UnkStruct_ov5_021F6704 *param1, u8 param2, u8 param3, u8 param4, u8 param5, u16 *param6, StringTemplate *param7, Window *param8, MessageLoader *param9, u16 *param10, u16 *param11);
UnkStruct_ov5_021F6704 *ov5_021F6704(FieldSystem *fieldSystem, u8 param1, u8 param2, u8 param3, u8 param4, u16 *param5, StringTemplate *param6, Window *param7, MessageLoader *param8, u16 *param9, u16 *param10);
void ov5_021F6760(UnkStruct_ov5_021F6704 *param0, u32 param1, u32 param2, u32 param3);
static void ov5_021F6768(UnkStruct_ov5_021F6704 *param0);
static void ov5_021F6830(UnkStruct_ov5_021F6704 *param0, u32 param1, u32 param2, u32 param3);
static void ov5_021F68BC(UnkStruct_ov5_021F6704 *param0);
static void ov5_021F69CC(ListMenu *param0, u32 param1, u8 param2);
static void ov5_021F69F0(ListMenu *param0, u32 param1, u8 param2);
static void ov5_021F6A34(SysTask *param0, void *param1);
static void ov5_021F6AD4(UnkStruct_ov5_021F6704 *param0);
static u16 Unk_ov5_0220210C[] = {
0x12,
0x13,
0x14,
0x15,
0x16,
0x17,
0x18,
0x19,
0x1A
// TODO Create zukan_data.naix and populate constants here
static u16 sAlphabeticalSpeciesLists[] = {
18,
19,
20,
21,
22,
23,
24,
25,
26
};
BOOL ScrCmd_2DE(ScriptContext *ctx)
BOOL ScrCmd_ShowBattleHallRecordMonSelectionMenu(ScriptContext *ctx)
{
int v0;
BattleFrontierStage *v1;
u16 v2;
u16 *v3;
int v4, v5;
MessageLoader *v6;
MessageLoader *v7;
int resultCode;
BattleFrontierStage *frontierStage;
u16 *speciesList;
FieldSystem *fieldSystem = ctx->fieldSystem;
UnkStruct_ov5_021F6704 *v9;
StringTemplate **v10 = FieldSystem_GetScriptMemberPtr(fieldSystem, SCRIPT_MANAGER_STR_TEMPLATE);
u16 v11 = ScriptContext_GetVar(ctx);
u16 v12 = ScriptContext_GetVar(ctx);
u16 v13 = ScriptContext_ReadHalfWord(ctx);
u16 v14 = ScriptContext_ReadHalfWord(ctx);
u16 v15 = ScriptContext_ReadHalfWord(ctx);
StringTemplate **strTemplate = FieldSystem_GetScriptMemberPtr(fieldSystem, SCRIPT_MANAGER_STR_TEMPLATE);
u16 challengeType = ScriptContext_GetVar(ctx);
u16 letterGroup = ScriptContext_GetVar(ctx);
u16 resultVar = ScriptContext_ReadHalfWord(ctx);
u16 listPosVar = ScriptContext_ReadHalfWord(ctx);
u16 cursorPosVar = ScriptContext_ReadHalfWord(ctx);
ctx->data[0] = v13;
ctx->data[0] = resultVar;
v6 = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_SPECIES_NAME, HEAP_ID_FIELD3);
v9 = ov5_021F6704(fieldSystem, 20, 1, 0, 1, FieldSystem_GetVarPointer(fieldSystem, v13), *v10, FieldSystem_GetScriptMemberPtr(ctx->fieldSystem, SCRIPT_MANAGER_WINDOW), v6, FieldSystem_GetVarPointer(fieldSystem, v14), FieldSystem_GetVarPointer(fieldSystem, v15));
v1 = sub_020308A0(fieldSystem->saveData, HEAP_ID_FIELD2, &v0);
MessageLoader *monMsgLoader = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_SPECIES_NAME, HEAP_ID_FIELD3);
BattleHallRecordSelector *selector = BattleHallRecordSelecter_New(fieldSystem, 20, 1, 0, TRUE, FieldSystem_GetVarPointer(fieldSystem, resultVar), *strTemplate, FieldSystem_GetScriptMemberPtr(ctx->fieldSystem, SCRIPT_MANAGER_WINDOW), monMsgLoader, FieldSystem_GetVarPointer(fieldSystem, listPosVar), FieldSystem_GetVarPointer(fieldSystem, cursorPosVar));
frontierStage = sub_020308A0(fieldSystem->saveData, HEAP_ID_FIELD2, &resultCode);
if (v0 == 1) {
v3 = ov5_021F65FC(32, Unk_ov5_0220210C[v12], &v5);
if (resultCode == LOAD_RESULT_OK) {
int speciesListSize;
speciesList = BattleHallRecordSelector_GetSpeciesList(HEAP_ID_FIELD3, sAlphabeticalSpeciesLists[letterGroup], &speciesListSize);
for (v4 = 0; v4 < v5; v4++) {
v2 = sub_020308BC(fieldSystem->saveData, v1, sub_0205E584(v11), v3[v4]);
for (int i = 0; i < speciesListSize; i++) {
u16 streak = sub_020308BC(fieldSystem->saveData, frontierStage, sub_0205E584(challengeType), speciesList[i]);
if (v2 != 0) {
ov5_021F6760(v9, v3[v4], 0xff, v3[v4]);
if (streak != 0) {
BattleHallRecordSelector_AddOption(selector, speciesList[i], 0xff, speciesList[i]);
}
}
Heap_Free(v3);
Heap_Free(speciesList);
}
if (v1 != NULL) {
Heap_Free(v1);
if (frontierStage != NULL) {
Heap_Free(frontierStage);
}
v7 = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_MENU_ENTRIES, HEAP_ID_FIELD3);
MessageLoader *menuMsgLoader = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_MENU_ENTRIES, HEAP_ID_FIELD3);
ov5_021F661C(v9, v7);
ov5_021F6760(v9, 12, 0xff, 0xfffe);
BattleHallRecordSelector_UpdateMessageLoader(selector, menuMsgLoader);
BattleHallRecordSelector_AddOption(selector, MenuEntries_Text_ListMenu_Exit, 0xff, (u16)MENU_CANCEL);
MessageLoader_Free(v7);
MessageLoader_Free(menuMsgLoader);
ov5_021F661C(v9, v6);
ov5_021F6768(v9);
BattleHallRecordSelector_UpdateMessageLoader(selector, monMsgLoader);
BattleHallRecordSelector_OpenMenu(selector);
ScriptContext_Pause(ctx, ov5_021F65D4);
MessageLoader_Free(v6);
ScriptContext_Pause(ctx, BattleHallRecordSelector_WaitForSelection);
MessageLoader_Free(monMsgLoader);
return 1;
return TRUE;
}
static BOOL ov5_021F65D4(ScriptContext *ctx)
static BOOL BattleHallRecordSelector_WaitForSelection(ScriptContext *ctx)
{
FieldSystem *fieldSystem = ctx->fieldSystem;
u16 *v1 = FieldSystem_GetVarPointer(fieldSystem, ctx->data[0]);
u16 *selection = FieldSystem_GetVarPointer(fieldSystem, ctx->data[0]);
if (*v1 == 0xEEEE) {
return 0;
if (*selection == LIST_MENU_NO_SELECTION_YET) {
return FALSE;
}
return 1;
return TRUE;
}
static u16 *ov5_021F65FC(enum HeapID heapID, int fileIndex, int *pokedexLength)
static u16 *BattleHallRecordSelector_GetSpeciesList(enum HeapID heapID, int fileIndex, int *numElements)
{
u32 pokedexSize;
u16 *pokedex = LoadMemberFromNARC_OutFileSize(NARC_INDEX_APPLICATION__ZUKANLIST__ZKN_DATA__ZUKAN_DATA, fileIndex, 0, heapID, 0, &pokedexSize);
*pokedexLength = pokedexSize / (sizeof(u16));
u32 speciesListSize;
u16 *speciesList = LoadMemberFromNARC_OutFileSize(NARC_INDEX_APPLICATION__ZUKANLIST__ZKN_DATA__ZUKAN_DATA, fileIndex, 0, heapID, 0, &speciesListSize);
*numElements = speciesListSize / sizeof(u16);
return pokedex;
return speciesList;
}
static void ov5_021F661C(UnkStruct_ov5_021F6704 *param0, MessageLoader *param1)
static void BattleHallRecordSelector_UpdateMessageLoader(BattleHallRecordSelector *selector, MessageLoader *msgLoader)
{
param0->unk_1FC = param1;
return;
selector->msgLoader = msgLoader;
}
static void ov5_021F6624(FieldSystem *fieldSystem, UnkStruct_ov5_021F6704 *param1, u8 param2, u8 param3, u8 param4, u8 param5, u16 *param6, StringTemplate *param7, Window *param8, MessageLoader *param9, u16 *param10, u16 *param11)
static void BattleHallRecordSelector_Init(FieldSystem *fieldSystem, BattleHallRecordSelector *selector, u8 tilemapLeft, u8 tilemapTop, u8 menuPosInit, u8 alwaysTrue, u16 *resultPtr, StringTemplate *strTemplate, Window *unused, MessageLoader *msgLoader, u16 *listPos, u16 *cursorPos)
{
int v0;
int i;
param1->unk_1FC = param9;
param1->unk_207_1 = 0;
param1->unk_200 = param7;
param1->fieldSystem = fieldSystem;
param1->unk_210 = param6;
selector->msgLoader = msgLoader;
selector->alwaysFalse = FALSE;
selector->strTemplate = strTemplate;
selector->fieldSystem = fieldSystem;
selector->resultPtr = resultPtr;
*param1->unk_210 = 0;
*selector->resultPtr = 0;
param1->unk_214 = param10;
param1->unk_218 = param11;
param1->unk_207_0 = param5;
param1->unk_206 = param4;
param1->unk_208 = param2;
param1->unk_209 = param3;
param1->unk_20B = 0;
param1->unk_18 = param8;
param1->unk_204 = 3;
param1->unk_6F4 = param4;
selector->listPos = listPos;
selector->cursorPos = cursorPos;
selector->alwaysTrue = alwaysTrue;
selector->unused[1] = menuPosInit;
selector->tilemapLeft = tilemapLeft;
selector->tilemapTop = tilemapTop;
selector->numOptions = 0;
selector->unusedWin = unused;
selector->startupDelay = 3;
selector->menuPos = menuPosInit;
for (v0 = 0; v0 < 120; v0++) {
param1->unk_244[v0].entry = NULL;
param1->unk_244[v0].index = 0;
param1->unk_604[v0] = 0xff;
for (i = 0; i < MAX_LIST_ENTRIES; i++) {
selector->strList[i].entry = NULL;
selector->strList[i].index = 0;
selector->unused5[i] = 0xff;
}
for (v0 = 0; v0 < 120; v0++) {
param1->unk_1C[v0] = String_Init(40 * 2, HEAP_ID_FIELD1);
for (i = 0; i < MAX_LIST_ENTRIES; i++) {
selector->strs[i] = String_Init(80, HEAP_ID_FIELD1);
}
*param1->unk_210 = 0xEEEE;
return;
*selector->resultPtr = LIST_MENU_NO_SELECTION_YET;
}
UnkStruct_ov5_021F6704 *ov5_021F6704(FieldSystem *fieldSystem, u8 param1, u8 param2, u8 param3, u8 param4, u16 *param5, StringTemplate *param6, Window *param7, MessageLoader *param8, u16 *param9, u16 *param10)
static BattleHallRecordSelector *BattleHallRecordSelecter_New(FieldSystem *fieldSystem, u8 tilemapLeft, u8 tilemapTop, u8 menuPosInit, u8 alwaysTrue, u16 *resultPtr, StringTemplate *strTemplate, Window *unused, MessageLoader *msgLoader, u16 *listPos, u16 *cursorPos)
{
UnkStruct_ov5_021F6704 *v0;
int v1;
BattleHallRecordSelector *selector = Heap_Alloc(HEAP_ID_FIELD1, sizeof(BattleHallRecordSelector));
v0 = Heap_Alloc(HEAP_ID_FIELD1, sizeof(UnkStruct_ov5_021F6704));
if (v0 == NULL) {
if (selector == NULL) {
return NULL;
}
memset(v0, 0, sizeof(UnkStruct_ov5_021F6704));
ov5_021F6624(fieldSystem, v0, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10);
memset(selector, 0, sizeof(BattleHallRecordSelector));
BattleHallRecordSelector_Init(fieldSystem, selector, tilemapLeft, tilemapTop, menuPosInit, alwaysTrue, resultPtr, strTemplate, unused, msgLoader, listPos, cursorPos);
return v0;
return selector;
}
void ov5_021F6760(UnkStruct_ov5_021F6704 *param0, u32 param1, u32 param2, u32 param3)
static void BattleHallRecordSelector_AddOption(BattleHallRecordSelector *selector, u32 entryID, u32 unused, u32 value)
{
ov5_021F6830(param0, param1, param2, param3);
return;
BattleHallRecordSelector_AddToMenu(selector, entryID, unused, value);
}
static void ov5_021F6768(UnkStruct_ov5_021F6704 *param0)
static void BattleHallRecordSelector_OpenMenu(BattleHallRecordSelector *selector)
{
if (param0->unk_20B > 8) {
Window_Add(param0->fieldSystem->bgConfig, &param0->unk_08, 3, param0->unk_208, param0->unk_209, 11, 8 * 2, 13, 1);
if (selector->numOptions > 8) {
Window_Add(selector->fieldSystem->bgConfig, &selector->window, BG_LAYER_MAIN_3, selector->tilemapLeft, selector->tilemapTop, 11, 16, 13, 1);
} else {
Window_Add(param0->fieldSystem->bgConfig, &param0->unk_08, 3, param0->unk_208, param0->unk_209, 11, param0->unk_20B * 2, 13, 1);
Window_Add(selector->fieldSystem->bgConfig, &selector->window, BG_LAYER_MAIN_3, selector->tilemapLeft, selector->tilemapTop, 11, selector->numOptions * 2, 13, 1);
}
LoadStandardWindowGraphics(param0->fieldSystem->bgConfig, 3, 1024 - (18 + 12) - 9, 11, 0, HEAP_ID_FIELD1);
Window_DrawStandardFrame(&param0->unk_08, 1, 1024 - (18 + 12) - 9, 11);
ov5_021F68BC(param0);
LoadStandardWindowGraphics(selector->fieldSystem->bgConfig, BG_LAYER_MAIN_3, BASE_TILE_STANDARD_WINDOW_FRAME, PLTT_11, STANDARD_WINDOW_SYSTEM, HEAP_ID_FIELD1);
Window_DrawStandardFrame(&selector->window, TRUE, BASE_TILE_STANDARD_WINDOW_FRAME, PLTT_11);
BattleHallRecordSelector_InitListMenuTemplate(selector);
param0->unk_23C = ListMenu_New((const ListMenuTemplate *)&param0->unk_21C, *param0->unk_214, *param0->unk_218, HEAP_ID_FIELD1);
param0->unk_04 = SysTask_Start(ov5_021F6A34, param0, 0);
return;
selector->listMenu = ListMenu_New(&selector->menuTemplate, *selector->listPos, *selector->cursorPos, HEAP_ID_FIELD1);
selector->task = SysTask_Start(BattleHallRecordSelector_Process, selector, 0);
}
static void ov5_021F6830(UnkStruct_ov5_021F6704 *param0, u32 param1, u32 param2, u32 param3)
static void BattleHallRecordSelector_AddToMenu(BattleHallRecordSelector *selector, u32 entryID, u32 unused, u32 value)
{
int v0;
void *v1;
String *string = String_Init(80, HEAP_ID_FIELD1);
{
String *v2 = String_Init(40 * 2, HEAP_ID_FIELD1);
MessageLoader_GetString(selector->msgLoader, entryID, string);
StringTemplate_Format(selector->strTemplate, selector->strs[selector->numOptions], string);
selector->strList[selector->numOptions].entry = selector->strs[selector->numOptions];
String_Free(string);
MessageLoader_GetString(param0->unk_1FC, param1, v2);
StringTemplate_Format(param0->unk_200, param0->unk_1C[param0->unk_20B], v2);
param0->unk_244[param0->unk_20B].entry = (const void *)param0->unk_1C[param0->unk_20B];
String_Free(v2);
}
if (param3 == 0xfa) {
param0->unk_244[param0->unk_20B].index = 0xfffffffd;
if (value == LIST_MENU_BUILDER_HEADER) {
selector->strList[selector->numOptions].index = MENU_HEADER;
} else {
param0->unk_244[param0->unk_20B].index = param3;
selector->strList[selector->numOptions].index = value;
}
param0->unk_604[param0->unk_20B] = param2;
param0->unk_20B++;
return;
selector->unused5[selector->numOptions] = unused;
selector->numOptions++;
}
static void ov5_021F68BC(UnkStruct_ov5_021F6704 *param0)
static void BattleHallRecordSelector_InitListMenuTemplate(BattleHallRecordSelector *selector)
{
param0->unk_21C.choices = param0->unk_244;
param0->unk_21C.cursorCallback = ov5_021F69F0;
param0->unk_21C.printCallback = ov5_021F69CC;
param0->unk_21C.window = &param0->unk_08;
param0->unk_21C.count = param0->unk_20B;
param0->unk_21C.maxDisplay = 8;
param0->unk_21C.headerXOffset = 1;
param0->unk_21C.textXOffset = 12;
param0->unk_21C.cursorXOffset = 2;
param0->unk_21C.yOffset = 1;
param0->unk_21C.textColorFg = 1;
param0->unk_21C.textColorBg = 15;
param0->unk_21C.textColorShadow = 2;
param0->unk_21C.letterSpacing = 0;
param0->unk_21C.lineSpacing = 0;
param0->unk_21C.pagerMode = PAGER_MODE_LEFT_RIGHT_PAD;
param0->unk_21C.fontID = FONT_SYSTEM;
param0->unk_21C.cursorType = 0;
param0->unk_21C.parent = (void *)param0;
return;
selector->menuTemplate.choices = selector->strList;
selector->menuTemplate.cursorCallback = UpdateListPosition;
selector->menuTemplate.printCallback = UpdateItemColor;
selector->menuTemplate.window = &selector->window;
selector->menuTemplate.count = selector->numOptions;
selector->menuTemplate.maxDisplay = 8;
selector->menuTemplate.headerXOffset = 1;
selector->menuTemplate.textXOffset = 12;
selector->menuTemplate.cursorXOffset = 2;
selector->menuTemplate.yOffset = 1;
selector->menuTemplate.textColorFg = 1;
selector->menuTemplate.textColorBg = 15;
selector->menuTemplate.textColorShadow = 2;
selector->menuTemplate.letterSpacing = 0;
selector->menuTemplate.lineSpacing = 0;
selector->menuTemplate.pagerMode = PAGER_MODE_LEFT_RIGHT_PAD;
selector->menuTemplate.fontID = FONT_SYSTEM;
selector->menuTemplate.cursorType = 0;
selector->menuTemplate.parent = selector;
}
static void ov5_021F69CC(ListMenu *param0, u32 param1, u8 param2)
static void UpdateItemColor(ListMenu *menu, u32 item, u8 yOffset)
{
if (param1 == 0xfffffffd) {
ListMenu_SetAltTextColors(param0, 3, 15, 4);
if (item == MENU_HEADER) {
ListMenu_SetAltTextColors(menu, 3, 15, 4);
} else {
ListMenu_SetAltTextColors(param0, 1, 15, 2);
ListMenu_SetAltTextColors(menu, 1, 15, 2);
}
}
static void ov5_021F69F0(ListMenu *param0, u32 param1, u8 param2)
static void UpdateListPosition(ListMenu *listMenu, u32 item, u8 onInit)
{
u32 v0, v1;
u16 v2 = 0;
u16 v3 = 0;
UnkStruct_ov5_021F6704 *v4 = (UnkStruct_ov5_021F6704 *)ListMenu_GetAttribute(param0, 19);
u16 listPos = 0;
u16 cursorPos = 0;
BattleHallRecordSelector *selector = (BattleHallRecordSelector *)ListMenu_GetAttribute(listMenu, LIST_MENU_PARENT);
ListMenu_GetListAndCursorPos(param0, &v2, &v3);
ListMenu_GetListAndCursorPos(listMenu, &listPos, &cursorPos);
if ((v4->unk_214 != NULL) && (v4->unk_218 != NULL)) {
*v4->unk_214 = v2;
*v4->unk_218 = v3;
if (selector->listPos != NULL && selector->cursorPos != NULL) {
*selector->listPos = listPos;
*selector->cursorPos = cursorPos;
}
return;
}
static void ov5_021F6A34(SysTask *param0, void *param1)
static void BattleHallRecordSelector_Process(SysTask *task, void *context)
{
u16 v0;
u32 v1;
UnkStruct_ov5_021F6704 *v2 = (UnkStruct_ov5_021F6704 *)param1;
BattleHallRecordSelector *selector = context;
if (v2->unk_204 != 0) {
v2->unk_204--;
if (selector->startupDelay != 0) {
selector->startupDelay--;
return;
}
@ -379,56 +352,50 @@ static void ov5_021F6A34(SysTask *param0, void *param1)
return;
}
v1 = ListMenu_ProcessInput(v2->unk_23C);
v0 = v2->unk_6F4;
u32 input = ListMenu_ProcessInput(selector->listMenu);
u16 oldPos = selector->menuPos;
ListMenu_CalcTrueCursorPos(v2->unk_23C, &v2->unk_6F4);
ListMenu_CalcTrueCursorPos(selector->listMenu, &selector->menuPos);
if (v0 != v2->unk_6F4) {
if (oldPos != selector->menuPos) {
Sound_PlayEffect(SEQ_SE_CONFIRM);
}
switch (v1) {
case 0xffffffff:
switch (input) {
case MENU_NOTHING_CHOSEN:
break;
case 0xfffffffe:
if (v2->unk_207_0 == 1) {
case MENU_CANCEL:
if (selector->alwaysTrue == TRUE) {
Sound_PlayEffect(SEQ_SE_CONFIRM);
*v2->unk_210 = 0xfffe;
ov5_021F6AD4(param1);
*selector->resultPtr = MENU_CANCEL;
BattleHallRecordSelector_Free(selector);
}
break;
default:
Sound_PlayEffect(SEQ_SE_CONFIRM);
*v2->unk_210 = v1;
ov5_021F6AD4(param1);
*selector->resultPtr = input;
BattleHallRecordSelector_Free(selector);
break;
}
return;
}
static void ov5_021F6AD4(UnkStruct_ov5_021F6704 *param0)
static void BattleHallRecordSelector_Free(BattleHallRecordSelector *selector)
{
int v0;
Sound_PlayEffect(SEQ_SE_CONFIRM);
ListMenu_Free(param0->unk_23C, NULL, NULL);
Window_EraseStandardFrame(param0->unk_21C.window, 0);
Window_Remove(&param0->unk_08);
ListMenu_Free(selector->listMenu, NULL, NULL);
Window_EraseStandardFrame(selector->menuTemplate.window, FALSE);
Window_Remove(&selector->window);
for (v0 = 0; v0 < 120; v0++) {
String_Free(param0->unk_1C[v0]);
for (int i = 0; i < MAX_LIST_ENTRIES; i++) {
String_Free(selector->strs[i]);
}
if (param0->unk_207_1 == 1) {
MessageLoader_Free(param0->unk_1FC);
if (selector->alwaysFalse == TRUE) {
MessageLoader_Free(selector->msgLoader);
}
SysTask_Done(param0->unk_04);
Heap_Free(param0);
return;
SysTask_Done(selector->task);
Heap_Free(selector);
}
static const u16 sHighestIVMessageIndices[] = {

View File

@ -1,903 +0,0 @@
#include "overlay110/ov110_021D0D80.h"
#include <nitro.h>
#include <string.h>
#include "struct_decls/struct_0202D750_decl.h"
#include "struct_decls/struct_020308A0_decl.h"
#include "struct_defs/battle_frontier.h"
#include "struct_defs/struct_0203E564.h"
#include "overlay110/ov110_021D2124.h"
#include "bg_window.h"
#include "font.h"
#include "game_options.h"
#include "graphics.h"
#include "gx_layers.h"
#include "heap.h"
#include "message.h"
#include "narc.h"
#include "overlay_manager.h"
#include "palette.h"
#include "save_player.h"
#include "savedata.h"
#include "screen_fade.h"
#include "string_gf.h"
#include "string_template.h"
#include "system.h"
#include "text.h"
#include "unk_0202D05C.h"
#include "unk_0202FF4C.h"
#include "unk_020302D0.h"
#include "unk_02030494.h"
#include "unk_0203061C.h"
#include "unk_02030880.h"
#include "unk_0205DFC4.h"
typedef struct {
ApplicationManager *appMan;
u8 unk_04;
u8 unk_05;
u8 unk_06;
u8 unk_07;
u16 unk_08;
u16 unk_0A;
BgConfig *unk_0C;
Window unk_10[16];
MessageLoader *unk_110;
StringTemplate *unk_114;
String *unk_118;
String *unk_11C;
PaletteData *unk_120;
const Options *options;
SaveData *saveData;
BattleFrontier *frontier;
} UnkStruct_ov110_021D0F78;
int ov110_021D0D80(ApplicationManager *appMan, int *param1);
int ov110_021D0E9C(ApplicationManager *appMan, int *param1);
int ov110_021D0EF0(ApplicationManager *appMan, int *param1);
static BOOL ov110_021D0F78(UnkStruct_ov110_021D0F78 *param0);
static BOOL ov110_021D0FD0(UnkStruct_ov110_021D0F78 *param0);
static BOOL ov110_021D1000(UnkStruct_ov110_021D0F78 *param0);
static void ov110_021D1048(void *param0);
static void ov110_021D1078(void);
static void ov110_021D1098(BgConfig *param0);
static void ov110_021D1180(UnkStruct_ov110_021D0F78 *param0);
static void ov110_021D11CC(BgConfig *param0);
static void ov110_021D1200(UnkStruct_ov110_021D0F78 *param0, int *param1, int param2);
static u8 ov110_021D1208(u8 param0);
static void ov110_021D123C(UnkStruct_ov110_021D0F78 *param0, u32 param1);
static void ov110_021D128C(void);
static void ov110_021D12C0(UnkStruct_ov110_021D0F78 *param0, u32 param1);
static u8 ov110_021D1324(UnkStruct_ov110_021D0F78 *param0, Window *param1, int param2, u32 param3, u32 param4, u8 param5, u8 param6, u8 param7, u8 param8, u8 param9, int param10);
static u8 ov110_021D13CC(UnkStruct_ov110_021D0F78 *param0, Window *param1, int param2, u8 param3);
static void ov110_021D13F0(UnkStruct_ov110_021D0F78 *param0, u32 param1, s32 param2);
static void ov110_021D140C(UnkStruct_ov110_021D0F78 *param0);
static void ov110_021D1468(UnkStruct_ov110_021D0F78 *param0);
static void ov110_021D1650(UnkStruct_ov110_021D0F78 *param0);
static u32 ov110_021D17AC(UnkStruct_ov110_021D0F78 *param0, u8 param1);
static void ov110_021D1808(UnkStruct_ov110_021D0F78 *param0);
static void ov110_021D19B0(UnkStruct_ov110_021D0F78 *param0);
static void ov110_021D19F4(UnkStruct_ov110_021D0F78 *param0);
static u32 ov110_021D1BEC(UnkStruct_ov110_021D0F78 *param0);
static void ov110_021D1C40(UnkStruct_ov110_021D0F78 *param0);
static u32 ov110_021D1D68(UnkStruct_ov110_021D0F78 *param0);
static void ov110_021D1DBC(UnkStruct_ov110_021D0F78 *param0);
static void ov110_021D1ED8(UnkStruct_ov110_021D0F78 *param0);
static u32 ov110_021D20CC(UnkStruct_ov110_021D0F78 *param0, u8 param1);
int ov110_021D0D80(ApplicationManager *appMan, int *param1)
{
int v0;
UnkStruct_ov110_021D0F78 *v1;
UnkStruct_0203E564 *v2;
SetVBlankCallback(NULL, NULL);
SetHBlankCallback(NULL, NULL);
GXLayers_DisableEngineALayers();
GXLayers_DisableEngineBLayers();
GX_SetVisiblePlane(0);
GXS_SetVisiblePlane(0);
Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_114, 0x20000);
v1 = ApplicationManager_NewData(appMan, sizeof(UnkStruct_ov110_021D0F78), HEAP_ID_114);
memset(v1, 0, sizeof(UnkStruct_ov110_021D0F78));
v1->appMan = appMan;
v1->unk_0C = BgConfig_New(HEAP_ID_114);
v2 = (UnkStruct_0203E564 *)ApplicationManager_Args(appMan);
v1->saveData = v2->saveData;
v1->frontier = SaveData_GetBattleFrontier(v1->saveData);
v1->unk_05 = v2->unk_04;
v1->unk_06 = v2->unk_05;
v1->unk_08 = v2->unk_06;
v1->options = SaveData_GetOptions(v1->saveData);
ov110_021D1180(v1);
v1->unk_110 = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_BATTLE_TOWER_RECORDS, HEAP_ID_114);
v1->unk_114 = StringTemplate_Default(HEAP_ID_114);
v1->unk_118 = String_Init(800, HEAP_ID_114);
v1->unk_11C = String_Init(800, HEAP_ID_114);
Font_LoadTextPalette(0, 13 * 32, HEAP_ID_114);
Font_LoadScreenIndicatorsPalette(0, 12 * 32, HEAP_ID_114);
ov110_021D2124(v1->unk_0C, v1->unk_10, ov110_021D1208(v1->unk_06));
SetVBlankCallback(ov110_021D1048, (void *)v1);
(*param1) = 0;
return 1;
}
int ov110_021D0E9C(ApplicationManager *appMan, int *param1)
{
UnkStruct_ov110_021D0F78 *v0 = ApplicationManager_Data(appMan);
switch (*param1) {
case 0:
if (ov110_021D0F78(v0) == 1) {
ov110_021D1200(v0, param1, 1);
}
break;
case 1:
if (ov110_021D0FD0(v0) == 1) {
ov110_021D1200(v0, param1, 2);
}
break;
case 2:
if (ov110_021D1000(v0) == 1) {
return 1;
}
}
return 0;
}
int ov110_021D0EF0(ApplicationManager *appMan, int *param1)
{
int v0;
UnkStruct_ov110_021D0F78 *v1 = ApplicationManager_Data(appMan);
PaletteData_FreeBuffer(v1->unk_120, 2);
PaletteData_FreeBuffer(v1->unk_120, 0);
PaletteData_Free(v1->unk_120);
v1->unk_120 = NULL;
MessageLoader_Free(v1->unk_110);
StringTemplate_Free(v1->unk_114);
String_Free(v1->unk_118);
String_Free(v1->unk_11C);
ov110_021D216C(v1->unk_10, ov110_021D1208(v1->unk_06));
ov110_021D11CC(v1->unk_0C);
ApplicationManager_FreeData(appMan);
SetVBlankCallback(NULL, NULL);
Heap_Destroy(HEAP_ID_114);
return 1;
}
static BOOL ov110_021D0F78(UnkStruct_ov110_021D0F78 *param0)
{
switch (param0->unk_04) {
case 0:
param0->unk_04++;
break;
case 1:
StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_IN, FADE_TYPE_BRIGHTNESS_IN, COLOR_BLACK, 6, 1 * 3, HEAP_ID_114);
ov110_021D140C(param0);
param0->unk_04++;
break;
case 2:
if (IsScreenFadeDone() == TRUE) {
return 1;
}
break;
}
return 0;
}
static BOOL ov110_021D0FD0(UnkStruct_ov110_021D0F78 *param0)
{
int v0;
switch (param0->unk_04) {
case 0:
param0->unk_04++;
break;
case 1:
if ((gSystem.heldKeys & PAD_BUTTON_A) || (gSystem.heldKeys & PAD_BUTTON_B)) {
return 1;
}
break;
}
return 0;
}
static BOOL ov110_021D1000(UnkStruct_ov110_021D0F78 *param0)
{
int v0;
switch (param0->unk_04) {
case 0:
StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_BLACK, 6, 1, HEAP_ID_114);
param0->unk_04++;
break;
case 1:
if (IsScreenFadeDone() == TRUE) {
return 1;
}
break;
}
return 0;
}
static void ov110_021D1048(void *param0)
{
UnkStruct_ov110_021D0F78 *v0 = param0;
if (v0->unk_120 != NULL) {
PaletteData_CommitFadedBuffers(v0->unk_120);
}
Bg_RunScheduledUpdates(v0->unk_0C);
OS_SetIrqCheckFlag(OS_IE_V_BLANK);
}
static void ov110_021D1078(void)
{
GXBanks v0 = {
GX_VRAM_BG_128_A,
GX_VRAM_BGEXTPLTT_NONE,
GX_VRAM_SUB_BG_128_C,
GX_VRAM_SUB_BGEXTPLTT_NONE,
GX_VRAM_OBJ_128_B,
GX_VRAM_OBJEXTPLTT_NONE,
GX_VRAM_SUB_OBJ_16_I,
GX_VRAM_SUB_OBJEXTPLTT_NONE,
GX_VRAM_TEX_NONE,
GX_VRAM_TEXPLTT_NONE
};
GXLayers_SetBanks(&v0);
return;
}
static void ov110_021D1098(BgConfig *param0)
{
{
GraphicsModes v0 = {
GX_DISPMODE_GRAPHICS,
GX_BGMODE_0,
GX_BGMODE_0,
GX_BG0_AS_2D
};
SetAllGraphicsModes(&v0);
}
{
BgTemplate v1 = {
.x = 0,
.y = 0,
.bufferSize = 0x800,
.baseTile = 0,
.screenSize = BG_SCREEN_SIZE_256x256,
.colorMode = GX_BG_COLORMODE_16,
.screenBase = GX_BG_SCRBASE_0x0000,
.charBase = GX_BG_CHARBASE_0x04000,
.bgExtPltt = GX_BG_EXTPLTT_01,
.priority = 0,
.areaOver = 0,
.mosaic = FALSE,
};
Bg_InitFromTemplate(param0, BG_LAYER_MAIN_0, &v1, 0);
Bg_ClearTilesRange(BG_LAYER_MAIN_0, 32, 0, HEAP_ID_114);
Bg_ClearTilemap(param0, BG_LAYER_MAIN_0);
}
{
BgTemplate v2 = {
.x = 0,
.y = 0,
.bufferSize = 0x800,
.baseTile = 0,
.screenSize = BG_SCREEN_SIZE_256x256,
.colorMode = GX_BG_COLORMODE_16,
.screenBase = GX_BG_SCRBASE_0x1000,
.charBase = GX_BG_CHARBASE_0x0c000,
.bgExtPltt = GX_BG_EXTPLTT_01,
.priority = 0,
.areaOver = 0,
.mosaic = FALSE,
};
Bg_InitFromTemplate(param0, BG_LAYER_MAIN_2, &v2, 0);
Bg_ClearTilesRange(BG_LAYER_MAIN_2, 32, 0, HEAP_ID_114);
Bg_ClearTilemap(param0, BG_LAYER_MAIN_2);
}
{
BgTemplate v3 = {
.x = 0,
.y = 0,
.bufferSize = 0x800,
.baseTile = 0,
.screenSize = BG_SCREEN_SIZE_256x256,
.colorMode = GX_BG_COLORMODE_16,
.screenBase = GX_BG_SCRBASE_0x3000,
.charBase = GX_BG_CHARBASE_0x04000,
.bgExtPltt = GX_BG_EXTPLTT_01,
.priority = 0,
.areaOver = 0,
.mosaic = FALSE,
};
Bg_InitFromTemplate(param0, BG_LAYER_SUB_2, &v3, 0);
Bg_ClearTilesRange(6, 32, 0, HEAP_ID_114);
Bg_ClearTilemap(param0, BG_LAYER_SUB_2);
}
G2_SetBG0Priority(0);
GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 1);
GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG2, 1);
return;
}
static void ov110_021D1180(UnkStruct_ov110_021D0F78 *param0)
{
ov110_021D1078();
ov110_021D1098(param0->unk_0C);
param0->unk_120 = PaletteData_New(HEAP_ID_114);
PaletteData_AllocBuffer(param0->unk_120, 2, 32 * 16, HEAP_ID_114);
PaletteData_AllocBuffer(param0->unk_120, 0, 32 * 16, HEAP_ID_114);
ov110_021D123C(param0, 2);
ov110_021D128C();
ov110_021D12C0(param0, 6);
return;
}
static void ov110_021D11CC(BgConfig *param0)
{
GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1 | GX_PLANEMASK_BG2 | GX_PLANEMASK_BG3 | GX_PLANEMASK_OBJ, 0);
GXLayers_EngineBToggleLayers(GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1 | GX_PLANEMASK_BG2 | GX_PLANEMASK_BG3 | GX_PLANEMASK_OBJ, 0);
Bg_FreeTilemapBuffer(param0, BG_LAYER_MAIN_0);
Bg_FreeTilemapBuffer(param0, BG_LAYER_MAIN_2);
Bg_FreeTilemapBuffer(param0, BG_LAYER_SUB_2);
Heap_Free(param0);
return;
}
static void ov110_021D1200(UnkStruct_ov110_021D0F78 *param0, int *param1, int param2)
{
param0->unk_04 = 0;
*param1 = param2;
return;
}
static u8 ov110_021D1208(u8 param0)
{
u8 v0 = 0;
switch (param0) {
case 2:
case 3:
v0 = 0;
break;
case 5:
v0 = 1;
break;
case 4:
v0 = 2;
break;
case 6:
v0 = 3;
break;
case 1:
v0 = 4;
break;
}
return v0;
}
static void ov110_021D123C(UnkStruct_ov110_021D0F78 *param0, u32 param1)
{
NARC *v0;
v0 = NARC_ctor(NARC_INDEX_RESOURCE__ENG__FRONTIER_GRAPHIC__FRONTIER_BG, HEAP_ID_114);
Graphics_LoadTilesToBgLayerFromOpenNARC(v0, 124, param0->unk_0C, param1, 0, 0, 1, HEAP_ID_114);
Graphics_LoadTilemapToBgLayerFromOpenNARC(v0, 123, param0->unk_0C, param1, 0, 0, 1, HEAP_ID_114);
NARC_dtor(v0);
return;
}
static void ov110_021D128C(void)
{
void *v0;
NNSG2dPaletteData *v1;
v0 = Graphics_GetPlttData(NARC_INDEX_RESOURCE__ENG__FRONTIER_GRAPHIC__FRONTIER_BG, 170, &v1, HEAP_ID_114);
DC_FlushRange(v1->pRawData, sizeof(u16) * 16 * 2);
GX_LoadBGPltt(v1->pRawData, 0, sizeof(u16) * 16 * 2);
Heap_Free(v0);
return;
}
static void ov110_021D12C0(UnkStruct_ov110_021D0F78 *param0, u32 param1)
{
NARC *v0;
v0 = NARC_ctor(NARC_INDEX_GRAPHIC__POKETCH, HEAP_ID_114);
Graphics_LoadTilesToBgLayerFromOpenNARC(v0, 10, param0->unk_0C, param1, 0, 0, 1, HEAP_ID_114);
Graphics_LoadTilemapToBgLayerFromOpenNARC(v0, 11, param0->unk_0C, param1, 0, 0, 1, HEAP_ID_114);
Graphics_LoadPaletteFromOpenNARC(v0, 12, 4, 0, 0x20, HEAP_ID_114);
NARC_dtor(v0);
return;
}
static u8 ov110_021D1324(UnkStruct_ov110_021D0F78 *param0, Window *param1, int param2, u32 param3, u32 param4, u8 param5, u8 param6, u8 param7, u8 param8, u8 param9, int param10)
{
if (param9) {
Window_FillTilemap(param1, param7);
}
MessageLoader_GetString(param0->unk_110, param2, param0->unk_11C);
StringTemplate_Format(param0->unk_114, param0->unk_118, param0->unk_11C);
switch (param10) {
case 1:
param3 -= (Font_CalcStringWidth(FONT_SYSTEM, param0->unk_118, 0) + 1) / 2;
break;
case 2:
param3 -= Font_CalcStringWidth(FONT_SYSTEM, param0->unk_118, 0);
break;
}
Text_AddPrinterWithParamsAndColor(param1, param8, param0->unk_118, param3, param4, TEXT_SPEED_INSTANT, TEXT_COLOR(param5, param6, param7), NULL);
}
static u8 ov110_021D13CC(UnkStruct_ov110_021D0F78 *param0, Window *param1, int param2, u8 param3)
{
return ov110_021D1324(param0, param1, param2, 0, 0, 1, 2, 0, FONT_SYSTEM, param3, 0);
}
static void ov110_021D13F0(UnkStruct_ov110_021D0F78 *param0, u32 param1, s32 param2)
{
StringTemplate_SetNumber(param0->unk_114, param1, param2, 4, 1, 1);
return;
}
static void ov110_021D140C(UnkStruct_ov110_021D0F78 *param0)
{
int v0;
switch (param0->unk_06) {
case 2:
case 3:
ov110_021D1468(param0);
ov110_021D1650(param0);
break;
case 5:
ov110_021D1808(param0);
break;
case 4:
ov110_021D19F4(param0);
break;
case 6:
ov110_021D1C40(param0);
break;
case 1:
if ((param0->unk_05 == 0) || (param0->unk_05 == 1)) {
ov110_021D1DBC(param0);
} else {
ov110_021D1ED8(param0);
}
break;
default:
ov110_021D1C40(param0);
break;
}
return;
}
static void ov110_021D1468(UnkStruct_ov110_021D0F78 *param0)
{
u8 v1;
int v2;
u32 v3;
Window_FillTilemap(&param0->unk_10[0], 0);
ov110_021D1324(param0, &param0->unk_10[0], 22, 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 0);
if (param0->unk_05 == 0) {
v2 = 26;
v3 = 27 * 8;
} else if (param0->unk_05 == 1) {
v2 = 27;
v3 = 27 * 8;
} else {
v2 = 28;
v3 = 27 * 8;
}
ov110_021D1324(param0, &param0->unk_10[0], v2, v3, 0, 1, 2, 0, FONT_SYSTEM, 0, 2);
Window_ScheduleCopyToVRAM(&param0->unk_10[0]);
ov110_021D13CC(param0, &param0->unk_10[1], 34, 1);
ov110_021D1324(param0, &param0->unk_10[1], 36, 28 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 2);
Window_ScheduleCopyToVRAM(&param0->unk_10[1]);
ov110_021D13CC(param0, &param0->unk_10[2], ov110_021D17AC(param0, 0), 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E430(0, param0->unk_05), 0xFF));
ov110_021D1324(param0, &param0->unk_10[2], 38, 14 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E488(0, param0->unk_05), 0xFF));
ov110_021D1324(param0, &param0->unk_10[2], 40, 28 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 2);
Window_ScheduleCopyToVRAM(&param0->unk_10[2]);
ov110_021D13CC(param0, &param0->unk_10[3], 31, 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E45C(0, param0->unk_05), 0xFF));
ov110_021D1324(param0, &param0->unk_10[3], 38, 14 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E4B4(0, param0->unk_05), 0xFF));
ov110_021D1324(param0, &param0->unk_10[3], 40, 28 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 2);
Window_ScheduleCopyToVRAM(&param0->unk_10[3]);
}
static void ov110_021D1650(UnkStruct_ov110_021D0F78 *param0)
{
ov110_021D13CC(param0, &param0->unk_10[4], 35, 1);
Window_ScheduleCopyToVRAM(&param0->unk_10[4]);
ov110_021D13CC(param0, &param0->unk_10[5], ov110_021D17AC(param0, 1), 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E430(1, param0->unk_05), 0xFF));
ov110_021D1324(param0, &param0->unk_10[5], 38, 14 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E488(1, param0->unk_05), 0xFF));
ov110_021D1324(param0, &param0->unk_10[5], 40, 28 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 2);
Window_ScheduleCopyToVRAM(&param0->unk_10[5]);
ov110_021D13CC(param0, &param0->unk_10[6], 31, 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E45C(1, param0->unk_05), 0xFF));
ov110_021D1324(param0, &param0->unk_10[6], 38, 14 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E4B4(1, param0->unk_05), 0xFF));
ov110_021D1324(param0, &param0->unk_10[6], 40, 28 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 2);
Window_ScheduleCopyToVRAM(&param0->unk_10[6]);
}
static u32 ov110_021D17AC(UnkStruct_ov110_021D0F78 *param0, u8 param1)
{
u8 v0;
u32 v1;
if (param1 == 0) {
v1 = 102;
} else {
v1 = 104;
}
if (param0->unk_05 == 3) {
v0 = sub_02030698(SaveData_GetBattleFrontier(param0->saveData), v1, sub_0205E6A8(v1));
} else {
v0 = (u8)sub_020300E0(sub_020300F4(param0->saveData), 10, (param1 * 4) + param0->unk_05, NULL);
}
if (v0 == 1) {
return 30;
}
return 29;
}
static void ov110_021D1808(UnkStruct_ov110_021D0F78 *param0)
{
int v1;
u32 v2;
u16 v3;
int v4;
BattleFrontierStage *frontierStage;
Window_FillTilemap(&param0->unk_10[0], 0);
ov110_021D1324(param0, &param0->unk_10[0], 24, 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 0);
if (param0->unk_05 == 0) {
v1 = 26;
v2 = 27 * 8;
} else if (param0->unk_05 == 1) {
v1 = 27;
v2 = 27 * 8;
} else {
v1 = 28;
v2 = 27 * 8;
}
ov110_021D1324(param0, &param0->unk_10[0], v1, v2, 0, 1, 2, 0, FONT_SYSTEM, 0, 2);
Window_ScheduleCopyToVRAM(&param0->unk_10[0]);
ov110_021D19B0(param0);
ov110_021D1324(param0, &param0->unk_10[1], 39, 0, 0, 1, 2, 0, FONT_SYSTEM, 0, 0);
Window_ScheduleCopyToVRAM(&param0->unk_10[1]);
ov110_021D13CC(param0, &param0->unk_10[2], 29, 1);
if (param0->unk_08 != sub_02030698(SaveData_GetBattleFrontier(param0->saveData), sub_0205E55C(param0->unk_05), sub_0205E6A8(sub_0205E55C(param0->unk_05)))) {
v3 = 0;
} else {
v3 = sub_02030698(param0->frontier, sub_0205E50C(param0->unk_05), 0xFF);
}
ov110_021D13F0(param0, 0, v3);
ov110_021D1324(param0, &param0->unk_10[2], 38, 14 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 1);
Window_ScheduleCopyToVRAM(&param0->unk_10[2]);
ov110_021D13CC(param0, &param0->unk_10[3], 31, 1);
frontierStage = sub_020308A0(param0->saveData, HEAP_ID_FIELD2, &v4);
if (v4 != 1) {
v3 = 0;
} else {
v3 = sub_020308BC(param0->saveData, frontierStage, sub_0205E584(param0->unk_05), param0->unk_08);
}
if (frontierStage != NULL) {
Heap_Free(frontierStage);
}
ov110_021D13F0(param0, 0, v3);
ov110_021D1324(param0, &param0->unk_10[3], 38, 14 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 1);
Window_ScheduleCopyToVRAM(&param0->unk_10[3]);
}
static void ov110_021D19B0(UnkStruct_ov110_021D0F78 *param0)
{
MessageLoader *v0;
String *v1;
v0 = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_SPECIES_NAME, HEAP_ID_114);
v1 = MessageLoader_GetNewString(v0, param0->unk_08);
MessageLoader_Free(v0);
StringTemplate_SetString(param0->unk_114, 0, v1, 0, 0, GAME_LANGUAGE);
String_Free(v1);
return;
}
static void ov110_021D19F4(UnkStruct_ov110_021D0F78 *param0)
{
int v1;
u32 v2;
Window_FillTilemap(&param0->unk_10[0], 0);
ov110_021D1324(param0, &param0->unk_10[0], 23, 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 0);
if (param0->unk_05 == 0) {
v1 = 26;
v2 = 27 * 8;
} else if (param0->unk_05 == 1) {
v1 = 27;
v2 = 27 * 8;
} else {
v1 = 28;
v2 = 27 * 8;
}
ov110_021D1324(param0, &param0->unk_10[0], v1, v2, 0, 1, 2, 0, FONT_SYSTEM, 0, 2);
Window_ScheduleCopyToVRAM(&param0->unk_10[0]);
ov110_021D1324(param0, &param0->unk_10[1], 37, 12 * 8, 0, 1, 2, 0, FONT_SYSTEM, 1, 2);
Window_ScheduleCopyToVRAM(&param0->unk_10[1]);
ov110_021D13CC(param0, &param0->unk_10[2], ov110_021D1BEC(param0), 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E5E0(param0->unk_05), 0xFF));
ov110_021D1324(param0, &param0->unk_10[2], 42, 14 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 1);
ov110_021D13F0(param0, 0, sub_02030698(SaveData_GetBattleFrontier(param0->saveData), sub_0205E630(param0->unk_05), sub_0205E6A8(sub_0205E630(param0->unk_05))));
ov110_021D1324(param0, &param0->unk_10[2], 41, 28 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 2);
Window_ScheduleCopyToVRAM(&param0->unk_10[2]);
ov110_021D13CC(param0, &param0->unk_10[3], 31, 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E608(param0->unk_05), 0xFF));
ov110_021D1324(param0, &param0->unk_10[3], 42, 14 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 1);
ov110_021D13F0(param0, 0, sub_02030698(SaveData_GetBattleFrontier(param0->saveData), sub_0205E680(param0->unk_05), sub_0205E6A8(sub_0205E680(param0->unk_05))));
ov110_021D1324(param0, &param0->unk_10[3], 41, 28 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 2);
Window_ScheduleCopyToVRAM(&param0->unk_10[3]);
}
static u32 ov110_021D1BEC(UnkStruct_ov110_021D0F78 *param0)
{
u8 v0;
if (param0->unk_05 == 3) {
v0 = sub_02030698(SaveData_GetBattleFrontier(param0->saveData), 108, sub_0205E6A8(108));
} else {
v0 = (u8)sub_02030470(sub_0203041C(param0->saveData), 9, param0->unk_05, 0, NULL);
}
if (v0 == 1) {
return 30;
}
return 29;
}
static void ov110_021D1C40(UnkStruct_ov110_021D0F78 *param0)
{
int v1;
u32 v2;
Window_FillTilemap(&param0->unk_10[0], 0);
ov110_021D1324(param0, &param0->unk_10[0], 25, 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 0);
if (param0->unk_05 == 0) {
v1 = 26;
v2 = 27 * 8;
} else if (param0->unk_05 == 1) {
v1 = 27;
v2 = 27 * 8;
} else {
v1 = 28;
v2 = 27 * 8;
}
ov110_021D1324(param0, &param0->unk_10[0], v1, v2, 0, 1, 2, 0, FONT_SYSTEM, 0, 2);
Window_ScheduleCopyToVRAM(&param0->unk_10[0]);
ov110_021D13CC(param0, &param0->unk_10[1], ov110_021D1D68(param0), 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E700(param0->unk_05), 0xFF));
ov110_021D1324(param0, &param0->unk_10[1], 43, 14 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 1);
Window_ScheduleCopyToVRAM(&param0->unk_10[1]);
ov110_021D13CC(param0, &param0->unk_10[2], 31, 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E728(param0->unk_05), 0xFF));
ov110_021D1324(param0, &param0->unk_10[2], 43, 14 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 1);
Window_ScheduleCopyToVRAM(&param0->unk_10[2]);
}
static u32 ov110_021D1D68(UnkStruct_ov110_021D0F78 *param0)
{
u8 v0;
if (param0->unk_05 == 3) {
v0 = sub_02030698(SaveData_GetBattleFrontier(param0->saveData), 110, sub_0205E6A8(110));
} else {
v0 = (u8)sub_02030600(sub_020305B8(param0->saveData), 8, param0->unk_05, 0, NULL);
}
if (v0 == 1) {
return 30;
}
return 29;
}
static void ov110_021D1DBC(UnkStruct_ov110_021D0F78 *param0)
{
int v1;
u32 v2;
Window_FillTilemap(&param0->unk_10[0], 0);
ov110_021D1324(param0, &param0->unk_10[0], 21, 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 0);
if (param0->unk_05 == 0) {
v1 = 26;
v2 = 27 * 8;
} else {
v1 = 27;
v2 = 27 * 8;
}
ov110_021D1324(param0, &param0->unk_10[0], v1, v2, 0, 1, 2, 0, FONT_SYSTEM, 0, 2);
Window_ScheduleCopyToVRAM(&param0->unk_10[0]);
ov110_021D13CC(param0, &param0->unk_10[2], ov110_021D20CC(param0, param0->unk_05), 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E750(param0->unk_05), 0xFF));
ov110_021D1324(param0, &param0->unk_10[2], 38, 14 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 1);
Window_ScheduleCopyToVRAM(&param0->unk_10[2]);
ov110_021D13CC(param0, &param0->unk_10[3], 31, 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E790(param0->unk_05), 0xFF));
ov110_021D1324(param0, &param0->unk_10[3], 38, 14 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 1);
Window_ScheduleCopyToVRAM(&param0->unk_10[3]);
}
static void ov110_021D1ED8(UnkStruct_ov110_021D0F78 *param0)
{
Window_FillTilemap(&param0->unk_10[0], 0);
ov110_021D1324(param0, &param0->unk_10[0], 21, 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 0);
ov110_021D1324(param0, &param0->unk_10[0], 28, 27 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 2);
Window_ScheduleCopyToVRAM(&param0->unk_10[0]);
ov110_021D13CC(param0, &param0->unk_10[1], 32, 1);
Window_ScheduleCopyToVRAM(&param0->unk_10[1]);
ov110_021D13CC(param0, &param0->unk_10[4], ov110_021D20CC(param0, param0->unk_05), 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E750(param0->unk_05), 0xFF));
ov110_021D1324(param0, &param0->unk_10[4], 38, 14 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 1);
Window_ScheduleCopyToVRAM(&param0->unk_10[4]);
ov110_021D13CC(param0, &param0->unk_10[5], 31, 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E790(param0->unk_05), 0xFF));
ov110_021D1324(param0, &param0->unk_10[5], 38, 14 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 1);
Window_ScheduleCopyToVRAM(&param0->unk_10[5]);
ov110_021D13CC(param0, &param0->unk_10[6], 33, 1);
Window_ScheduleCopyToVRAM(&param0->unk_10[6]);
ov110_021D13CC(param0, &param0->unk_10[7], ov110_021D20CC(param0, 3), 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E750(3), 0xFF));
ov110_021D1324(param0, &param0->unk_10[7], 38, 14 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 1);
Window_ScheduleCopyToVRAM(&param0->unk_10[7]);
ov110_021D13CC(param0, &param0->unk_10[8], 31, 1);
ov110_021D13F0(param0, 0, sub_02030698(param0->frontier, sub_0205E790(3), 0xFF));
ov110_021D1324(param0, &param0->unk_10[8], 38, 14 * 8, 0, 1, 2, 0, FONT_SYSTEM, 0, 1);
Window_ScheduleCopyToVRAM(&param0->unk_10[8]);
}
static u32 ov110_021D20CC(UnkStruct_ov110_021D0F78 *param0, u8 param1)
{
u16 v0;
int v1;
UnkStruct_0202D750 *v2;
v2 = sub_0202D750(param0->saveData);
switch (param1) {
case 0:
v0 = 8;
break;
case 1:
v0 = 9;
break;
case 2:
v0 = 10;
break;
case 3:
v0 = 11;
break;
case 4:
v0 = 12;
break;
case 6:
v0 = 15;
break;
default:
v0 = 8;
break;
}
v1 = sub_0202D414(v2, v0, 0);
if (v1 == 1) {
return 30;
}
return 29;
}

View File

@ -1,90 +0,0 @@
#include "overlay110/ov110_021D2124.h"
#include <nitro.h>
#include <string.h>
#include "bg_window.h"
typedef struct {
const WindowTemplate *unk_00;
u32 unk_04;
} UnkStruct_ov110_021D2278;
void ov110_021D2124(BgConfig *param0, Window *param1, u8 param2);
void ov110_021D216C(Window *param0, u8 param1);
static const WindowTemplate Unk_ov110_021D22A0[] = {
{ 0x0, 0x2, 0x2, 0x1E, 0x2, 0xD, 0x1 },
{ 0x0, 0x2, 0x7, 0x1C, 0x2, 0xD, 0x3D },
{ 0x0, 0x2, 0xA, 0x1C, 0x2, 0xD, 0x75 },
{ 0x0, 0x2, 0xC, 0x1C, 0x2, 0xD, 0xAD },
{ 0x0, 0x2, 0xF, 0x10, 0x2, 0xD, 0xE5 },
{ 0x0, 0x2, 0x12, 0x1C, 0x2, 0xD, 0x105 },
{ 0x0, 0x2, 0x14, 0x1C, 0x2, 0xD, 0x13D }
};
static const WindowTemplate Unk_ov110_021D2238[] = {
{ 0x0, 0x2, 0x2, 0x1C, 0x2, 0xD, 0x1 },
{ 0x0, 0x2, 0x7, 0x1C, 0x2, 0xD, 0x39 },
{ 0x0, 0x2, 0xA, 0x1C, 0x2, 0xD, 0x71 },
{ 0x0, 0x2, 0xD, 0x1C, 0x2, 0xD, 0xA9 }
};
static const WindowTemplate Unk_ov110_021D2258[] = {
{ 0x0, 0x2, 0x2, 0x1C, 0x2, 0xD, 0x1 },
{ 0x0, 0x12, 0x7, 0xC, 0x2, 0xD, 0x39 },
{ 0x0, 0x2, 0xA, 0x1C, 0x2, 0xD, 0x51 },
{ 0x0, 0x2, 0xD, 0x1C, 0x2, 0xD, 0x89 }
};
static const WindowTemplate Unk_ov110_021D2220[] = {
{ 0x0, 0x2, 0x2, 0x1C, 0x2, 0xD, 0x1 },
{ 0x0, 0x2, 0x8, 0x1C, 0x2, 0xD, 0x39 },
{ 0x0, 0x2, 0xB, 0x1C, 0x2, 0xD, 0x71 }
};
static const WindowTemplate Unk_ov110_021D22D8[] = {
{ 0x0, 0x2, 0x2, 0x1E, 0x2, 0xD, 0x1 },
{ 0x0, 0x2, 0x7, 0x1C, 0x2, 0xD, 0x3D },
{ 0x0, 0x2, 0x7, 0x1C, 0x2, 0xD, 0x75 },
{ 0x0, 0x2, 0xA, 0x1C, 0x2, 0xD, 0xAD },
{ 0x0, 0x2, 0xA, 0x1C, 0x2, 0xD, 0x75 },
{ 0x0, 0x2, 0xC, 0x1C, 0x2, 0xD, 0xAD },
{ 0x0, 0x2, 0xF, 0x10, 0x2, 0xD, 0xE5 },
{ 0x0, 0x2, 0x12, 0x1C, 0x2, 0xD, 0x105 },
{ 0x0, 0x2, 0x14, 0x1C, 0x2, 0xD, 0x13D }
};
static const UnkStruct_ov110_021D2278 Unk_ov110_021D2278[5] = {
{ Unk_ov110_021D22A0, 0x7 },
{ Unk_ov110_021D2238, 0x4 },
{ Unk_ov110_021D2258, 0x4 },
{ Unk_ov110_021D2220, 0x3 },
{ Unk_ov110_021D22D8, 0x9 }
};
void ov110_021D2124(BgConfig *param0, Window *param1, u8 param2)
{
u8 v0;
const WindowTemplate *v1 = Unk_ov110_021D2278[param2].unk_00;
u32 v2 = Unk_ov110_021D2278[param2].unk_04;
for (v0 = 0; v0 < v2; v0++) {
Window_AddFromTemplate(param0, &param1[v0], &v1[v0]);
Window_FillTilemap(&param1[v0], 0);
}
return;
}
void ov110_021D216C(Window *param0, u8 param1)
{
u16 v0;
u32 v1 = Unk_ov110_021D2278[param1].unk_04;
for (v0 = 0; v0 < v1; v0++) {
Window_Remove(&param0[v0]);
}
return;
}

View File

@ -714,7 +714,7 @@ static BOOL ScrCmd_Unused_2CE(ScriptContext *ctx);
static BOOL ScrCmd_SaveExtraData(ScriptContext *ctx);
static BOOL ScrCmd_CheckIsMiscSaveInit(ScriptContext *ctx);
static BOOL ScrCmd_PokeMartFrontier(ScriptContext *ctx);
BOOL ScrCmd_2C8(ScriptContext *ctx);
static BOOL ScrCmd_OpenFrontierRecordsApp(ScriptContext *ctx);
BOOL ScrCmd_2E2(ScriptContext *ctx);
BOOL ScrCmd_2E3(ScriptContext *ctx);
BOOL ScrCmd_2E4(ScriptContext *ctx);
@ -1477,7 +1477,7 @@ const ScrCmdFunc Unk_020EAC58[] = {
ScrCmd_2C5,
ScrCmd_2C6,
ScrCmd_2C7,
ScrCmd_2C8,
ScrCmd_OpenFrontierRecordsApp,
ScrCmd_InitPersistedMapFeaturesForEternaGym,
ScrCmd_AdvanceEternaGymClock,
ScrCmd_CountRepeatedSpeciesInParty,
@ -1499,7 +1499,7 @@ const ScrCmdFunc Unk_020EAC58[] = {
ScrCmd_2DB,
ScrCmd_2DC,
ScrCmd_FindPartySlotWithSpecies,
ScrCmd_2DE,
ScrCmd_ShowBattleHallRecordMonSelectionMenu,
ScrCmd_CalcAmitySquareBerryAndAccessoryManOptionID,
ScrCmd_CheckAmitySquareManGiftIsAccessory,
ScrCmd_GetAmitySquareBerryOrAccessoryIDFromMan,
@ -7538,14 +7538,14 @@ static BOOL ScrCmd_PokeMartFrontier(ScriptContext *ctx)
return TRUE;
}
BOOL ScrCmd_2C8(ScriptContext *ctx)
static BOOL ScrCmd_OpenFrontierRecordsApp(ScriptContext *ctx)
{
void **v0 = FieldSystem_GetScriptMemberPtr(ctx->fieldSystem, SCRIPT_MANAGER_PARTY_MANAGEMENT_DATA);
u16 v1 = ScriptContext_GetVar(ctx);
u16 v2 = ScriptContext_GetVar(ctx);
u16 v3 = ScriptContext_GetVar(ctx);
void **partyData = FieldSystem_GetScriptMemberPtr(ctx->fieldSystem, SCRIPT_MANAGER_PARTY_MANAGEMENT_DATA);
u16 challengeType = ScriptContext_GetVar(ctx);
u16 facility = ScriptContext_GetVar(ctx);
u16 species = ScriptContext_GetVar(ctx);
*v0 = sub_0203E564(ctx->fieldSystem, v1, v2, v3, HEAP_ID_FIELD3);
*partyData = FieldSystem_OpenBattleFrontierRecord(ctx->fieldSystem, challengeType, facility, species, HEAP_ID_FIELD3);
ScriptContext_Pause(ctx, sub_02041CC8);
return TRUE;

View File

@ -31,7 +31,7 @@
// clang-format off
#define SCRIPT_RANGE_TABLE(Entry) \
Entry(SCRIPT_ID_OFFSET_SCRATCH_OFF_CARDS, scripts_scratch_off_cards, TEXT_BANK_SCRATCH_OFF_CARDS) \
Entry(SCRIPT_ID_OFFSET_BATTLE_TOWER_RECORDS, scripts_battle_tower_records, TEXT_BANK_BATTLE_TOWER_RECORDS) \
Entry(SCRIPT_ID_OFFSET_BATTLE_FRONTIER_RECORDS, scripts_battle_frontier_records, TEXT_BANK_BATTLE_FRONTIER_RECORDS) \
Entry(SCRIPT_ID_OFFSET_POKEMON_CENTER_DAILY_TRAINERS, scripts_pokemon_center_daily_trainers, TEXT_BANK_POKEMON_CENTER_DAILY_TRAINERS) \
Entry(SCRIPT_ID_OFFSET_COUNTERPART_TALK, scripts_counterpart_talk, TEXT_BANK_COUNTERPART_TALK) \
Entry(SCRIPT_ID_OFFSET_MYSTERY_GIFT_DELIVERYMAN, scripts_mystery_gift_deliveryman, TEXT_BANK_MYSTERY_GIFT_DELIVERYMAN) \

View File

@ -28,6 +28,7 @@
#include "applications/bag/application.h"
#include "applications/diploma.h"
#include "applications/frontier/records/main.h"
#include "applications/journal_display/journal_controller.h"
#include "applications/move_reminder.h"
#include "applications/naming_screen.h"
@ -69,7 +70,6 @@
#include "overlay096/ov96_0223B6A0.h"
#include "overlay099/ov99_021D0D80.h"
#include "overlay101/ov101_021D0D80.h"
#include "overlay110/ov110_021D0D80.h"
#include "overlay111/ov111_021D0D80.h"
#include "savedata/save_table.h"
#include "trainer_card_screen/trainer_card_screen.h"
@ -164,7 +164,7 @@ FS_EXTERN_OVERLAY(overlay95);
FS_EXTERN_OVERLAY(overlay96);
FS_EXTERN_OVERLAY(overlay99);
FS_EXTERN_OVERLAY(overlay101);
FS_EXTERN_OVERLAY(overlay110);
FS_EXTERN_OVERLAY(frontier_records_app);
FS_EXTERN_OVERLAY(overlay111);
FS_EXTERN_OVERLAY(dw_warp);
@ -1667,29 +1667,29 @@ void *FieldSystem_ShowDiploma(FieldSystem *fieldSystem, enum HeapID heapID, BOOL
return diplomaData;
}
void *sub_0203E564(FieldSystem *fieldSystem, u8 param1, u8 param2, u16 param3, enum HeapID heapID)
void *FieldSystem_OpenBattleFrontierRecord(FieldSystem *fieldSystem, u8 challengeType, u8 facility, u16 species, enum HeapID heapID)
{
UnkStruct_0203E564 *v0;
FrontierRecordsAppArgs *args;
FS_EXTERN_OVERLAY(overlay110);
FS_EXTERN_OVERLAY(frontier_records_app);
static ApplicationManagerTemplate v1 = {
ov110_021D0D80,
ov110_021D0E9C,
ov110_021D0EF0,
FS_OVERLAY_ID(overlay110)
static ApplicationManagerTemplate template = {
BattleFrontierRecordsApp_Init,
BattleFrontierRecordsApp_Main,
BattleFrontierRecordsApp_Exit,
FS_OVERLAY_ID(frontier_records_app)
};
v0 = Heap_Alloc(heapID, sizeof(UnkStruct_0203E564));
args = Heap_Alloc(heapID, sizeof(FrontierRecordsAppArgs));
v0->unk_04 = param1;
v0->unk_05 = param2;
v0->unk_06 = param3;
v0->saveData = fieldSystem->saveData;
args->challengeType = challengeType;
args->facility = facility;
args->species = species;
args->saveData = fieldSystem->saveData;
FieldSystem_StartChildProcess(fieldSystem, &v1, v0);
FieldSystem_StartChildProcess(fieldSystem, &template, args);
return v0;
return args;
}
PartyMenu *FieldSystem_OpenPartyMenu_SelectForItemUsage(FieldSystem *fieldSystem, enum HeapID heapID, enum Item item)