Document field moves (#430)

* initial documentation of unk_0207070C->field moves

* changes for PR suggestions + menu taskdata

* symbols in FieldMoveTaskData + fieldMoveMon done

* function name changes, document badges, cleanup

* Use enum FieldMoveError as return type for FieldMoveErrContext functions

* badge enum and bool constants

---------

Co-authored-by: Rachel <lhearachel@proton.me>
This commit is contained in:
Zatsu 2025-04-12 03:47:01 +01:00 committed by GitHub
parent 97e1968e98
commit c8d41bc96a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
25 changed files with 1116 additions and 1166 deletions

View File

@ -0,0 +1,54 @@
#ifndef POKEPLATINUM_FIELD_MOVE_TASKS_H
#define POKEPLATINUM_FIELD_MOVE_TASKS_H
#include "struct_decls/struct_02061AB4_decl.h"
#include "field/field_system_decl.h"
#include "field_task.h"
typedef struct FieldMoveContext {
u32 mapId;
FieldSystem *fieldSystem;
MapObject *mapObj;
u16 usableMoves;
} FieldMoveContext;
typedef struct FieldMovePokemon {
FieldTask *fieldTask;
u16 fieldMonId;
u16 fieldMove;
} FieldMovePokemon;
enum FieldMoveList {
FIELD_MOVE_CUT,
FIELD_MOVE_FLY, // unused
FIELD_MOVE_SURF,
FIELD_MOVE_STRENGTH,
FIELD_MOVE_DEFOG,
FIELD_MOVE_ROCK_SMASH,
FIELD_MOVE_WATERFALL,
FIELD_MOVE_ROCK_CLIMB,
FIELD_MOVE_FLASH,
};
enum FieldMoveError {
FIELD_MOVE_ERROR_NONE,
FIELD_MOVE_ERROR_LOCATION,
FIELD_MOVE_ERROR_BADGE,
FIELD_MOVE_ERROR_PARTNER,
FIELD_MOVE_ERROR_STATE,
};
enum TaskOrError {
FIELD_MOVE_TASK,
FIELD_MOVE_ERROR,
};
typedef void (*FieldMoveTaskContext)(FieldMovePokemon *, const FieldMoveContext *);
typedef enum FieldMoveError (*FieldMoveErrContext)(const FieldMoveContext *);
void *FieldMove_GetTaskOrError(u16 taskOrError, u16 fieldMove);
void FieldMoves_SetUsableMoves(FieldSystem *fieldSystem, FieldMoveContext *fieldMoveContext);
#endif // POKEPLATINUM_FIELD_MOVE_TASKS_H

View File

@ -1,9 +0,0 @@
#ifndef POKEPLATINUM_FUNCPTR_0203B7C0_H
#define POKEPLATINUM_FUNCPTR_0203B7C0_H
#include "struct_decls/struct_02070950_decl.h"
#include "struct_decls/struct_020709CC_decl.h"
typedef void (*UnkFuncPtr_0203B7C0)(UnkStruct_020709CC *, const UnkStruct_02070950 *);
#endif // POKEPLATINUM_FUNCPTR_0203B7C0_H

View File

@ -1,8 +0,0 @@
#ifndef POKEPLATINUM_FUNCPTR_02084808_H
#define POKEPLATINUM_FUNCPTR_02084808_H
#include "struct_decls/struct_02070950_decl.h"
typedef int (*UnkFuncPtr_02084808)(const UnkStruct_02070950 *);
#endif // POKEPLATINUM_FUNCPTR_02084808_H

View File

@ -12,9 +12,9 @@ void PlayerAvatar_SetRequestStateBit(PlayerAvatar *playerAvatar, u32 param1);
void PlayerAvatar_RequestChangeState(PlayerAvatar *playerAvatar);
int ov5_021DFDE0(FieldSystem *fieldSystem, PlayerAvatar *param1, int param2, int param3);
void ov5_021E00EC(FieldTask *param0, int param1, int param2);
int ov5_021E0118(PlayerAvatar *playerAvatar, u32 param1, u32 param2);
int PlayerAvatar_CanUseSurf(PlayerAvatar *playerAvatar, u32 currTileBehavior, u32 nextTileBehavior);
void ov5_021E0734(FieldTask *param0, int param1, int param2);
int ov5_021E0760(u32 param0, int param1);
BOOL PlayerAvatar_CanUseRockClimb(u32 metatileBehavior, int facingDir);
void ov5_021E097C(FieldSystem *fieldSystem, int param1);
void ov5_021E0998(FieldTask *param0, int param1, int param2);
void ov5_021E0DD4(FieldTask *param0);

View File

@ -28,7 +28,7 @@ MapObject *sub_0205EA24(const MapObjectManager *param0);
int PlayerAvatar_GetDir(PlayerAvatar *const playerAvatar);
void Player_SetDir(PlayerAvatar *playerAvatar, int param1);
int PlayerAvatar_GetMoveDir(PlayerAvatar *const playerAvatar);
int sub_0205EAA0(PlayerAvatar *const playerAvatar);
int PlayerAvatar_GetDistortionDir(PlayerAvatar *const playerAvatar);
int Player_GetXPos(PlayerAvatar *const playerAvatar);
int Player_GetZPos(PlayerAvatar *const playerAvatar);
int PlayerAvatar_XPosPrev(PlayerAvatar *const playerAvatar);

View File

@ -1,6 +0,0 @@
#ifndef POKEPLATINUM_STRUCT_02070950_DECL_H
#define POKEPLATINUM_STRUCT_02070950_DECL_H
typedef struct UnkStruct_02070950_t UnkStruct_02070950;
#endif // POKEPLATINUM_STRUCT_02070950_DECL_H

View File

@ -1,6 +0,0 @@
#ifndef POKEPLATINUM_STRUCT_020709CC_DECL_H
#define POKEPLATINUM_STRUCT_020709CC_DECL_H
typedef struct UnkStruct_020709CC_t UnkStruct_020709CC;
#endif // POKEPLATINUM_STRUCT_020709CC_DECL_H

View File

@ -2,11 +2,11 @@
#define POKEPLATINUM_STRUCT_020708E0_H
#include "struct_defs/struct_020684D0.h"
#include "struct_defs/struct_02070950.h"
#include "overlay005/struct_ov5_021D30A8.h"
#include "bg_window.h"
#include "field_move_tasks.h"
#include "field_task.h"
#include "menu.h"
#include "sprite_system.h"
@ -26,10 +26,10 @@ typedef struct {
u32 unk_220;
u32 unk_224;
u32 unk_228;
FieldTaskFunc unk_22C;
FieldTaskFunc callback;
UnkStruct_020684D0 unk_230;
UnkStruct_02070950 unk_24C;
void *unk_25C;
FieldMoveContext fieldMoveContext;
void *taskData;
void *unk_260;
} StartMenu;

View File

@ -1,15 +0,0 @@
#ifndef POKEPLATINUM_STRUCT_02070950_H
#define POKEPLATINUM_STRUCT_02070950_H
#include "struct_decls/struct_02061AB4_decl.h"
#include "field/field_system_decl.h"
typedef struct UnkStruct_02070950_t {
u32 unk_00;
FieldSystem *fieldSystem;
MapObject *unk_08;
u16 unk_0C;
} UnkStruct_02070950;
#endif // POKEPLATINUM_STRUCT_02070950_H

View File

@ -1,12 +0,0 @@
#ifndef POKEPLATINUM_STRUCT_020709CC_H
#define POKEPLATINUM_STRUCT_020709CC_H
#include "field_task.h"
typedef struct UnkStruct_020709CC_t {
FieldTask *unk_00;
u16 unk_04;
u16 unk_06;
} UnkStruct_020709CC;
#endif // POKEPLATINUM_STRUCT_020709CC_H

View File

@ -1,7 +1,6 @@
#ifndef POKEPLATINUM_UNK_0203D1B8_H
#define POKEPLATINUM_UNK_0203D1B8_H
#include "struct_decls/struct_02070950_decl.h"
#include "struct_decls/struct_0209747C_decl.h"
#include "struct_defs/choose_starter_data.h"
#include "struct_defs/struct_0203D8AC.h"
@ -21,6 +20,7 @@
#include "overlay090/struct_ov90_021D0D80.h"
#include "field_battle_data_transfer.h"
#include "field_move_tasks.h"
#include "field_task.h"
#include "pokemon.h"
#include "savedata.h"
@ -33,7 +33,7 @@ u16 sub_0203D2C4(void *param0);
void sub_0203D2E4(FieldSystem *fieldSystem, void *param1);
void sub_0203D30C(FieldSystem *fieldSystem, void *param1);
void FieldSystem_OpenSummaryScreen(FieldSystem *fieldSystem, void *overlayArgs);
void *sub_0203D390(FieldSystem *fieldSystem, UnkStruct_02070950 *param1, u8 param2);
void *sub_0203D390(FieldSystem *fieldSystem, FieldMoveContext *param1, u8 param2);
void *sub_0203D3C0(int param0, FieldSystem *fieldSystem);
void *sub_0203D3E4(int param0, FieldSystem *fieldSystem);
int PartyManagementData_GetSelectedSlot(PartyManagementData *partyMan);

View File

@ -26,8 +26,8 @@ u32 sub_0206156C(PlayerAvatar *playerAvatar, int param1);
void PlayerAvatar_MoveCoordsInDirection(PlayerAvatar *playerAvatar, int direction, int *x, int *z);
void PlayerAvatar_GetFacingTileCoords(PlayerAvatar *playerAvatar, int *x, int *z);
void sub_02061674(PlayerAvatar *playerAvatar, int param1, int *param2, int *param3, int *param4);
u32 sub_020616F0(PlayerAvatar *playerAvatar, int param1);
u32 sub_02061760(PlayerAvatar *playerAvatar);
u32 PlayerAvatar_GetDistortionTileBehaviour(PlayerAvatar *playerAvatar, int param1);
u32 PlayerAvatar_GetDistortionCurrTileBehaviour(PlayerAvatar *playerAvatar);
void sub_020617BC(PlayerAvatar *const playerAvatar, int *param1, int *param2, int *param3);
#endif // POKEPLATINUM_UNK_0205F180_H

View File

@ -1,11 +0,0 @@
#ifndef POKEPLATINUM_UNK_0207070C_H
#define POKEPLATINUM_UNK_0207070C_H
#include "struct_decls/struct_02070950_decl.h"
#include "field/field_system_decl.h"
u32 sub_0207070C(u16 param0, u16 param1);
void sub_02070728(FieldSystem *fieldSystem, UnkStruct_02070950 *param1);
#endif // POKEPLATINUM_UNK_0207070C_H

View File

@ -276,7 +276,7 @@ Static main
Object main.nef.p/src_unk_0206F314.c.o
Object main.nef.p/src_unk_02070428.c.o
Object main.nef.p/src_unk_0207064C.c.o
Object main.nef.p/src_unk_0207070C.c.o
Object main.nef.p/src_field_move_tasks.c.o
Object main.nef.p/src_unk_020711C8.c.o
Object main.nef.p/src_unk_020711EC.c.o
Object main.nef.p/src_platform_lift.c.o

811
src/field_move_tasks.c Normal file
View File

@ -0,0 +1,811 @@
#include "field_move_tasks.h"
#include <nitro.h>
#include <string.h>
#include "constants/field/dynamic_map_features.h"
#include "constants/field/map_load.h"
#include "generated/badges.h"
#include "generated/journal_location_events.h"
#include "generated/object_events.h"
#include "struct_decls/struct_02061AB4_decl.h"
#include "struct_defs/struct_0203D8AC.h"
#include "struct_defs/struct_020708E0.h"
#include "struct_defs/struct_020711C8.h"
#include "field/field_system.h"
#include "overlay005/ov5_021DFB54.h"
#include "overlay005/ov5_021F101C.h"
#include "overlay006/ov6_02247100.h"
#include "field_overworld_state.h"
#include "field_task.h"
#include "heap.h"
#include "inlines.h"
#include "journal.h"
#include "map_header.h"
#include "map_object.h"
#include "map_tile_behavior.h"
#include "persisted_map_features_init.h"
#include "player_avatar.h"
#include "save_player.h"
#include "script_manager.h"
#include "start_menu.h"
#include "system_flags.h"
#include "terrain_collision_manager.h"
#include "trainer_info.h"
#include "unk_0203C954.h"
#include "unk_0203D1B8.h"
#include "unk_0205F180.h"
#include "unk_0206B70C.h"
#include "unk_020711C8.h"
#include "vars_flags.h"
#define FIELD_MOVE_FLAG(move) (1 << (move))
typedef struct {
FieldMoveTaskContext task;
FieldMoveErrContext error;
} FieldMoveTaskOrError;
typedef struct {
u32 magicNumber;
MapObject *mapObj;
FieldMovePokemon fieldMoveMon;
} FieldMoveTaskData;
static void FieldMoves_CanUseSurfDistortionWorld(FieldSystem *fieldSystem, FieldMoveContext *param1);
static enum FieldMoveError FieldMoves_CheckFly(const FieldMoveContext *fieldMoveContext);
static void FieldMoves_SetFlyTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext);
static enum FieldMoveError FieldMoves_CheckTeleport(const FieldMoveContext *fieldMoveContext);
static void FieldMoves_SetTeleportTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext);
static BOOL FieldMoves_TeleportTask(FieldTask *taskMan);
static enum FieldMoveError FieldMoves_CheckSurf(const FieldMoveContext *fieldMoveContext);
static void FieldMoves_SetSurfTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext);
static BOOL FieldMoves_SurfTask(FieldTask *taskMan);
static enum FieldMoveError FieldMoves_CheckWaterfall(const FieldMoveContext *fieldMoveContext);
static void FieldMoves_SetWaterfallTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext);
static BOOL FieldMoves_WaterfallTask(FieldTask *taskMan);
static enum FieldMoveError FieldMoves_CheckRockClimb(const FieldMoveContext *fieldMoveContext);
static void FieldMoves_SetRockClimbTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext);
static BOOL FieldMoves_RockClimbTask(FieldTask *taskMan);
static enum FieldMoveError FieldMoves_CheckFlash(const FieldMoveContext *fieldMoveContext);
static void FieldMoves_SetFlashTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext);
static BOOL FieldMoves_FlashTask(FieldTask *taskMan);
static enum FieldMoveError FieldMoves_CheckDefog(const FieldMoveContext *fieldMoveContext);
static void FieldMoves_SetDefogTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext);
static BOOL FieldMoves_DefogTask(FieldTask *taskMan);
static enum FieldMoveError FieldMoves_CheckRockSmash(const FieldMoveContext *fieldMoveContext);
static void FieldMoves_SetRockSmashTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext);
static BOOL FieldMoves_RockSmashTask(FieldTask *taskMan);
static enum FieldMoveError FieldMoves_CheckStrength(const FieldMoveContext *fieldMoveContext);
static void FieldMoves_SetStrengthTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext);
static BOOL FieldMoves_StrengthTask(FieldTask *taskMan);
static enum FieldMoveError FieldMoves_CheckDig(const FieldMoveContext *fieldMoveContext);
static void FieldMoves_SetDigTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext);
static BOOL FieldMoves_DigTask(FieldTask *taskMan);
static enum FieldMoveError FieldMoves_CheckSweetScent(const FieldMoveContext *fieldMoveContext);
static void FieldMoves_SetSweetScentTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext);
static enum FieldMoveError FieldMoves_CheckChatter(const FieldMoveContext *fieldMoveContext);
static void FieldMoves_SetChatterTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext);
static BOOL FieldMoves_ChatterTask(FieldTask *taskMan);
static enum FieldMoveError FieldMoves_CheckCut(const FieldMoveContext *fieldMoveContext);
static void FieldMoves_SetCutTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext);
static BOOL FieldMoves_CutTask(FieldTask *taskMan);
static const FieldMoveTaskOrError fieldMoveTaskOrError[] = {
{ FieldMoves_SetCutTask, FieldMoves_CheckCut },
{ FieldMoves_SetFlyTask, FieldMoves_CheckFly },
{ FieldMoves_SetSurfTask, FieldMoves_CheckSurf },
{ FieldMoves_SetStrengthTask, FieldMoves_CheckStrength },
{ FieldMoves_SetDefogTask, FieldMoves_CheckDefog },
{ FieldMoves_SetRockSmashTask, FieldMoves_CheckRockSmash },
{ FieldMoves_SetWaterfallTask, FieldMoves_CheckWaterfall },
{ FieldMoves_SetRockClimbTask, FieldMoves_CheckRockClimb },
{ FieldMoves_SetFlashTask, FieldMoves_CheckFlash },
{ FieldMoves_SetTeleportTask, FieldMoves_CheckTeleport },
{ FieldMoves_SetDigTask, FieldMoves_CheckDig },
{ FieldMoves_SetSweetScentTask, FieldMoves_CheckSweetScent },
{ FieldMoves_SetChatterTask, FieldMoves_CheckChatter },
};
static inline BOOL FieldMoves_IsMoveUsable(const FieldMoveContext *fieldMoveContext, enum FieldMoveList fieldMove)
{
if ((fieldMoveContext->usableMoves & FIELD_MOVE_FLAG(fieldMove)) != 0) {
return TRUE;
}
return FALSE;
}
static inline BOOL PlayerHasRequiredBadge(const FieldMoveContext *fieldMoveContext, enum Badge badge)
{
return TrainerInfo_HasBadge(SaveData_GetTrainerInfo(fieldMoveContext->fieldSystem->saveData), badge);
}
static inline BOOL PlayerTravellingWithPartner(const FieldMoveContext *fieldMoveContext)
{
return SystemFlag_CheckHasPartner(SaveData_GetVarsFlags(fieldMoveContext->fieldSystem->saveData));
}
static inline BOOL PlayerInSafariZoneOrPalPark(const FieldMoveContext *fieldMoveContext)
{
if ((SystemFlag_CheckSafariGameActive(SaveData_GetVarsFlags(fieldMoveContext->fieldSystem->saveData)) == TRUE) || (SystemFlag_CheckInPalPark(SaveData_GetVarsFlags(fieldMoveContext->fieldSystem->saveData)) == TRUE)) {
return TRUE;
}
return FALSE;
}
static inline BOOL PlayerInPalPark(const FieldMoveContext *fieldMoveContext)
{
if (SystemFlag_CheckInPalPark(SaveData_GetVarsFlags(fieldMoveContext->fieldSystem->saveData)) == TRUE) {
return TRUE;
}
return FALSE;
}
static inline BOOL PlayerOutsideLinkRoom(const FieldMoveContext *fieldMoveContext)
{
if ((fieldMoveContext->fieldSystem->mapLoadType == MAP_LOAD_TYPE_COLOSSEUM) || (fieldMoveContext->fieldSystem->mapLoadType == MAP_LOAD_TYPE_UNION)) {
return FALSE;
}
return TRUE;
}
void *FieldMove_GetTaskOrError(u16 taskOrError, u16 fieldMove)
{
if (taskOrError == FIELD_MOVE_TASK) {
return fieldMoveTaskOrError[fieldMove].task;
}
return fieldMoveTaskOrError[fieldMove].error;
}
void FieldMoves_SetUsableMoves(FieldSystem *fieldSystem, FieldMoveContext *fieldMoveContext)
{
MapObject *mapObj;
int playerX, playerY;
int nextTileBehavior;
int currTileBehavior;
fieldMoveContext->fieldSystem = fieldSystem;
fieldMoveContext->mapId = fieldSystem->location->mapId;
fieldMoveContext->usableMoves = 0;
if (PlayerAvatar_DistortionGravityChanged(fieldSystem->playerAvatar) == TRUE) {
FieldMoves_CanUseSurfDistortionWorld(fieldSystem, fieldMoveContext);
return;
}
sub_0203C9D4(fieldSystem, &mapObj);
fieldMoveContext->mapObj = mapObj;
if (mapObj != NULL) {
switch (MapObject_GetGraphicsID(mapObj)) {
case OBJ_EVENT_GFX_STRENGTH_BOULDER:
fieldMoveContext->usableMoves |= FIELD_MOVE_FLAG(FIELD_MOVE_STRENGTH);
break;
case OBJ_EVENT_GFX_ROCK_SMASH:
fieldMoveContext->usableMoves |= FIELD_MOVE_FLAG(FIELD_MOVE_ROCK_SMASH);
break;
case OBJ_EVENT_GFX_CUT_TREE:
fieldMoveContext->usableMoves |= FIELD_MOVE_FLAG(FIELD_MOVE_CUT);
break;
}
}
playerX = Player_GetXPos(fieldSystem->playerAvatar);
playerY = Player_GetZPos(fieldSystem->playerAvatar);
currTileBehavior = TerrainCollisionManager_GetTileBehavior(fieldSystem, playerX, playerY);
PlayerAvatar_GetFacingTileCoords(fieldSystem->playerAvatar, &playerX, &playerY);
nextTileBehavior = TerrainCollisionManager_GetTileBehavior(fieldSystem, playerX, playerY);
if (PlayerAvatar_CanUseSurf(fieldSystem->playerAvatar, currTileBehavior, nextTileBehavior)) {
fieldMoveContext->usableMoves |= FIELD_MOVE_FLAG(FIELD_MOVE_SURF);
}
if (PlayerAvatar_CanUseRockClimb(nextTileBehavior, PlayerAvatar_GetDir(fieldSystem->playerAvatar))) {
fieldMoveContext->usableMoves |= FIELD_MOVE_FLAG(FIELD_MOVE_ROCK_CLIMB);
}
if (TileBehavior_IsWaterfall(nextTileBehavior)) {
fieldMoveContext->usableMoves |= FIELD_MOVE_FLAG(FIELD_MOVE_WATERFALL);
}
switch (FieldOverworldState_GetWeather(SaveData_GetFieldOverworldState(fieldSystem->saveData))) {
case OVERWORLD_WEATHER_FOG:
fieldMoveContext->usableMoves |= FIELD_MOVE_FLAG(FIELD_MOVE_DEFOG);
break;
case OVERWORLD_WEATHER_DARK_FLASH:
fieldMoveContext->usableMoves |= FIELD_MOVE_FLAG(FIELD_MOVE_FLASH);
break;
}
}
static void FieldMoves_CanUseSurfDistortionWorld(FieldSystem *fieldSystem, FieldMoveContext *fieldMoveContext)
{
int distortionDir;
u32 currTileBehavior, nextTileBehavior;
distortionDir = PlayerAvatar_GetDistortionDir(fieldSystem->playerAvatar);
nextTileBehavior = PlayerAvatar_GetDistortionTileBehaviour(fieldSystem->playerAvatar, distortionDir);
currTileBehavior = PlayerAvatar_GetDistortionCurrTileBehaviour(fieldSystem->playerAvatar);
if (PlayerAvatar_CanUseSurf(fieldSystem->playerAvatar, currTileBehavior, nextTileBehavior) == TRUE) {
fieldMoveContext->usableMoves |= FIELD_MOVE_FLAG(FIELD_MOVE_SURF);
}
}
static FieldMoveTaskData *FieldMoves_AllocateTaskData(const FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext)
{
FieldMoveTaskData *taskData = Heap_AllocFromHeap(HEAP_ID_FIELD_TASK, sizeof(FieldMoveTaskData));
taskData->magicNumber = 0x19740205;
taskData->mapObj = fieldMoveContext->mapObj;
taskData->fieldMoveMon = *fieldMoveMon;
return taskData;
}
static void FieldMoves_FreeTaskData(FieldMoveTaskData *taskData)
{
GF_ASSERT(taskData->magicNumber == 0x19740205);
Heap_FreeToHeap(taskData);
}
static enum FieldMoveError FieldMoves_CheckCut(const FieldMoveContext *fieldMoveContext)
{
if (PlayerOutsideLinkRoom(fieldMoveContext) == FALSE) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (PlayerHasRequiredBadge(fieldMoveContext, BADGE_ID_FOREST) == FALSE) {
return FIELD_MOVE_ERROR_BADGE;
}
if (FieldMoves_IsMoveUsable(fieldMoveContext, FIELD_MOVE_CUT)) {
return FIELD_MOVE_ERROR_NONE;
}
return FIELD_MOVE_ERROR_LOCATION;
}
static void FieldMoves_SetCutTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext)
{
StartMenu *menu = FieldTask_GetEnv(fieldMoveMon->fieldTask);
FieldMoveTaskData *taskData = FieldMoves_AllocateTaskData(fieldMoveMon, fieldMoveContext);
FieldSystem_StartFieldMap(fieldMoveContext->fieldSystem);
menu->callback = FieldMoves_CutTask;
menu->taskData = taskData;
menu->state = START_MENU_STATE_10;
}
static BOOL FieldMoves_CutTask(FieldTask *taskMan)
{
FieldMoveTaskData *taskData = FieldTask_GetEnv(taskMan);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
ScriptManager_Change(taskMan, 10008, taskData->mapObj);
FieldSystem_SetScriptParameters(fieldSystem, taskData->fieldMoveMon.fieldMonId, 0, 0, 0);
FieldMoves_FreeTaskData(taskData);
return 0;
}
static enum FieldMoveError FieldMoves_CheckFly(const FieldMoveContext *fieldMoveContext)
{
if (PlayerOutsideLinkRoom(fieldMoveContext) == FALSE) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (PlayerHasRequiredBadge(fieldMoveContext, BADGE_ID_COBBLE) == FALSE) {
return FIELD_MOVE_ERROR_BADGE;
}
if (MapHeader_IsFlyAllowed(fieldMoveContext->mapId) == FALSE) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (PlayerTravellingWithPartner(fieldMoveContext) == TRUE) {
return FIELD_MOVE_ERROR_PARTNER;
}
if (PlayerInSafariZoneOrPalPark(fieldMoveContext) == TRUE) {
return FIELD_MOVE_ERROR_LOCATION;
}
return FIELD_MOVE_ERROR_NONE;
}
static void FieldMoves_SetFlyTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext)
{
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldMoveMon->fieldTask);
StartMenu *menu = FieldTask_GetEnv(fieldMoveMon->fieldTask);
u32 *fieldMonID = Heap_AllocFromHeap(HEAP_ID_FIELDMAP, sizeof(u32));
*fieldMonID = fieldMoveMon->fieldMonId;
menu->unk_260 = fieldMonID;
menu->taskData = Heap_AllocFromHeap(HEAP_ID_FIELDMAP, sizeof(UnkStruct_0203D8AC));
sub_0206B70C(fieldSystem, menu->taskData, 1);
sub_0203D884(fieldSystem, menu->taskData);
sub_0203B674(menu, sub_0203C434);
}
static enum FieldMoveError FieldMoves_CheckSurf(const FieldMoveContext *fieldMoveContext)
{
if (PlayerOutsideLinkRoom(fieldMoveContext) == FALSE) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (PlayerHasRequiredBadge(fieldMoveContext, BADGE_ID_FEN) == FALSE) {
return FIELD_MOVE_ERROR_BADGE;
}
if (PlayerAvatar_GetPlayerState(fieldMoveContext->fieldSystem->playerAvatar) == 0x2) {
return FIELD_MOVE_ERROR_STATE;
}
if (!(FieldMoves_IsMoveUsable(fieldMoveContext, FIELD_MOVE_SURF))) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (PlayerTravellingWithPartner(fieldMoveContext) == TRUE) {
return FIELD_MOVE_ERROR_PARTNER;
}
return FIELD_MOVE_ERROR_NONE;
}
static void FieldMoves_SetSurfTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext)
{
StartMenu *menu = FieldTask_GetEnv(fieldMoveMon->fieldTask);
FieldMoveTaskData *taskData = FieldMoves_AllocateTaskData(fieldMoveMon, fieldMoveContext);
FieldSystem_StartFieldMap(fieldMoveContext->fieldSystem);
menu->callback = FieldMoves_SurfTask;
menu->taskData = taskData;
menu->state = START_MENU_STATE_10;
}
static BOOL FieldMoves_SurfTask(FieldTask *taskMan)
{
FieldMoveTaskData *taskData = FieldTask_GetEnv(taskMan);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
ScriptManager_Change(taskMan, 10012, NULL);
FieldSystem_SetScriptParameters(fieldSystem, taskData->fieldMoveMon.fieldMonId, 0, 0, 0);
FieldMoves_FreeTaskData(taskData);
return 0;
}
static enum FieldMoveError FieldMoves_CheckStrength(const FieldMoveContext *fieldMoveContext)
{
if (PlayerOutsideLinkRoom(fieldMoveContext) == FALSE) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (PlayerHasRequiredBadge(fieldMoveContext, BADGE_ID_MINE) == FALSE) {
return FIELD_MOVE_ERROR_BADGE;
}
if (FieldMoves_IsMoveUsable(fieldMoveContext, FIELD_MOVE_STRENGTH)) {
return FIELD_MOVE_ERROR_NONE;
}
return FIELD_MOVE_ERROR_LOCATION;
}
static void FieldMoves_SetStrengthTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext)
{
StartMenu *menu = FieldTask_GetEnv(fieldMoveMon->fieldTask);
FieldMoveTaskData *taskData = FieldMoves_AllocateTaskData(fieldMoveMon, fieldMoveContext);
FieldSystem_StartFieldMap(fieldMoveContext->fieldSystem);
menu->callback = FieldMoves_StrengthTask;
menu->taskData = taskData;
menu->state = START_MENU_STATE_10;
}
static BOOL FieldMoves_StrengthTask(FieldTask *param0)
{
FieldMoveTaskData *taskData = FieldTask_GetEnv(param0);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(param0);
ScriptManager_Change(param0, 10010, taskData->mapObj);
FieldSystem_SetScriptParameters(fieldSystem, taskData->fieldMoveMon.fieldMonId, 0, 0, 0);
FieldMoves_FreeTaskData(taskData);
return 0;
}
static enum FieldMoveError FieldMoves_CheckDefog(const FieldMoveContext *fieldMoveContext)
{
if (PlayerOutsideLinkRoom(fieldMoveContext) == FALSE) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (PlayerHasRequiredBadge(fieldMoveContext, BADGE_ID_RELIC) == FALSE) {
return FIELD_MOVE_ERROR_BADGE;
}
if (FieldMoves_IsMoveUsable(fieldMoveContext, FIELD_MOVE_DEFOG)) {
return FIELD_MOVE_ERROR_NONE;
}
return FIELD_MOVE_ERROR_LOCATION;
}
static void FieldMoves_SetDefogTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext)
{
StartMenu *menu = FieldTask_GetEnv(fieldMoveMon->fieldTask);
FieldMoveTaskData *taskData = FieldMoves_AllocateTaskData(fieldMoveMon, fieldMoveContext);
FieldSystem_StartFieldMap(fieldMoveContext->fieldSystem);
menu->callback = FieldMoves_DefogTask;
menu->taskData = taskData;
menu->state = START_MENU_STATE_10;
}
static BOOL FieldMoves_DefogTask(FieldTask *taskMan)
{
FieldMoveTaskData *taskData = FieldTask_GetEnv(taskMan);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
ScriptManager_Change(taskMan, 10014, NULL);
FieldSystem_SetScriptParameters(fieldSystem, taskData->fieldMoveMon.fieldMonId, 0, 0, 0);
FieldMoves_FreeTaskData(taskData);
return 0;
}
static enum FieldMoveError FieldMoves_CheckRockSmash(const FieldMoveContext *fieldMoveContext)
{
if (PlayerOutsideLinkRoom(fieldMoveContext) == FALSE) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (PlayerHasRequiredBadge(fieldMoveContext, BADGE_ID_COAL) == FALSE) {
return FIELD_MOVE_ERROR_BADGE;
}
if (PlayerAvatar_GetPlayerState(fieldMoveContext->fieldSystem->playerAvatar) == 0x2) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (FieldMoves_IsMoveUsable(fieldMoveContext, FIELD_MOVE_ROCK_SMASH)) {
return FIELD_MOVE_ERROR_NONE;
}
return FIELD_MOVE_ERROR_LOCATION;
}
static void FieldMoves_SetRockSmashTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext)
{
StartMenu *menu = FieldTask_GetEnv(fieldMoveMon->fieldTask);
FieldMoveTaskData *taskData = FieldMoves_AllocateTaskData(fieldMoveMon, fieldMoveContext);
FieldSystem_StartFieldMap(fieldMoveContext->fieldSystem);
menu->callback = FieldMoves_RockSmashTask;
menu->taskData = taskData;
menu->state = START_MENU_STATE_10;
}
static BOOL FieldMoves_RockSmashTask(FieldTask *taskMan)
{
FieldMoveTaskData *taskData = FieldTask_GetEnv(taskMan);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
ScriptManager_Change(taskMan, 10009, taskData->mapObj);
FieldSystem_SetScriptParameters(fieldSystem, taskData->fieldMoveMon.fieldMonId, 0, 0, 0);
FieldMoves_FreeTaskData(taskData);
return 0;
}
static enum FieldMoveError FieldMoves_CheckWaterfall(const FieldMoveContext *fieldMoveContext)
{
if (PlayerOutsideLinkRoom(fieldMoveContext) == FALSE) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (PlayerHasRequiredBadge(fieldMoveContext, BADGE_ID_BEACON) == FALSE) {
return FIELD_MOVE_ERROR_BADGE;
}
if (FieldMoves_IsMoveUsable(fieldMoveContext, FIELD_MOVE_WATERFALL)) {
return FIELD_MOVE_ERROR_NONE;
}
return FIELD_MOVE_ERROR_LOCATION;
}
static void FieldMoves_SetWaterfallTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext)
{
StartMenu *menu = FieldTask_GetEnv(fieldMoveMon->fieldTask);
FieldMoveTaskData *taskData = FieldMoves_AllocateTaskData(fieldMoveMon, fieldMoveContext);
FieldSystem_StartFieldMap(fieldMoveContext->fieldSystem);
menu->callback = FieldMoves_WaterfallTask;
menu->taskData = taskData;
menu->state = START_MENU_STATE_10;
}
static BOOL FieldMoves_WaterfallTask(FieldTask *param0)
{
FieldMoveTaskData *taskData = FieldTask_GetEnv(param0);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(param0);
ScriptManager_Change(param0, 10013, NULL);
FieldSystem_SetScriptParameters(fieldSystem, taskData->fieldMoveMon.fieldMonId, 0, 0, 0);
FieldMoves_FreeTaskData(taskData);
return 0;
}
static enum FieldMoveError FieldMoves_CheckRockClimb(const FieldMoveContext *fieldMoveContext)
{
if (PlayerOutsideLinkRoom(fieldMoveContext) == FALSE) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (PlayerHasRequiredBadge(fieldMoveContext, BADGE_ID_ICICLE) == FALSE) {
return FIELD_MOVE_ERROR_BADGE;
}
if (!(FieldMoves_IsMoveUsable(fieldMoveContext, FIELD_MOVE_ROCK_CLIMB))) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (PlayerTravellingWithPartner(fieldMoveContext) == TRUE) {
return FIELD_MOVE_ERROR_PARTNER;
}
return FIELD_MOVE_ERROR_NONE;
}
static void FieldMoves_SetRockClimbTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext)
{
StartMenu *menu = FieldTask_GetEnv(fieldMoveMon->fieldTask);
FieldMoveTaskData *taskData = FieldMoves_AllocateTaskData(fieldMoveMon, fieldMoveContext);
FieldSystem_StartFieldMap(fieldMoveContext->fieldSystem);
menu->callback = FieldMoves_RockClimbTask;
menu->taskData = taskData;
menu->state = START_MENU_STATE_10;
}
static BOOL FieldMoves_RockClimbTask(FieldTask *taskMan)
{
FieldMoveTaskData *taskData = FieldTask_GetEnv(taskMan);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
ScriptManager_Change(taskMan, 10011, NULL);
FieldSystem_SetScriptParameters(fieldSystem, taskData->fieldMoveMon.fieldMonId, 0, 0, 0);
FieldMoves_FreeTaskData(taskData);
return 0;
}
static enum FieldMoveError FieldMoves_CheckFlash(const FieldMoveContext *fieldMoveContext)
{
if (PlayerOutsideLinkRoom(fieldMoveContext) == FALSE) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (FieldMoves_IsMoveUsable(fieldMoveContext, FIELD_MOVE_FLASH)) {
return FIELD_MOVE_ERROR_NONE;
}
return FIELD_MOVE_ERROR_LOCATION;
}
static void FieldMoves_SetFlashTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext)
{
StartMenu *menu = FieldTask_GetEnv(fieldMoveMon->fieldTask);
FieldMoveTaskData *taskData = FieldMoves_AllocateTaskData(fieldMoveMon, fieldMoveContext);
FieldSystem_StartFieldMap(fieldMoveContext->fieldSystem);
menu->callback = FieldMoves_FlashTask;
menu->taskData = taskData;
menu->state = START_MENU_STATE_10;
}
static BOOL FieldMoves_FlashTask(FieldTask *taskMan)
{
FieldMoveTaskData *taskData = FieldTask_GetEnv(taskMan);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
ScriptManager_Change(taskMan, 10015, NULL);
FieldSystem_SetScriptParameters(fieldSystem, taskData->fieldMoveMon.fieldMonId, 0, 0, 0);
FieldMoves_FreeTaskData(taskData);
return 0;
}
static enum FieldMoveError FieldMoves_CheckTeleport(const FieldMoveContext *fieldMoveContext)
{
if (PlayerOutsideLinkRoom(fieldMoveContext) == FALSE) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (MapHeader_IsTeleportAllowed(fieldMoveContext->mapId) == FALSE) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (PlayerTravellingWithPartner(fieldMoveContext) == TRUE) {
return FIELD_MOVE_ERROR_PARTNER;
}
if (PlayerInSafariZoneOrPalPark(fieldMoveContext) == TRUE) {
return FIELD_MOVE_ERROR_LOCATION;
}
return FIELD_MOVE_ERROR_NONE;
}
static void FieldMoves_SetTeleportTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext)
{
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldMoveMon->fieldTask);
StartMenu *menu = FieldTask_GetEnv(fieldMoveMon->fieldTask);
FieldSystem_StartFieldMap(fieldSystem);
UnkStruct_020711C8 *v2 = sub_020711C8(11, fieldMoveMon->fieldMonId, fieldSystem->saveData);
menu->callback = FieldMoves_TeleportTask;
menu->taskData = v2;
menu->state = START_MENU_STATE_10;
}
static BOOL FieldMoves_TeleportTask(FieldTask *param0)
{
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(param0);
UnkStruct_020711C8 *v1 = FieldTask_GetEnv(param0);
void *v2 = ov6_02247530(fieldSystem, v1->unk_00, 4);
Heap_FreeToHeap(v1);
FieldTask_InitJump(param0, ov6_02247554, v2);
return 0;
}
static enum FieldMoveError FieldMoves_CheckDig(const FieldMoveContext *fieldMoveContext)
{
if (PlayerOutsideLinkRoom(fieldMoveContext) == FALSE) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (!((MapHeader_IsCave(fieldMoveContext->mapId) == TRUE) && (MapHeader_IsEscapeRopeAllowed(fieldMoveContext->mapId) == TRUE))) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (PlayerTravellingWithPartner(fieldMoveContext) == TRUE) {
return FIELD_MOVE_ERROR_PARTNER;
}
return FIELD_MOVE_ERROR_NONE;
}
static void FieldMoves_SetDigTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext)
{
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldMoveMon->fieldTask);
StartMenu *v1 = FieldTask_GetEnv(fieldMoveMon->fieldTask);
FieldSystem_StartFieldMap(fieldSystem);
UnkStruct_020711C8 *v2 = sub_020711C8(11, fieldMoveMon->fieldMonId, fieldSystem->saveData);
v1->callback = FieldMoves_DigTask;
v1->taskData = v2;
v1->state = START_MENU_STATE_10;
}
static BOOL FieldMoves_DigTask(FieldTask *param0)
{
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(param0);
UnkStruct_020711C8 *v1 = FieldTask_GetEnv(param0);
void *v2 = ov6_02247488(fieldSystem, v1->unk_00, 11);
void *journalEntryLocationEvent = JournalEntry_CreateEventUsedMove(LOCATION_EVENT_USED_DIG - LOCATION_EVENT_USED_CUT, fieldSystem->location->mapId, HEAP_ID_FIELD);
JournalEntry_SaveData(fieldSystem->journalEntry, journalEntryLocationEvent, JOURNAL_LOCATION);
Heap_FreeToHeap(v1);
FieldTask_InitJump(param0, ov6_022474AC, v2);
return FALSE;
}
static enum FieldMoveError FieldMoves_CheckSweetScent(const FieldMoveContext *fieldMoveContext)
{
if (PlayerOutsideLinkRoom(fieldMoveContext) == FALSE) {
return FIELD_MOVE_ERROR_LOCATION;
}
if (PlayerInPalPark(fieldMoveContext) == TRUE) {
return FIELD_MOVE_ERROR_LOCATION;
}
return FIELD_MOVE_ERROR_NONE;
}
static void FieldMoves_SetSweetScentTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext)
{
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldMoveMon->fieldTask);
StartMenu *startMenu = FieldTask_GetEnv(fieldMoveMon->fieldTask);
UnkStruct_020711C8 *v2 = sub_020711C8(11, fieldMoveMon->fieldMonId, fieldSystem->saveData);
int unused;
void *v4;
FieldSystem_StartFieldMap(fieldSystem);
startMenu->callback = ov5_021F101C;
startMenu->taskData = v2;
startMenu->state = START_MENU_STATE_10;
v4 = JournalEntry_CreateEventUsedMove(LOCATION_EVENT_LURED_POKEMON - LOCATION_EVENT_USED_CUT, fieldSystem->location->mapId, HEAP_ID_FIELDMAP);
JournalEntry_SaveData(fieldSystem->journalEntry, v4, JOURNAL_LOCATION);
}
static enum FieldMoveError FieldMoves_CheckChatter(const FieldMoveContext *fieldMoveContext)
{
if ((PlayerOutsideLinkRoom(fieldMoveContext) == FALSE) || (PersistedMapFeatures_IsCurrentDynamicMap(fieldMoveContext->fieldSystem, 9) == TRUE)) {
return FIELD_MOVE_ERROR_LOCATION;
}
return FIELD_MOVE_ERROR_NONE;
}
static void FieldMoves_SetChatterTask(FieldMovePokemon *fieldMoveMon, const FieldMoveContext *fieldMoveContext)
{
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(fieldMoveMon->fieldTask);
StartMenu *menu = FieldTask_GetEnv(fieldMoveMon->fieldTask);
FieldMoveTaskData *taskData = FieldMoves_AllocateTaskData(fieldMoveMon, fieldMoveContext);
FieldSystem_StartFieldMap(fieldSystem);
menu->callback = FieldMoves_ChatterTask;
menu->taskData = taskData;
menu->state = START_MENU_STATE_10;
}
static BOOL FieldMoves_ChatterTask(FieldTask *taskMan)
{
FieldMoveTaskData *taskData = FieldTask_GetEnv(taskMan);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
ScriptManager_Change(taskMan, 8900, NULL);
FieldSystem_SetScriptParameters(fieldSystem, taskData->fieldMoveMon.fieldMonId, 0, 0, 0);
FieldMoves_FreeTaskData(taskData);
return 0;
}

