Document battle tower multi battle scripts (#848)

This commit is contained in:
Viperio 2025-12-11 23:35:07 +01:00 committed by GitHub
parent ac5f4a411f
commit 30f97f3b48
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
38 changed files with 598 additions and 578 deletions

View File

@ -2925,9 +2925,9 @@
.short \word2
.endm
.macro ScrCmd_1FE arg0
.macro PrintBattleTowerIntroMessage opponentID
.short 510
.byte \arg0
.byte \opponentID
.endm
.macro MessageSeenBanlistSpecies banlistMsgStartIdx, numPokemonRequired

View File

@ -1,5 +1,5 @@
BATTLE_TOWER_FUNCTION_CHECK_ENOUGH_VALID_POKEMON = 1
BATTLE_TOWER_FUNCTION_UNK_02
BATTLE_TOWER_FUNCTION_RESET_SYSTEM
BATTLE_TOWER_FUNCTION_UNK_03
BATTLE_TOWER_FUNCTION_UNK_04
BATTLE_TOWER_FUNCTION_SET_COMMUNICATION_CLUB_ACCESSIBLE
@ -15,20 +15,21 @@ BATTLE_TOWER_FUNCTION_UNK_16
BATTLE_TOWER_FUNCTION_UNK_30 = 30
BATTLE_TOWER_FUNCTION_UNK_31
BATTLE_TOWER_FUNCTION_CHECK_DUPLICATE_SPECIES_AND_HELD_ITEMS
BATTLE_TOWER_FUNCTION_UNK_33
BATTLE_TOWER_FUNCTION_GET_NEXT_OPPONENT_NUM
BATTLE_TOWER_FUNCTION_UNK_34
BATTLE_TOWER_FUNCTION_UNK_35
BATTLE_TOWER_FUNCTION_HAS_DEFEATED_SEVEN_TRAINERS
BATTLE_TOWER_FUNCTION_UNK_36
BATTLE_TOWER_FUNCTION_UNK_37
BATTLE_TOWER_FUNCTION_UNK_38
BATTLE_TOWER_FUNCTION_UPDATE_GAME_RECORDS
BATTLE_TOWER_FUNCTION_UPDATE_GAME_RECORDS_AND_JOURNAL
BATTLE_TOWER_FUNCTION_UNK_39
BATTLE_TOWER_FUNCTION_UNK_40
BATTLE_TOWER_FUNCTION_SET_OPPONENT_TEAMS
BATTLE_TOWER_FUNCTION_GET_OPPONENT_OBJECT_ID
BATTLE_TOWER_FUNCTION_UNK_42
BATTLE_TOWER_FUNCTION_GET_CHALLENGE_MODE
BATTLE_TOWER_FUNCTION_UNK_44
BATTLE_TOWER_FUNCTION_UNK_45
BATTLE_TOWER_FUNCTION_UNK_47 = 47
BATTLE_TOWER_FUNCTION_UNK_46
BATTLE_TOWER_FUNCTION_UNK_47
BATTLE_TOWER_FUNCTION_UNK_48
BATTLE_TOWER_FUNCTION_UNK_49
BATTLE_TOWER_FUNCTION_SET_PARTNER_ID
@ -40,4 +41,5 @@ BATTLE_TOWER_FUNCTION_GET_PARTNER_PARAM
BATTLE_TOWER_FUNCTION_UNK_56
BATTLE_TOWER_FUNCTION_UNK_57
BATTLE_TOWER_FUNCTION_UNK_58
BATTLE_TOWER_FUNCTION_UNK_59
BATTLE_TOWER_FUNCTION_CHECK_IS_NULL = 100

View File

@ -488,8 +488,8 @@ FLAG_UNK_0x01E6
FLAG_UNK_0x01E7
FLAG_UNK_0x01E8
FLAG_UNK_0x01E9
FLAG_UNK_0x01EA
FLAG_UNK_0x01EB
FLAG_HIDE_MULTI_BATTLE_ROOM_OPPONENT_1
FLAG_HIDE_MULTI_BATTLE_ROOM_OPPONENT_2
FLAG_HIDE_BATTLE_SALON_CHERYL
FLAG_HIDE_BATTLE_SALON_MIRA
FLAG_HIDE_BATTLE_SALON_RILEY

View File

@ -12,4 +12,9 @@
#define BT_PARTNER_BUCK 4
#define BT_PARTNERS_COUNT 5
#define BT_OPPONENTS_COUNT 7
#define BT_SINGLES_PARTY_SIZE 3
#define BT_DOUBLES_PARTY_SIZE 4
#endif // POKEPLATINUM_CONSTANTS_BATTLE_TOWER_H

View File

@ -3,6 +3,7 @@
#include "constants/moves.h"
#include "constants/string.h"
#include "generated/pokemon_stats.h"
typedef struct FrontierTrainerDataDTO {
u32 trainerID;
@ -45,7 +46,7 @@ typedef struct FrontierPokemonDataDTO {
u8 spAtkEV;
u8 spDefEV;
};
u8 evList[6];
u8 evList[STAT_MAX];
};
union {
struct {

View File

@ -14,9 +14,9 @@
#include "string_template.h"
#include "trainer_info.h"
BattleFrontierTrainerData *ov104_0222DCE0(u16 param0, int param1, enum NarcID narcID);
void ov104_0222DCF4(BattleFrontierPokemonData *param0, int param1, enum NarcID narcID);
BattleFrontierTrainerData *ov104_0222DD04(FrontierTrainerDataDTO *param0, int param1, int heapID, int param3);
BattleFrontierTrainerData *BattleTower_GetTrainerDataFromTrainerIDAndNarcID(u16 battleTowerTrainerID, enum HeapID heapID, enum NarcID narcID);
void BattleTower_GetMonDataFromSetIDAndNarcID(BattleFrontierPokemonData *monData, int setID, enum NarcID narcID);
BattleFrontierTrainerData *BattleTower_GetTrainerData(FrontierTrainerDataDTO *trDataDTO, int battleTowerTrainerID, enum HeapID heapID, enum NarcID narcID);
u32 ov104_0222DD6C(FrontierPokemonDataDTO *param0, u16 param1, u32 param2, u32 param3, u8 param4, u8 param5, BOOL param6, int param7, enum NarcID narcID);
void ov104_0222DF40(const FrontierPokemonDataDTO *param0, Pokemon *param1, u8 param2);
u16 ov104_0222E10C(u8 param0);

View File

@ -5,7 +5,7 @@
#include "savedata.h"
void ov104_022394A4(BattleTower *battleTower, SaveData *saveData);
void BattleTower_CreateOpponentParties(BattleTower *battleTower, SaveData *saveData);
u16 ov104_02239588(BattleTower *battleTower, u16 param1);
void ov104_022395A0(BattleTower *battleTower, u16 param1);
u16 ov104_022395B4(BattleTower *battleTower);

View File

@ -10,11 +10,11 @@
#include "field_battle_data_transfer.h"
#include "savedata.h"
BOOL ov104_0223A0C4(BattleTower *battleTower, FrontierDataDTO *param1, u16 param2, int param3, u16 *param4, u16 *param5, UnkStruct_0204B404 *param6, int heapID);
BOOL BattleTower_CreateTrainerParty(BattleTower *battleTower, FrontierDataDTO *opponentDataDTO, u16 battleTowerTrainerID, int partySize, u16 *species, u16 *items, UnkStruct_0204B404 *param6, int heapID);
void ov104_0223A30C(SaveData *saveData, FrontierDataDTO *param1, const u8 param2);
FieldBattleDTO *ov104_0223A580(BattleTower *battleTower, UnkStruct_ov104_02230BE4 *param1);
void ov104_0223A734(BattleTower *battleTower, u16 param1);
u16 ov104_0223A750(BattleTower *battleTower, const u16 *param1);
int ov104_0223A790(u8 param0);
int BattleTower_GetTrainerMessagesBankID(u8 challengeMode);
#endif // POKEPLATINUM_OV104_0223A0C4_H

View File

@ -15,11 +15,11 @@ typedef struct BattleTower {
int unk_00;
int heapID;
u32 unk_08;
u8 unk_0C;
u8 nextOpponentNum;
u8 unk_0D;
u8 partySize;
u8 challengeMode;
u8 unk_10_0 : 1;
u8 defeatedSevenTrainers : 1;
u8 unk_10_1 : 2;
u8 unk_10_3 : 1;
u8 unk_10_4 : 1;
@ -29,7 +29,7 @@ typedef struct BattleTower {
u16 unk_14;
u16 unk_16[2];
u16 unk_1A;
u16 unk_1C;
u16 roomNum;
u32 unk_20;
u16 unk_24;
u16 unk_26;
@ -37,11 +37,11 @@ typedef struct BattleTower {
u8 unk_2A[4];
u16 unk_2E[4];
u16 unk_36[4];
u16 unk_3E[14];
u16 trainerIDs[BT_OPPONENTS_COUNT * 2];
Location unk_5C;
UnkStruct_0202D060 *unk_70;
UnkStruct_0202D750 *unk_74;
FrontierDataDTO unk_78[2];
FrontierDataDTO opponentsDataDTO[2];
FrontierDataDTO partnersDataDTO[BT_PARTNERS_COUNT];
UnkStruct_0204B404 unk_7E8[BT_PARTNERS_COUNT];
u8 unk_838[BT_PARTNERS_COUNT];

View File

@ -12,7 +12,7 @@
u16 BattleTower_GetPartySizeForChallengeMode(u16 param0);
BOOL sub_02049EC4(u16 param0, SaveData *saveData, u8 param2);
void sub_02049F8C(void);
void BattleTower_ResetSystem(void);
void sub_02049F98(UnkStruct_0202D060 *param0);
BOOL sub_02049FA0(UnkStruct_0202D060 *param0);
void BattleTower_SetCommunicationClubAccessible(FieldSystem *fieldSystem);
@ -29,10 +29,10 @@ void sub_0204A358(BattleTower *battleTower, FieldTask *param1, void **param2);
BOOL sub_0204A378(BattleTower *battleTower, void **param1, SaveData *saveData);
int BattleTower_CheckDuplicateSpeciesAndHeldItems(BattleTower *battleTower, SaveData *saveData);
void sub_0204A4C8(BattleTower *battleTower, SaveData *saveData);
u16 sub_0204A578(BattleTower *battleTower);
BOOL sub_0204A57C(BattleTower *battleTower);
void sub_0204A660(BattleTower *battleTower, SaveData *saveData);
void sub_0204A7A4(BattleTower *battleTower, SaveData *saveData, JournalEntry *param2);
u16 BattleTower_GetNextOpponentNum(BattleTower *battleTower);
BOOL BattleTower_HasDefeatedSevenTrainers(BattleTower *battleTower);
void BattleTower_UpdateGameRecords(BattleTower *battleTower, SaveData *saveData);
void BattleTower_UpdateGameRecordsAndJournal(BattleTower *battleTower, SaveData *saveData, JournalEntry *journalEntry);
void sub_0204A8C8(BattleTower *battleTower);
void sub_0204A97C(BattleTower *battleTower);
u16 BattleTower_GetObjectIDFromOpponentID(BattleTower *battleTower, u16 param1);
@ -45,6 +45,6 @@ u16 sub_0204AB68(BattleTower *battleTower, SaveData *saveData);
u16 sub_0204ABA0(BattleTower *battleTower, SaveData *saveData);
u16 sub_0204ABF4(BattleTower *battleTower, SaveData *saveData);
u8 BattleTower_GetIVsFromTrainerID(u16 param0);
u16 sub_0204AEC0(BattleTower *battleTower);
u16 BattleTower_GetRandom(BattleTower *battleTower);
#endif // POKEPLATINUM_UNK_02049D08_H

View File

@ -18,7 +18,7 @@ u16 sub_0204B044(FieldSystem *fieldSystem, const u16 *param1);
void sub_0204B060(BattleTower *battleTower, SaveData *saveData);
void sub_0204B0BC(BattleTower *battleTower);
void sub_0204B0D4(BattleTower *battleTower, u16 param1);
u16 sub_0204B0F0(BattleTower *battleTower, u8 param1, u8 param2, int param3);
u16 BattleTower_GetTrainerIDForRoomAndOpponentNum(BattleTower *battleTower, u8 roomNum, u8 opponentNum, int challengeMode);
BOOL sub_0204B3B8(BattleTower *battleTower, FrontierDataDTO *param1, u16 partnerBattleTowerID, int partysize, u16 *param4, u16 *param5, UnkStruct_0204B404 *param6, int heapID);
void sub_0204B404(BattleTower *battleTower, FrontierDataDTO *param1, u16 partnerBattleTowerID, BOOL param3, const UnkStruct_0204B404 *param4, int heapID);

View File

@ -32,7 +32,7 @@
"y": 0
},
{
"id": "BATTLE_TOWER_CORRIDOR_MULTI_PLAYER_LEADER",
"id": "BATTLE_TOWER_CORRIDOR_MULTI_LEADER",
"graphics_id": "OBJ_EVENT_GFX_COUNTERPART",
"movement_type": "MOVEMENT_TYPE_NONE",
"trainer_type": "TRAINER_TYPE_NONE",
@ -47,7 +47,7 @@
"y": 0
},
{
"id": "BATTLE_TOWER_CORRIDOR_MULTI_PLAYER_PARTNER",
"id": "BATTLE_TOWER_CORRIDOR_MULTI_PARTNER",
"graphics_id": "OBJ_EVENT_GFX_UNK_102",
"movement_type": "MOVEMENT_TYPE_NONE",
"trainer_type": "TRAINER_TYPE_NONE",

View File

@ -2,7 +2,7 @@
"bg_events": [],
"object_events": [
{
"id": "BATTLE_TOWER_MULTI_BATTLE_ROOM_TEALA_0",
"id": "BATTLE_TOWER_MULTI_BATTLE_ROOM_ATTENDANT_NORTH",
"graphics_id": "OBJ_EVENT_GFX_TEALA",
"movement_type": "MOVEMENT_TYPE_NONE",
"trainer_type": "TRAINER_TYPE_NONE",
@ -17,7 +17,7 @@
"y": 0
},
{
"id": "BATTLE_TOWER_MULTI_BATTLE_ROOM_TEALA_1",
"id": "BATTLE_TOWER_MULTI_BATTLE_ROOM_ATTENDANT_SOUTH",
"graphics_id": "OBJ_EVENT_GFX_TEALA",
"movement_type": "MOVEMENT_TYPE_NONE",
"trainer_type": "TRAINER_TYPE_NONE",
@ -32,7 +32,7 @@
"y": 0
},
{
"id": "BATTLE_TOWER_MULTI_BATTLE_ROOM_COUNTERPART_2",
"id": "BATTLE_TOWER_MULTI_BATTLE_ROOM_LEADER",
"graphics_id": "OBJ_EVENT_GFX_COUNTERPART",
"movement_type": "MOVEMENT_TYPE_NONE",
"trainer_type": "TRAINER_TYPE_NONE",
@ -47,7 +47,7 @@
"y": 0
},
{
"id": "BATTLE_TOWER_MULTI_BATTLE_ROOM_UNK_102_3",
"id": "BATTLE_TOWER_MULTI_BATTLE_ROOM_PARTNER",
"graphics_id": "OBJ_EVENT_GFX_UNK_102",
"movement_type": "MOVEMENT_TYPE_NONE",
"trainer_type": "TRAINER_TYPE_NONE",
@ -62,11 +62,11 @@
"y": 0
},
{
"id": "BATTLE_TOWER_MULTI_BATTLE_ROOM_UNK_104_4",
"id": "BATTLE_TOWER_MULTI_BATTLE_ROOM_OPPONENT_2",
"graphics_id": "OBJ_EVENT_GFX_UNK_104",
"movement_type": "MOVEMENT_TYPE_NONE",
"trainer_type": "TRAINER_TYPE_NONE",
"hidden_flag": "FLAG_UNK_0x01EB",
"hidden_flag": "FLAG_HIDE_MULTI_BATTLE_ROOM_OPPONENT_2",
"script": 0,
"initial_dir": 1,
"data": [],
@ -77,11 +77,11 @@
"y": 0
},
{
"id": "BATTLE_TOWER_MULTI_BATTLE_ROOM_UNK_103_5",
"id": "BATTLE_TOWER_MULTI_BATTLE_ROOM_OPPONENT_1",
"graphics_id": "OBJ_EVENT_GFX_UNK_103",
"movement_type": "MOVEMENT_TYPE_NONE",
"trainer_type": "TRAINER_TYPE_NONE",
"hidden_flag": "FLAG_UNK_0x01EA",
"hidden_flag": "FLAG_HIDE_MULTI_BATTLE_ROOM_OPPONENT_1",
"script": 0,
"initial_dir": 1,
"data": [],

View File

@ -619,7 +619,7 @@ _09FB:
FadeScreenOut
WaitFadeScreen
CloseMessage
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_02, 0, 0
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_RESET_SYSTEM, 0, 0
ReleaseAll
End
@ -878,7 +878,7 @@ _0EBF:
Call _0724
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_CHECK_IS_NULL, 0, VAR_RESULT
GoToIfEq VAR_RESULT, TRUE, BattleTower_WeHopeToSeeYouAgain
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_35, 0, VAR_RESULT
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_HAS_DEFEATED_SEVEN_TRAINERS, 0, VAR_RESULT
GoToIfEq VAR_RESULT, 1, _0F7E
GoTo _0F05
End

View File

@ -1,5 +1,6 @@
#include "macros/scrcmd.inc"
#include "res/text/bank/battle_tower_battle_room.h"
#include "res/text/bank/menu_entries.h"
#include "constants/map_object.h"
@ -87,9 +88,9 @@ _012C:
End
_015D:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_40, 0, 0
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_SET_OPPONENT_TEAMS, 0, 0
Call _045C
ScrCmd_1FE 0
PrintBattleTowerIntroMessage 0
WaitABPress
CloseMessage
Call _047E
@ -99,12 +100,12 @@ _015D:
Return
_018C:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_37, 0, 0
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UPDATE_GAME_RECORDS, 0, 0
GoTo _007D
End
_019C:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_38, 0, 0
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UPDATE_GAME_RECORDS_AND_JOURNAL, 0, 0
GoTo _007D
End
@ -121,7 +122,7 @@ _01AC:
FadeScreenOut
WaitFadeScreen
CloseMessage
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_02, 0, 0
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_RESET_SYSTEM, 0, 0
End
_01E7:
@ -130,14 +131,14 @@ _01E7:
_01EF:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_34, 0, VAR_RESULT
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_35, 0, VAR_RESULT
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_HAS_DEFEATED_SEVEN_TRAINERS, 0, VAR_RESULT
Return
_0201:
Call _015D
GoToIfEq VAR_0x8004, FALSE, _018C
Call _01EF
GoToIfEq VAR_RESULT, 1, _019C
GoToIfEq VAR_RESULT, TRUE, _019C
Call _0492
Call _04A6
Call _0070
@ -145,14 +146,14 @@ _0201:
End
_0241:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_33, 0, VAR_0x8004
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_GET_NEXT_OPPONENT_NUM, 0, VAR_0x8004
BufferNumber 0, VAR_0x8004
Message 1
InitGlobalTextListMenu 31, 11, 0, VAR_RESULT, NO_EXIT_ON_B
SetMenuXOriginToRight
AddListMenuEntry 146, 0
AddListMenuEntry 147, 1
AddListMenuEntry 148, 2
AddListMenuEntry MenuEntries_Text_BattleTowerBattleRoom_KeepGoing, 0
AddListMenuEntry MenuEntries_Text_BattleTowerBattleRoom_Rest, 1
AddListMenuEntry MenuEntries_Text_BattleTowerBattleRoom_Retire, 2
ShowListMenu
CloseMessage
SetVar VAR_0x8008, VAR_RESULT
@ -196,9 +197,9 @@ _0336:
Message 14
InitGlobalTextListMenu 31, 11, 0, VAR_RESULT, NO_EXIT_ON_B
SetMenuXOriginToRight
AddListMenuEntry 146, 0
AddListMenuEntry 147, 1
AddListMenuEntry 148, 2
AddListMenuEntry MenuEntries_Text_BattleTowerBattleRoom_KeepGoing, 0
AddListMenuEntry MenuEntries_Text_BattleTowerBattleRoom_Rest, 1
AddListMenuEntry MenuEntries_Text_BattleTowerBattleRoom_Retire, 2
ShowListMenu
CloseMessage
SetVar VAR_0x8008, VAR_RESULT
@ -210,7 +211,7 @@ _0336:
_0395:
Call _04BA
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_40, 0, 0
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_SET_OPPONENT_TEAMS, 0, 0
Call _04CE
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_36, 0, VAR_RESULT
GoToIfEq VAR_RESULT, 48, _041E

View File

@ -28,8 +28,8 @@ BattleTowerCorridorMulti_SetPlayer2Graphics:
_0068:
CallIfNe VAR_UNK_0x40DD, 0, _007F
HideObject 2
HideObject 3
HideObject BATTLE_TOWER_CORRIDOR_MULTI_LEADER
HideObject BATTLE_TOWER_CORRIDOR_MULTI_PARTNER
End
_007F:
@ -60,10 +60,10 @@ BattleTowerCorridorMulti_PlayEnterCorridorAnimation:
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_LEFT_ATTENDANT, BattleTowerCorridorMulti_AttendantEnterCorridorMovement
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_RIGHT_ATTENDANT, BattleTowerCorridorMulti_AttendantEnterCorridorMovement
WaitMovement
ShowObject BATTLE_TOWER_CORRIDOR_MULTI_PLAYER_LEADER
ShowObject BATTLE_TOWER_CORRIDOR_MULTI_PLAYER_PARTNER
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_PLAYER_LEADER, BattleTowerCorridorMulti_PlayerEnterCorridorMovement
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_PLAYER_PARTNER, BattleTowerCorridorMulti_PlayerEnterCorridorMovement
ShowObject BATTLE_TOWER_CORRIDOR_MULTI_LEADER
ShowObject BATTLE_TOWER_CORRIDOR_MULTI_PARTNER
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_LEADER, BattleTowerCorridorMulti_PlayerEnterCorridorMovement
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_PARTNER, BattleTowerCorridorMulti_PlayerEnterCorridorMovement
WaitMovement
PlayDoorCloseAnimation ANIMATION_TAG_DOOR_1
PlayDoorCloseAnimation ANIMATION_TAG_DOOR_2
@ -75,17 +75,17 @@ BattleTowerCorridorMulti_PlayEnterCorridorAnimation:
BattleTowerCorridorMulti_ApplyWalkToBattleRoomMovement:
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_LEFT_ATTENDANT, BattleTowerCorridorMulti_LeftAttendantWalkToBattleRoomMovement
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_PLAYER_LEADER, BattleTowerCorridorMulti_PlayerLeaderWalkToBattleRoomMovement
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_LEADER, BattleTowerCorridorMulti_LeaderWalkToBattleRoomMovement
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_RIGHT_ATTENDANT, BattleTowerCorridorMulti_RightAttendantWalkToBattleRoomMovement
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_PLAYER_PARTNER, BattleTowerCorridorMulti_PlayerFriendWalkToBattleRoomMovement
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_PARTNER, BattleTowerCorridorMulti_FriendWalkToBattleRoomMovement
WaitMovement
Return
BattleTowerCorridorMulti_ApplyEnterBattleRoomMovement:
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_LEFT_ATTENDANT, BattleTowerCorridorMulti_AttendantEnterBattleRoomMovement
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_RIGHT_ATTENDANT, BattleTowerCorridorMulti_AttendantEnterBattleRoomMovement
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_PLAYER_LEADER, BattleTowerCorridorMulti_PlayerEnterBattleRoomMovement
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_PLAYER_PARTNER, BattleTowerCorridorMulti_PlayerEnterBattleRoomMovement
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_LEADER, BattleTowerCorridorMulti_PlayerEnterBattleRoomMovement
ApplyMovement BATTLE_TOWER_CORRIDOR_MULTI_PARTNER, BattleTowerCorridorMulti_PlayerEnterBattleRoomMovement
WaitMovement
Return
@ -101,13 +101,13 @@ BattleTowerCorridorMulti_PlayerEnterCorridorMovement:
EndMovement
.balign 4, 0
BattleTowerCorridorMulti_PlayerLeaderWalkToBattleRoomMovement:
BattleTowerCorridorMulti_LeaderWalkToBattleRoomMovement:
WalkNormalSouth
WalkNormalEast 5
EndMovement
.balign 4, 0
BattleTowerCorridorMulti_PlayerFriendWalkToBattleRoomMovement:
BattleTowerCorridorMulti_FriendWalkToBattleRoomMovement:
WalkNormalSouth
WalkNormalWest 5
EndMovement

View File

@ -1,61 +1,63 @@
#include "macros/scrcmd.inc"
#include "res/text/bank/battle_tower_multi_battle_room.h"
#include "res/text/bank/menu_entries.h"
#include "res/field/events/events_battle_tower_multi_battle_room.h"
#include "constants/map_object.h"
ScriptEntry _0012
ScriptEntry _0074
ScriptEntry _0156
ScriptEntry _0181
ScriptEntry BattleTowerMultiBattleRoom_SetPlayerGraphics
ScriptEntry BattleTowerMultiBattleRoom_SetPositions
ScriptEntry BattleTowerMultiBattleRoom_Enter
ScriptEntry BattleTowerMultiBattleRoom_ContinueMultiChallenge
ScriptEntryEnd
_0012:
GoToIfEq VAR_UNK_0x40DE, 0, _0054
SetFlag FLAG_UNK_0x01EA
SetFlag FLAG_UNK_0x01EB
BattleTowerMultiBattleRoom_SetPlayerGraphics:
GoToIfEq VAR_UNK_0x40DE, 0, BattleTowerMultiBattleRoom_DontSetPlayerGraphics
SetFlag FLAG_HIDE_MULTI_BATTLE_ROOM_OPPONENT_1
SetFlag FLAG_HIDE_MULTI_BATTLE_ROOM_OPPONENT_2
GetCurNetID VAR_MAP_LOCAL_0
GoToIfEq VAR_MAP_LOCAL_0, 1, _0056
GoToIfEq VAR_MAP_LOCAL_0, 1, BattleTowerMultiBattleRoom_SetPlayer2Graphics
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_GET_PARTNER_PARAM, BT_PARAM_PLAYER_GRAPHICS_ID, VAR_MAP_LOCAL_0
SetVar VAR_OBJ_GFX_ID_0, VAR_MAP_LOCAL_0
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_GET_PARTNER_PARAM, BT_PARAM_PARTNER_GRAPHICS_ID, VAR_MAP_LOCAL_0
SetVar VAR_OBJ_GFX_ID_1, VAR_MAP_LOCAL_0
_0054:
BattleTowerMultiBattleRoom_DontSetPlayerGraphics:
End
_0056:
BattleTowerMultiBattleRoom_SetPlayer2Graphics:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_GET_PARTNER_PARAM, BT_PARAM_PLAYER_GRAPHICS_ID, VAR_MAP_LOCAL_0
SetVar VAR_OBJ_GFX_ID_1, VAR_MAP_LOCAL_0
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_GET_PARTNER_PARAM, BT_PARAM_PARTNER_GRAPHICS_ID, VAR_MAP_LOCAL_0
SetVar VAR_OBJ_GFX_ID_0, VAR_MAP_LOCAL_0
End
_0074:
CallIfNe VAR_UNK_0x40DE, 0, _0090
GoToIfEq VAR_UNK_0x40DE, 3, _009E
_008E:
BattleTowerMultiBattleRoom_SetPositions:
CallIfNe VAR_UNK_0x40DE, 0, BattleTowerMultiBattleRoom_HidePlayer
GoToIfEq VAR_UNK_0x40DE, 3, BattleTowerMultiBattleRoom_SetPlayerPositionsForBattle
BattleTowerMultiBattleRoom_EndSetPositions:
End
_0090:
BattleTowerMultiBattleRoom_HidePlayer:
HideObject LOCALID_PLAYER
MoveCamera 8, 0, 0
Return
_009E:
SetPosition 2, 5, 0, 5, 3
SetPosition 3, 5, 0, 6, 3
GoTo _008E
BattleTowerMultiBattleRoom_SetPlayerPositionsForBattle:
SetPosition BATTLE_TOWER_MULTI_BATTLE_ROOM_LEADER, 5, 0, 5, 3
SetPosition BATTLE_TOWER_MULTI_BATTLE_ROOM_PARTNER, 5, 0, 6, 3
GoTo BattleTowerMultiBattleRoom_EndSetPositions
End
_00BE:
Message 2
BattleTowerMultiBattleRoom_RestorePokemon:
Message BattleTowerMultiBattleRoom_Text_YourPokemonWillBeRestored
PlaySound SEQ_ASA
WaitSound
HealParty
Return
_00CB:
BattleTowerMultiBattleRoom_EndChallenge:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_GET_CHALLENGE_MODE, 0, VAR_RESULT
GoToIfEq VAR_RESULT, BATTLE_TOWER_MODE_LINK_MULTI, _0114
GoToIfEq VAR_RESULT, BATTLE_TOWER_MODE_LINK_MULTI, BattleTowerMultiBattleRoom_EndLinkMultiChallenge
WaitTime 30, VAR_RESULT
SetVar VAR_UNK_0x40D8, 1
FadeScreenOut
@ -66,7 +68,7 @@ _00CB:
ReleaseAll
End
_0114:
BattleTowerMultiBattleRoom_EndLinkMultiChallenge:
WaitTime 30, VAR_RESULT
SetVar VAR_UNK_0x40D8, 1
ClearReceivedTempDataAllPlayers
@ -82,52 +84,52 @@ _0114:
ReleaseAll
End
_0156:
BattleTowerMultiBattleRoom_Enter:
LockAll
SetVar VAR_UNK_0x40DE, 3
Call _048D
Call BattleTowerMultiBattleRoom_ApplyPlayersEnterRoomMovement
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_GET_CHALLENGE_MODE, 0, VAR_RESULT
GoToIfEq VAR_RESULT, BATTLE_TOWER_MODE_LINK_MULTI, _039E
GoTo _02B0
GoToIfEq VAR_RESULT, BATTLE_TOWER_MODE_LINK_MULTI, BattleTowerMultiBattleRoom_DoLinkMultiBattle
GoTo BattleTowerMultiBattleRoom_DoMultiBattle
End
_0181:
BattleTowerMultiBattleRoom_ContinueMultiChallenge:
LockAll
SetVar VAR_UNK_0x40DE, 3
Call _048D
Call _04A1
GoTo _02E8
Call BattleTowerMultiBattleRoom_ApplyPlayersEnterRoomMovement
Call BattleTowerMultiBattleRoom_PlayersAndAttendantFaceEachOther
GoTo BattleTowerMultiBattleRoom_AskReadyForNextMultiBattle
End
_019D:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_40, 0, 0
Call _04C5
Call _0529
ScrCmd_1FE 0
BattleTowerMultiBattleRoom_DoNextMultiBattle:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_SET_OPPONENT_TEAMS, 0, 0
Call BattleTowerMultiBattleRoom_SetOpponentGraphicsAndEnterRoom
Call BattleTowerMultiBattleRoom_ApplyOpponent1WalkOnSpotSlowWestMovement
PrintBattleTowerIntroMessage 0
WaitABPress
CloseMessage
Call _0535
ScrCmd_1FE 1
Call BattleTowerMultiBattleRoom_ApplyOpponent2WalkOnSpotSlowWestMovement
PrintBattleTowerIntroMessage 1
WaitABPress
CloseMessage
Call _0505
Call BattleTowerMultiBattleRoom_PlayersAndOpponentsApproachEachOther
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_42, 0, 0
CheckWonBattle VAR_RESULT
SetVar VAR_0x8004, VAR_RESULT
Return
_01DF:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_40, 0, 0
Call _04C5
Call _0529
ScrCmd_1FE 0
BattleTowerMultiBattleRoom_DoNextLinkMultiBattle:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_SET_OPPONENT_TEAMS, 0, 0
Call BattleTowerMultiBattleRoom_SetOpponentGraphicsAndEnterRoom
Call BattleTowerMultiBattleRoom_ApplyOpponent1WalkOnSpotSlowWestMovement
PrintBattleTowerIntroMessage 0
WaitTime 30, VAR_RESULT
CloseMessage
Call _0535
ScrCmd_1FE 1
Call BattleTowerMultiBattleRoom_ApplyOpponent2WalkOnSpotSlowWestMovement
PrintBattleTowerIntroMessage 1
WaitTime 30, VAR_RESULT
CloseMessage
Call _0505
Call BattleTowerMultiBattleRoom_PlayersAndOpponentsApproachEachOther
ClearReceivedTempDataAllPlayers
ScrCmd_135 4
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_42, 0, 0
@ -135,23 +137,23 @@ _01DF:
SetVar VAR_0x8004, VAR_RESULT
Return
_022F:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_37, 0, 0
BattleTowerMultiBattleRoom_EndChallengeAndUpdateGameRecords:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UPDATE_GAME_RECORDS, 0, 0
SetVar VAR_MAP_LOCAL_0, 0
GoTo _00CB
GoTo BattleTowerMultiBattleRoom_EndChallenge
End
_0245:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_38, 0, 0
BattleTowerMultiBattleRoom_EndChallengeAndUpdateGameRecordsAndJournal:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UPDATE_GAME_RECORDS_AND_JOURNAL, 0, 0
SetVar VAR_MAP_LOCAL_0, 1
GoTo _00CB
GoTo BattleTowerMultiBattleRoom_EndChallenge
End
_025B:
BattleTowerMultiBattleRoom_SaveAndQuitMultiChallenge:
SetVar VAR_UNK_0x40D8, 2
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_39, 0, 0
FreeBattleTower
Message 0
Message BattleTowerMultiBattleRoom_Text_ThanksForParticipating
ShowSavingIcon
TrySaveGame VAR_RESULT
HideSavingIcon
@ -160,189 +162,189 @@ _025B:
FadeScreenOut
WaitFadeScreen
CloseMessage
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_02, 0, 0
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_RESET_SYSTEM, 0, 0
End
_0296:
GoTo _022F
BattleTowerMultiBattleRoom_GoToEndChallengeAndUpdateGameRecords:
GoTo BattleTowerMultiBattleRoom_EndChallengeAndUpdateGameRecords
End
_029E:
BattleTowerMultiBattleRoom_HasDefeatedSevenTrainers:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_34, 0, VAR_RESULT
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_35, 0, VAR_RESULT
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_HAS_DEFEATED_SEVEN_TRAINERS, 0, VAR_RESULT
Return
_02B0:
Call _019D
GoToIfEq VAR_0x8004, FALSE, _022F
Call _029E
GoToIfEq VAR_RESULT, 1, _0245
Call _0541
Call _0565
Call _00BE
_02E8:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_33, 0, VAR_0x8004
BattleTowerMultiBattleRoom_DoMultiBattle:
Call BattleTowerMultiBattleRoom_DoNextMultiBattle
GoToIfEq VAR_0x8004, FALSE, BattleTowerMultiBattleRoom_EndChallengeAndUpdateGameRecords
Call BattleTowerMultiBattleRoom_HasDefeatedSevenTrainers
GoToIfEq VAR_RESULT, TRUE, BattleTowerMultiBattleRoom_EndChallengeAndUpdateGameRecordsAndJournal
Call BattleTowerMultiBattleRoom_OpponentsLeaveRoom
Call BattleTowerMultiBattleRoom_PlayersAndAttendantApproachEachOther
Call BattleTowerMultiBattleRoom_RestorePokemon
BattleTowerMultiBattleRoom_AskReadyForNextMultiBattle:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_GET_NEXT_OPPONENT_NUM, 0, VAR_0x8004
BufferNumber 0, VAR_0x8004
Message 3
Message BattleTowerMultiBattleRoom_Text_AskReadyForNextPair
InitGlobalTextListMenu 31, 11, 0, VAR_RESULT, NO_EXIT_ON_B
SetMenuXOriginToRight
AddListMenuEntry 146, 0
AddListMenuEntry 147, 1
AddListMenuEntry 148, 2
AddListMenuEntry MenuEntries_Text_BattleTowerBattleRoom_KeepGoing, 0
AddListMenuEntry MenuEntries_Text_BattleTowerBattleRoom_Rest, 1
AddListMenuEntry MenuEntries_Text_BattleTowerBattleRoom_Retire, 2
ShowListMenu
CloseMessage
SetVar VAR_0x8008, VAR_RESULT
GoToIfEq VAR_0x8008, 0, _0354
GoToIfEq VAR_0x8008, 1, _0362
GoToIfEq VAR_0x8008, 2, _0380
GoTo _0354
GoToIfEq VAR_0x8008, 0, BattleTowerMultiBattleRoom_GoToNextMultiBattle
GoToIfEq VAR_0x8008, 1, BattleTowerMultiBattleRoom_AskSaveAndQuitMultiChallenge
GoToIfEq VAR_0x8008, 2, BattleTowerMultiBattleRoom_AskCancelMultiChallenge
GoTo BattleTowerMultiBattleRoom_GoToNextMultiBattle
End
_0354:
Call _0589
GoTo _02B0
BattleTowerMultiBattleRoom_GoToNextMultiBattle:
Call BattleTowerMultiBattleRoom_PlayersAndAttendantsMoveBack
GoTo BattleTowerMultiBattleRoom_DoMultiBattle
End
_0362:
Message 4
BattleTowerMultiBattleRoom_AskSaveAndQuitMultiChallenge:
Message BattleTowerMultiBattleRoom_Text_AskSaveAndQuit
ShowYesNoMenu VAR_RESULT
CloseMessage
GoToIfEq VAR_RESULT, MENU_YES, _025B
GoTo _02E8
GoToIfEq VAR_RESULT, MENU_YES, BattleTowerMultiBattleRoom_SaveAndQuitMultiChallenge
GoTo BattleTowerMultiBattleRoom_AskReadyForNextMultiBattle
End
_0380:
Message 5
BattleTowerMultiBattleRoom_AskCancelMultiChallenge:
Message BattleTowerMultiBattleRoom_Text_AskCancelChallenge
ShowYesNoMenu VAR_RESULT
CloseMessage
GoToIfEq VAR_RESULT, MENU_YES, _0296
GoTo _02E8
GoToIfEq VAR_RESULT, MENU_YES, BattleTowerMultiBattleRoom_GoToEndChallengeAndUpdateGameRecords
GoTo BattleTowerMultiBattleRoom_AskReadyForNextMultiBattle
End
_039E:
Call _01DF
GoToIfEq VAR_0x8004, FALSE, _022F
Call _029E
GoToIfEq VAR_RESULT, 1, _0245
Call _0541
Call _0565
Call _00BE
_03D6:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_UNK_33, 0, VAR_0x8004
BattleTowerMultiBattleRoom_DoLinkMultiBattle:
Call BattleTowerMultiBattleRoom_DoNextLinkMultiBattle
GoToIfEq VAR_0x8004, FALSE, BattleTowerMultiBattleRoom_EndChallengeAndUpdateGameRecords
Call BattleTowerMultiBattleRoom_HasDefeatedSevenTrainers
GoToIfEq VAR_RESULT, TRUE, BattleTowerMultiBattleRoom_EndChallengeAndUpdateGameRecordsAndJournal
Call BattleTowerMultiBattleRoom_OpponentsLeaveRoom
Call BattleTowerMultiBattleRoom_PlayersAndAttendantApproachEachOther
Call BattleTowerMultiBattleRoom_RestorePokemon
BattleTowerMultiBattleRoom_AskReadyForNextLinkMultiBattle:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_GET_NEXT_OPPONENT_NUM, 0, VAR_0x8004
BufferNumber 0, VAR_0x8004
Message 3
Message BattleTowerMultiBattleRoom_Text_AskReadyForNextPair
InitGlobalTextListMenu 31, 13, 0, VAR_RESULT, NO_EXIT_ON_B
SetMenuXOriginToRight
AddListMenuEntry 146, 0
AddListMenuEntry 148, 1
AddListMenuEntry MenuEntries_Text_BattleTowerBattleRoom_KeepGoing, 0
AddListMenuEntry MenuEntries_Text_BattleTowerBattleRoom_Retire, 1
ShowListMenu
CloseMessage
SetVar VAR_MAP_LOCAL_0, 0
GoToIfEq VAR_RESULT, 1, _0452
_0418:
Message 12
GoToIfEq VAR_RESULT, 1, BattleTowerMultiBattleRoom_AskCancelLinkMultiChallenge
BattleTowerMultiBattleRoom_HandleLinkMultiDecision:
Message BattleTowerMultiBattleRoom_Text_AwaitingResponseFromFriend
ClearReceivedTempDataAllPlayers
ScrCmd_135 5
ScrCmd_1E1 2, VAR_MAP_LOCAL_0, VAR_RESULT
ScrCmd_1E2 2, VAR_MAP_LOCAL_0
CloseMessage
SetVar VAR_0x8008, VAR_MAP_LOCAL_0
GoToIfEq VAR_0x8008, 1, _0474
Call _0589
GoTo _039E
GoToIfEq VAR_0x8008, 1, BattleTowerMultiBattleRoom_LinkMultiRetire
Call BattleTowerMultiBattleRoom_PlayersAndAttendantsMoveBack
GoTo BattleTowerMultiBattleRoom_DoLinkMultiBattle
End
_0452:
Message 5
BattleTowerMultiBattleRoom_AskCancelLinkMultiChallenge:
Message BattleTowerMultiBattleRoom_Text_AskCancelChallenge
ShowYesNoMenu VAR_RESULT
GoToIfEq VAR_RESULT, MENU_NO, _03D6
GoToIfEq VAR_RESULT, MENU_NO, BattleTowerMultiBattleRoom_AskReadyForNextLinkMultiBattle
SetVar VAR_MAP_LOCAL_0, 1
GoTo _0418
GoTo BattleTowerMultiBattleRoom_HandleLinkMultiDecision
End
_0474:
Message 11
BattleTowerMultiBattleRoom_LinkMultiRetire:
Message BattleTowerMultiBattleRoom_Text_YouHaveChosenToRetire
WaitTime 30, VAR_RESULT
ClearReceivedTempDataAllPlayers
ScrCmd_135 7
CloseMessage
GoTo _0296
GoTo BattleTowerMultiBattleRoom_GoToEndChallengeAndUpdateGameRecords
End
_048D:
ApplyMovement 2, _05B0
ApplyMovement 3, _05C4
BattleTowerMultiBattleRoom_ApplyPlayersEnterRoomMovement:
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_LEADER, BattleTowerMultiBattleRoom_LeaderEnterRoomMovement
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_PARTNER, BattleTowerMultiBattleRoom_PartnerEnterRoomMovement
WaitMovement
Return
_04A1:
ApplyMovement 0, _0644
ApplyMovement 1, _0644
ApplyMovement 2, _0664
ApplyMovement 3, _0664
BattleTowerMultiBattleRoom_PlayersAndAttendantFaceEachOther:
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_ATTENDANT_NORTH, BattleTowerMultiBattleRoom_AttendantApproachPlayerMovement
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_ATTENDANT_SOUTH, BattleTowerMultiBattleRoom_AttendantApproachPlayerMovement
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_LEADER, BattleTowerMultiBattleRoom_PlayerFaceAttendantMovement
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_PARTNER, BattleTowerMultiBattleRoom_PlayerFaceAttendantMovement
WaitMovement
Return
_04C5:
BattleTowerMultiBattleRoom_SetOpponentGraphicsAndEnterRoom:
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_GET_OPPONENT_OBJECT_ID, 0, VAR_RESULT
SetVar VAR_OBJ_GFX_ID_2, VAR_RESULT
CallBattleTowerFunction BATTLE_TOWER_FUNCTION_GET_OPPONENT_OBJECT_ID, 1, VAR_RESULT
SetVar VAR_OBJ_GFX_ID_3, VAR_RESULT
ClearFlag FLAG_UNK_0x01EA
ClearFlag FLAG_UNK_0x01EB
AddObject 5
AddObject 4
ApplyMovement 5, _05D8
ApplyMovement 4, _05EC
ClearFlag FLAG_HIDE_MULTI_BATTLE_ROOM_OPPONENT_1
ClearFlag FLAG_HIDE_MULTI_BATTLE_ROOM_OPPONENT_2
AddObject BATTLE_TOWER_MULTI_BATTLE_ROOM_OPPONENT_1
AddObject BATTLE_TOWER_MULTI_BATTLE_ROOM_OPPONENT_2
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_OPPONENT_1, BattleTowerMultiBattleRoom_Opponent1EnterRoomMovement
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_OPPONENT_2, BattleTowerMultiBattleRoom_Opponent2EnterRoomMovement
WaitMovement
Return
_0505:
ApplyMovement 2, _0600
ApplyMovement 3, _0600
ApplyMovement 5, _0608
ApplyMovement 4, _0608
BattleTowerMultiBattleRoom_PlayersAndOpponentsApproachEachOther:
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_LEADER, BattleTowerMultiBattleRoom_PlayerApproachOpponentMovement
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_PARTNER, BattleTowerMultiBattleRoom_PlayerApproachOpponentMovement
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_OPPONENT_1, BattleTowerMultiBattleRoom_OpponentApproachPlayerMovement
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_OPPONENT_2, BattleTowerMultiBattleRoom_OpponentApproachPlayerMovement
WaitMovement
Return
_0529:
ApplyMovement 5, _0610
BattleTowerMultiBattleRoom_ApplyOpponent1WalkOnSpotSlowWestMovement:
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_OPPONENT_1, BattleTowerMultiBattleRoom_WalkOnSpotSlowWestMovement
WaitMovement
Return
_0535:
ApplyMovement 4, _0610
BattleTowerMultiBattleRoom_ApplyOpponent2WalkOnSpotSlowWestMovement:
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_OPPONENT_2, BattleTowerMultiBattleRoom_WalkOnSpotSlowWestMovement
WaitMovement
Return
_0541:
ApplyMovement 5, _0618
ApplyMovement 4, _0628
BattleTowerMultiBattleRoom_OpponentsLeaveRoom:
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_OPPONENT_1, BattleTowerMultiBattleRoom_Opponent2LeaveRoomMovement
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_OPPONENT_2, BattleTowerMultiBattleRoom_Opponent1LeaveRoomMovement
WaitMovement
SetFlag FLAG_UNK_0x01EA
SetFlag FLAG_UNK_0x01EB
RemoveObject 5
RemoveObject 4
SetFlag FLAG_HIDE_MULTI_BATTLE_ROOM_OPPONENT_1
SetFlag FLAG_HIDE_MULTI_BATTLE_ROOM_OPPONENT_2
RemoveObject BATTLE_TOWER_MULTI_BATTLE_ROOM_OPPONENT_1
RemoveObject BATTLE_TOWER_MULTI_BATTLE_ROOM_OPPONENT_2
Return
_0565:
ApplyMovement 2, _0638
ApplyMovement 3, _0638
ApplyMovement 0, _0644
ApplyMovement 1, _0644
BattleTowerMultiBattleRoom_PlayersAndAttendantApproachEachOther:
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_LEADER, BattleTowerMultiBattleRoom_PlayerApproachAttendantMovement
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_PARTNER, BattleTowerMultiBattleRoom_PlayerApproachAttendantMovement
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_ATTENDANT_NORTH, BattleTowerMultiBattleRoom_AttendantApproachPlayerMovement
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_ATTENDANT_SOUTH, BattleTowerMultiBattleRoom_AttendantApproachPlayerMovement
WaitMovement
Return
_0589:
ApplyMovement 2, _064C
ApplyMovement 3, _064C
ApplyMovement 0, _0654
ApplyMovement 1, _0654
BattleTowerMultiBattleRoom_PlayersAndAttendantsMoveBack:
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_LEADER, BattleTowerMultiBattleRoom_PlayersMoveBackEastMovement
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_PARTNER, BattleTowerMultiBattleRoom_PlayersMoveBackEastMovement
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_ATTENDANT_NORTH, BattleTowerMultiBattleRoom_AttendantsMoveBackWestMovement
ApplyMovement BATTLE_TOWER_MULTI_BATTLE_ROOM_ATTENDANT_SOUTH, BattleTowerMultiBattleRoom_AttendantsMoveBackWestMovement
WaitMovement
Return
.balign 4, 0
_05B0:
BattleTowerMultiBattleRoom_LeaderEnterRoomMovement:
WalkNormalNorth
WalkNormalWest 3
WalkNormalNorth 3
@ -350,7 +352,7 @@ _05B0:
EndMovement
.balign 4, 0
_05C4:
BattleTowerMultiBattleRoom_PartnerEnterRoomMovement:
WalkNormalNorth
WalkNormalWest 4
WalkNormalNorth 2
@ -358,7 +360,7 @@ _05C4:
EndMovement
.balign 4, 0
_05D8:
BattleTowerMultiBattleRoom_Opponent1EnterRoomMovement:
WalkNormalSouth
WalkNormalEast 3
WalkNormalSouth 3
@ -366,7 +368,7 @@ _05D8:
EndMovement
.balign 4, 0
_05EC:
BattleTowerMultiBattleRoom_Opponent2EnterRoomMovement:
WalkNormalSouth
WalkNormalEast 4
WalkNormalSouth 2
@ -374,58 +376,58 @@ _05EC:
EndMovement
.balign 4, 0
_0600:
BattleTowerMultiBattleRoom_PlayerApproachOpponentMovement:
WalkNormalEast
EndMovement
.balign 4, 0
_0608:
BattleTowerMultiBattleRoom_OpponentApproachPlayerMovement:
WalkNormalWest
EndMovement
.balign 4, 0
_0610:
BattleTowerMultiBattleRoom_WalkOnSpotSlowWestMovement:
WalkOnSpotSlowWest
EndMovement
.balign 4, 0
_0618:
BattleTowerMultiBattleRoom_Opponent2LeaveRoomMovement:
WalkNormalNorth 3
WalkNormalWest 2
WalkNormalNorth
EndMovement
.balign 4, 0
_0628:
BattleTowerMultiBattleRoom_Opponent1LeaveRoomMovement:
WalkNormalNorth 2
WalkNormalWest 3
WalkNormalNorth
EndMovement
.balign 4, 0
_0638:
BattleTowerMultiBattleRoom_PlayerApproachAttendantMovement:
WalkNormalWest
FaceWest
EndMovement
.balign 4, 0
_0644:
BattleTowerMultiBattleRoom_AttendantApproachPlayerMovement:
WalkNormalEast
EndMovement
.balign 4, 0
_064C:
BattleTowerMultiBattleRoom_PlayersMoveBackEastMovement:
FaceEast
EndMovement
.balign 4, 0
_0654:
BattleTowerMultiBattleRoom_AttendantsMoveBackWestMovement:
FaceWest
WalkNormalWest
FaceEast
EndMovement
.balign 4, 0
_0664:
BattleTowerMultiBattleRoom_PlayerFaceAttendantMovement:
FaceWest
EndMovement

View File

@ -2,7 +2,7 @@
"key": 9318,
"messages": [
{
"id": "pl_msg_00000306_00000",
"id": "BattleTowerMultiBattleRoom_Text_ThanksForParticipating",
"en_US": [
"Thank you so much for participating!\r",
"Please wait while I save the game.\n",
@ -10,85 +10,85 @@
]
},
{
"id": "pl_msg_00000306_00001",
"id": "BattleTowerMultiBattleRoom_Text_WeHopeToSeeYouAgain",
"en_US": "We hope to see you again!"
},
{
"id": "pl_msg_00000306_00002",
"id": "BattleTowerMultiBattleRoom_Text_YourPokemonWillBeRestored",
"en_US": [
"Your Pokémon will be restored to\n",
"full health."
]
},
{
"id": "pl_msg_00000306_00003",
"id": "BattleTowerMultiBattleRoom_Text_AskReadyForNextPair",
"en_US": [
"Up next, opponent pair no. {STRVAR_1 50, 0, 0}.\n",
"Are you ready?"
]
},
{
"id": "pl_msg_00000306_00004",
"id": "BattleTowerMultiBattleRoom_Text_AskSaveAndQuit",
"en_US": [
"Would you like to save and\n",
"quit the game?"
]
},
{
"id": "pl_msg_00000306_00005",
"id": "BattleTowerMultiBattleRoom_Text_AskCancelChallenge",
"en_US": [
"Would you like to cancel your\n",
"Battle Room challenge?"
]
},
{
"id": "pl_msg_00000306_00006",
"id": "BattleTowerMultiBattleRoom_Text_AskSaveBattleVideo",
"en_US": [
"Would you like to save the last battle\n",
"as your Battle Video?"
]
},
{
"id": "pl_msg_00000306_00007",
"id": "BattleTowerMultiBattleRoom_Text_BattleHasBeenSaved",
"en_US": [
"{STRVAR_1 3, 0, 0}s battle has been saved\n",
"as a Battle Video.\r"
]
},
{
"id": "pl_msg_00000306_00008",
"id": "BattleTowerMultiBattleRoom_Text_BattleVideoCouldntBeSaved",
"en_US": [
"There was an error.\n",
"The Battle Video couldnt be saved.\r"
]
},
{
"id": "pl_msg_00000306_00009",
"id": "BattleTowerMultiBattleRoom_Text_AskDeleteExistingBattleVideo",
"en_US": [
"Delete your existing Battle Video and\n",
"save the last battle?"
]
},
{
"id": "pl_msg_00000306_00010",
"id": "BattleTowerMultiBattleRoom_Text_SavingDontTurnOffPower",
"en_US": [
"Saving...\n",
"Dont turn off the power."
]
},
{
"id": "pl_msg_00000306_00011",
"id": "BattleTowerMultiBattleRoom_Text_YouHaveChosenToRetire",
"en_US": [
"You have chosen to retire from\n",
"this Battle Room challenge."
]
},
{
"id": "pl_msg_00000306_00012",
"id": "BattleTowerMultiBattleRoom_Text_AwaitingResponseFromFriend",
"en_US": "Awaiting response from a friend..."
},
{
"id": "pl_msg_00000306_00013",
"id": "BattleTowerMultiBattleRoom_Text_YouHaveClearedYourSeventhMatch",
"en_US": [
"You have cleared your seventh match!\n",
"Congratulations!\r",
@ -97,18 +97,18 @@
]
},
{
"id": "pl_msg_00000306_00014",
"id": "BattleTowerMultiBattleRoom_Text_PlayerReceivedBP",
"en_US": "{STRVAR_1 3, 0, 0} received {STRVAR_1 51, 1, 0} BP!\r"
},
{
"id": "pl_msg_00000306_00015",
"id": "BattleTowerMultiBattleRoom_Text_SavingDontTurnOffPower2",
"en_US": [
"Saving...\n",
"Dont turn off the power."
]
},
{
"id": "pl_msg_00000306_00016",
"id": "BattleTowerMultiBattleRoom_Text_PleaseWait",
"en_US": "Please wait."
}
]

View File

@ -610,15 +610,15 @@
"en_US": "DOUBLE"
},
{
"id": "pl_msg_00000361_00146",
"id": "MenuEntries_Text_BattleTowerBattleRoom_KeepGoing",
"en_US": "KEEP GOING"
},
{
"id": "pl_msg_00000361_00147",
"id": "MenuEntries_Text_BattleTowerBattleRoom_Rest",
"en_US": "REST"
},
{
"id": "pl_msg_00000361_00148",
"id": "MenuEntries_Text_BattleTowerBattleRoom_Retire",
"en_US": "RETIRE"
},
{

View File

@ -5,6 +5,7 @@
#include "constants/heap.h"
#include "constants/narc.h"
#include "constants/string.h"
#include "generated/object_events.h"
#include "generated/species_data_params.h"
#include "generated/trainer_classes.h"
@ -100,36 +101,36 @@ static const u16 sTrainerClassToObjectID[][2] = {
{ TRAINER_CLASS_POKE_KID, OBJ_EVENT_GFX_PIKACHU }
};
BattleFrontierTrainerData *ov104_0222DCE0(u16 param0, int param1, enum NarcID narcID)
BattleFrontierTrainerData *BattleTower_GetTrainerDataFromTrainerIDAndNarcID(u16 battleTowerTrainerID, enum HeapID heapID, enum NarcID narcID)
{
return NARC_AllocAndReadWholeMemberByIndexPair(narcID, param0, param1);
return NARC_AllocAndReadWholeMemberByIndexPair(narcID, battleTowerTrainerID, heapID);
}
void ov104_0222DCF4(BattleFrontierPokemonData *param0, int param1, enum NarcID narcID)
void BattleTower_GetMonDataFromSetIDAndNarcID(BattleFrontierPokemonData *monData, int setID, enum NarcID narcID)
{
NARC_ReadWholeMemberByIndexPair(param0, narcID, param1);
NARC_ReadWholeMemberByIndexPair(monData, narcID, setID);
}
BattleFrontierTrainerData *ov104_0222DD04(FrontierTrainerDataDTO *param0, int param1, int heapID, int param3)
BattleFrontierTrainerData *BattleTower_GetTrainerData(FrontierTrainerDataDTO *trDataDTO, int battleTowerTrainerID, enum HeapID heapID, enum NarcID narcID)
{
MessageLoader *v1 = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_FRONTIER_TRAINER_NAMES, heapID);
MessageLoader *msgLoader = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_FRONTIER_TRAINER_NAMES, heapID);
MI_CpuClear8(param0, sizeof(FrontierTrainerDataDTO));
MI_CpuClear8(trDataDTO, sizeof(FrontierTrainerDataDTO));
BattleFrontierTrainerData *v0 = ov104_0222DCE0(param1, heapID, param3);
BattleFrontierTrainerData *trData = BattleTower_GetTrainerDataFromTrainerIDAndNarcID(battleTowerTrainerID, heapID, narcID);
param0->trainerID = param1;
param0->unk_18[0] = 0xFFFF;
param0->unk_18[1] = param1 * 3;
param0->trainerType = v0->trainerType;
trDataDTO->trainerID = battleTowerTrainerID;
trDataDTO->unk_18[0] = 0xFFFF;
trDataDTO->unk_18[1] = battleTowerTrainerID * 3;
trDataDTO->trainerType = trData->trainerType;
Strbuf *v2 = MessageLoader_GetNewStrbuf(v1, param1);
Strbuf *strbuf = MessageLoader_GetNewStrbuf(msgLoader, battleTowerTrainerID);
Strbuf_ToChars(v2, &param0->trainerName[0], 8);
Strbuf_Free(v2);
MessageLoader_Free(v1);
Strbuf_ToChars(strbuf, &trDataDTO->trainerName[0], TRAINER_NAME_LEN + 1);
Strbuf_Free(strbuf);
MessageLoader_Free(msgLoader);
return v0;
return trData;
}
static const u16 Unk_ov104_0223F290[] = {
@ -147,7 +148,7 @@ u32 ov104_0222DD6C(FrontierPokemonDataDTO *param0, u16 param1, u32 param2, u32 p
BattleFrontierPokemonData v4;
MI_CpuClear8(param0, sizeof(FrontierPokemonDataDTO));
ov104_0222DCF4(&v4, param1, narcID);
BattleTower_GetMonDataFromSetIDAndNarcID(&v4, param1, narcID);
param0->species = v4.species;
param0->form = v4.form;
@ -407,7 +408,7 @@ u8 ov104_0222E240(u16 param0, u16 param1)
void ov104_0222E278(FrontierDataDTO *param0, u16 param1, int heapID, int param3)
{
Heap_Free(ov104_0222DD04(&param0->trDataDTO, param1, heapID, param3));
Heap_Free(BattleTower_GetTrainerData(&param0->trDataDTO, param1, heapID, param3));
return;
}
@ -503,7 +504,7 @@ BOOL ov104_0222E3E4(BattleFrontierTrainerData *param0, const u16 param1[], const
v5 = (LCRNG_Next() % param0->numSets);
v1 = param0->setIDs[v5];
ov104_0222DCF4(&v3[v0], v1, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDPM);
BattleTower_GetMonDataFromSetIDAndNarcID(&v3[v0], v1, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDPM);
for (v4 = 0; v4 < v0; v4++) {
if ((v3[v4].species == v3[v0].species) || (v3[v4].item == v3[v0].item)) {
@ -547,7 +548,7 @@ void ov104_0222E4BC(u8 param0, u16 param1, u16 param2, u16 *param3, FrontierPoke
FrontierTrainerDataDTO v4;
BattleFrontierPokemonData v6;
BattleFrontierTrainerData *v5 = ov104_0222DD04(&v4, param1, HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR);
BattleFrontierTrainerData *v5 = BattleTower_GetTrainerData(&v4, param1, HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR);
for (v0 = 0; v0 < param0; v0++) {
param5[v0] = ov104_0222E3A8(param1);
@ -559,13 +560,13 @@ void ov104_0222E4BC(u8 param0, u16 param1, u16 param2, u16 *param3, FrontierPoke
ov104_0222E3E4(v5, v2, v3, 0, (param0 / 2), param3, 11);
for (v0 = 0; v0 < (param0 / 2); v0++) {
ov104_0222DCF4(&v6, param3[v0], NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDPM);
BattleTower_GetMonDataFromSetIDAndNarcID(&v6, param3[v0], NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDPM);
v2[v0] = v6.species;
v3[v0] = v6.item;
}
Heap_Free(v5);
v5 = ov104_0222DD04(&v4, param2, HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR);
v5 = BattleTower_GetTrainerData(&v4, param2, HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR);
ov104_0222E3E4(v5, v2, v3, (param0 / 2), (param0 / 2), &param3[param0 / 2], 11);
for (v0 = 0; v0 < (param0 / 2); v0++) {

View File

@ -437,7 +437,7 @@ u16 ov104_02234440(UnkStruct_ov104_0223ADA0 *param0, u8 param1)
FrontierTrainerDataDTO v0;
u8 v2 = param0->unk_06 + (param1 * 7);
Heap_Free(ov104_0222DD04(&v0, param0->unk_18[v2], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
Heap_Free(BattleTower_GetTrainerData(&v0, param0->unk_18[v2], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
return ov104_0222E10C(v0.trainerType);
}

View File

@ -329,7 +329,7 @@ u16 ov104_022354C0(UnkStruct_ov104_0223B5C0 *param0, u8 param1)
FrontierTrainerDataDTO v0;
u8 v2 = (param0->unk_05 * 2) + param1;
Heap_Free(ov104_0222DD04(&v0, param0->unk_18[v2], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
Heap_Free(BattleTower_GetTrainerData(&v0, param0->unk_18[v2], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
return ov104_0222E10C(v0.trainerType);
}

View File

@ -437,7 +437,7 @@ u16 ov104_02236B58(UnkStruct_ov104_0223BA10 *param0, u8 param1)
FrontierTrainerDataDTO v0;
u8 v2 = param0->unk_11 + (param1 * 7);
Heap_Free(ov104_0222DD04(&v0, param0->unk_30[v2], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
Heap_Free(BattleTower_GetTrainerData(&v0, param0->unk_30[v2], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
return ov104_0222E10C(v0.trainerType);
}

View File

@ -444,7 +444,7 @@ u16 ov104_02238464(UnkStruct_ov104_0223BFFC *param0, u8 param1)
FrontierTrainerDataDTO v0;
u8 v2 = ov104_02238498(param0, param1);
Heap_Free(ov104_0222DD04(&v0, param0->unk_78[v2], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
Heap_Free(BattleTower_GetTrainerData(&v0, param0->unk_78[v2], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
return ov104_0222E10C(v0.trainerType);
}

View File

@ -3,6 +3,7 @@
#include <string.h>
#include "constants/battle_tower.h"
#include "generated/battle_tower_functions.h"
#include "generated/battle_tower_modes.h"
#include "generated/game_records.h"
#include "generated/object_events.h"
@ -48,71 +49,69 @@ static BOOL ov104_02239464(UnkStruct_ov104_0222E930 *param0, BattleTower *battle
BOOL ov104_02239130(UnkStruct_ov104_0222E930 *param0)
{
TVBroadcast *broadcast;
Pokemon *v1;
BattleTower *battleTower;
int v3, v4;
u16 v5, v6;
u16 functionIndex, v6;
u16 *v7;
UnkStruct_ov104_02230BE4 *v8 = sub_0209B970(param0->unk_00->unk_00);
v5 = ov104_0222EA48(param0);
functionIndex = ov104_0222EA48(param0);
v6 = ov104_0222FC00(param0);
v7 = ov104_0222FBE4(param0);
battleTower = sub_0209B978(param0->unk_00->unk_00);
switch (v5) {
case 2:
sub_02049F8C();
switch (functionIndex) {
case BATTLE_TOWER_FUNCTION_RESET_SYSTEM:
BattleTower_ResetSystem();
break;
case (30 + 16):
case BATTLE_TOWER_FUNCTION_UNK_46:
*v7 = sub_0204AA04(battleTower);
broadcast = SaveData_GetTVBroadcast(v8->saveData);
sub_0206D0C8(broadcast, *v7);
GameRecords_AddToRecordValue(SaveData_GetGameRecords(v8->saveData), RECORD_UNK_068, *v7);
break;
case (30 + 25):
case BATTLE_TOWER_FUNCTION_GET_PARTNER_PARAM:
*v7 = ov104_0223927C(battleTower, v6);
break;
case (30 + 3):
*v7 = sub_0204A578(battleTower);
case BATTLE_TOWER_FUNCTION_GET_NEXT_OPPONENT_NUM:
*v7 = BattleTower_GetNextOpponentNum(battleTower);
break;
case (30 + 4):
case BATTLE_TOWER_FUNCTION_UNK_34:
*v7 = ov104_022395B4(battleTower);
break;
case (30 + 5):
*v7 = sub_0204A57C(battleTower);
case BATTLE_TOWER_FUNCTION_HAS_DEFEATED_SEVEN_TRAINERS:
*v7 = BattleTower_HasDefeatedSevenTrainers(battleTower);
break;
case (30 + 6):
case BATTLE_TOWER_FUNCTION_UNK_36:
*v7 = ov104_022395D8(battleTower);
break;
case (30 + 13):
case BATTLE_TOWER_FUNCTION_GET_CHALLENGE_MODE:
*v7 = (u16)BattleTower_GetChallengeMode(battleTower);
break;
case (30 + 10):
ov104_022394A4(battleTower, v8->saveData);
case BATTLE_TOWER_FUNCTION_SET_OPPONENT_TEAMS:
BattleTower_CreateOpponentParties(battleTower, v8->saveData);
break;
case (30 + 11):
case BATTLE_TOWER_FUNCTION_GET_OPPONENT_OBJECT_ID:
*v7 = ov104_02239588(battleTower, v6);
break;
case (30 + 14):
case BATTLE_TOWER_FUNCTION_UNK_44:
ov104_022395A0(battleTower, v6);
break;
case (30 + 7):
sub_0204A660(battleTower, v8->saveData);
case BATTLE_TOWER_FUNCTION_UPDATE_GAME_RECORDS:
BattleTower_UpdateGameRecords(battleTower, v8->saveData);
break;
case (30 + 8):
sub_0204A7A4(battleTower, v8->saveData, v8->journalEntry);
case BATTLE_TOWER_FUNCTION_UPDATE_GAME_RECORDS_AND_JOURNAL:
BattleTower_UpdateGameRecordsAndJournal(battleTower, v8->saveData, v8->journalEntry);
break;
case (30 + 9):
case BATTLE_TOWER_FUNCTION_UNK_39:
sub_0204A8C8(battleTower);
break;
case (30 + 28):
case BATTLE_TOWER_FUNCTION_UNK_58:
MI_CpuClear8(battleTower->unk_884, 70);
break;
case (30 + 29):
case BATTLE_TOWER_FUNCTION_UNK_59:
battleTower->unk_8D6 = 1;
break;
case 100:
case BATTLE_TOWER_FUNCTION_CHECK_IS_NULL:
if (battleTower == NULL) {
*v7 = 1;
} else {
@ -124,7 +123,7 @@ BOOL ov104_02239130(UnkStruct_ov104_0222E930 *param0)
break;
}
return 0;
return FALSE;
}
static u16 ov104_0223927C(BattleTower *battleTower, u8 param)
@ -174,9 +173,9 @@ BOOL ov104_022392C0(UnkStruct_ov104_0222E930 *param0)
return 0;
}
v1 = battleTower->unk_78[v4].trDataDTO.unk_18;
v1 = battleTower->opponentsDataDTO[v4].trDataDTO.unk_18;
ov104_0223310C(param0, v1, ov104_0223A790(battleTower->challengeMode));
ov104_0223310C(param0, v1, BattleTower_GetTrainerMessagesBankID(battleTower->challengeMode));
return 1;
}

View File

@ -1,6 +1,8 @@
#include <nitro.h>
#include <string.h>
#include "generated/battle_tower_modes.h"
#include "struct_defs/battle_tower.h"
#include "overlay104/ov104_0222DCE0.h"
@ -14,39 +16,39 @@ void ov104_022395A0(BattleTower *battleTower, u16 param1);
u16 ov104_022395B4(BattleTower *battleTower);
u16 ov104_022395D8(BattleTower *battleTower);
void ov104_022394A4(BattleTower *battleTower, SaveData *saveData)
void BattleTower_CreateOpponentParties(BattleTower *battleTower, SaveData *saveData)
{
switch (battleTower->challengeMode) {
case 4:
case 5:
ov104_0223A30C(saveData, battleTower->unk_78, battleTower->unk_0C - 1);
case BATTLE_TOWER_MODE_WIFI:
case BATTLE_TOWER_MODE_5:
ov104_0223A30C(saveData, battleTower->opponentsDataDTO, battleTower->nextOpponentNum - 1);
break;
case 2:
case 3:
case 6:
ov104_0223A0C4(battleTower, &(battleTower->unk_78[0]), battleTower->unk_3E[(battleTower->unk_0C - 1) * 2 + 0], battleTower->partySize, NULL, NULL, NULL, battleTower->heapID);
case BATTLE_TOWER_MODE_MULTI:
case BATTLE_TOWER_MODE_LINK_MULTI:
case BATTLE_TOWER_MODE_6:
BattleTower_CreateTrainerParty(battleTower, &(battleTower->opponentsDataDTO[0]), battleTower->trainerIDs[(battleTower->nextOpponentNum - 1) * 2 + 0], battleTower->partySize, NULL, NULL, NULL, battleTower->heapID);
u16 v1[2];
u16 v2[2];
u16 species[2];
u16 items[2];
for (int v0 = 0; v0 < battleTower->partySize; v0++) {
v1[v0] = battleTower->unk_78[0].monDataDTO[v0].species;
v2[v0] = battleTower->unk_78[0].monDataDTO[v0].item;
species[v0] = battleTower->opponentsDataDTO[0].monDataDTO[v0].species;
items[v0] = battleTower->opponentsDataDTO[0].monDataDTO[v0].item;
}
ov104_0223A0C4(battleTower, &(battleTower->unk_78[1]), battleTower->unk_3E[(battleTower->unk_0C - 1) * 2 + 1], battleTower->partySize, v1, v2, NULL, battleTower->heapID);
BattleTower_CreateTrainerParty(battleTower, &(battleTower->opponentsDataDTO[1]), battleTower->trainerIDs[(battleTower->nextOpponentNum - 1) * 2 + 1], battleTower->partySize, species, items, NULL, battleTower->heapID);
break;
case 1:
case 0:
case BATTLE_TOWER_MODE_DOUBLE:
case BATTLE_TOWER_MODE_SINGLE:
default:
ov104_0223A0C4(battleTower, &(battleTower->unk_78[0]), battleTower->unk_3E[battleTower->unk_0C - 1], battleTower->partySize, NULL, NULL, NULL, battleTower->heapID);
BattleTower_CreateTrainerParty(battleTower, &(battleTower->opponentsDataDTO[0]), battleTower->trainerIDs[battleTower->nextOpponentNum - 1], battleTower->partySize, NULL, NULL, NULL, battleTower->heapID);
break;
}
}
u16 ov104_02239588(BattleTower *battleTower, u16 param1)
{
return ov104_0222E10C(battleTower->unk_78[param1].trDataDTO.trainerType);
return ov104_0222E10C(battleTower->opponentsDataDTO[param1].trDataDTO.trainerType);
}
void ov104_022395A0(BattleTower *battleTower, u16 param1)
@ -58,11 +60,11 @@ u16 ov104_022395B4(BattleTower *battleTower)
{
++battleTower->unk_0D;
if (battleTower->challengeMode != 6) {
if (battleTower->challengeMode != BATTLE_TOWER_MODE_6) {
battleTower->unk_08 = sub_0206BFF0(battleTower->unk_08);
}
return ++battleTower->unk_0C;
return ++battleTower->nextOpponentNum;
}
u16 ov104_022395D8(BattleTower *battleTower)

View File

@ -3,6 +3,7 @@
#include <string.h>
#include "constants/battle_tower.h"
#include "generated/battle_tower_modes.h"
#include "struct_decls/struct_0202D750_decl.h"
#include "struct_defs/battle_tower.h"
@ -326,10 +327,10 @@ BOOL ov104_02239B14(UnkStruct_ov104_0222E930 *param0)
v4 = *v3;
ov104_02239C7C(v3);
battleTower = BattleTower_Init(v2->saveData, 0, 6);
battleTower = BattleTower_Init(v2->saveData, 0, BATTLE_TOWER_MODE_6);
sub_0209B980(param0->unk_00->unk_00, battleTower);
if (battleTower->challengeMode == 6) {
if (battleTower->challengeMode == BATTLE_TOWER_MODE_6) {
ov104_0222E630(v2->saveData);
}

View File

@ -3,6 +3,7 @@
#include <nitro.h>
#include <string.h>
#include "constants/battle_tower.h"
#include "generated/battle_tower_modes.h"
#include "generated/species_data_params.h"
@ -623,151 +624,151 @@ static const UnkStruct_ov104_0223FCB4 Unk_ov104_0223FCB4[] = {
},
};
void FieldBattleDTO_CopyPlayerInfoToTrainerData(FieldBattleDTO *param0);
void ov104_0223A30C(SaveData *saveData, FrontierDataDTO *param1, const u8 param2);
void FieldBattleDTO_CopyPlayerInfoToTrainerData(FieldBattleDTO *dto);
void ov104_0223A30C(SaveData *saveData, FrontierDataDTO *dto, const u8 param2);
FieldBattleDTO *ov104_0223A580(BattleTower *battleTower, UnkStruct_ov104_02230BE4 *param1);
void ov104_0223A734(BattleTower *battleTower, u16 param1);
u16 ov104_0223A750(BattleTower *battleTower, const u16 *param1);
int ov104_0223A768(u8 param0);
int ov104_0223A77C(u8 param0);
int ov104_0223A790(u8 param0);
static BOOL ov104_0223A118(BattleTower *battleTower, BattleFrontierTrainerData *param1, u16 param2, FrontierPokemonDataDTO *param3, u8 param4, u16 *param5, u16 *param6, UnkStruct_0204B404 *param7, int param8);
int BattleTower_GetPokemonDataNarcID(u8 challengeMode);
int BattleTower_GetTrainerDataNarcID(u8 challengeMode);
int BattleTower_GetTrainerMessagesBankID(u8 challengeMode);
static BOOL BattleTower_CreateRandomTrainerParty(BattleTower *battleTower, BattleFrontierTrainerData *trData, u16 battleTowerTrainerID, FrontierPokemonDataDTO *monDataDTO, u8 partySize, u16 *species, u16 *items, UnkStruct_0204B404 *param7, int heapID);
static void ov104_0223A348(FrontierDataDTO *param0, const u8 param1);
static u32 ov104_0223A3A8(BattleTower *battleTower, FrontierPokemonDataDTO *param1, u16 param2, u32 param3, u32 param4, u8 param5, u8 param6, BOOL param7, int param8);
static u32 BattleTower_CopySetToPokemonDataDTO(BattleTower *battleTower, FrontierPokemonDataDTO *monDataDTO, u16 setID, u32 otID, u32 givenPersonality, u8 ivs, u8 partyIndex, BOOL giveReservedItem, int heapID);
static u32 BattleTower_GetBattleTypeFromChallengeMode(u8 challengeMode);
static void ov104_0223A6AC(FieldBattleDTO *param0, FrontierDataDTO *param1, int param2, int param3, int param4);
static int ov104_0223A7AC(u8 param0);
static int BattleTower_AreAllConnectedGamesPlatinum(u8 challengeMode);
BOOL ov104_0223A0C4(BattleTower *battleTower, FrontierDataDTO *param1, u16 param2, int param3, u16 *param4, u16 *param5, UnkStruct_0204B404 *param6, int heapID)
BOOL BattleTower_CreateTrainerParty(BattleTower *battleTower, FrontierDataDTO *opponentDataDTO, u16 battleTowerTrainerID, int partySize, u16 *species, u16 *items, UnkStruct_0204B404 *param6, int heapID)
{
BOOL v0 = 0;
BattleFrontierTrainerData *v1 = ov104_0222DD04(&param1->trDataDTO, param2, heapID, ov104_0223A77C(battleTower->challengeMode));
v0 = ov104_0223A118(battleTower, v1, param2, &param1->monDataDTO[0], param3, param4, param5, param6, heapID);
BattleFrontierTrainerData *trData = BattleTower_GetTrainerData(&opponentDataDTO->trDataDTO, battleTowerTrainerID, heapID, BattleTower_GetTrainerDataNarcID(battleTower->challengeMode));
v0 = BattleTower_CreateRandomTrainerParty(battleTower, trData, battleTowerTrainerID, &opponentDataDTO->monDataDTO[0], partySize, species, items, param6, heapID);
Heap_Free(v1);
Heap_Free(trData);
return v0;
}
static BOOL ov104_0223A118(BattleTower *battleTower, BattleFrontierTrainerData *param1, u16 param2, FrontierPokemonDataDTO *param3, u8 param4, u16 *param5, u16 *param6, UnkStruct_0204B404 *param7, int param8)
static BOOL BattleTower_CreateRandomTrainerParty(BattleTower *battleTower, BattleFrontierTrainerData *trData, u16 battleTowerTrainerID, FrontierPokemonDataDTO *monDataDTO, u8 partySize, u16 *species, u16 *items, UnkStruct_0204B404 *param7, int heapID)
{
int v0;
u8 v2;
u8 v3;
int i;
u8 ivs;
u8 random;
u32 v4;
int v5;
int v6[4];
u32 v7[4];
int v8;
int v9;
BOOL v10 = 0;
BattleFrontierPokemonData v11;
BattleFrontierPokemonData v12;
int setID;
int setIDs[BT_DOUBLES_PARTY_SIZE];
u32 personalities[BT_DOUBLES_PARTY_SIZE];
int partyIndex;
int dupeItemFailsafeCount;
BOOL giveReservedItem = 0;
BattleFrontierPokemonData monDataPrev;
BattleFrontierPokemonData monDataCurr;
GF_ASSERT(param4 <= 4);
GF_ASSERT(partySize <= BT_DOUBLES_PARTY_SIZE);
v8 = 0;
v9 = 0;
partyIndex = 0;
dupeItemFailsafeCount = 0;
while (v8 != param4) {
v3 = sub_0204AEC0(battleTower) % param1->numSets;
v5 = param1->setIDs[v3];
while (partyIndex != partySize) {
random = BattleTower_GetRandom(battleTower) % trData->numSets;
setID = trData->setIDs[random];
ov104_0222DCF4(&v12, v5, ov104_0223A768(battleTower->challengeMode));
BattleTower_GetMonDataFromSetIDAndNarcID(&monDataCurr, setID, BattleTower_GetPokemonDataNarcID(battleTower->challengeMode));
for (v0 = 0; v0 < v8; v0++) {
ov104_0222DCF4(&v11, v6[v0], ov104_0223A768(battleTower->challengeMode));
for (i = 0; i < partyIndex; i++) {
BattleTower_GetMonDataFromSetIDAndNarcID(&monDataPrev, setIDs[i], BattleTower_GetPokemonDataNarcID(battleTower->challengeMode));
if (v11.species == v12.species) {
if (monDataPrev.species == monDataCurr.species) {
break;
}
}
if (v0 != v8) {
if (i != partyIndex) {
continue;
}
if (param5 != NULL) {
for (v0 = 0; v0 < param4; v0++) {
if (param5[v0] == v12.species) {
if (species != NULL) {
for (i = 0; i < partySize; i++) {
if (species[i] == monDataCurr.species) {
break;
}
}
if (v0 != param4) {
if (i != partySize) {
continue;
}
}
if (v9 < 50) {
for (v0 = 0; v0 < v8; v0++) {
ov104_0222DCF4(&v11, v6[v0], ov104_0223A768(battleTower->challengeMode));
if (dupeItemFailsafeCount < 50) {
for (i = 0; i < partyIndex; i++) {
BattleTower_GetMonDataFromSetIDAndNarcID(&monDataPrev, setIDs[i], BattleTower_GetPokemonDataNarcID(battleTower->challengeMode));
if ((v11.item) && (v11.item == v12.item)) {
if (monDataPrev.item && monDataPrev.item == monDataCurr.item) {
break;
}
}
if (v0 != v8) {
v9++;
if (i != partyIndex) {
dupeItemFailsafeCount++;
continue;
}
if (param6 != NULL) {
for (v0 = 0; v0 < param4; v0++) {
if ((param6[v0] == v12.item) && (param6[v0] != 0)) {
if (items != NULL) {
for (i = 0; i < partySize; i++) {
if (items[i] == monDataCurr.item && items[i] != 0) {
break;
}
}
if (v0 != param4) {
v9++;
if (i != partySize) {
dupeItemFailsafeCount++;
continue;
}
}
}
v6[v8] = v5;
v8++;
setIDs[partyIndex] = setID;
partyIndex++;
}
v2 = BattleTower_GetIVsFromTrainerID(param2);
v4 = (sub_0204AEC0(battleTower) | (sub_0204AEC0(battleTower) << 16));
ivs = BattleTower_GetIVsFromTrainerID(battleTowerTrainerID);
v4 = BattleTower_GetRandom(battleTower) | (BattleTower_GetRandom(battleTower) << 16);
if (v9 >= 50) {
v10 = 1;
if (dupeItemFailsafeCount >= 50) {
giveReservedItem = TRUE;
}
for (v0 = 0; v0 < v8; v0++) {
v7[v0] = ov104_0223A3A8(battleTower, &(param3[v0]), v6[v0], v4, 0, v2, v0, v10, param8);
for (i = 0; i < partyIndex; i++) {
personalities[i] = BattleTower_CopySetToPokemonDataDTO(battleTower, &(monDataDTO[i]), setIDs[i], v4, 0, ivs, i, giveReservedItem, heapID);
}
if (param7 == NULL) {
return v10;
return giveReservedItem;
}
param7->unk_00 = v4;
for (v0 = 0; v0 < 2; v0++) {
param7->unk_04[v0] = v6[v0];
param7->unk_08[v0] = v7[v0];
for (i = 0; i < 2; i++) {
param7->unk_04[i] = setIDs[i];
param7->unk_08[i] = personalities[i];
}
return v10;
return giveReservedItem;
}
void ov104_0223A30C(SaveData *saveData, FrontierDataDTO *param1, const u8 param2)
void ov104_0223A30C(SaveData *saveData, FrontierDataDTO *dto, const u8 param2)
{
MI_CpuClear8(param1, sizeof(FrontierDataDTO));
MI_CpuClear8(dto, sizeof(FrontierDataDTO));
UnkStruct_0202D764 *v1 = sub_0202D764(saveData);
if (!sub_0202D5E8(v1)) {
ov104_0223A348(param1, param2);
ov104_0223A348(dto, param2);
return;
}
sub_0202D63C(v1, param1, param2);
sub_0202D63C(v1, dto, param2);
}
static void ov104_0223A348(FrontierDataDTO *param0, const u8 param1)
@ -787,101 +788,101 @@ static void ov104_0223A348(FrontierDataDTO *param0, const u8 param1)
}
}
static const u16 Unk_ov104_0223FCAC[] = {
static const u16 sBattleTowerReservedItems[] = {
ITEM_BRIGHTPOWDER,
ITEM_LUM_BERRY,
ITEM_LEFTOVERS,
ITEM_QUICK_CLAW,
};
static u32 ov104_0223A3A8(BattleTower *battleTower, FrontierPokemonDataDTO *param1, u16 param2, u32 param3, u32 param4, u8 param5, u8 param6, BOOL param7, int param8)
static u32 BattleTower_CopySetToPokemonDataDTO(BattleTower *battleTower, FrontierPokemonDataDTO *monDataDTO, u16 setID, u32 otID, u32 givenPersonality, u8 ivs, u8 partyIndex, BOOL giveReservedItem, int heapID)
{
int v0;
int v1;
u32 v2;
BattleFrontierPokemonData v4;
int evs;
u32 randomPersonality;
BattleFrontierPokemonData monData;
MI_CpuClear8(param1, sizeof(FrontierPokemonDataDTO));
ov104_0222DCF4(&v4, param2, ov104_0223A768(battleTower->challengeMode));
MI_CpuClear8(monDataDTO, sizeof(FrontierPokemonDataDTO));
BattleTower_GetMonDataFromSetIDAndNarcID(&monData, setID, BattleTower_GetPokemonDataNarcID(battleTower->challengeMode));
param1->species = v4.species;
param1->form = v4.form;
monDataDTO->species = monData.species;
monDataDTO->form = monData.form;
if (param7) {
param1->item = Unk_ov104_0223FCAC[param6];
if (giveReservedItem) {
monDataDTO->item = sBattleTowerReservedItems[partyIndex];
} else {
param1->item = v4.item;
monDataDTO->item = monData.item;
}
u8 friendship = MAX_FRIENDSHIP_VALUE;
for (v0 = 0; v0 < LEARNED_MOVES_MAX; v0++) {
param1->moves[v0] = v4.moves[v0];
monDataDTO->moves[v0] = monData.moves[v0];
if (v4.moves[v0] == MOVE_FRUSTRATION) {
if (monData.moves[v0] == MOVE_FRUSTRATION) {
friendship = 0;
}
}
param1->otID = param3;
monDataDTO->otID = otID;
if (param4 == 0) {
if (givenPersonality == 0) {
do {
v2 = (sub_0204AEC0(battleTower) | sub_0204AEC0(battleTower) << 16);
} while ((v4.nature != Pokemon_GetNatureOf(v2)) || (Pokemon_IsPersonalityShiny(param3, v2) == 1));
randomPersonality = BattleTower_GetRandom(battleTower) | BattleTower_GetRandom(battleTower) << 16;
} while (monData.nature != Pokemon_GetNatureOf(randomPersonality) || Pokemon_IsPersonalityShiny(otID, randomPersonality) == 1);
param1->personality = v2;
monDataDTO->personality = randomPersonality;
} else {
param1->personality = param4;
v2 = param4;
monDataDTO->personality = givenPersonality;
randomPersonality = givenPersonality;
}
param1->hpIV = param5;
param1->atkIV = param5;
param1->defIV = param5;
param1->speedIV = param5;
param1->spAtkIV = param5;
param1->spDefIV = param5;
monDataDTO->hpIV = ivs;
monDataDTO->atkIV = ivs;
monDataDTO->defIV = ivs;
monDataDTO->speedIV = ivs;
monDataDTO->spAtkIV = ivs;
monDataDTO->spDefIV = ivs;
v1 = 0;
evs = 0;
for (v0 = 0; v0 < 6; v0++) {
if (v4.evFlags & FlagIndex(v0)) {
v1++;
for (v0 = 0; v0 < STAT_MAX; v0++) {
if (monData.evFlags & FlagIndex(v0)) {
evs++;
}
}
if ((510 / v1) > 255) {
v1 = 255;
if (MAX_EVS_ALL_STATS / evs > MAX_EVS_SINGLE_STAT) {
evs = MAX_EVS_SINGLE_STAT;
} else {
v1 = 510 / v1;
evs = MAX_EVS_ALL_STATS / evs;
}
for (v0 = 0; v0 < 6; v0++) {
if (v4.evFlags & FlagIndex(v0)) {
param1->evList[v0] = v1;
for (v0 = 0; v0 < STAT_MAX; v0++) {
if (monData.evFlags & FlagIndex(v0)) {
monDataDTO->evList[v0] = evs;
}
}
param1->combinedPPUps = 0;
param1->language = gGameLanguage;
monDataDTO->combinedPPUps = 0;
monDataDTO->language = gGameLanguage;
v0 = SpeciesData_GetSpeciesValue(param1->species, SPECIES_DATA_ABILITY_2);
v0 = SpeciesData_GetSpeciesValue(monDataDTO->species, SPECIES_DATA_ABILITY_2);
if (v0) {
if (param1->personality & 1) {
param1->ability = v0;
if (monDataDTO->personality & 1) {
monDataDTO->ability = v0;
} else {
param1->ability = SpeciesData_GetSpeciesValue(param1->species, SPECIES_DATA_ABILITY_1);
monDataDTO->ability = SpeciesData_GetSpeciesValue(monDataDTO->species, SPECIES_DATA_ABILITY_1);
}
} else {
param1->ability = SpeciesData_GetSpeciesValue(param1->species, SPECIES_DATA_ABILITY_1);
monDataDTO->ability = SpeciesData_GetSpeciesValue(monDataDTO->species, SPECIES_DATA_ABILITY_1);
}
param1->friendship = friendship;
MessageLoader_GetSpeciesName(param1->species, param8, &(param1->nickname[0]));
monDataDTO->friendship = friendship;
MessageLoader_GetSpeciesName(monDataDTO->species, heapID, &(monDataDTO->nickname[0]));
return v2;
return randomPersonality;
}
FieldBattleDTO *ov104_0223A580(BattleTower *battleTower, UnkStruct_ov104_02230BE4 *param1)
@ -918,19 +919,19 @@ FieldBattleDTO *ov104_0223A580(BattleTower *battleTower, UnkStruct_ov104_02230BE
Heap_Free(mon);
FieldBattleDTO_CopyPlayerInfoToTrainerData(v3);
ov104_0223A6AC(v3, &(battleTower->unk_78[0]), battleTower->partySize, BATTLER_ENEMY_1, battleTower->heapID);
ov104_0223A6AC(v3, &(battleTower->opponentsDataDTO[0]), battleTower->partySize, BATTLER_ENEMY_1, battleTower->heapID);
for (v0 = 0; v0 < MAX_BATTLERS; v0++) {
v3->trainer[v0].header.aiMask = (0x1 | 0x2 | 0x4);
}
switch (battleTower->challengeMode) {
case 2:
case BATTLE_TOWER_MODE_MULTI:
ov104_0223A6AC(v3, &(battleTower->partnersDataDTO[battleTower->partnerID]), battleTower->partySize, BATTLER_PLAYER_2, battleTower->heapID);
// fall through
case 3:
case 6:
ov104_0223A6AC(v3, &(battleTower->unk_78[1]), battleTower->partySize, BATTLER_ENEMY_2, battleTower->heapID);
case BATTLE_TOWER_MODE_LINK_MULTI:
case BATTLE_TOWER_MODE_6:
ov104_0223A6AC(v3, &(battleTower->opponentsDataDTO[1]), battleTower->partySize, BATTLER_ENEMY_2, battleTower->heapID);
break;
default:
break;
@ -987,38 +988,38 @@ u16 ov104_0223A750(BattleTower *battleTower, const u16 *param1)
return 0;
}
int ov104_0223A768(u8 param0)
int BattleTower_GetPokemonDataNarcID(u8 challengeMode)
{
if (ov104_0223A7AC(param0) == FALSE) {
if (BattleTower_AreAllConnectedGamesPlatinum(challengeMode) == FALSE) {
return NARC_INDEX_BATTLE__B_TOWER__BTDPM;
}
return NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDPM;
}
int ov104_0223A77C(u8 param0)
int BattleTower_GetTrainerDataNarcID(u8 challengeMode)
{
if (ov104_0223A7AC(param0) == FALSE) {
if (BattleTower_AreAllConnectedGamesPlatinum(challengeMode) == FALSE) {
return NARC_INDEX_BATTLE__B_TOWER__BTDTR;
}
return NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR;
}
int ov104_0223A790(u8 param0)
int BattleTower_GetTrainerMessagesBankID(u8 challengeMode)
{
if (ov104_0223A7AC(param0) == FALSE) {
if (BattleTower_AreAllConnectedGamesPlatinum(challengeMode) == FALSE) {
return TEXT_BANK_UNK_0613;
}
return TEXT_BANK_FRONTIER_TRAINER_MESSAGES;
}
static int ov104_0223A7AC(u8 param0)
static int BattleTower_AreAllConnectedGamesPlatinum(u8 challengeMode)
{
switch (param0) {
case 3:
case 6:
switch (challengeMode) {
case BATTLE_TOWER_MODE_LINK_MULTI:
case BATTLE_TOWER_MODE_6:
TrainerInfo *v0 = CommInfo_TrainerInfo(0);
if (v0 == NULL) {
@ -1034,7 +1035,7 @@ static int ov104_0223A7AC(u8 param0)
u8 v2 = TrainerInfo_GameCode(v0);
u8 v3 = TrainerInfo_GameCode(v1);
if ((v2 == 0) || (v3 == 0)) {
if (v2 == 0 || v3 == 0) {
return FALSE;
}

View File

@ -227,7 +227,7 @@ BOOL ov104_0223A918(const u16 param0[], const u16 param1[], int param2, int para
v0 = v7->unk_06;
}
ov104_0222DCF4(&v4[v1], v3, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDPM);
BattleTower_GetMonDataFromSetIDAndNarcID(&v4[v1], v3, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDPM);
for (v5 = 0; v5 < v1; v5++) {
if ((v4[v5].species == v4[v1].species) || (v4[v5].item == v4[v1].item)) {
@ -360,7 +360,7 @@ FieldBattleDTO *ov104_0223ABA0(UnkStruct_ov104_0223ADA0 *param0, UnkStruct_ov104
Heap_Free(v5);
FieldBattleDTO_CopyPlayerInfoToTrainerData(v4);
Heap_Free(ov104_0222DD04(&v6, param0->unk_18[param0->unk_06], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
Heap_Free(BattleTower_GetTrainerData(&v6, param0->unk_18[param0->unk_06], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
ov104_0222E284(v4, &v6, v3, 1, 11);
Party_InitWithCapacity(v4->parties[1], ov104_0223AA74(param0->unk_04, 0));
@ -385,7 +385,7 @@ FieldBattleDTO *ov104_0223ABA0(UnkStruct_ov104_0223ADA0 *param0, UnkStruct_ov104
TrainerInfo_Copy(CommInfo_TrainerInfo(1 - CommSys_CurNetId()), v4->trainerInfo[2]);
Heap_Free(ov104_0222DD04(&v6, param0->unk_18[param0->unk_06 + 7], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
Heap_Free(BattleTower_GetTrainerData(&v6, param0->unk_18[param0->unk_06 + 7], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
ov104_0222E284(v4, &v6, v3, 3, 11);
Party_InitWithCapacity(v4->parties[3], ov104_0223AA74(param0->unk_04, 0));

View File

@ -1592,7 +1592,7 @@ FieldBattleDTO *ov104_0223B250(UnkStruct_ov104_0223B5C0 *param0, UnkStruct_ov104
Heap_Free(v9);
FieldBattleDTO_CopyPlayerInfoToTrainerData(v8);
Heap_Free(ov104_0222DD04(&v10, param0->unk_18[v6], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
Heap_Free(BattleTower_GetTrainerData(&v10, param0->unk_18[v6], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
ov104_0222E284(v8, &v10, v5, 1, 11);
Party_InitWithCapacity(v8->parties[1], v5);
@ -1634,7 +1634,7 @@ FieldBattleDTO *ov104_0223B250(UnkStruct_ov104_0223B5C0 *param0, UnkStruct_ov104
TrainerInfo_Copy(CommInfo_TrainerInfo(1 - CommSys_CurNetId()), v8->trainerInfo[2]);
Heap_Free(ov104_0222DD04(&v10, param0->unk_18[v6 + 1], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
Heap_Free(BattleTower_GetTrainerData(&v10, param0->unk_18[v6 + 1], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
ov104_0222E284(v8, &v10, v5, 3, 11);
Party_InitWithCapacity(v8->parties[3], v5);

View File

@ -188,7 +188,7 @@ FieldBattleDTO *ov104_0223B810(UnkStruct_ov104_0223BA10 *param0, UnkStruct_ov104
Heap_Free(v6);
FieldBattleDTO_CopyPlayerInfoToTrainerData(v5);
Heap_Free(ov104_0222DD04(&v7, param0->unk_30[param0->unk_11], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
Heap_Free(BattleTower_GetTrainerData(&v7, param0->unk_30[param0->unk_11], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
ov104_0222E284(v5, &v7, v3, 1, 11);
Party_InitWithCapacity(v5->parties[1], ov104_0223B7DC(param0->unk_10, 0));
@ -212,7 +212,7 @@ FieldBattleDTO *ov104_0223B810(UnkStruct_ov104_0223BA10 *param0, UnkStruct_ov104
TrainerInfo_Copy(CommInfo_TrainerInfo(1 - CommSys_CurNetId()), v5->trainerInfo[2]);
Heap_Free(ov104_0222DD04(&v7, param0->unk_30[param0->unk_11 + 7], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
Heap_Free(BattleTower_GetTrainerData(&v7, param0->unk_30[param0->unk_11 + 7], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR));
ov104_0222E284(v5, &v7, v3, 3, 11);
Party_InitWithCapacity(v5->parties[3], ov104_0223B7DC(param0->unk_10, 0));

View File

@ -202,7 +202,7 @@ FieldBattleDTO *ov104_0223BDD8(UnkStruct_ov104_0223BFFC *param0, UnkStruct_ov104
Heap_Free(v6);
FieldBattleDTO_CopyPlayerInfoToTrainerData(v5);
BattleFrontierTrainerData *v8 = ov104_0222DD04(&v7, param0->unk_78[param0->unk_11], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR);
BattleFrontierTrainerData *v8 = BattleTower_GetTrainerData(&v7, param0->unk_78[param0->unk_11], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR);
Heap_Free(v8);
ov104_0222E284(v5, &v7, v3, 1, 11);
@ -228,7 +228,7 @@ FieldBattleDTO *ov104_0223BDD8(UnkStruct_ov104_0223BFFC *param0, UnkStruct_ov104
TrainerInfo_Copy(CommInfo_TrainerInfo(1 - CommSys_CurNetId()), v5->trainerInfo[2]);
v8 = ov104_0222DD04(&v7, param0->unk_78[param0->unk_11 + 7], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR);
v8 = BattleTower_GetTrainerData(&v7, param0->unk_78[param0->unk_11 + 7], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR);
Heap_Free(v8);
ov104_0222E284(v5, &v7, v3, 3, 11);

View File

@ -290,7 +290,7 @@ static BOOL ScrCmd_MessageFromBankInstant(ScriptContext *ctx);
static BOOL ScrCmd_MessageFromBank(ScriptContext *ctx);
static BOOL ScrCmd_SentenceInstant(ScriptContext *ctx);
static BOOL ScrCmd_Sentence(ScriptContext *ctx);
static BOOL ScrCmd_1FE(ScriptContext *ctx);
static BOOL ScrCmd_PrintBattleTowerIntroMessage(ScriptContext *ctx);
static BOOL ScrCmd_MessageSeenBanlistSpecies(ScriptContext *ctx);
static BOOL ScrCmd_MessageUnown(ScriptContext *ctx);
static BOOL ScrCmd_Message(ScriptContext *ctx);
@ -1279,7 +1279,7 @@ const ScrCmdFunc Unk_020EAC58[] = {
ScrCmd_MessageFromBank,
ScrCmd_SentenceInstant,
ScrCmd_Sentence,
ScrCmd_1FE,
ScrCmd_PrintBattleTowerIntroMessage,
ScrCmd_MessageSeenBanlistSpecies,
ScrCmd_GetPreviousMapID,
ScrCmd_GetCurrentMapID,
@ -2090,9 +2090,9 @@ static BOOL ScrCmd_Sentence(ScriptContext *ctx)
return TRUE;
}
static BOOL ScrCmd_1FE(ScriptContext *ctx)
static BOOL ScrCmd_PrintBattleTowerIntroMessage(ScriptContext *ctx)
{
u16 v3 = ScriptContext_ReadByte(ctx);
u16 opponentID = ScriptContext_ReadByte(ctx);
BattleTower *battleTower = ctx->fieldSystem->battleTower;
@ -2100,7 +2100,7 @@ static BOOL ScrCmd_1FE(ScriptContext *ctx)
return FALSE;
}
u16 *v0 = battleTower->unk_78[v3].trDataDTO.unk_18;
u16 *v0 = battleTower->opponentsDataDTO[opponentID].trDataDTO.unk_18;
if (v0[0] == 0xFFFF) {
MessageLoader *msgLoader = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_UNK_0613, HEAP_ID_FIELD3);

View File

@ -3,6 +3,8 @@
#include <nitro.h>
#include <string.h>
#include "constants/battle_tower.h"
#include "struct_defs/battle_frontier.h"
#include "struct_defs/sentence.h"
#include "struct_defs/struct_0202D060.h"
@ -75,7 +77,7 @@ u32 sub_0202D0BC(UnkStruct_0202D060 *param0, int param1, void *param2)
case 7:
return param0->unk_00_0;
case 8:
MI_CpuCopy8(param0->unk_0C, param2, 2 * 14);
MI_CpuCopy8(param0->unk_0C, param2, BT_OPPONENTS_COUNT * 2 * sizeof(u16));
return 0;
case 9:
return param0->unk_00_5;

View File

@ -75,8 +75,8 @@ BOOL ScrCmd_CallBattleTowerFunction(ScriptContext *ctx)
*destVar = sub_02049EC4(functionArgument, ctx->fieldSystem->saveData, 1);
}
break;
case BATTLE_TOWER_FUNCTION_UNK_02:
sub_02049F8C();
case BATTLE_TOWER_FUNCTION_RESET_SYSTEM:
BattleTower_ResetSystem();
break;
case BATTLE_TOWER_FUNCTION_UNK_03:
sub_02049F98(sub_0202D740(ctx->fieldSystem->saveData));
@ -125,14 +125,14 @@ BOOL ScrCmd_CallBattleTowerFunction(ScriptContext *ctx)
case BATTLE_TOWER_FUNCTION_CHECK_DUPLICATE_SPECIES_AND_HELD_ITEMS:
*destVar = BattleTower_CheckDuplicateSpeciesAndHeldItems(battleTower, ctx->fieldSystem->saveData);
break;
case BATTLE_TOWER_FUNCTION_UNK_35:
*destVar = sub_0204A57C(battleTower);
case BATTLE_TOWER_FUNCTION_HAS_DEFEATED_SEVEN_TRAINERS:
*destVar = BattleTower_HasDefeatedSevenTrainers(battleTower);
break;
case BATTLE_TOWER_FUNCTION_UNK_37:
sub_0204A660(battleTower, ctx->fieldSystem->saveData);
case BATTLE_TOWER_FUNCTION_UPDATE_GAME_RECORDS:
BattleTower_UpdateGameRecords(battleTower, ctx->fieldSystem->saveData);
break;
case BATTLE_TOWER_FUNCTION_UNK_38:
sub_0204A7A4(battleTower, ctx->fieldSystem->saveData, ctx->fieldSystem->journalEntry);
case BATTLE_TOWER_FUNCTION_UPDATE_GAME_RECORDS_AND_JOURNAL:
BattleTower_UpdateGameRecordsAndJournal(battleTower, ctx->fieldSystem->saveData, ctx->fieldSystem->journalEntry);
break;
case BATTLE_TOWER_FUNCTION_UNK_39:
sub_0204A8C8(battleTower);

View File

@ -3,6 +3,7 @@
#include <nitro.h>
#include <string.h>
#include "constants/battle_tower.h"
#include "generated/battle_tower_modes.h"
#include "generated/frontier_trainers.h"
#include "generated/game_records.h"
@ -26,6 +27,7 @@
#include "inlines.h"
#include "journal.h"
#include "location.h"
#include "main.h"
#include "math_util.h"
#include "party.h"
#include "player_avatar.h"
@ -208,9 +210,9 @@ BOOL sub_02049EC4(u16 param0, SaveData *saveData, u8 param2)
return sub_02049DB4(v8, param0, v2, (v2 - param0) + 1);
}
void sub_02049F8C(void)
void BattleTower_ResetSystem(void)
{
OS_ResetSystem(0);
OS_ResetSystem(RESET_CLEAN);
}
void sub_02049F98(UnkStruct_0202D060 *param0)
@ -334,15 +336,15 @@ BattleTower *BattleTower_Init(SaveData *saveData, u16 param1, u16 challengeMode)
if (param1 == 0) {
battleTower->challengeMode = challengeMode;
battleTower->partySize = (u8)BattleTower_GetPartySizeForChallengeMode(battleTower->challengeMode);
battleTower->unk_0C = 1;
battleTower->nextOpponentNum = 1;
battleTower->unk_0D = 0;
for (v1 = 0; v1 < 4; v1++) {
battleTower->unk_2A[v1] = 0xFF;
}
for (v1 = 0; v1 < 14; v1++) {
battleTower->unk_3E[v1] = 0xFFFF;
for (v1 = 0; v1 < BT_OPPONENTS_COUNT * 2; v1++) {
battleTower->trainerIDs[v1] = 0xFFFF;
}
sub_0202D060(battleTower->unk_70);
@ -350,12 +352,12 @@ BattleTower *BattleTower_Init(SaveData *saveData, u16 param1, u16 challengeMode)
sub_0202D140(battleTower->unk_70, 0, &v0);
} else {
battleTower->challengeMode = (u8)sub_0202D0BC(battleTower->unk_70, 0, NULL);
battleTower->unk_0C = (u8)sub_0202D0BC(battleTower->unk_70, 1, NULL);
battleTower->unk_0D = battleTower->unk_0C - 1;
battleTower->nextOpponentNum = (u8)sub_0202D0BC(battleTower->unk_70, 1, NULL);
battleTower->unk_0D = battleTower->nextOpponentNum - 1;
battleTower->partySize = (u8)BattleTower_GetPartySizeForChallengeMode(battleTower->challengeMode);
sub_0202D0BC(battleTower->unk_70, 5, battleTower->unk_2A);
sub_0202D0BC(battleTower->unk_70, 8, battleTower->unk_3E);
sub_0202D0BC(battleTower->unk_70, 8, battleTower->trainerIDs);
battleTower->unk_08 = sub_0202D0BC(battleTower->unk_70, 10, NULL);
@ -388,14 +390,14 @@ BattleTower *BattleTower_Init(SaveData *saveData, u16 param1, u16 challengeMode)
frontier, 1 + battleTower->challengeMode * 2, 0xff);
}
battleTower->unk_1C = sub_0202D3B4(battleTower->unk_74, battleTower->challengeMode, 0);
battleTower->roomNum = sub_0202D3B4(battleTower->unk_74, battleTower->challengeMode, 0);
}
battleTower->unk_20 = GameRecords_GetRecordValue(v5, RECORD_UNK_029);
}
if (battleTower->challengeMode == BATTLE_TOWER_MODE_6) {
battleTower->unk_1C = sub_0202D3FC(battleTower->unk_74, 6, battleTower->unk_1A / 7);
battleTower->roomNum = sub_0202D3FC(battleTower->unk_74, BATTLE_TOWER_MODE_6, battleTower->unk_1A / 7);
}
return battleTower;
@ -476,66 +478,66 @@ int BattleTower_CheckDuplicateSpeciesAndHeldItems(BattleTower *battleTower, Save
return 0;
}
static BOOL sub_0204A4A0(u16 *param0, u16 param1, u16 param2)
static BOOL BattleTower_IsTrainerAlreadyUsed(u16 *trainerIDs, u16 trainerID, u16 currOpponentNum)
{
u16 v0;
u16 opponentNum;
for (v0 = 0; v0 < param2; v0++) {
if (param0[v0] == param1) {
return 1;
for (opponentNum = 0; opponentNum < currOpponentNum; opponentNum++) {
if (trainerIDs[opponentNum] == trainerID) {
return TRUE;
}
}
return 0;
return FALSE;
}
void sub_0204A4C8(BattleTower *battleTower, SaveData *saveData)
{
int v0;
u16 v1, v2;
int opponentNum;
u16 trainerID, roomNum;
if (battleTower->challengeMode == BATTLE_TOWER_MODE_MULTI || battleTower->challengeMode == BATTLE_TOWER_MODE_6 || battleTower->challengeMode == BATTLE_TOWER_MODE_LINK_MULTI) {
if ((battleTower->challengeMode == BATTLE_TOWER_MODE_LINK_MULTI && battleTower->unk_14 > battleTower->unk_1C) || (battleTower->challengeMode == BATTLE_TOWER_MODE_6 && battleTower->unk_14 > battleTower->unk_1C)) {
v2 = battleTower->unk_14;
if ((battleTower->challengeMode == BATTLE_TOWER_MODE_LINK_MULTI && battleTower->unk_14 > battleTower->roomNum) || (battleTower->challengeMode == BATTLE_TOWER_MODE_6 && battleTower->unk_14 > battleTower->roomNum)) {
roomNum = battleTower->unk_14;
} else {
v2 = battleTower->unk_1C;
roomNum = battleTower->roomNum;
}
for (v0 = 0; v0 < 14; v0++) {
for (opponentNum = 0; opponentNum < BT_OPPONENTS_COUNT * 2; opponentNum++) {
do {
v1 = sub_0204B0F0(battleTower, v2, v0 / 2, battleTower->challengeMode);
} while (sub_0204A4A0(battleTower->unk_3E, v1, v0));
trainerID = BattleTower_GetTrainerIDForRoomAndOpponentNum(battleTower, roomNum, opponentNum / 2, battleTower->challengeMode);
} while (BattleTower_IsTrainerAlreadyUsed(battleTower->trainerIDs, trainerID, opponentNum));
battleTower->unk_3E[v0] = v1;
battleTower->trainerIDs[opponentNum] = trainerID;
}
} else {
for (v0 = 0; v0 < (14 / 2); v0++) {
for (opponentNum = 0; opponentNum < BT_OPPONENTS_COUNT; opponentNum++) {
do {
v1 = sub_0204B0F0(battleTower, battleTower->unk_1C, v0, battleTower->challengeMode);
} while (sub_0204A4A0(battleTower->unk_3E, v1, v0));
trainerID = BattleTower_GetTrainerIDForRoomAndOpponentNum(battleTower, battleTower->roomNum, opponentNum, battleTower->challengeMode);
} while (BattleTower_IsTrainerAlreadyUsed(battleTower->trainerIDs, trainerID, opponentNum));
battleTower->unk_3E[v0] = v1;
battleTower->trainerIDs[opponentNum] = trainerID;
}
}
}
u16 sub_0204A578(BattleTower *battleTower)
u16 BattleTower_GetNextOpponentNum(BattleTower *battleTower)
{
return battleTower->unk_0C;
return battleTower->nextOpponentNum;
}
BOOL sub_0204A57C(BattleTower *battleTower)
BOOL BattleTower_HasDefeatedSevenTrainers(BattleTower *battleTower)
{
if (battleTower->unk_10_0) {
return 1;
if (battleTower->defeatedSevenTrainers) {
return TRUE;
}
if (battleTower->unk_0C > 7) {
battleTower->unk_10_0 = 1;
return 1;
if (battleTower->nextOpponentNum > 7) {
battleTower->defeatedSevenTrainers = TRUE;
return TRUE;
}
return 0;
return FALSE;
}
static void sub_0204A5A0(BattleTower *battleTower, SaveData *saveData, u16 param2)
@ -574,7 +576,7 @@ static void sub_0204A5EC(BattleTower *battleTower, SaveData *saveData, u8 param2
v0 = battleTower->challengeMode;
sub_0202D140(battleTower->unk_70, 0, &v0);
v0 = battleTower->unk_0C;
v0 = battleTower->nextOpponentNum;
sub_0202D140(battleTower->unk_70, 1, &v0);
sub_0202D334(battleTower->unk_74, battleTower->unk_70);
break;
@ -583,7 +585,7 @@ static void sub_0204A5EC(BattleTower *battleTower, SaveData *saveData, u8 param2
}
}
void sub_0204A660(BattleTower *battleTower, SaveData *saveData)
void BattleTower_UpdateGameRecords(BattleTower *battleTower, SaveData *saveData)
{
u32 v0 = 0;
int v1;
@ -642,7 +644,7 @@ void sub_0204A660(BattleTower *battleTower, SaveData *saveData)
sub_0204A5EC(battleTower, saveData, 0, v0);
}
void sub_0204A7A4(BattleTower *battleTower, SaveData *saveData, JournalEntry *journalEntry)
void BattleTower_UpdateGameRecordsAndJournal(BattleTower *battleTower, SaveData *saveData, JournalEntry *journalEntry)
{
u32 v0 = 0;
int v1;
@ -706,12 +708,12 @@ void sub_0204A8C8(BattleTower *battleTower)
v1[0] = battleTower->challengeMode;
sub_0202D140(battleTower->unk_70, 0, v1);
v1[0] = battleTower->unk_0C;
v1[0] = battleTower->nextOpponentNum;
sub_0202D140(battleTower->unk_70, 1, v1);
sub_0202D140(battleTower->unk_70, 5, battleTower->unk_2A);
sub_0202D1E8(battleTower->unk_70, battleTower->unk_28, battleTower->unk_24, battleTower->unk_26);
sub_0202D140(battleTower->unk_70, 8, battleTower->unk_3E);
sub_0202D140(battleTower->unk_70, 8, battleTower->trainerIDs);
sub_0202D140(battleTower->unk_70, 10, &(battleTower->unk_08));
sub_0202D21C(battleTower->unk_70, 1);
@ -735,7 +737,7 @@ void sub_0204A97C(BattleTower *battleTower)
u16 BattleTower_GetObjectIDFromOpponentID(BattleTower *battleTower, u16 opponentID)
{
return BattleFrontier_GetObjectIDFromTrainerClass(battleTower->unk_78[opponentID].trDataDTO.trainerType);
return BattleFrontier_GetObjectIDFromTrainerClass(battleTower->opponentsDataDTO[opponentID].trDataDTO.trainerType);
}
u16 BattleTower_GetChallengeMode(BattleTower *battleTower)
@ -1055,7 +1057,7 @@ u8 BattleTower_GetIVsFromTrainerID(u16 battleTowerID)
return ivs;
}
u16 sub_0204AEC0(BattleTower *battleTower)
u16 BattleTower_GetRandom(BattleTower *battleTower)
{
if (battleTower->challengeMode == BATTLE_TOWER_MODE_6) {
return LCRNG_Next();

View File

@ -5,6 +5,7 @@
#include "constants/battle_tower.h"
#include "generated/battle_tower_modes.h"
#include "generated/frontier_trainers.h"
#include "generated/object_events.h"
#include "generated/species_data_params.h"
#include "generated/trainer_classes.h"
@ -182,7 +183,7 @@ u16 sub_0204B020(FieldSystem *fieldSystem, const u16 *param1)
return 0;
}
MI_CpuCopy8(param1, battleTower->unk_3E, 14 * 2);
MI_CpuCopy8(param1, battleTower->trainerIDs, BT_OPPONENTS_COUNT * 2 * sizeof(u16));
return 1;
}
@ -217,7 +218,7 @@ void sub_0204B060(BattleTower *battleTower, SaveData *saveData)
void sub_0204B0BC(BattleTower *battleTower)
{
MI_CpuCopy8(battleTower->unk_3E, battleTower->unk_83E, 14 * 2);
MI_CpuCopy8(battleTower->trainerIDs, battleTower->unk_83E, BT_OPPONENTS_COUNT * 2 * sizeof(u16));
}
void sub_0204B0D4(BattleTower *battleTower, u16 param1)
@ -226,56 +227,56 @@ void sub_0204B0D4(BattleTower *battleTower, u16 param1)
battleTower->unk_83E[0] = param1;
}
static const u16 Unk_020EBD58[][2] = {
{ 0x0, 0x63 },
{ 0x50, 0x77 },
{ 0x64, 0x8B },
{ 0x78, 0x9F },
{ 0x8C, 0xB3 },
{ 0xA0, 0xC7 },
{ 0xB4, 0xDB },
{ 0xC8, 0x12B }
static const u16 sBattleTowerTrainerRangesPerRoom[][2] = {
{ FRONTIER_TRAINER_YOUNGSTER_JIM, FRONTIER_TRAINER_REPORTER_GINGHAM },
{ FRONTIER_TRAINER_HIKER_RAIDEN, FRONTIER_TRAINER_SOCIALITE_CARMEN },
{ FRONTIER_TRAINER_CYCLIST_GASPAR, FRONTIER_TRAINER_CLOWN_PRESCOT },
{ FRONTIER_TRAINER_PSYCHIC_ALPHA, FRONTIER_TRAINER_ACE_TRAINER_DANIELA },
{ FRONTIER_TRAINER_ACE_TRAINER_YARDLEY, FRONTIER_TRAINER_IDOL_UTAH },
{ FRONTIER_TRAINER_YOUNGSTER_KADEN, FRONTIER_TRAINER_PI_SERGEI },
{ FRONTIER_TRAINER_JOGGER_COLT, FRONTIER_TRAINER_BREEDER_ANTONIA },
{ FRONTIER_TRAINER_CAMPER_FREDDY, FRONTIER_TRAINER_IDOL_NISSA }
};
static const u16 Unk_020EBD78[][2] = {
{ 0x64, 0x77 },
{ 0x78, 0x8B },
{ 0x8C, 0x9F },
{ 0xA0, 0xB3 },
{ 0xB4, 0xC7 },
{ 0xC8, 0xDB },
{ 0xDC, 0xEF },
{ 0xC8, 0x12B }
static const u16 sBattleTowerBossTrainerRangesPerRoom[][2] = {
{ FRONTIER_TRAINER_CYCLIST_GASPAR, FRONTIER_TRAINER_SOCIALITE_CARMEN },
{ FRONTIER_TRAINER_PSYCHIC_ALPHA, FRONTIER_TRAINER_CLOWN_PRESCOT },
{ FRONTIER_TRAINER_ACE_TRAINER_YARDLEY, FRONTIER_TRAINER_ACE_TRAINER_DANIELA },
{ FRONTIER_TRAINER_YOUNGSTER_KADEN, FRONTIER_TRAINER_IDOL_UTAH },
{ FRONTIER_TRAINER_JOGGER_COLT, FRONTIER_TRAINER_PI_SERGEI },
{ FRONTIER_TRAINER_CAMPER_FREDDY, FRONTIER_TRAINER_BREEDER_ANTONIA },
{ FRONTIER_TRAINER_ACE_TRAINER_SAWYER, FRONTIER_TRAINER_VETERAN_ALFRED },
{ FRONTIER_TRAINER_CAMPER_FREDDY, FRONTIER_TRAINER_IDOL_NISSA }
};
u16 sub_0204B0F0(BattleTower *battleTower, u8 param1, u8 param2, int challengeMode)
u16 BattleTower_GetTrainerIDForRoomAndOpponentNum(BattleTower *battleTower, u8 roomNum, u8 opponentNum, int challengeMode)
{
u16 v0;
u16 trainerID;
if (challengeMode == BATTLE_TOWER_MODE_SINGLE) {
if (param1 == 2 && param2 == 6) {
return 305;
if (roomNum == 2 && opponentNum == BT_OPPONENTS_COUNT - 1) { // 21st battle
return FRONTIER_TRAINER_TOWER_TYCOON_PALMER_SILVER;
}
if (param1 == 6 && param2 == 6) {
return 306;
if (roomNum == 6 && opponentNum == BT_OPPONENTS_COUNT - 1) { // 49th battle
return FRONTIER_TRAINER_TOWER_TYCOON_PALMER_GOLD;
}
}
if (param1 < 7) {
if (param2 == (7 - 1)) {
v0 = (Unk_020EBD78[param1][1] - Unk_020EBD78[param1][0]) + 1;
v0 = Unk_020EBD78[param1][0] + (sub_0204AEC0(battleTower) % v0);
if (roomNum < 7) {
if (opponentNum == BT_OPPONENTS_COUNT - 1) {
trainerID = sBattleTowerBossTrainerRangesPerRoom[roomNum][1] - sBattleTowerBossTrainerRangesPerRoom[roomNum][0] + 1;
trainerID = sBattleTowerBossTrainerRangesPerRoom[roomNum][0] + (BattleTower_GetRandom(battleTower) % trainerID);
} else {
v0 = (Unk_020EBD58[param1][1] - Unk_020EBD58[param1][0]) + 1;
v0 = Unk_020EBD58[param1][0] + (sub_0204AEC0(battleTower) % v0);
trainerID = sBattleTowerTrainerRangesPerRoom[roomNum][1] - sBattleTowerTrainerRangesPerRoom[roomNum][0] + 1;
trainerID = sBattleTowerTrainerRangesPerRoom[roomNum][0] + (BattleTower_GetRandom(battleTower) % trainerID);
}
} else {
v0 = (Unk_020EBD58[7][1] - Unk_020EBD58[7][0]) + 1;
v0 = Unk_020EBD58[7][0] + (sub_0204AEC0(battleTower) % v0);
trainerID = sBattleTowerTrainerRangesPerRoom[7][1] - sBattleTowerTrainerRangesPerRoom[7][0] + 1;
trainerID = sBattleTowerTrainerRangesPerRoom[7][0] + (BattleTower_GetRandom(battleTower) % trainerID);
}
return v0;
return trainerID;
}
static BattleFrontierTrainerData *sub_0204B184(FrontierDataDTO *param0, u16 param1, int heapID)
@ -339,7 +340,7 @@ static u32 sub_0204B1E8(BattleTower *battleTower, FrontierPokemonDataDTO *param1
if (param4 == 0) {
do {
v2 = (sub_0204AEC0(battleTower) | sub_0204AEC0(battleTower) << 16);
v2 = (BattleTower_GetRandom(battleTower) | BattleTower_GetRandom(battleTower) << 16);
} while ((v4.nature != Pokemon_GetNatureOf(v2)) || (Pokemon_IsPersonalityShiny(param3, v2) == 1));
param1->personality = v2;
@ -441,7 +442,7 @@ static BOOL sub_0204B470(BattleTower *battleTower, BattleFrontierTrainerData *tr
v9 = 0;
while (v8 != partySize) {
v3 = sub_0204AEC0(battleTower) % trainerData->numSets;
v3 = BattleTower_GetRandom(battleTower) % trainerData->numSets;
v5 = trainerData->setIDs[v3];
sub_0204B640(&v12, v5);
@ -503,7 +504,7 @@ static BOOL sub_0204B470(BattleTower *battleTower, BattleFrontierTrainerData *tr
}
ivs = BattleTower_GetIVsFromTrainerID(partnerBattleTowerID);
v4 = (sub_0204AEC0(battleTower) | (sub_0204AEC0(battleTower) << 16));
v4 = (BattleTower_GetRandom(battleTower) | (BattleTower_GetRandom(battleTower) << 16));
if (v9 >= 50) {
v10 = TRUE;

View File

@ -139,7 +139,7 @@ BOOL sub_0209BB08(BattleTower *battleTower)
v1 = (14 * 2);
MI_CpuCopy8(battleTower->unk_3E, battleTower->unk_83E, v1);
MI_CpuCopy8(battleTower->trainerIDs, battleTower->unk_83E, v1);
if (CommSys_SendData(63, battleTower->unk_83E, v1) == 1) {
v0 = 1;
@ -167,7 +167,7 @@ static void sub_0209BB34(int param0, int param1, void *param2, void *param3)
return;
}
MI_CpuCopy8(v2, battleTower->unk_3E, 14 * 2);
MI_CpuCopy8(v2, battleTower->trainerIDs, BT_OPPONENTS_COUNT * 2 * sizeof(u16));
return;
}