View File

@ -263,7 +263,7 @@ pokeplatinum_c = files(
'unk_0206F314.c',
'unk_02070428.c',
'unk_0207064C.c',
'unk_0207070C.c',
'field_move_tasks.c',
'unk_020711C8.c',
'unk_020711EC.c',
'platform_lift.c',

View File

@ -297,8 +297,8 @@ BOOL FieldInput_Process(const FieldInput *input, FieldSystem *fieldSystem)
}
}
int distortionDir = sub_0205EAA0(fieldSystem->playerAvatar);
u32 distortionBehavior = sub_020616F0(fieldSystem->playerAvatar, distortionDir);
int distortionDir = PlayerAvatar_GetDistortionDir(fieldSystem->playerAvatar);
u32 distortionBehavior = PlayerAvatar_GetDistortionTileBehaviour(fieldSystem->playerAvatar, distortionDir);
int distortionScript = Field_TileBehaviorToScript(fieldSystem, distortionBehavior);
if (distortionScript != 0xffff) {
@ -680,15 +680,15 @@ u16 Field_TileBehaviorToScript(FieldSystem *fieldSystem, u8 behavior)
return 10100;
}
if (ov5_021E0760(behavior, playerDir)) {
if (PlayerAvatar_CanUseRockClimb(behavior, playerDir)) {
return 10003;
}
if (PlayerAvatar_GetPlayerState(fieldSystem->playerAvatar) != PLAYER_STATE_SURFING) {
TrainerInfo *info = SaveData_GetTrainerInfo(fieldSystem->saveData);
u32 distortionBehavior = sub_02061760(fieldSystem->playerAvatar);
u32 distortionBehavior = PlayerAvatar_GetDistortionCurrTileBehaviour(fieldSystem->playerAvatar);
if (ov5_021E0118(fieldSystem->playerAvatar, distortionBehavior, behavior) && TrainerInfo_HasBadge(info, 3)) {
if (PlayerAvatar_CanUseSurf(fieldSystem->playerAvatar, distortionBehavior, behavior) && TrainerInfo_HasBadge(info, 3)) {
if (Party_HasMonWithMove(SaveData_GetParty(fieldSystem->saveData), MOVE_SURF) != PARTY_SLOT_NONE) {
return 10004;
}

View File

@ -593,12 +593,12 @@ void ov5_021E00EC(FieldTask *taskMan, int param1, int param2)
ov5_021E00B0(fieldSystem, param1, &v0);
}
int ov5_021E0118(PlayerAvatar *playerAvatar, u32 param1, u32 param2)
int PlayerAvatar_CanUseSurf(PlayerAvatar *playerAvatar, u32 currTileBehavior, u32 nextTileBehavior)
{
MapObject *v0 = Player_MapObject(playerAvatar);
if (TileBehavior_IsSurfable(param2) == 1) {
if ((TileBehavior_IsBridge(param1) == 1) || (TileBehavior_IsBridgeStart(param1) == 1)) {
if (TileBehavior_IsSurfable(nextTileBehavior) == TRUE) {
if ((TileBehavior_IsBridge(currTileBehavior) == TRUE) || (TileBehavior_IsBridgeStart(currTileBehavior) == TRUE)) {
if (sub_02062F30(v0) == 1) {
return 0;
}
@ -974,24 +974,24 @@ void ov5_021E0734(FieldTask *param0, int param1, int param2)
ov5_021E06F8(fieldSystem, param1, &v0);
}
int ov5_021E0760(u32 param0, int param1)
BOOL PlayerAvatar_CanUseRockClimb(u32 metatileBehavior, int facingDir)
{
switch (param1) {
case 0:
case 1:
if (TileBehavior_IsRockClimbNorthSouth(param0) == 1) {
return 1;
switch (facingDir) {
case DIR_NORTH:
case DIR_SOUTH:
if (TileBehavior_IsRockClimbNorthSouth(metatileBehavior) == 1) {
return TRUE;
}
break;
case 2:
case 3:
if (TileBehavior_IsRockClimbEastWest(param0) == 1) {
return 1;
case DIR_WEST:
case DIR_EAST:
if (TileBehavior_IsRockClimbEastWest(metatileBehavior) == 1) {
return TRUE;
}
break;
}
return 0;
return FALSE;
}
static BOOL ov5_021E07A0(FieldTask *param0)
@ -1082,10 +1082,10 @@ static int ov5_021E08C0(UnkStruct_ov5_021F9B54 *param0)
}
{
int v0 = MapObject_GetMovingDir(param0->unk_14);
u8 v1 = MapObject_GetTileBehaviorFromDir(param0->unk_14, v0);
int facingDir = MapObject_GetMovingDir(param0->unk_14);
u8 metatileBehaviour = MapObject_GetTileBehaviorFromDir(param0->unk_14, facingDir);
if (ov5_021E0760(v1, v0) == 1) {
if (PlayerAvatar_CanUseRockClimb(metatileBehaviour, facingDir) == TRUE) {
param0->unk_00 = 5;
return 1 + 1;
}

View File

@ -210,7 +210,7 @@ int PlayerAvatar_GetMoveDir(PlayerAvatar *const playerAvatar)
return MapObject_GetMovingDir(Player_MapObject(playerAvatar));
}
int sub_0205EAA0(PlayerAvatar *const playerAvatar)
int PlayerAvatar_GetDistortionDir(PlayerAvatar *const playerAvatar)
{
if (PlayerAvatar_DistortionStateOnFloor(playerAvatar) == TRUE) {
return PlayerAvatar_GetDir(playerAvatar);

View File

@ -15,14 +15,12 @@
#include "struct_defs/struct_0203D8AC.h"
#include "struct_defs/struct_02068630.h"
#include "struct_defs/struct_020708E0.h"
#include "struct_defs/struct_020709CC.h"
#include "struct_defs/struct_02072014.h"
#include "struct_defs/struct_02097728.h"
#include "struct_defs/struct_02098C44.h"
#include "applications/pokemon_summary_screen/main.h"
#include "field/field_system.h"
#include "functypes/funcptr_0203B7C0.h"
#include "functypes/funcptr_0203BC5C.h"
#include "overlay005/fieldmap.h"
#include "overlay005/ov5_021D2F14.h"
@ -33,6 +31,7 @@
#include "bg_window.h"
#include "catching_show.h"
#include "dexmode_checker.h"
#include "field_move_tasks.h"
#include "field_overworld_state.h"
#include "field_system.h"
#include "field_task.h"
@ -82,7 +81,6 @@
#include "unk_020683F4.h"
#include "unk_0206B9D8.h"
#include "unk_0207064C.h"
#include "unk_0207070C.h"
#include "unk_02071D40.h"
#include "unk_0207AE68.h"
#include "unk_0207CB08.h"
@ -346,7 +344,7 @@ static StartMenu *StartMenu_Alloc(void)
menu->state = START_MENU_STATE_INIT;
menu->unk_28 = 0;
menu->unk_25C = NULL;
menu->taskData = NULL;
return menu;
}
@ -415,7 +413,7 @@ static BOOL sub_0203AC44(FieldTask *taskMan)
case START_MENU_STATE_INIT:
MapObjectMan_PauseAllMovement(fieldSystem->mapObjMan);
sub_0206842C(fieldSystem, &menu->unk_230);
sub_02070728(fieldSystem, &menu->unk_24C);
FieldMoves_SetUsableMoves(fieldSystem, &menu->fieldMoveContext);
sub_0203ADFC(taskMan);
sub_0203B094(taskMan);
menu->state = START_MENU_STATE_SELECT;
@ -475,7 +473,7 @@ static BOOL sub_0203AC44(FieldTask *taskMan)
break;
case START_MENU_STATE_11:
if (IsScreenTransitionDone()) {
FieldTask_InitJump(taskMan, menu->unk_22C, menu->unk_25C);
FieldTask_InitJump(taskMan, menu->callback, menu->taskData);
Heap_FreeToHeap(menu);
}
break;
@ -893,7 +891,7 @@ static void StartMenu_ApplicationStart(FieldTask *taskMan)
Window_Remove(&menu->unk_00);
sub_0203B200(taskMan);
menu->unk_22C(taskMan);
menu->callback(taskMan);
menu->state = START_MENU_STATE_APP_RUN;
}
@ -909,12 +907,12 @@ static void StartMenu_ApplicationRun(FieldTask *taskMan)
return;
}
menu->unk_22C(taskMan);
menu->callback(taskMan);
}
void sub_0203B674(StartMenu *menu, void *param1)
{
menu->unk_22C = param1;
menu->callback = param1;
menu->state = START_MENU_STATE_APP_RUN;
}
@ -924,7 +922,7 @@ static BOOL StartMenu_SelectPokedex(FieldTask *taskMan)
ov5_021D1744(0);
menu->unk_22C = StartMenu_OpenPokedex;
menu->callback = StartMenu_OpenPokedex;
menu->state = START_MENU_STATE_APP_START;
return TRUE;
@ -950,8 +948,8 @@ static BOOL StartMenu_OpenPokedex(FieldTask *taskMan)
sub_0203E0AC(fieldSystem, pokedexArgs);
menu->unk_25C = pokedexArgs;
menu->unk_22C = StartMenu_PokedexEnd;
menu->taskData = pokedexArgs;
menu->callback = StartMenu_PokedexEnd;
return FALSE;
}
@ -966,8 +964,8 @@ static BOOL StartMenu_PokedexEnd(FieldTask *taskMan)
FieldSystem_StartFieldMap(fieldSystem);
if (menu->unk_25C != NULL) {
Heap_FreeToHeapExplicit(HEAP_ID_FIELDMAP, menu->unk_25C);
if (menu->taskData != NULL) {
Heap_FreeToHeapExplicit(HEAP_ID_FIELDMAP, menu->taskData);
}
menu->state = START_MENU_STATE_12;
@ -981,7 +979,7 @@ static BOOL StartMenu_SelectPokemon(FieldTask *taskMan)
ov5_021D1744(0);
menu->unk_22C = sub_0203B78C;
menu->callback = sub_0203B78C;
menu->state = START_MENU_STATE_APP_START;
return TRUE;
@ -995,8 +993,8 @@ static BOOL sub_0203B78C(FieldTask *taskMan)
fieldSystem = FieldTask_GetFieldSystem(taskMan);
menu = FieldTask_GetEnv(taskMan);
menu->unk_25C = sub_0203D390(fieldSystem, &menu->unk_24C, 0);
menu->unk_22C = sub_0203B7C0;
menu->taskData = sub_0203D390(fieldSystem, &menu->fieldMoveContext, 0);
menu->callback = sub_0203B7C0;
return 0;
}
@ -1011,8 +1009,8 @@ BOOL sub_0203B7C0(FieldTask *taskMan)
menu = FieldTask_GetEnv(taskMan);
partyMan = (PartyManagementData *)Heap_AllocFromHeap(HEAP_ID_FIELDMAP, sizeof(PartyManagementData));
memcpy(partyMan, menu->unk_25C, sizeof(PartyManagementData));
Heap_FreeToHeap(menu->unk_25C);
memcpy(partyMan, menu->taskData, sizeof(PartyManagementData));
Heap_FreeToHeap(menu->taskData);
switch (partyMan->unk_23) {
case 1: {
@ -1034,7 +1032,7 @@ BOOL sub_0203B7C0(FieldTask *taskMan)
PokemonSummaryScreen_SetPlayerProfile(summary, SaveData_GetTrainerInfo(fieldSystem->saveData));
FieldSystem_OpenSummaryScreen(fieldSystem, summary);
menu->unk_25C = summary;
menu->taskData = summary;
sub_0203B674(menu, sub_0203C1C8);
} break;
case 4: {
@ -1061,7 +1059,7 @@ BOOL sub_0203B7C0(FieldTask *taskMan)
v5->unk_02 = 0;
menu->unk_260 = v5;
menu->unk_25C = summary;
menu->taskData = summary;
sub_0203B674(menu, sub_0203C1C8);
} break;
case 5: {
@ -1088,14 +1086,14 @@ BOOL sub_0203B7C0(FieldTask *taskMan)
v7->unk_02 = (u16)partyMan->unk_34;
menu->unk_260 = v7;
menu->unk_25C = summary;
menu->taskData = summary;
sub_0203B674(menu, sub_0203C1C8);
} break;
case 6: {
UnkStruct_02097728 *v8;
v8 = sub_0203D920(fieldSystem, 2, partyMan->selectedMonSlot, Item_MailNumber(partyMan->unk_24), 11);
menu->unk_25C = v8;
menu->taskData = v8;
if (partyMan->unk_20 == 10) {
menu->unk_260 = sub_0203C540(
@ -1114,7 +1112,7 @@ BOOL sub_0203B7C0(FieldTask *taskMan)
v10 = Party_GetPokemonBySlotIndex(SaveData_GetParty(fieldSystem->saveData), partyMan->selectedMonSlot);
v9 = sub_0203D984(fieldSystem, v10, 11);
menu->unk_25C = v9;
menu->taskData = v9;
menu->unk_260 = sub_0203C540(partyMan->unk_24, 2, partyMan->selectedMonSlot);
sub_0203B674(menu, sub_0203C558);
@ -1126,11 +1124,11 @@ BOOL sub_0203B7C0(FieldTask *taskMan)
Bag *bag = SaveData_GetBag(fieldSystem->saveData);
TrainerInfo *v12 = SaveData_GetTrainerInfo(fieldSystem->saveData);
menu->unk_25C = sub_0207D824(bag, Unk_020EA020, HEAP_ID_FIELDMAP);
menu->taskData = sub_0207D824(bag, Unk_020EA020, HEAP_ID_FIELDMAP);
sub_0207CB2C(menu->unk_25C, fieldSystem->saveData, 1, fieldSystem->bagCursor);
sub_0207CB2C(menu->taskData, fieldSystem->saveData, 1, fieldSystem->bagCursor);
sub_0203D1E4(fieldSystem, menu->unk_25C);
sub_0203D1E4(fieldSystem, menu->taskData);
sub_0203B674(menu, sub_0203BC5C);
} break;
case 8: {
@ -1142,7 +1140,7 @@ BOOL sub_0203B7C0(FieldTask *taskMan)
v14->unk_04 = partyMan->unk_38;
v14->unk_08 = partyMan->unk_3C;
menu->unk_25C = v14;
menu->taskData = v14;
menu->state = START_MENU_STATE_EVOLVE_INIT;
} break;
case 9: {
@ -1153,7 +1151,7 @@ BOOL sub_0203B7C0(FieldTask *taskMan)
v15->unk_00 = partyMan->selectedMonSlot;
v15->unk_04 = partyMan->unk_38;
v15->unk_08 = partyMan->unk_3C;
menu->unk_25C = v15;
menu->taskData = v15;
menu->state = START_MENU_STATE_EVOLVE_INIT;
} break;
case 16:
@ -1169,33 +1167,33 @@ BOOL sub_0203B7C0(FieldTask *taskMan)
case 21:
case 22:
case 23:
UnkFuncPtr_0203B7C0 v16;
UnkStruct_020709CC v17;
FieldMoveTaskContext v16;
FieldMovePokemon fieldMoveMon;
v17.unk_06 = partyMan->unk_23 - 11;
v17.unk_04 = partyMan->selectedMonSlot;
v17.unk_00 = taskMan;
fieldMoveMon.fieldMove = partyMan->unk_23 - 11;
fieldMoveMon.fieldMonId = partyMan->selectedMonSlot;
fieldMoveMon.fieldTask = taskMan;
v16 = (UnkFuncPtr_0203B7C0)sub_0207070C(0, v17.unk_06);
v16(&v17, &menu->unk_24C);
v16 = (FieldMoveTaskContext)FieldMove_GetTaskOrError(FIELD_MOVE_TASK, fieldMoveMon.fieldMove);
v16(&fieldMoveMon, &menu->fieldMoveContext);
break;
case 10:
menu->unk_25C = sub_0203D20C(fieldSystem, &menu->unk_230);
menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230);
sub_0203B674(menu, sub_0203BC5C);
break;
default:
if ((partyMan->unk_20 == 5) || (partyMan->unk_20 == 6) || (partyMan->unk_20 == 7) || (partyMan->unk_20 == 16) || (partyMan->unk_20 == 8)) {
menu->unk_25C = sub_0203D20C(fieldSystem, &menu->unk_230);
menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230);
if (partyMan->selectedMonSlot >= 6) {
sub_0207CB70(menu->unk_25C, 0);
sub_0207CB70(menu->taskData, 0);
} else {
sub_0207CB70(menu->unk_25C, partyMan->selectedMonSlot);
sub_0207CB70(menu->taskData, partyMan->selectedMonSlot);
}
sub_0203B674(menu, sub_0203BC5C);
} else if (partyMan->unk_20 == 9) {
menu->unk_25C = sub_0203D20C(fieldSystem, &menu->unk_230);
menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230);
sub_0203B674(menu, sub_0203BC5C);
} else {
FieldSystem_StartFieldMap(fieldSystem);
@ -1214,7 +1212,7 @@ static BOOL StartMenu_SelectBag(FieldTask *taskMan)
ov5_021D1744(0);
menu->unk_22C = StartMenu_Bag;
menu->callback = StartMenu_Bag;
menu->state = START_MENU_STATE_APP_START;
return TRUE;
@ -1225,9 +1223,9 @@ static BOOL StartMenu_Bag(FieldTask *taskMan)
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
StartMenu *menu = FieldTask_GetEnv(taskMan);
menu->unk_25C = sub_0203D20C(fieldSystem, &menu->unk_230);
sub_0207CB70(menu->unk_25C, 0);
menu->unk_22C = sub_0203BC5C;
menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230);
sub_0207CB70(menu->taskData, 0);
menu->callback = sub_0203BC5C;
FieldSystem_SaveStateIfCommunicationOff(fieldSystem);
@ -1244,8 +1242,8 @@ static BOOL sub_0203BC5C(FieldTask *taskMan)
menu = FieldTask_GetEnv(taskMan);
v2 = sub_0207CB08(HEAP_ID_FIELDMAP);
memcpy(v2, menu->unk_25C, sub_0207CB20());
Heap_FreeToHeap(menu->unk_25C);
memcpy(v2, menu->taskData, sub_0207CB20());
Heap_FreeToHeap(menu->taskData);
switch (sub_0207CB9C(v2)) {
case 0: {
@ -1273,14 +1271,14 @@ static BOOL sub_0203BC5C(FieldTask *taskMan)
v6->unk_04 = SaveData_GetBag(fieldSystem->saveData);
v6->unk_08 = sub_02028430(fieldSystem->saveData);
v6->unk_0C = SaveData_GetOptions(fieldSystem->saveData);
v6->unk_18 = &menu->unk_24C;
v6->unk_18 = &menu->fieldMoveContext;
v6->unk_21 = 0;
v6->unk_20 = 9;
v6->unk_24 = sub_0207CB94(v2);
v6->unk_1C = fieldSystem;
FieldSystem_StartChildProcess(fieldSystem, &Unk_020F1E88, v6);
menu->unk_25C = v6;
menu->taskData = v6;
sub_0203B674(menu, sub_0203B7C0);
} break;
case 4: {
@ -1301,7 +1299,7 @@ static BOOL sub_0203BC5C(FieldTask *taskMan)
UnkStruct_0203C540 *v12;
v11 = sub_0203D920(fieldSystem, 2, v9, Item_MailNumber(v10), 11);
menu->unk_25C = v11;
menu->taskData = v11;
menu->unk_260 = sub_0203C540(v10, 0, (u8)v9);
sub_0203B674(menu, sub_0203C558);
} else {
@ -1314,7 +1312,7 @@ static BOOL sub_0203BC5C(FieldTask *taskMan)
v13->unk_04 = SaveData_GetBag(fieldSystem->saveData);
v13->unk_08 = sub_02028430(fieldSystem->saveData);
v13->unk_0C = SaveData_GetOptions(fieldSystem->saveData);
v13->unk_18 = &menu->unk_24C;
v13->unk_18 = &menu->fieldMoveContext;
v13->unk_21 = 0;
v13->unk_24 = sub_0207CB94(v2);
v13->selectedMonSlot = (u8)v9;
@ -1327,7 +1325,7 @@ static BOOL sub_0203BC5C(FieldTask *taskMan)
}
FieldSystem_StartChildProcess(fieldSystem, &Unk_020F1E88, v13);
menu->unk_25C = v13;
menu->taskData = v13;
sub_0203B674(menu, sub_0203B7C0);
}
} break;
@ -1348,7 +1346,7 @@ static BOOL StartMenu_SelectTrainerCard(FieldTask *taskMan)
ov5_021D1744(0);
menu->unk_22C = StartMenu_TrainerCard;
menu->callback = StartMenu_TrainerCard;
menu->state = START_MENU_STATE_APP_START;
return TRUE;
@ -1362,12 +1360,12 @@ static BOOL StartMenu_TrainerCard(FieldTask *taskMan)
fieldSystem = FieldTask_GetFieldSystem(taskMan);
menu = FieldTask_GetEnv(taskMan);
menu->unk_25C = sub_02071F04(HEAP_ID_FIELDMAP);
menu->taskData = sub_02071F04(HEAP_ID_FIELDMAP);
sub_02071D40(1, 1, 0, 0xff, fieldSystem, (TrainerCard *)menu->unk_25C);
sub_0203E09C(fieldSystem, (TrainerCard *)menu->unk_25C);
sub_02071D40(1, 1, 0, 0xff, fieldSystem, (TrainerCard *)menu->taskData);
sub_0203E09C(fieldSystem, (TrainerCard *)menu->taskData);
menu->unk_22C = sub_0203BF00;
menu->callback = sub_0203BF00;
return 0;
}
@ -1379,8 +1377,8 @@ static BOOL sub_0203BF00(FieldTask *taskMan)
fieldSystem = FieldTask_GetFieldSystem(taskMan);
menu = FieldTask_GetEnv(taskMan);
sub_020721D4(fieldSystem, (TrainerCard *)menu->unk_25C);
sub_02071F20((TrainerCard *)menu->unk_25C);
sub_020721D4(fieldSystem, (TrainerCard *)menu->taskData);
sub_02071F20((TrainerCard *)menu->taskData);
FieldSystem_StartFieldMap(fieldSystem);
menu->state = START_MENU_STATE_12;
@ -1412,8 +1410,8 @@ static void StartMenu_Save(FieldTask *taskMan)
if (SaveData_OverwriteCheck(fieldSystem->saveData)) {
ScriptManager_Start(taskMan, 2034, NULL, NULL);
} else {
menu->unk_25C = Heap_AllocFromHeap(HEAP_ID_FIELD_TASK, sizeof(SaveMenu));
saveMenu = menu->unk_25C;
menu->taskData = Heap_AllocFromHeap(HEAP_ID_FIELD_TASK, sizeof(SaveMenu));
saveMenu = menu->taskData;
saveMenu->unk_04 = 0;
ScriptManager_Start(taskMan, 2005, NULL, &saveMenu->unk_04);
@ -1426,7 +1424,7 @@ static void StartMenu_SaveWait(FieldTask *taskMan)
{
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
StartMenu *menu = FieldTask_GetEnv(taskMan);
SaveMenu *saveMenu = menu->unk_25C;
SaveMenu *saveMenu = menu->taskData;
if (SaveData_OverwriteCheck(fieldSystem->saveData)) {
menu->state = START_MENU_STATE_INIT;
@ -1447,7 +1445,7 @@ static BOOL StartMenu_SelectOptions(FieldTask *taskMan)
ov5_021D1744(0);
menu->unk_22C = StartMenu_Options;
menu->callback = StartMenu_Options;
menu->state = START_MENU_STATE_APP_START;
return TRUE;
@ -1461,8 +1459,8 @@ static BOOL StartMenu_Options(FieldTask *taskMan)
fieldSystem = FieldTask_GetFieldSystem(taskMan);
menu = FieldTask_GetEnv(taskMan);
menu->unk_25C = FieldSystem_OpenOptionsMenu(fieldSystem);
menu->unk_22C = sub_0203C050;
menu->taskData = FieldSystem_OpenOptionsMenu(fieldSystem);
menu->callback = sub_0203C050;
return FALSE;
}
@ -1475,7 +1473,7 @@ static BOOL sub_0203C050(FieldTask *taskMan)
fieldSystem = FieldTask_GetFieldSystem(taskMan);
menu = FieldTask_GetEnv(taskMan);
Heap_FreeToHeap(menu->unk_25C);
Heap_FreeToHeap(menu->taskData);
FieldSystem_StartFieldMap(fieldSystem);
menu->state = START_MENU_STATE_12;
@ -1489,7 +1487,7 @@ static BOOL StartMenu_SelectChat(FieldTask *taskMan)
ov5_021D1744(0);
menu->unk_22C = sub_0203C0A0;
menu->callback = sub_0203C0A0;
menu->state = START_MENU_STATE_APP_START;
return 1;
@ -1504,13 +1502,13 @@ static BOOL sub_0203C0A0(FieldTask *taskMan)
fieldSystem = FieldTask_GetFieldSystem(taskMan);
menu = FieldTask_GetEnv(taskMan);
menu->unk_25C = sub_0209747C(2, 0, fieldSystem->saveData, HEAP_ID_FIELDMAP);
menu->taskData = sub_0209747C(2, 0, fieldSystem->saveData, HEAP_ID_FIELDMAP);
sub_02014A9C(&v2, 4);
sub_02097500(menu->unk_25C, &v2);
sub_0203D874(fieldSystem, (UnkStruct_0209747C *)menu->unk_25C);
sub_02097500(menu->taskData, &v2);
sub_0203D874(fieldSystem, (UnkStruct_0209747C *)menu->taskData);
menu->unk_22C = sub_0203C0F8;
menu->callback = sub_0203C0F8;
return 0;
}
@ -1524,8 +1522,8 @@ static BOOL sub_0203C0F8(FieldTask *taskMan)
fieldSystem = FieldTask_GetFieldSystem(taskMan);
menu = FieldTask_GetEnv(taskMan);
if (sub_02097528(menu->unk_25C) == 0) {
sub_02097540(menu->unk_25C, &sentence);
if (sub_02097528(menu->taskData) == 0) {
sub_02097540(menu->taskData, &sentence);
if (CommServerClient_IsInitialized()) {
sub_0205C12C(&sentence);
@ -1537,7 +1535,7 @@ static BOOL sub_0203C0F8(FieldTask *taskMan)
menu->state = START_MENU_STATE_12;
}
sub_020974EC((UnkStruct_0209747C *)menu->unk_25C);
sub_020974EC((UnkStruct_0209747C *)menu->taskData);
FieldSystem_StartFieldMap(fieldSystem);
sub_0205C2B0(fieldSystem->unk_80);
@ -1578,8 +1576,8 @@ static BOOL sub_0203C1C8(FieldTask *taskMan)
menu = FieldTask_GetEnv(taskMan);
v2 = Heap_AllocFromHeap(HEAP_ID_FIELDMAP, sizeof(PokemonSummary));
memcpy(v2, menu->unk_25C, sizeof(PokemonSummary));
Heap_FreeToHeap(menu->unk_25C);
memcpy(v2, menu->taskData, sizeof(PokemonSummary));
Heap_FreeToHeap(menu->taskData);
switch (v2->mode) {
case SUMMARY_MODE_SELECT_MOVE: {
@ -1595,7 +1593,7 @@ static BOOL sub_0203C1C8(FieldTask *taskMan)
v3->unk_04 = SaveData_GetBag(fieldSystem->saveData);
v3->unk_08 = sub_02028430(fieldSystem->saveData);
v3->unk_0C = SaveData_GetOptions(fieldSystem->saveData);
v3->unk_18 = &menu->unk_24C;
v3->unk_18 = &menu->fieldMoveContext;
v3->unk_21 = 0;
v3->unk_1C = fieldSystem;
@ -1614,11 +1612,11 @@ static BOOL sub_0203C1C8(FieldTask *taskMan)
FieldSystem_StartChildProcess(fieldSystem, &Unk_020F1E88, v3);
Heap_FreeToHeap(menu->unk_260);
menu->unk_25C = v3;
menu->taskData = v3;
sub_0203B674(menu, sub_0203B7C0);
} break;
default:
menu->unk_25C = sub_0203D390(fieldSystem, &menu->unk_24C, v2->monIndex);
menu->taskData = sub_0203D390(fieldSystem, &menu->fieldMoveContext, v2->monIndex);
sub_0203B674(menu, sub_0203B7C0);
}
@ -1635,24 +1633,24 @@ static void sub_0203C2D8(FieldTask *taskMan, u16 item)
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
StartMenu *menu = FieldTask_GetEnv(taskMan);
menu->unk_25C = sub_020972FC(HEAP_ID_FIELDMAP);
menu->taskData = sub_020972FC(HEAP_ID_FIELDMAP);
Bag *bag = SaveData_GetBag(fieldSystem->saveData);
sub_02097320(menu->unk_25C, item, 1);
sub_02097320(menu->taskData, item, 1);
v6 = 0;
for (i = 0; i < NUM_BERRIES; i++) {
item = Item_ForBerryNumber(i);
if (Bag_CanRemoveItem(bag, item, 1, HEAP_ID_FIELDMAP) == TRUE) {
sub_02097320(menu->unk_25C, item, 0);
sub_02097320(menu->taskData, item, 0);
v6++;
}
}
BagCursor_GetFieldPocketPosition(fieldSystem->bagCursor, 4, &v5, &v4);
sub_0209733C(menu->unk_25C, v4, v5, v6 + 3);
sub_0209733C(menu->taskData, v4, v5, v6 + 3);
sub_0203D2E4(fieldSystem, menu->unk_25C);
sub_0203D2E4(fieldSystem, menu->taskData);
sub_0203B674(menu, sub_0203C390);
}
@ -1665,11 +1663,11 @@ static BOOL sub_0203C390(FieldTask *taskMan)
fieldSystem = FieldTask_GetFieldSystem(taskMan);
menu = FieldTask_GetEnv(taskMan);
sub_02097390(menu->unk_25C, &v2, &v3);
sub_02097390(menu->taskData, &v2, &v3);
BagCursor_SetFieldPocketPosition(fieldSystem->bagCursor, 4, v3, v2);
Heap_FreeToHeapExplicit(HEAP_ID_FIELDMAP, menu->unk_25C);
Heap_FreeToHeapExplicit(HEAP_ID_FIELDMAP, menu->taskData);
menu->unk_25C = sub_0203D20C(fieldSystem, &menu->unk_230);
menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230);
sub_0203B674(menu, sub_0203BC5C);
return 0;
@ -1683,8 +1681,8 @@ BOOL sub_0203C3F4(FieldTask *taskMan)
fieldSystem = FieldTask_GetFieldSystem(taskMan);
menu = FieldTask_GetEnv(taskMan);
Heap_FreeToHeapExplicit(HEAP_ID_FIELDMAP, menu->unk_25C);
menu->unk_25C = sub_0203D20C(fieldSystem, &menu->unk_230);
Heap_FreeToHeapExplicit(HEAP_ID_FIELDMAP, menu->taskData);
menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230);
sub_0203B674(menu, sub_0203BC5C);
return 0;
@ -1703,11 +1701,11 @@ BOOL sub_0203C434(FieldTask *taskMan)
Heap_FreeToHeapExplicit(HEAP_ID_FIELDMAP, menu->unk_260);
v2 = (UnkStruct_0203D8AC *)menu->unk_25C;
v2 = (UnkStruct_0203D8AC *)menu->taskData;
if (!(v2->unk_10)) {
Heap_FreeToHeapExplicit(HEAP_ID_FIELDMAP, menu->unk_25C);
menu->unk_25C = sub_0203D390(fieldSystem, &menu->unk_24C, v3);
Heap_FreeToHeapExplicit(HEAP_ID_FIELDMAP, menu->taskData);
menu->taskData = sub_0203D390(fieldSystem, &menu->fieldMoveContext, v3);
sub_0203B674(menu, sub_0203B7C0);
} else {
Pokemon *mon;
@ -1719,11 +1717,11 @@ BOOL sub_0203C434(FieldTask *taskMan)
journalEntryLocationEvent = JournalEntry_CreateEventUsedMove(LOCATION_EVENT_FLEW_TO_LOCATION - LOCATION_EVENT_USED_CUT, v2->unk_1C, HEAP_ID_FIELDMAP);
JournalEntry_SaveData(fieldSystem->journalEntry, journalEntryLocationEvent, JOURNAL_LOCATION);
Heap_FreeToHeapExplicit(HEAP_ID_FIELDMAP, menu->unk_25C);
Heap_FreeToHeapExplicit(HEAP_ID_FIELDMAP, menu->taskData);
FieldSystem_StartFieldMap(fieldSystem);
menu->unk_22C = sub_02070680;
menu->unk_25C = v5;
menu->callback = sub_02070680;
menu->taskData = v5;
menu->state = START_MENU_STATE_10;
}
@ -1738,7 +1736,7 @@ BOOL sub_0203C50C(FieldTask *taskMan)
fieldSystem = FieldTask_GetFieldSystem(taskMan);
menu = FieldTask_GetEnv(taskMan);
menu->unk_25C = sub_0203D20C(fieldSystem, &menu->unk_230);
menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230);
sub_0203B674(menu, sub_0203BC5C);
return 0;
@ -1769,30 +1767,30 @@ BOOL sub_0203C558(FieldTask *taskMan)
switch (v2->unk_03) {
case 3:
sub_02097770(menu->unk_25C);
menu->unk_25C = sub_0203D20C(fieldSystem, &menu->unk_230);
sub_02097770(menu->taskData);
menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230);
sub_0203B674(menu, sub_0203BC5C);
break;
case 2:
sub_02097770(menu->unk_25C);
menu->unk_25C = sub_0203D390(fieldSystem, &menu->unk_24C, v2->unk_02);
sub_02097770(menu->taskData);
menu->taskData = sub_0203D390(fieldSystem, &menu->fieldMoveContext, v2->unk_02);
sub_0203B674(menu, sub_0203B7C0);
break;
case 0:
if (sub_02097728(menu->unk_25C) == 1) {
if (sub_02097728(menu->taskData) == 1) {
sub_0203C668(fieldSystem, menu, 12);
} else {
sub_02097770(menu->unk_25C);
menu->unk_25C = sub_0203D390(fieldSystem, &menu->unk_24C, v2->unk_02);
sub_02097770(menu->taskData);
menu->taskData = sub_0203D390(fieldSystem, &menu->fieldMoveContext, v2->unk_02);
sub_0203B674(menu, sub_0203B7C0);
}
break;
case 1:
if (sub_02097728(menu->unk_25C) == 1) {
if (sub_02097728(menu->taskData) == 1) {
sub_0203C668(fieldSystem, menu, 11);
} else {
sub_02097770(menu->unk_25C);
menu->unk_25C = sub_0203D20C(fieldSystem, &menu->unk_230);
sub_02097770(menu->taskData);
menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230);
sub_0203B674(menu, sub_0203BC5C);
}
break;
@ -1802,12 +1800,12 @@ BOOL sub_0203C558(FieldTask *taskMan)
return 0;
}
static void sub_0203C668(FieldSystem *fieldSystem, StartMenu *param1, u8 param2)
static void sub_0203C668(FieldSystem *fieldSystem, StartMenu *menu, u8 param2)
{
UnkStruct_0203C540 *v0;
PartyManagementData *partyMan;
v0 = param1->unk_260;
v0 = menu->unk_260;
partyMan = Heap_AllocFromHeap(HEAP_ID_FIELDMAP, sizeof(PartyManagementData));
memset(partyMan, 0, sizeof(PartyManagementData));
@ -1815,19 +1813,19 @@ static void sub_0203C668(FieldSystem *fieldSystem, StartMenu *param1, u8 param2)
partyMan->unk_04 = SaveData_GetBag(fieldSystem->saveData);
partyMan->unk_08 = sub_02028430(fieldSystem->saveData);
partyMan->unk_0C = SaveData_GetOptions(fieldSystem->saveData);
partyMan->unk_18 = &param1->unk_24C;
partyMan->unk_18 = &menu->fieldMoveContext;
partyMan->unk_21 = 0;
partyMan->unk_24 = v0->unk_00;
partyMan->selectedMonSlot = v0->unk_02;
partyMan->unk_20 = param2;
partyMan->unk_1C = fieldSystem;
sub_02097750(param1->unk_25C, Party_GetPokemonBySlotIndex(partyMan->unk_00, v0->unk_02));
sub_02097770(param1->unk_25C);
sub_02097750(menu->taskData, Party_GetPokemonBySlotIndex(partyMan->unk_00, v0->unk_02));
sub_02097770(menu->taskData);
FieldSystem_StartChildProcess(fieldSystem, &Unk_020F1E88, partyMan);
param1->unk_25C = partyMan;
sub_0203B674(param1, sub_0203B7C0);
menu->taskData = partyMan;
sub_0203B674(menu, sub_0203B7C0);
}
BOOL sub_0203C710(FieldTask *taskMan)
@ -1838,9 +1836,9 @@ BOOL sub_0203C710(FieldTask *taskMan)
fieldSystem = FieldTask_GetFieldSystem(taskMan);
menu = FieldTask_GetEnv(taskMan);
sub_02098AF0(menu->unk_25C);
sub_02098AF0(menu->taskData);
menu->unk_25C = sub_0203D20C(fieldSystem, &menu->unk_230);
menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230);
sub_0203B674(menu, sub_0203BC5C);
return 0;
@ -1854,7 +1852,7 @@ BOOL sub_0203C750(FieldTask *taskMan)
fieldSystem = FieldTask_GetFieldSystem(taskMan);
menu = FieldTask_GetEnv(taskMan);
menu->unk_25C = sub_0203D20C(fieldSystem, &menu->unk_230);
menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230);
sub_0203B674(menu, sub_0203BC5C);
return 0;
@ -1868,7 +1866,7 @@ BOOL sub_0203C784(FieldTask *taskMan)
fieldSystem = FieldTask_GetFieldSystem(taskMan);
menu = FieldTask_GetEnv(taskMan);
menu->unk_25C = sub_0203D20C(fieldSystem, &menu->unk_230);
menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230);
sub_0203B674(menu, sub_0203BC5C);
return 0;
@ -1885,7 +1883,7 @@ static void StartMenu_EvolveInit(FieldTask *taskMan)
fieldSystem = FieldTask_GetFieldSystem(taskMan);
menu = FieldTask_GetEnv(taskMan);
v2 = menu->unk_25C;
v2 = menu->taskData;
Sound_StopWaveOutAndSequences();
Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_73, 0x30000);
@ -1906,9 +1904,9 @@ static void StartMenu_EvolveInit(FieldTask *taskMan)
menu->unk_260 = v6;
}
Heap_FreeToHeap(menu->unk_25C);
Heap_FreeToHeap(menu->taskData);
menu->unk_25C = v5;
menu->taskData = v5;
menu->state = START_MENU_STATE_EVOLVE;
}
@ -1920,19 +1918,19 @@ static void StartMenu_Evolve(FieldTask *taskMan)
fieldSystem = FieldTask_GetFieldSystem(taskMan);
menu = FieldTask_GetEnv(taskMan);
if (sub_0207B0D0(menu->unk_25C) == 1) {
sub_0207B0E0(menu->unk_25C);
if (sub_0207B0D0(menu->taskData) == 1) {
sub_0207B0E0(menu->taskData);
Heap_Destroy(HEAP_ID_73);
Sound_StopBGM(1141, 0);
Sound_SetScene(0);
sub_020556A0(fieldSystem, fieldSystem->location->mapId);
menu->unk_25C = sub_0203D20C(fieldSystem, &menu->unk_230);
menu->taskData = sub_0203D20C(fieldSystem, &menu->unk_230);
{
u32 v2 = *((u32 *)menu->unk_260);
sub_0207CB70(menu->unk_25C, (u8)v2);
sub_0207CB70(menu->taskData, (u8)v2);
Heap_FreeToHeap(menu->unk_260);
}

View File

@ -32,7 +32,6 @@
#include "struct_defs/struct_020556C4.h"
#include "struct_defs/struct_020684D0.h"
#include "struct_defs/struct_0206BC70.h"
#include "struct_defs/struct_02070950.h"
#include "struct_defs/struct_02072014.h"
#include "struct_defs/struct_0208737C.h"
#include "struct_defs/struct_02097728.h"
@ -88,6 +87,7 @@
#include "coins.h"
#include "dexmode_checker.h"
#include "field_battle_data_transfer.h"
#include "field_move_tasks.h"
#include "field_overworld_state.h"
#include "field_system.h"
#include "field_task.h"
@ -115,7 +115,6 @@
#include "unk_02017498.h"
#include "unk_02028124.h"
#include "unk_020298BC.h"
#include "unk_0202ACE0.h"
#include "unk_0202C7FC.h"
#include "unk_0202C858.h"
#include "unk_0202D05C.h"
@ -393,7 +392,7 @@ static PartyManagementData *sub_0203D344(int heapID, FieldSystem *fieldSystem, i
return v0;
}
void *sub_0203D390(FieldSystem *fieldSystem, UnkStruct_02070950 *param1, u8 param2)
void *sub_0203D390(FieldSystem *fieldSystem, FieldMoveContext *param1, u8 param2)
{
PartyManagementData *v0 = sub_0203D344(HEAP_ID_FIELDMAP, fieldSystem, 0, 0);

View File

@ -2427,7 +2427,7 @@ void sub_02061674(PlayerAvatar *playerAvatar, int param1, int *param2, int *para
(*param4) += v0->unk_04;
}
u32 sub_020616F0(PlayerAvatar *playerAvatar, int param1)
u32 PlayerAvatar_GetDistortionTileBehaviour(PlayerAvatar *playerAvatar, int param1)
{
u32 v0;
@ -2447,7 +2447,7 @@ u32 sub_020616F0(PlayerAvatar *playerAvatar, int param1)
return v0;
}
u32 sub_02061760(PlayerAvatar *playerAvatar)
u32 PlayerAvatar_GetDistortionCurrTileBehaviour(PlayerAvatar *playerAvatar)
{
u32 v0;
MapObject *mapObj = Player_MapObject(playerAvatar);
@ -2467,7 +2467,7 @@ u32 sub_02061760(PlayerAvatar *playerAvatar)
void sub_020617BC(PlayerAvatar *const playerAvatar, int *xOut, int *yOut, int *zOut)
{
int v0 = sub_0205EAA0(playerAvatar);
int v0 = PlayerAvatar_GetDistortionDir(playerAvatar);
MapObject *mapObj = Player_MapObject(playerAvatar);
*xOut = MapObject_GetX(mapObj);

View File

@ -254,11 +254,11 @@ static void sub_020684D0(FieldSystem *fieldSystem, UnkStruct_020684D0 *param1)
param1->unk_00 = fieldSystem->location->mapId;
param1->unk_04 = SystemFlag_CheckHasPartner(SaveData_GetVarsFlags(fieldSystem->saveData));
param1->unk_08 = PlayerAvatar_GetPlayerState(fieldSystem->playerAvatar);
param1->unk_0E = sub_02061760(fieldSystem->playerAvatar);
param1->unk_0E = PlayerAvatar_GetDistortionCurrTileBehaviour(fieldSystem->playerAvatar);
{
int v0 = sub_0205EAA0(fieldSystem->playerAvatar);
param1->unk_0C = sub_020616F0(fieldSystem->playerAvatar, v0);
int v0 = PlayerAvatar_GetDistortionDir(fieldSystem->playerAvatar);
param1->unk_0C = PlayerAvatar_GetDistortionTileBehaviour(fieldSystem->playerAvatar, v0);
}
param1->unk_10 = sub_02055FC8(fieldSystem, NULL);
@ -281,16 +281,16 @@ static UnkStruct_0206851C *sub_0206851C(u32 param0, u16 param1, u16 param2, u16
static void sub_02068540(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1, u32 param2)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
FieldSystem_StartFieldMap(fieldSystem);
v1->unk_22C = sub_020685AC;
v1->unk_25C = sub_0206851C(param2, param0->unk_04, 0, 0, 0);
v1->state = START_MENU_STATE_10;
menu->callback = sub_020685AC;
menu->taskData = sub_0206851C(param2, param0->unk_04, 0, 0, 0);
menu->state = START_MENU_STATE_10;
}
static void sub_02068584(UnkStruct_02068870 *param0, u32 param1)
@ -329,11 +329,11 @@ static BOOL sub_020685AC(FieldTask *task)
static void sub_02068630(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
PartyManagementData *v2;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
v2 = Heap_AllocFromHeap(HEAP_ID_FIELDMAP, sizeof(PartyManagementData));
memset(v2, 0, sizeof(PartyManagementData));
@ -343,7 +343,7 @@ static void sub_02068630(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *p
v2->unk_08 = sub_02028430(fieldSystem->saveData);
v2->unk_0C = SaveData_GetOptions(fieldSystem->saveData);
v2->unk_10 = SaveData_GetTVBroadcast(fieldSystem->saveData);
v2->unk_18 = &v1->unk_24C;
v2->unk_18 = &menu->fieldMoveContext;
v2->unk_21 = 0;
v2->unk_20 = 5;
v2->unk_1C = fieldSystem;
@ -351,20 +351,20 @@ static void sub_02068630(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *p
v2->selectedMonSlot = param0->unk_06;
FieldSystem_StartChildProcess(fieldSystem, &Unk_020F1E88, v2);
v1->unk_25C = v2;
sub_0203B674(v1, sub_0203B7C0);
menu->taskData = v2;
sub_0203B674(menu, sub_0203B7C0);
}
static void sub_020686C8(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
v1->unk_25C = sub_0203D8AC(fieldSystem);
sub_0203B674(v1, sub_0203C3F4);
menu->taskData = sub_0203D8AC(fieldSystem);
sub_0203B674(menu, sub_0203C3F4);
}
static BOOL sub_020686F8(UnkStruct_02068870 *param0)
@ -381,16 +381,16 @@ static void *sub_02068708(void *param0)
static void sub_02068710(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
FieldSystem_StartFieldMap(fieldSystem);
v1->unk_22C = FieldTask_MapChangeToUnderground;
v1->unk_25C = sub_02053FAC(fieldSystem);
v1->state = START_MENU_STATE_10;
menu->callback = FieldTask_MapChangeToUnderground;
menu->taskData = sub_02053FAC(fieldSystem);
menu->state = START_MENU_STATE_10;
fieldSystem->unk_90 = 0;
}
@ -453,16 +453,16 @@ static u32 sub_0206877C(const UnkStruct_020684D0 *param0)
static void sub_0206883C(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
FieldSystem_StartFieldMap(fieldSystem);
v1->unk_22C = sub_02068884;
v1->unk_25C = NULL;
v1->state = START_MENU_STATE_10;
menu->callback = sub_02068884;
menu->taskData = NULL;
menu->state = START_MENU_STATE_10;
}
static BOOL sub_02068870(UnkStruct_02068870 *param0)
@ -579,11 +579,11 @@ static void *sub_02068A28(void *param0)
static void sub_02068A34(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
PartyManagementData *v2;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
v2 = Heap_AllocFromHeap(HEAP_ID_FIELDMAP, sizeof(PartyManagementData));
memset(v2, 0, sizeof(PartyManagementData));
@ -592,7 +592,7 @@ static void sub_02068A34(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *p
v2->unk_04 = SaveData_GetBag(fieldSystem->saveData);
v2->unk_08 = sub_02028430(fieldSystem->saveData);
v2->unk_0C = SaveData_GetOptions(fieldSystem->saveData);
v2->unk_18 = &v1->unk_24C;
v2->unk_18 = &menu->fieldMoveContext;
v2->unk_21 = 0;
v2->unk_20 = 6;
v2->unk_1C = fieldSystem;
@ -601,24 +601,24 @@ static void sub_02068A34(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *p
v2->unk_26 = Item_MoveForTMHM(param0->unk_04);
FieldSystem_StartChildProcess(fieldSystem, &Unk_020F1E88, v2);
v1->unk_25C = v2;
sub_0203B674(v1, sub_0203B7C0);
menu->taskData = v2;
sub_0203B674(menu, sub_0203B7C0);
}
static void sub_02068ACC(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
UnkStruct_02097728 *v2;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
v2 = sub_0203D94C(fieldSystem, 3, Item_MailNumber(param0->unk_04), 11);
v1->unk_260 = sub_0203C540(param0->unk_04, 3, 0);
v1->unk_25C = v2;
menu->unk_260 = sub_0203C540(param0->unk_04, 3, 0);
menu->taskData = v2;
sub_0203B674(v1, sub_0203C558);
sub_0203B674(menu, sub_0203C558);
}
static u32 sub_02068B18(const UnkStruct_020684D0 *param0)
@ -654,15 +654,15 @@ BOOL sub_02068B50(const UnkStruct_020684D0 *param0)
static void sub_02068B5C(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
UnkStruct_0203D9B8 *v2;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
v2 = sub_0203D9B8(fieldSystem, HEAP_ID_FIELDMAP);
v1->unk_25C = v2;
sub_0203B674(v1, sub_0203C710);
menu->taskData = v2;
sub_0203B674(menu, sub_0203C710);
}
static BOOL sub_02068B8C(UnkStruct_02068870 *param0)
@ -679,14 +679,14 @@ static void *sub_02068B9C(void *param0)
static void sub_02068BA8(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
sub_0203DE78(fieldSystem, fieldSystem->saveData);
v1->unk_25C = NULL;
sub_0203B674(v1, sub_0203C750);
menu->taskData = NULL;
sub_0203B674(menu, sub_0203C750);
}
static BOOL sub_02068BDC(UnkStruct_02068870 *param0)
@ -704,19 +704,19 @@ static void *sub_02068BEC(void *param0)
static void sub_02068BF8(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
int *v2;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
v2 = Heap_AllocFromHeapAtEnd(11, sizeof(int));
(*v2) = 0;
FieldSystem_StartFieldMap(fieldSystem);
v1->unk_22C = RefreshRadarChain;
v1->unk_25C = v2;
v1->state = START_MENU_STATE_10;
menu->callback = RefreshRadarChain;
menu->taskData = v2;
menu->state = START_MENU_STATE_10;
}
static BOOL sub_02068C38(UnkStruct_02068870 *param0)
@ -787,12 +787,12 @@ static u32 sub_02068CE0(const UnkStruct_020684D0 *param0)
static void sub_02068CF0(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
UnkStruct_ov5_021F0468 *v2;
int v3;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
FieldSystem_StartFieldMap(fieldSystem);
@ -801,9 +801,9 @@ static void sub_02068CF0(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *p
memset(v2, 0, v3);
v1->unk_22C = ov5_021F0488;
v1->unk_25C = v2;
v1->state = START_MENU_STATE_10;
menu->callback = ov5_021F0488;
menu->taskData = v2;
menu->state = START_MENU_STATE_10;
Bag_TryRemoveItem(SaveData_GetBag(fieldSystem->saveData), param0->unk_04, 1, HEAP_ID_FIELDMAP);
}
@ -831,16 +831,16 @@ static u32 sub_02068D68(const UnkStruct_020684D0 *param0)
static void sub_02068D80(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
FieldSystem_StartFieldMap(fieldSystem);
v1->unk_22C = ov5_021F08F8;
v1->unk_25C = ov5_021F08CC(fieldSystem, 11, 0);
v1->state = START_MENU_STATE_10;
menu->callback = ov5_021F08F8;
menu->taskData = ov5_021F08CC(fieldSystem, 11, 0);
menu->state = START_MENU_STATE_10;
}
static BOOL sub_02068DBC(UnkStruct_02068870 *param0)
@ -854,16 +854,16 @@ static BOOL sub_02068DBC(UnkStruct_02068870 *param0)
static void sub_02068DDC(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
FieldSystem_StartFieldMap(fieldSystem);
v1->unk_22C = ov5_021F08F8;
v1->unk_25C = ov5_021F08CC(fieldSystem, 11, 1);
v1->state = START_MENU_STATE_10;
menu->callback = ov5_021F08F8;
menu->taskData = ov5_021F08CC(fieldSystem, 11, 1);
menu->state = START_MENU_STATE_10;
}
static BOOL sub_02068E18(UnkStruct_02068870 *param0)
@ -877,16 +877,16 @@ static BOOL sub_02068E18(UnkStruct_02068870 *param0)
static void sub_02068E38(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
FieldSystem_StartFieldMap(fieldSystem);
v1->unk_22C = ov5_021F08F8;
v1->unk_25C = ov5_021F08CC(fieldSystem, 11, 2);
v1->state = START_MENU_STATE_10;
menu->callback = ov5_021F08F8;
menu->taskData = ov5_021F08CC(fieldSystem, 11, 2);
menu->state = START_MENU_STATE_10;
}
static BOOL sub_02068E74(UnkStruct_02068870 *param0)
@ -976,11 +976,11 @@ static BOOL sub_02068F48(FieldTask *task)
static void sub_02068FEC(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
PartyManagementData *v2;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
v2 = Heap_AllocFromHeap(HEAP_ID_FIELDMAP, sizeof(PartyManagementData));
memset(v2, 0, sizeof(PartyManagementData));
@ -990,15 +990,15 @@ static void sub_02068FEC(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *p
v2->unk_08 = sub_02028430(fieldSystem->saveData);
v2->unk_0C = SaveData_GetOptions(fieldSystem->saveData);
v2->unk_10 = SaveData_GetTVBroadcast(fieldSystem->saveData);
v2->unk_18 = &v1->unk_24C;
v2->unk_18 = &menu->fieldMoveContext;
v2->unk_21 = 0;
v2->unk_20 = 16;
v2->unk_24 = param0->unk_04;
v2->selectedMonSlot = param0->unk_06;
FieldSystem_StartChildProcess(fieldSystem, &Unk_020F1E88, v2);
v1->unk_25C = v2;
sub_0203B674(v1, sub_0203B7C0);
menu->taskData = v2;
sub_0203B674(menu, sub_0203B7C0);
}
static void sub_02069080(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
@ -1011,8 +1011,8 @@ static void sub_02069080(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *p
FieldSystem_StartFieldMap(fieldSystem);
menu->unk_22C = sub_020690F0;
menu->unk_25C = NULL;
menu->callback = sub_020690F0;
menu->taskData = NULL;
menu->state = START_MENU_STATE_10;
Bag_TryRemoveItem(SaveData_GetBag(fieldSystem->saveData), param0->unk_04, 1, HEAP_ID_FIELDMAP);
@ -1077,14 +1077,14 @@ static u32 sub_02069130(const UnkStruct_020684D0 *param0)
static void sub_02069188(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
sub_0203DE88(fieldSystem, fieldSystem->saveData);
v1->unk_25C = NULL;
sub_0203B674(v1, sub_0203C784);
menu->taskData = NULL;
sub_0203B674(menu, sub_0203C784);
}
static BOOL sub_020691BC(UnkStruct_02068870 *param0)
@ -1104,15 +1104,15 @@ static void *sub_020691CC(void *param0)
static void sub_020691E0(UnkStruct_02068630 *param0, const UnkStruct_020684D0 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
StartMenu *menu;
PartyManagementData *v2;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
v1->unk_25C = sub_0203E598(fieldSystem, HEAP_ID_FIELDMAP, 466);
menu->taskData = sub_0203E598(fieldSystem, HEAP_ID_FIELDMAP, 466);
sub_0203B674(v1, sub_0203B7C0);
sub_0203B674(menu, sub_0203B7C0);
}
static BOOL sub_02069218(UnkStruct_02068870 *param0)

View File

@ -1,843 +0,0 @@
#include "unk_0207070C.h"
#include <nitro.h>
#include <string.h>
#include "constants/field/dynamic_map_features.h"
#include "constants/field/map_load.h"
#include "generated/journal_location_events.h"
#include "struct_decls/struct_02061AB4_decl.h"
#include "struct_defs/struct_0203D8AC.h"
#include "struct_defs/struct_020708E0.h"
#include "struct_defs/struct_02070950.h"
#include "struct_defs/struct_020709CC.h"
#include "struct_defs/struct_020711C8.h"
#include "field/field_system.h"
#include "functypes/funcptr_0203B7C0.h"
#include "functypes/funcptr_02084808.h"
#include "overlay005/ov5_021DFB54.h"
#include "overlay005/ov5_021F101C.h"
#include "overlay006/ov6_02247100.h"
#include "field_overworld_state.h"
#include "field_task.h"
#include "heap.h"
#include "inlines.h"
#include "journal.h"
#include "map_header.h"
#include "map_object.h"
#include "map_tile_behavior.h"
#include "persisted_map_features_init.h"
#include "player_avatar.h"
#include "save_player.h"
#include "script_manager.h"
#include "start_menu.h"
#include "system_flags.h"
#include "terrain_collision_manager.h"
#include "trainer_info.h"
#include "unk_0203C954.h"
#include "unk_0203D1B8.h"
#include "unk_0205F180.h"
#include "unk_0206B70C.h"
#include "unk_020711C8.h"
#include "vars_flags.h"
typedef struct {
UnkFuncPtr_0203B7C0 unk_00;
UnkFuncPtr_02084808 unk_04;
} UnkStruct_020F0368;
typedef struct {
u32 unk_00;
MapObject *unk_04;
UnkStruct_020709CC unk_08;
} UnkStruct_0207086C;
static void sub_02070838(FieldSystem *fieldSystem, UnkStruct_02070950 *param1);
static int sub_02070950(const UnkStruct_02070950 *param0);
static void sub_020709CC(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1);
static int sub_02070EEC(const UnkStruct_02070950 *param0);
static void sub_02070F54(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1);
static BOOL sub_02070F94(FieldTask *taskMan);
static int sub_02070A24(const UnkStruct_02070950 *param0);
static void sub_02070A80(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1);
static BOOL sub_02070AB4(FieldTask *taskMan);
static int sub_02070CF8(const UnkStruct_02070950 *param0);
static void sub_02070D30(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1);
static BOOL sub_02070D64(FieldTask *taskMan);
static int sub_02070DA0(const UnkStruct_02070950 *param0);
static void sub_02070DEC(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1);
static BOOL sub_02070E20(FieldTask *taskMan);
static int sub_02070E5C(const UnkStruct_02070950 *param0);
static void sub_02070E7C(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1);
static BOOL sub_02070EB0(FieldTask *taskMan);
static int sub_02070B98(const UnkStruct_02070950 *param0);
static void sub_02070BD0(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1);
static BOOL sub_02070C04(FieldTask *taskMan);
static int sub_02070C40(const UnkStruct_02070950 *param0);
static void sub_02070C88(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1);
static BOOL sub_02070CBC(FieldTask *taskMan);
static int sub_02070AF0(const UnkStruct_02070950 *param0);
static void sub_02070B28(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1);
static BOOL sub_02070B5C(FieldTask *taskMan);
static int sub_02070FCC(const UnkStruct_02070950 *param0);
static void sub_02071010(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1);
static BOOL sub_02071050(FieldTask *taskMan);
static int sub_020710A4(const UnkStruct_02070950 *param0);
static void sub_020710D4(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1);
static int sub_02071130(const UnkStruct_02070950 *param0);
static void sub_02071150(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1);
static BOOL sub_0207118C(FieldTask *taskMan);
static int sub_020708AC(const UnkStruct_02070950 *param0);
static void sub_020708E0(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1);
static BOOL sub_02070914(FieldTask *taskMan);
static const UnkStruct_020F0368 Unk_020F0368[] = {
{ sub_020708E0, sub_020708AC },
{ sub_020709CC, sub_02070950 },
{ sub_02070A80, sub_02070A24 },
{ sub_02070B28, sub_02070AF0 },
{ sub_02070BD0, sub_02070B98 },
{ sub_02070C88, sub_02070C40 },
{ sub_02070D30, sub_02070CF8 },
{ sub_02070DEC, sub_02070DA0 },
{ sub_02070E7C, sub_02070E5C },
{ sub_02070F54, sub_02070EEC },
{ sub_02071010, sub_02070FCC },
{ sub_020710D4, sub_020710A4 },
{ sub_02071150, sub_02071130 }
};
static inline BOOL inline_020708AC(const UnkStruct_02070950 *param0, int param1)
{
if ((param0->unk_0C & (1 << param1)) != 0) {
return 1;
} else {
return 0;
}
}
static inline BOOL inline_02070950(const UnkStruct_02070950 *param0, int param1)
{
return TrainerInfo_HasBadge(SaveData_GetTrainerInfo(param0->fieldSystem->saveData), param1);
}
static inline BOOL inline_02070A24(const UnkStruct_02070950 *param0)
{
return SystemFlag_CheckHasPartner(SaveData_GetVarsFlags(param0->fieldSystem->saveData));
}
static inline BOOL inline_02070EEC(const UnkStruct_02070950 *param0)
{
if ((SystemFlag_CheckSafariGameActive(SaveData_GetVarsFlags(param0->fieldSystem->saveData)) == 1) || (SystemFlag_CheckInPalPark(SaveData_GetVarsFlags(param0->fieldSystem->saveData)) == 1)) {
return 1;
}
return 0;
}
static inline BOOL inline_020710A4(const UnkStruct_02070950 *param0)
{
if (SystemFlag_CheckInPalPark(SaveData_GetVarsFlags(param0->fieldSystem->saveData)) == 1) {
return 1;
}
return 0;
}
static inline BOOL inline_02070AF0(const UnkStruct_02070950 *param0)
{
if ((param0->fieldSystem->mapLoadType == MAP_LOAD_TYPE_COLOSSEUM) || (param0->fieldSystem->mapLoadType == MAP_LOAD_TYPE_UNION)) {
return 0;
}
return 1;
}
u32 sub_0207070C(u16 param0, u16 param1)
{
if (param0 == 0) {
return (u32)Unk_020F0368[param1].unk_00;
}
return (u32)Unk_020F0368[param1].unk_04;
}
void sub_02070728(FieldSystem *fieldSystem, UnkStruct_02070950 *param1)
{
MapObject *mapObj;
int v1, v2;
int v3;
int v4;
param1->fieldSystem = fieldSystem;
param1->unk_00 = fieldSystem->location->mapId;
param1->unk_0C = 0;
if (PlayerAvatar_DistortionGravityChanged(fieldSystem->playerAvatar) == TRUE) {
sub_02070838(fieldSystem, param1);
return;
}
sub_0203C9D4(fieldSystem, &mapObj);
param1->unk_08 = mapObj;
if (mapObj != NULL) {
switch (MapObject_GetGraphicsID(mapObj)) {
case 0x54:
param1->unk_0C |= (1 << 3);
break;
case 0x55:
param1->unk_0C |= (1 << 5);
break;
case 0x56:
param1->unk_0C |= (1 << 0);
break;
}
}
v1 = Player_GetXPos(fieldSystem->playerAvatar);
v2 = Player_GetZPos(fieldSystem->playerAvatar);
v4 = TerrainCollisionManager_GetTileBehavior(fieldSystem, v1, v2);
PlayerAvatar_GetFacingTileCoords(fieldSystem->playerAvatar, &v1, &v2);
v3 = TerrainCollisionManager_GetTileBehavior(fieldSystem, v1, v2);
if (ov5_021E0118(fieldSystem->playerAvatar, v4, v3)) {
param1->unk_0C |= (1 << 2);
}
if (ov5_021E0760(v3, PlayerAvatar_GetDir(fieldSystem->playerAvatar))) {
param1->unk_0C |= (1 << 7);
}
if (TileBehavior_IsWaterfall(v3)) {
param1->unk_0C |= (1 << 6);
}
switch (FieldOverworldState_GetWeather(SaveData_GetFieldOverworldState(fieldSystem->saveData))) {
case 14:
param1->unk_0C |= (1 << 4);
break;
case 16:
param1->unk_0C |= (1 << 8);
break;
}
}
static void sub_02070838(FieldSystem *fieldSystem, UnkStruct_02070950 *param1)
{
int v0;
u32 v1, v2;
v0 = sub_0205EAA0(fieldSystem->playerAvatar);
v2 = sub_020616F0(fieldSystem->playerAvatar, v0);
v1 = sub_02061760(fieldSystem->playerAvatar);
if (ov5_021E0118(fieldSystem->playerAvatar, v1, v2) == 1) {
param1->unk_0C |= (1 << 2);
}
}
static UnkStruct_0207086C *sub_0207086C(const UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1)
{
UnkStruct_0207086C *v0 = Heap_AllocFromHeap(HEAP_ID_FIELD_TASK, sizeof(UnkStruct_0207086C));
v0->unk_00 = 0x19740205;
v0->unk_04 = param1->unk_08;
v0->unk_08 = *param0;
return v0;
}
static void sub_02070890(UnkStruct_0207086C *param0)
{
GF_ASSERT(param0->unk_00 == 0x19740205);
Heap_FreeToHeap(param0);
}
static int sub_020708AC(const UnkStruct_02070950 *param0)
{
if (inline_02070AF0(param0) == 0) {
return 1;
}
if (inline_02070950(param0, 1) == 0) {
return 2;
}
if (inline_020708AC(param0, 0)) {
return 0;
} else {
return 1;
}
}
static void sub_020708E0(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1)
{
StartMenu *menu;
UnkStruct_0207086C *v1;
menu = FieldTask_GetEnv(param0->unk_00);
v1 = sub_0207086C(param0, param1);
FieldSystem_StartFieldMap(param1->fieldSystem);
menu->unk_22C = sub_02070914;
menu->unk_25C = v1;
menu->state = START_MENU_STATE_10;
}
static BOOL sub_02070914(FieldTask *taskMan)
{
UnkStruct_0207086C *v0 = FieldTask_GetEnv(taskMan);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
ScriptManager_Change(taskMan, 10008, v0->unk_04);
FieldSystem_SetScriptParameters(fieldSystem, v0->unk_08.unk_04, 0, 0, 0);
sub_02070890(v0);
return 0;
}
static int sub_02070950(const UnkStruct_02070950 *param0)
{
if (inline_02070AF0(param0) == 0) {
return 1;
}
if (inline_02070950(param0, 2) == 0) {
return 2;
}
if (MapHeader_IsFlyAllowed(param0->unk_00) == 0) {
return 1;
}
if (inline_02070A24(param0) == 1) {
return 3;
}
if (inline_02070EEC(param0) == 1) {
return 1;
}
return 0;
}
static void sub_020709CC(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1)
{
FieldSystem *fieldSystem;
StartMenu *menu;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
u32 *v2 = (u32 *)Heap_AllocFromHeap(HEAP_ID_FIELDMAP, 4);
*v2 = param0->unk_04;
menu->unk_260 = (void *)v2;
menu->unk_25C = Heap_AllocFromHeap(HEAP_ID_FIELDMAP, sizeof(UnkStruct_0203D8AC));
sub_0206B70C(fieldSystem, menu->unk_25C, 1);
sub_0203D884(fieldSystem, menu->unk_25C);
sub_0203B674(menu, sub_0203C434);
}
static int sub_02070A24(const UnkStruct_02070950 *param0)
{
if (inline_02070AF0(param0) == 0) {
return 1;
}
if (inline_02070950(param0, 3) == 0) {
return 2;
}
if (PlayerAvatar_GetPlayerState(param0->fieldSystem->playerAvatar) == 0x2) {
return 4;
}
if (!(inline_020708AC(param0, 2))) {
return 1;
}
if (inline_02070A24(param0) == 1) {
return 3;
}
return 0;
}
static void sub_02070A80(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1)
{
StartMenu *menu;
UnkStruct_0207086C *v1;
menu = FieldTask_GetEnv(param0->unk_00);
v1 = sub_0207086C(param0, param1);
FieldSystem_StartFieldMap(param1->fieldSystem);
menu->unk_22C = sub_02070AB4;
menu->unk_25C = v1;
menu->state = START_MENU_STATE_10;
}
static BOOL sub_02070AB4(FieldTask *taskMan)
{
UnkStruct_0207086C *v0 = FieldTask_GetEnv(taskMan);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
ScriptManager_Change(taskMan, 10012, NULL);
FieldSystem_SetScriptParameters(fieldSystem, v0->unk_08.unk_04, 0, 0, 0);
sub_02070890(v0);
return 0;
}
static int sub_02070AF0(const UnkStruct_02070950 *param0)
{
if (inline_02070AF0(param0) == 0) {
return 1;
}
if (inline_02070950(param0, 5) == 0) {
return 2;
}
if (inline_020708AC(param0, 3)) {
return 0;
} else {
return 1;
}
}
static void sub_02070B28(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1)
{
StartMenu *menu;
UnkStruct_0207086C *v1;
menu = FieldTask_GetEnv(param0->unk_00);
v1 = sub_0207086C(param0, param1);
FieldSystem_StartFieldMap(param1->fieldSystem);
menu->unk_22C = sub_02070B5C;
menu->unk_25C = v1;
menu->state = START_MENU_STATE_10;
}
static BOOL sub_02070B5C(FieldTask *param0)
{
UnkStruct_0207086C *v0 = FieldTask_GetEnv(param0);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(param0);
ScriptManager_Change(param0, 10010, v0->unk_04);
FieldSystem_SetScriptParameters(fieldSystem, v0->unk_08.unk_04, 0, 0, 0);
sub_02070890(v0);
return 0;
}
static int sub_02070B98(const UnkStruct_02070950 *param0)
{
if (inline_02070AF0(param0) == 0) {
return 1;
}
if (inline_02070950(param0, 4) == 0) {
return 2;
}
if (inline_020708AC(param0, 4)) {
return 0;
} else {
return 1;
}
}
static void sub_02070BD0(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1)
{
StartMenu *menu;
UnkStruct_0207086C *v1;
menu = FieldTask_GetEnv(param0->unk_00);
v1 = sub_0207086C(param0, param1);
FieldSystem_StartFieldMap(param1->fieldSystem);
menu->unk_22C = sub_02070C04;
menu->unk_25C = v1;
menu->state = START_MENU_STATE_10;
}
static BOOL sub_02070C04(FieldTask *taskMan)
{
UnkStruct_0207086C *v0 = FieldTask_GetEnv(taskMan);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
ScriptManager_Change(taskMan, 10014, NULL);
FieldSystem_SetScriptParameters(fieldSystem, v0->unk_08.unk_04, 0, 0, 0);
sub_02070890(v0);
return 0;
}
static int sub_02070C40(const UnkStruct_02070950 *param0)
{
if (inline_02070AF0(param0) == 0) {
return 1;
}
if (inline_02070950(param0, 0) == 0) {
return 2;
}
if (PlayerAvatar_GetPlayerState(param0->fieldSystem->playerAvatar) == 0x2) {
return 1;
}
if (inline_020708AC(param0, 5)) {
return 0;
} else {
return 1;
}
}
static void sub_02070C88(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1)
{
StartMenu *menu;
UnkStruct_0207086C *v1;
menu = FieldTask_GetEnv(param0->unk_00);
v1 = sub_0207086C(param0, param1);
FieldSystem_StartFieldMap(param1->fieldSystem);
menu->unk_22C = sub_02070CBC;
menu->unk_25C = v1;
menu->state = START_MENU_STATE_10;
}
static BOOL sub_02070CBC(FieldTask *taskMan)
{
UnkStruct_0207086C *v0 = FieldTask_GetEnv(taskMan);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
ScriptManager_Change(taskMan, 10009, v0->unk_04);
FieldSystem_SetScriptParameters(fieldSystem, v0->unk_08.unk_04, 0, 0, 0);
sub_02070890(v0);
return 0;
}
static int sub_02070CF8(const UnkStruct_02070950 *param0)
{
if (inline_02070AF0(param0) == 0) {
return 1;
}
if (inline_02070950(param0, 7) == 0) {
return 2;
}
if (inline_020708AC(param0, 6)) {
return 0;
} else {
return 1;
}
}
static void sub_02070D30(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1)
{
StartMenu *menu;
UnkStruct_0207086C *v1;
menu = FieldTask_GetEnv(param0->unk_00);
v1 = sub_0207086C(param0, param1);
FieldSystem_StartFieldMap(param1->fieldSystem);
menu->unk_22C = sub_02070D64;
menu->unk_25C = v1;
menu->state = START_MENU_STATE_10;
}
static BOOL sub_02070D64(FieldTask *param0)
{
UnkStruct_0207086C *v0 = FieldTask_GetEnv(param0);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(param0);
ScriptManager_Change(param0, 10013, NULL);
FieldSystem_SetScriptParameters(fieldSystem, v0->unk_08.unk_04, 0, 0, 0);
sub_02070890(v0);
return 0;
}
static int sub_02070DA0(const UnkStruct_02070950 *param0)
{
if (inline_02070AF0(param0) == 0) {
return 1;
}
if (inline_02070950(param0, 6) == 0) {
return 2;
}
if (!(inline_020708AC(param0, 7))) {
return 1;
}
if (inline_02070A24(param0) == 1) {
return 3;
}
return 0;
}
static void sub_02070DEC(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1)
{
StartMenu *menu;
UnkStruct_0207086C *v1;
menu = FieldTask_GetEnv(param0->unk_00);
v1 = sub_0207086C(param0, param1);
FieldSystem_StartFieldMap(param1->fieldSystem);
menu->unk_22C = sub_02070E20;
menu->unk_25C = v1;
menu->state = START_MENU_STATE_10;
}
static BOOL sub_02070E20(FieldTask *taskMan)
{
UnkStruct_0207086C *v0 = FieldTask_GetEnv(taskMan);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
ScriptManager_Change(taskMan, 10011, NULL);
FieldSystem_SetScriptParameters(fieldSystem, v0->unk_08.unk_04, 0, 0, 0);
sub_02070890(v0);
return 0;
}
static int sub_02070E5C(const UnkStruct_02070950 *param0)
{
if (inline_02070AF0(param0) == 0) {
return 1;
}
if (inline_020708AC(param0, 8)) {
return 0;
} else {
return 1;
}
}
static void sub_02070E7C(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1)
{
StartMenu *menu;
UnkStruct_0207086C *v1;
menu = FieldTask_GetEnv(param0->unk_00);
v1 = sub_0207086C(param0, param1);
FieldSystem_StartFieldMap(param1->fieldSystem);
menu->unk_22C = sub_02070EB0;
menu->unk_25C = v1;
menu->state = START_MENU_STATE_10;
}
static BOOL sub_02070EB0(FieldTask *taskMan)
{
UnkStruct_0207086C *v0 = FieldTask_GetEnv(taskMan);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
ScriptManager_Change(taskMan, 10015, NULL);
FieldSystem_SetScriptParameters(fieldSystem, v0->unk_08.unk_04, 0, 0, 0);
sub_02070890(v0);
return 0;
}
static int sub_02070EEC(const UnkStruct_02070950 *param0)
{
if (inline_02070AF0(param0) == 0) {
return 1;
}
if (MapHeader_IsTeleportAllowed(param0->unk_00) == 0) {
return 1;
}
if (inline_02070A24(param0) == 1) {
return 3;
}
if (inline_02070EEC(param0) == 1) {
return 1;
}
return 0;
}
static void sub_02070F54(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1)
{
FieldSystem *fieldSystem;
StartMenu *menu;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
FieldSystem_StartFieldMap(fieldSystem);
UnkStruct_020711C8 *v2 = sub_020711C8(11, param0->unk_04, fieldSystem->saveData);
menu->unk_22C = sub_02070F94;
menu->unk_25C = v2;
menu->state = START_MENU_STATE_10;
}
static BOOL sub_02070F94(FieldTask *param0)
{
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(param0);
UnkStruct_020711C8 *v1 = FieldTask_GetEnv(param0);
void *v2 = ov6_02247530(fieldSystem, v1->unk_00, 4);
Heap_FreeToHeap(v1);
FieldTask_InitJump(param0, ov6_02247554, v2);
return 0;
}
static int sub_02070FCC(const UnkStruct_02070950 *param0)
{
if (inline_02070AF0(param0) == 0) {
return 1;
}
if (!((MapHeader_IsCave(param0->unk_00) == 1) && (MapHeader_IsEscapeRopeAllowed(param0->unk_00) == 1))) {
return 1;
}
if (inline_02070A24(param0) == 1) {
return 3;
}
return 0;
}
static void sub_02071010(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
FieldSystem_StartFieldMap(fieldSystem);
{
UnkStruct_020711C8 *v2;
v2 = sub_020711C8(11, param0->unk_04, fieldSystem->saveData);
v1->unk_22C = sub_02071050;
v1->unk_25C = v2;
v1->state = START_MENU_STATE_10;
}
}
static BOOL sub_02071050(FieldTask *param0)
{
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(param0);
UnkStruct_020711C8 *v1 = FieldTask_GetEnv(param0);
void *v2 = ov6_02247488(fieldSystem, v1->unk_00, 11);
void *journalEntryLocationEvent = JournalEntry_CreateEventUsedMove((LOCATION_EVENT_USED_DIG - LOCATION_EVENT_USED_CUT), fieldSystem->location->mapId, HEAP_ID_FIELD);
JournalEntry_SaveData(fieldSystem->journalEntry, journalEntryLocationEvent, JOURNAL_LOCATION);
Heap_FreeToHeap(v1);
FieldTask_InitJump(param0, ov6_022474AC, v2);
return FALSE;
}
static int sub_020710A4(const UnkStruct_02070950 *param0)
{
if (inline_02070AF0(param0) == 0) {
return 1;
}
if (inline_020710A4(param0) == 1) {
return 1;
}
return 0;
}
static void sub_020710D4(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1)
{
FieldSystem *fieldSystem;
StartMenu *v1;
UnkStruct_020711C8 *v2;
int v3;
void *v4;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
v1 = FieldTask_GetEnv(param0->unk_00);
v2 = sub_020711C8(11, param0->unk_04, fieldSystem->saveData);
FieldSystem_StartFieldMap(fieldSystem);
v1->unk_22C = ov5_021F101C;
v1->unk_25C = v2;
v1->state = START_MENU_STATE_10;
v4 = JournalEntry_CreateEventUsedMove((30 - 19), fieldSystem->location->mapId, 11);
JournalEntry_SaveData(fieldSystem->journalEntry, v4, JOURNAL_LOCATION);
}
static int sub_02071130(const UnkStruct_02070950 *param0)
{
if ((inline_02070AF0(param0) == 0) || (PersistedMapFeatures_IsCurrentDynamicMap(param0->fieldSystem, DYNAMIC_MAP_FEATURES_DISTORTION_WORLD) == 1)) {
return 1;
}
return 0;
}
static void sub_02071150(UnkStruct_020709CC *param0, const UnkStruct_02070950 *param1)
{
FieldSystem *fieldSystem;
StartMenu *menu;
UnkStruct_0207086C *v2;
fieldSystem = FieldTask_GetFieldSystem(param0->unk_00);
menu = FieldTask_GetEnv(param0->unk_00);
v2 = sub_0207086C(param0, param1);
FieldSystem_StartFieldMap(fieldSystem);
menu->unk_22C = sub_0207118C;
menu->unk_25C = v2;
menu->state = START_MENU_STATE_10;
}
static BOOL sub_0207118C(FieldTask *taskMan)
{
UnkStruct_0207086C *v0 = FieldTask_GetEnv(taskMan);
FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan);
ScriptManager_Change(taskMan, 8900, NULL);
FieldSystem_SetScriptParameters(fieldSystem, v0->unk_08.unk_04, 0, 0, 0);
sub_02070890(v0);
return 0;
}

View File

@ -10,11 +10,11 @@
#include "struct_defs/struct_02083D1C.h"
#include "field/field_system.h"
#include "functypes/funcptr_02084808.h"
#include "overlay118/ov118_021D0D80.h"
#include "bag.h"
#include "bg_window.h"
#include "field_move_tasks.h"
#include "font.h"
#include "heap.h"
#include "menu.h"
@ -29,7 +29,6 @@
#include "string_template.h"
#include "system.h"
#include "text.h"
#include "unk_0207070C.h"
#include "unk_0207E0B8.h"
#include "unk_020819DC.h"
#include "unk_02082C2C.h"
@ -863,12 +862,11 @@ int sub_02084780(GameWindowLayout *param0)
static void sub_02084808(GameWindowLayout *param0, int *param1)
{
UnkFuncPtr_02084808 v0;
FieldMoveErrContext v0;
u32 v1;
u32 v2;
v0 = (UnkFuncPtr_02084808)sub_0207070C(
1, param0->unk_5A4->unk_23 - 11);
v0 = (FieldMoveErrContext)FieldMove_GetTaskOrError(FIELD_MOVE_ERROR, param0->unk_5A4->unk_23 - 11);
if (v0 != NULL) {
v1 = v0(param0->unk_5A4->unk_18);