pokeplatinum/src/overlay005/fieldmap.c
2024-11-03 16:08:01 -08:00

987 lines
26 KiB
C

#include "overlay005/fieldmap.h"
#include <nitro.h>
#include <string.h>
#include "constants/field/map_load.h"
#include "struct_decls/struct_02020C44_decl.h"
#include "struct_decls/struct_02027860_decl.h"
#include "struct_decls/struct_0203A790_decl.h"
#include "struct_defs/struct_020556C4.h"
#include "struct_defs/struct_02099F80.h"
#include "field/field_system.h"
#include "field/field_system_sub2_decl.h"
#include "field/field_system_sub2_t.h"
#include "overlay005/const_ov5_021FF6B8.h"
#include "overlay005/const_ov5_021FF744.h"
#include "overlay005/const_ov5_021FF7D0.h"
#include "overlay005/hblank_system.h"
#include "overlay005/ov5_021D1A94.h"
#include "overlay005/ov5_021D37AC.h"
#include "overlay005/ov5_021D521C.h"
#include "overlay005/ov5_021D57BC.h"
#include "overlay005/ov5_021D5878.h"
#include "overlay005/ov5_021D5B40.h"
#include "overlay005/ov5_021D5BC0.h"
#include "overlay005/ov5_021D5CB0.h"
#include "overlay005/ov5_021D5EB8.h"
#include "overlay005/ov5_021DD6FC.h"
#include "overlay005/ov5_021DF440.h"
#include "overlay005/ov5_021E15F4.h"
#include "overlay005/ov5_021E1B08.h"
#include "overlay005/ov5_021E779C.h"
#include "overlay005/ov5_021EA714.h"
#include "overlay005/ov5_021ECC20.h"
#include "overlay005/ov5_021ECE40.h"
#include "overlay005/ov5_021EE75C.h"
#include "overlay005/ov5_021EF250.h"
#include "overlay005/ov5_021EF4BC.h"
#include "overlay005/ov5_021EF75C.h"
#include "overlay005/ov5_021EFB0C.h"
#include "overlay005/ov5_021F0824.h"
#include "overlay005/ov5_021F10E8.h"
#include "overlay005/struct_ov5_021D1A68_decl.h"
#include "overlay005/struct_ov5_021D5894.h"
#include "overlay005/struct_ov5_021ED0A4.h"
#include "overlay009/ov9_02249960.h"
#include "overlay022/struct_ov22_022559F8.h"
#include "bg_window.h"
#include "camera.h"
#include "comm_player_manager.h"
#include "core_sys.h"
#include "easy3d.h"
#include "field_map_change.h"
#include "field_overworld_state.h"
#include "field_system.h"
#include "field_task.h"
#include "game_overlay.h"
#include "gx_layers.h"
#include "heap.h"
#include "inlines.h"
#include "map_header.h"
#include "map_header_data.h"
#include "map_object.h"
#include "narc.h"
#include "overlay_manager.h"
#include "player_avatar.h"
#include "pokeradar.h"
#include "savedata_misc.h"
#include "script_manager.h"
#include "unk_0200A784.h"
#include "unk_0200F174.h"
#include "unk_02017728.h"
#include "unk_0201DBEC.h"
#include "unk_0201E86C.h"
#include "unk_0201F834.h"
#include "unk_02020AEC.h"
#include "unk_0202419C.h"
#include "unk_02027F50.h"
#include "unk_02039C80.h"
#include "unk_020553DC.h"
#include "unk_020556C4.h"
#include "unk_020559DC.h"
#include "unk_02055C50.h"
#include "unk_0205D8CC.h"
#include "unk_02068344.h"
FS_EXTERN_OVERLAY(overlay6);
FS_EXTERN_OVERLAY(overlay7);
FS_EXTERN_OVERLAY(overlay8);
FS_EXTERN_OVERLAY(overlay9);
struct UnkStruct_ov5_021D1A68_t {
u16 unk_00;
int unk_02[24];
};
static void ov5_021D1444(BgConfig *bgl);
static void ov5_021D1524(BgConfig *bgl);
static void ov5_021D154C(void);
static void ov5_021D1570(void);
static void ov5_021D1578(UnkStruct_ov5_021D5894 *param0);
static void ov5_021D15F4(FieldSystem *fieldSystem);
static void ov5_021D173C(FieldSystem *fieldSystem);
static void ov5_021D1414(void);
static void ov5_021D15B4(void);
static void ov5_021D15E8(void);
static void ov5_021D1790(FieldSystem *fieldSystem);
static void ov5_021D17EC(FieldSystem *fieldSystem);
static void ov5_021D1878(FieldSystem *fieldSystem);
static void ov5_021D1968(FieldSystem *fieldSystem);
static BOOL FieldMap_Init(OverlayManager *overlayMan, int *param1);
static BOOL FieldMap_Main(OverlayManager *overlayMan, int *param1);
static BOOL FieldMap_Exit(OverlayManager *overlayMan, int *param1);
static BOOL FieldMap_ChangeZone(FieldSystem *fieldSystem);
static void ov5_021D134C(FieldSystem *fieldSystem, u8 param1);
static BOOL ov5_021D119C(FieldSystem *fieldSystem);
static void fieldmap(void *param0);
static void ov5_021D13B4(FieldSystem *fieldSystem);
static int ov5_021D1178(FieldSystem *fieldSystem);
static BOOL FieldMap_InDistortionWorld(FieldSystem *fieldSystem);
static UnkStruct_ov5_021D1A68 *ov5_021D1A14(int param0, int param1);
static const int *ov5_021D1A68(const UnkStruct_ov5_021D1A68 *param0);
static const int ov5_021D1A6C(const UnkStruct_ov5_021D1A68 *param0);
static void ov5_021D1A70(UnkStruct_ov5_021D1A68 *param0);
static inline void inline_fieldmap(FieldSystem *fieldSystem)
{
UnkStruct_ov5_021ED0A4 *v0 = sub_0206285C(fieldSystem->mapObjMan);
UnkStruct_02020C44 *v1 = ov5_021EDC8C(v0);
sub_02020D68(v1);
}
static void fieldmap(void *param0)
{
FieldSystem *fieldSystem = param0;
Bg_RunScheduledUpdates(fieldSystem->bgConfig);
sub_0201DCAC();
sub_0200A858();
inline_fieldmap(fieldSystem);
}
static BOOL FieldMap_Init(OverlayManager *overlayMan, int *param1)
{
FieldSystem *fieldSystem;
BOOL ret = FALSE;
fieldSystem = OverlayManager_Args(overlayMan);
switch (*param1) {
case 0:
SetMainCallback(NULL, NULL);
DisableHBlank();
G2_BlendNone();
G2S_BlendNone();
sub_0200F32C(0);
sub_0200F32C(1);
ov5_021D173C(fieldSystem);
FieldMapChange_Set3DDisplay(fieldSystem);
if (fieldSystem->mapLoadMode->unk_00_20) {
Overlay_LoadByID(FS_OVERLAY_ID(overlay6), 2);
switch (ov5_021D1178(fieldSystem)) {
case 0:
Overlay_LoadByID(FS_OVERLAY_ID(overlay8), 2);
break;
case 1:
Overlay_LoadByID(FS_OVERLAY_ID(overlay7), 2);
break;
case 2:
Overlay_LoadByID(FS_OVERLAY_ID(overlay9), 2);
break;
}
}
Heap_Create(3, 4, fieldSystem->mapLoadMode->unk_04);
GF_ASSERT(fieldSystem->unk_04 == NULL);
fieldSystem->unk_04 = Heap_AllocFromHeap(4, sizeof(FieldSystem_sub2));
MI_CpuClear8(fieldSystem->unk_04, sizeof(FieldSystem_sub2));
fieldSystem->unk_04->unk_04 = ov5_021D1A94(fieldSystem, 4, 8);
ov5_021D1414();
VRAMTransferManager_New(128, 4);
sub_02020B90(4, 4);
Easy3D_Init(4);
ov5_021D15B4();
ov5_021D154C();
GXLayers_SwapDisplay();
fieldSystem->bgConfig = BgConfig_New(4);
ov5_021D1444(fieldSystem->bgConfig);
sub_0205D8CC(0, 1);
sub_0203F5C0(fieldSystem, 4);
break;
case 1:
ov5_021D1790(fieldSystem);
ov5_021EF7A0(fieldSystem->unk_30);
fieldSystem->unk_A4 = ov5_021E15F4(4);
ov5_021F0824(fieldSystem);
ov5_021D17EC(fieldSystem);
ov5_021D1878(fieldSystem);
ov5_021D1968(fieldSystem);
if (fieldSystem->unk_04->unk_0C != NULL) {
u16 v3 = FieldOverworldState_GetWeather(SaveData_GetFieldOverworldState(fieldSystem->saveData));
ov5_021D5F24(fieldSystem->unk_04->unk_0C, v3);
}
sub_020556A0(fieldSystem, fieldSystem->location->mapId);
sub_0203F5C0(fieldSystem, 3);
fieldSystem->unk_04->hBlankSystem = HBlankSystem_New(4);
HBlankSystem_Start(fieldSystem->unk_04->hBlankSystem);
fieldSystem->unk_04->unk_20 = ov5_021EF4BC(4, fieldSystem->unk_04->hBlankSystem);
break;
case 2:
ov5_021D5BD8(fieldSystem);
break;
case 3:
if (ov5_021D5BF4(fieldSystem)) {
fieldSystem->runningFieldMap = TRUE;
ret = TRUE;
}
break;
}
(*param1)++;
return ret;
}
static BOOL FieldMap_Main(OverlayManager *overlayMan, int *param1)
{
FieldSystem *fieldSystem = OverlayManager_Args(overlayMan);
if (ov5_021D119C(fieldSystem)) {
sub_02055D94(fieldSystem);
ov5_021D13B4(fieldSystem);
ov5_021EA714(fieldSystem, 1, 1);
FieldMap_ChangeZone(fieldSystem);
}
ov5_021D134C(fieldSystem, fieldSystem->unk_C0);
if (fieldSystem->runningFieldMap) {
return FALSE;
} else {
return TRUE;
}
}
static BOOL FieldMap_Exit(OverlayManager *overlayMan, int *param1)
{
FieldSystem *fieldSystem = OverlayManager_Args(overlayMan);
ov5_021E8188(fieldSystem, fieldSystem->unk_28);
switch (*param1) {
case 0:
sub_02068368(fieldSystem);
ov5_021E9338(fieldSystem->unk_28);
fieldSystem->location->x = Player_GetXPos(fieldSystem->playerAvatar);
fieldSystem->location->z = Player_GetZPos(fieldSystem->playerAvatar);
fieldSystem->location->faceDirection = PlayerAvatar_GetDir(fieldSystem->playerAvatar);
ov5_021EF300(fieldSystem->unk_A0);
{
GF_ASSERT(fieldSystem->unk_50 != 0);
ov5_021E924C(fieldSystem->unk_28);
}
ov5_021D3CAC(fieldSystem->unk_50);
ov5_021D3D7C(fieldSystem->unk_50);
ov5_021D41B4(&fieldSystem->unk_54);
ov5_021D5E8C(fieldSystem->unk_04->unk_10);
ov5_021D5EAC(fieldSystem->unk_04->unk_10);
fieldSystem->unk_04->unk_10 = NULL;
sub_02061BF0(fieldSystem->mapObjMan);
ov5_021ECC78(fieldSystem->mapObjMan);
MapObjectMan_StopAllMovement(fieldSystem->mapObjMan);
ov5_021DF500(fieldSystem->unk_40);
ov5_021D1A70(fieldSystem->unk_34);
fieldSystem->unk_34 = NULL;
ov5_021E1608(fieldSystem->unk_A4);
(*param1)++;
break;
case 1:
if (ov5_021E9300(fieldSystem->unk_28) == 1) {
ov5_021EFA10(&fieldSystem->unk_30);
ov5_021E92E4(fieldSystem->unk_28);
ov5_021EFB30(&fieldSystem->unk_A8);
ov5_021D5BA8(fieldSystem);
ov5_021D5278(&fieldSystem->unk_4C);
ov5_021E1B20(fieldSystem->unk_64);
ov5_021DD9C8(fieldSystem->unk_04->unk_08);
if (fieldSystem->unk_04->unk_0C != NULL) {
ov5_021D5EF8(fieldSystem->unk_04->unk_0C);
}
ov5_021EF4F8(fieldSystem->unk_04->unk_20);
HBlankSystem_Delete(fieldSystem->unk_04->hBlankSystem);
sub_02055CBC(fieldSystem->unk_04->unk_18);
ov5_021D57D8(&fieldSystem->unk_48);
ov5_021D5894(&fieldSystem->unk_44);
ov5_021D1570();
ov5_021D1524(fieldSystem->bgConfig);
ov5_021D5C14(fieldSystem);
(*param1)++;
}
break;
case 2:
if (ov5_021D5C30(fieldSystem)) {
ov5_021D15E8();
sub_02020BD0();
VRAMTransferManager_Destroy();
Easy3D_Shutdown();
ov5_021D1AE4(fieldSystem->unk_04->unk_04);
SetMainCallback(NULL, NULL);
Heap_FreeToHeap(fieldSystem->bgConfig);
Heap_FreeToHeap(fieldSystem->unk_04);
fieldSystem->unk_04 = NULL;
Heap_Destroy(4);
if (fieldSystem->mapLoadMode->unk_00_20) {
Overlay_UnloadByID(FS_OVERLAY_ID(overlay6));
Overlay_UnloadByID(FS_OVERLAY_ID(overlay8));
Overlay_UnloadByID(FS_OVERLAY_ID(overlay7));
Overlay_UnloadByID(FS_OVERLAY_ID(overlay9));
}
return TRUE;
}
break;
}
return FALSE;
}
const OverlayManagerTemplate gFieldMapTemplate = {
FieldMap_Init,
FieldMap_Main,
FieldMap_Exit,
0xffffffff
};
static int ov5_021D1178(FieldSystem *fieldSystem)
{
UnkStruct_02027860 *v0 = sub_02027860(FieldSystem_GetSaveData(fieldSystem));
int v1 = sub_02027F80(v0);
if (v1 == 0) {
return 1;
}
if (v1 == 9) {
return 2;
}
return 0;
}
static BOOL ov5_021D119C(FieldSystem *fieldSystem)
{
int x, y;
x = Player_GetXPos(fieldSystem->playerAvatar);
y = Player_GetZPos(fieldSystem->playerAvatar);
if ((x != fieldSystem->location->x) || (y != fieldSystem->location->z)) {
fieldSystem->location->x = x;
fieldSystem->location->z = y;
return TRUE;
} else {
return FALSE;
}
}
static BOOL FieldMap_ChangeZone(FieldSystem *fieldSystem)
{
u32 v0;
u32 v1;
int v2, v3;
FieldOverworldState *v4;
if (FieldMap_InDistortionWorld(fieldSystem) == 1) {
return 0;
}
v2 = (Player_GetXPos(fieldSystem->playerAvatar) - ov5_021EA6AC(fieldSystem->unk_28)) / 32;
v3 = (Player_GetZPos(fieldSystem->playerAvatar) - ov5_021EA6B4(fieldSystem->unk_28)) / 32;
v0 = sub_02039E30(fieldSystem->unk_2C, v2, v3);
v1 = fieldSystem->location->mapId;
if (v0 == v1) {
return 0;
}
v4 = SaveData_GetFieldOverworldState(fieldSystem->saveData);
{
fieldSystem->location->mapId = v0;
MapHeaderData_Load(fieldSystem, v0);
FieldMapChange_UpdateGameData(fieldSystem, 1);
}
{
int v5 = MapHeaderData_GetNumObjectEvents(fieldSystem);
const ObjectEvent *v6 = MapHeaderData_GetObjectEvents(fieldSystem);
sub_0206184C(fieldSystem->mapObjMan, v1, v0, v5, v6);
}
{
RadarChain_Clear(fieldSystem->chain);
sub_02055554(fieldSystem, sub_02055428(fieldSystem, fieldSystem->location->mapId), 1);
sub_0203A418(fieldSystem);
if (fieldSystem->unk_04->unk_0C != NULL) {
ov5_021D5F7C(
fieldSystem->unk_04->unk_0C, FieldOverworldState_GetWeather(v4));
}
}
{
int v7, v8;
int v9;
v7 = MapHeader_GetMapLabelTextID(v1);
v8 = MapHeader_GetMapLabelTextID(v0);
v9 = MapHeader_GetMapLabelWindowID(v0);
if (v7 != v8) {
if (v9 != 0) {
v9--;
}
ov5_021DD9E8(fieldSystem->unk_04->unk_08, v8, v9);
}
}
return TRUE;
}
void ov5_021D12D0(FieldSystem *fieldSystem, u32 param1)
{
u32 v0;
FieldOverworldState *v1;
v0 = fieldSystem->location->mapId;
v1 = SaveData_GetFieldOverworldState(fieldSystem->saveData);
{
fieldSystem->location->mapId = param1;
MapHeaderData_Load(fieldSystem, param1);
FieldMapChange_UpdateGameDataDistortionWorld(fieldSystem, 1);
}
{
int v2 = MapHeaderData_GetNumObjectEvents(fieldSystem);
const ObjectEvent *v3 = MapHeaderData_GetObjectEvents(fieldSystem);
sub_0206184C(fieldSystem->mapObjMan, v0, param1, v2, v3);
}
{
sub_02055554(fieldSystem, sub_02055428(fieldSystem, fieldSystem->location->mapId), 1);
sub_0203A418(fieldSystem);
if (fieldSystem->unk_04->unk_0C != NULL) {
ov5_021D5F7C(fieldSystem->unk_04->unk_0C, FieldOverworldState_GetWeather(v1));
}
}
}
static void ov5_021D134C(FieldSystem *fieldSystem, u8 param1)
{
if (FieldSystem_IsRunningTask(fieldSystem) == 0) {
sub_020559DC(fieldSystem);
}
ov5_021D5298(fieldSystem->unk_4C);
ov5_021E1B68(fieldSystem);
if ((param1 & 1) != 0) {
ov5_021D5DEC(fieldSystem->unk_04->unk_10);
}
if ((param1 & 8) != 0) {
ov5_021D3F10(fieldSystem->unk_50);
}
if ((param1 & 2) != 0) {
ov5_021E8188(fieldSystem, fieldSystem->unk_28);
if (FieldMap_InDistortionWorld(fieldSystem) == 1) {
ov9_0224CA5C(fieldSystem);
}
}
if ((param1 & 4) != 0) {
ov5_021D15F4(fieldSystem);
}
}
static void ov5_021D13B4(FieldSystem *fieldSystem)
{
UnkStruct_020556C4 *v0;
int v1, v2, v3;
if (MapHeader_IsOnMainMatrix(fieldSystem->location->mapId) == 0) {
return;
}
v0 = sub_0203A76C(SaveData_GetFieldOverworldState(fieldSystem->saveData));
v1 = (Player_GetXPos(fieldSystem->playerAvatar) - ov5_021EA6AC(fieldSystem->unk_28)) / 32;
v2 = (Player_GetZPos(fieldSystem->playerAvatar) - ov5_021EA6B4(fieldSystem->unk_28)) / 32;
v3 = PlayerAvatar_GetDir(fieldSystem->playerAvatar);
sub_02055740(v0, v1, v2, v3);
}
static void ov5_021D1414(void)
{
UnkStruct_02099F80 v0 = {
GX_VRAM_BG_128_C,
GX_VRAM_BGEXTPLTT_NONE,
GX_VRAM_SUB_BG_32_H,
GX_VRAM_SUB_BGEXTPLTT_NONE,
GX_VRAM_OBJ_32_FG,
GX_VRAM_OBJEXTPLTT_NONE,
GX_VRAM_SUB_OBJ_16_I,
GX_VRAM_SUB_OBJEXTPLTT_NONE,
GX_VRAM_TEX_01_AB,
GX_VRAM_TEXPLTT_0123_E
};
GXLayers_SetBanks(&v0);
}
void ov5_021D1434(BgConfig *bgl)
{
ov5_021D1444(bgl);
}
void ov5_021D143C(BgConfig *bgl)
{
ov5_021D1524(bgl);
}
static void ov5_021D1444(BgConfig *bgl)
{
{
GraphicsModes v0 = {
GX_DISPMODE_GRAPHICS,
GX_BGMODE_0,
GX_BGMODE_0,
GX_BG0_AS_3D
};
SetAllGraphicsModes(&v0);
}
{
BgTemplate v1 = {
0,
0,
0x800,
0,
1,
GX_BG_COLORMODE_16,
GX_BG_SCRBASE_0x0000,
GX_BG_CHARBASE_0x10000,
GX_BG_EXTPLTT_01,
3,
0,
0,
0
};
Bg_InitFromTemplate(bgl, 1, &v1, 0);
Bg_ClearTilesRange(1, 32, 0, 4);
Bg_ClearTilemap(bgl, 1);
}
{
BgTemplate v2 = {
0,
0,
0x800,
0,
1,
GX_BG_COLORMODE_16,
GX_BG_SCRBASE_0x0800,
GX_BG_CHARBASE_0x14000,
GX_BG_EXTPLTT_23,
3,
0,
0,
0
};
Bg_InitFromTemplate(bgl, 2, &v2, 0);
Bg_ClearTilesRange(2, 32, 0, 4);
Bg_ClearTilemap(bgl, 2);
}
{
BgTemplate v3 = {
0,
0,
0x800,
0,
1,
GX_BG_COLORMODE_16,
GX_BG_SCRBASE_0x1000,
GX_BG_CHARBASE_0x08000,
GX_BG_EXTPLTT_23,
0,
0,
0,
0
};
Bg_InitFromTemplate(bgl, 3, &v3, 0);
Bg_ClearTilesRange(3, 32, 0, 4);
Bg_ClearTilemap(bgl, 3);
}
{
u16 v4 = 0x0;
DC_FlushRange((void *)v4, 2);
GX_LoadBGPltt(&v4, 0, 2);
}
}
static void ov5_021D1524(BgConfig *bgl)
{
GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1 | GX_PLANEMASK_BG2 | GX_PLANEMASK_BG3, 0);
Bg_FreeTilemapBuffer(bgl, 1);
Bg_FreeTilemapBuffer(bgl, 2);
Bg_FreeTilemapBuffer(bgl, 3);
}
static void ov5_021D154C(void)
{
NNS_G2dInitOamManagerModule();
sub_0200A784(0, 124, 0, 31, 0, 124, 0, 31, 4);
}
static void ov5_021D1570(void)
{
sub_0200A878();
}
static void ov5_021D1578(UnkStruct_ov5_021D5894 *param0)
{
ov5_021D5ADC(param0, GX_POLYGONMODE_MODULATE, 0);
ov5_021D5AF0(param0, GX_CULL_BACK, 0);
ov5_021D5B04(param0, 31, 0);
ov5_021D5B18(param0, GX_POLYGON_ATTR_MISC_FOG, 1, 0);
ov5_021D58A8(param0, 1 << 22);
}
void ov5_021D15B4(void)
{
{
UnkStruct_ov22_022559F8 v0 = {
20, 0x8000, 0x4000, 4
};
sub_0201E88C(&v0, GX_OBJVRAMMODE_CHAR_1D_32K, GX_OBJVRAMMODE_CHAR_1D_32K);
}
sub_0201F834(20, 4);
sub_0201E994();
sub_0201F8E4();
}
void ov5_021D15E8(void)
{
sub_0201E958();
sub_0201F8B4();
}
static void ov5_021D15F4(FieldSystem *fieldSystem)
{
MtxFx44 v0, v1;
sub_020241B4();
if (fieldSystem->unk_20 == 1) {
if (FieldMap_InDistortionWorld(fieldSystem) == 1) {
ov9_02249F9C(fieldSystem);
}
Camera_ComputeViewMatrixWithRoll();
} else {
Camera_ComputeViewMatrix();
}
sub_0206979C(fieldSystem);
ov5_021E91FC(fieldSystem->unk_28, fieldSystem->unk_44);
if (FieldMap_InDistortionWorld(fieldSystem) == 1) {
ov9_0224CA50(fieldSystem);
}
ov5_021E1A6C(fieldSystem->unk_A4, fieldSystem->unk_30);
{
const MtxFx44 *v2;
v2 = NNS_G3dGlbGetProjectionMtx();
v0 = *v2;
v1 = v0;
v1._32 += FX_Mul(v1._22, 4 * FX32_ONE);
NNS_G3dGlbSetProjectionMtx(&v1);
NNS_G3dGlbFlush();
}
ov5_021DF4F8(fieldSystem->unk_40);
sub_02020C08();
if (FieldMap_InDistortionWorld(fieldSystem) == 1) {
ov9_02250780(fieldSystem);
}
{
NNS_G3dGlbSetProjectionMtx(&v0);
NNS_G3dGlbFlush();
}
ov5_021D1B18(fieldSystem->unk_04->unk_04);
G3_RequestSwapBuffers(GX_SORTMODE_AUTO, gBufferMode);
}
void ov5_021D16F4(FieldSystem *fieldSystem, BOOL param1)
{
if (param1 == 1) {
fieldSystem->unk_C0 |= 4;
} else {
fieldSystem->unk_C0 &= ~4;
}
}
void ov5_021D1718(FieldSystem *fieldSystem, BOOL param1)
{
if (param1 == 1) {
fieldSystem->unk_C0 |= 1;
} else {
fieldSystem->unk_C0 &= ~1;
}
}
static void ov5_021D173C(FieldSystem *fieldSystem)
{
fieldSystem->unk_C0 = (8 | 1 | 2 | 4);
}
void ov5_021D1744(const u8 param0)
{
if (param0 == 1) {
StartScreenTransition(
0, 1, 1, 0x0, 6, 1, 4);
} else if (param0 == 0) {
StartScreenTransition(
0, 0, 0, 0x0, 6, 1, 4);
} else {
GF_ASSERT(FALSE);
}
}
static void ov5_021D1790(FieldSystem *fieldSystem)
{
GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 0);
G3_SwapBuffers(GX_SORTMODE_AUTO, gBufferMode);
fieldSystem->unk_50 = ov5_021D38B8();
fieldSystem->unk_54 = ov5_021D4194();
{
u16 v0, v1;
v0 = sub_0203A038(fieldSystem->location->mapId);
fieldSystem->unk_30 = ov5_021EF76C(v0, fieldSystem->unk_50);
v1 = sub_0203A04C(fieldSystem->location->mapId);
GF_ASSERT(fieldSystem->unk_34 == NULL);
fieldSystem->unk_34 = ov5_021D1A14(4, v1);
}
}
static void ov5_021D17EC(FieldSystem *fieldSystem)
{
fieldSystem->unk_28 = ov5_021E9084(fieldSystem->unk_2C, fieldSystem->unk_30, fieldSystem->unk_50, fieldSystem->unk_60);
if (FieldMap_InDistortionWorld(fieldSystem) == 1) {
int v0 = 0, v1 = 0, v2 = 0;
ov9_02251094(fieldSystem->location->mapId, &v0, &v1, &v2);
ov5_021EA678(fieldSystem->unk_28, v0, v1, v2);
ov5_021EA6A4(fieldSystem->unk_28, 1);
ov5_021EA6D0(fieldSystem->unk_28, 1);
}
fieldSystem->unk_A0 = ov5_021EF28C(8, 4);
fieldSystem->unk_A8 = ov5_021EFB0C();
if (fieldSystem->mapLoadType == MAP_LOAD_TYPE_OVERWORLD) {
ov5_021E9630(fieldSystem->unk_28, ov5_021F0030, fieldSystem);
}
ov5_021E9150(fieldSystem->unk_28, fieldSystem->location->x, fieldSystem->location->z);
}
static void ov5_021D1878(FieldSystem *fieldSystem)
{
fieldSystem->unk_40 = ov5_021DF440(fieldSystem, 34, 4);
{
int v0 = 80;
if (FieldMap_InDistortionWorld(fieldSystem) == 1) {
v0 = 112;
}
ov5_021DF47C(fieldSystem->unk_40, v0);
}
ov5_021DF488(fieldSystem->unk_40, 4, 32, 32, 32, 32, (0x500 * (32 / 2)), (0x80 * (32 / 2)), (0x800 * 32));
if ((fieldSystem->mapLoadType == MAP_LOAD_TYPE_UNDERGROUND) || (fieldSystem->mapLoadType == MAP_LOAD_TYPE_UNION)) {
sub_02062CCC(fieldSystem->mapObjMan, 0);
}
{
const u32 *v1;
if (fieldSystem->mapLoadType == MAP_LOAD_TYPE_UNDERGROUND) {
v1 = Unk_ov5_021FF7D0;
} else {
if (FieldMap_InDistortionWorld(fieldSystem) == 1) {
v1 = Unk_ov5_021FF6B8;
} else {
v1 = Unk_ov5_021FF744;
}
}
ov5_021DF4C8(fieldSystem->unk_40, v1);
}
{
int v2 = 10;
if (fieldSystem->mapLoadType == MAP_LOAD_TYPE_UNION) {
v2 = 5;
}
ov5_021ECC20(fieldSystem->mapObjMan, 32, ov5_021D1A6C(fieldSystem->unk_34) + 3, ov5_021D1A68(fieldSystem->unk_34), v2);
}
FieldEffect_InitRenderObject(fieldSystem->unk_40);
{
UnkStruct_02027860 *v3 = sub_02027860(FieldSystem_GetSaveData(fieldSystem));
int v4 = sub_02027F80(v3);
PlayerAvatar_InitDraw(fieldSystem->playerAvatar, v4);
}
sub_02061C48(fieldSystem->mapObjMan);
CommPlayerMan_ForcePos();
sub_02062C3C(fieldSystem->mapObjMan);
ov5_021E931C(PlayerAvatar_PosVector(fieldSystem->playerAvatar), fieldSystem->unk_28);
fieldSystem->unk_04->unk_18 = sub_02055C8C(fieldSystem, 4);
}
static void ov5_021D1968(FieldSystem *fieldSystem)
{
GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 1);
GXLayers_TurnBothDispOn();
fieldSystem->unk_44 = ov5_021D5878();
ov5_021D1578(fieldSystem->unk_44);
fieldSystem->unk_48 = ov5_021D57BC();
{
int v0 = FieldOverworldState_GetCameraType(SaveData_GetFieldOverworldState(fieldSystem->saveData));
ov5_021D5B40(PlayerAvatar_PosVector(fieldSystem->playerAvatar), fieldSystem, v0, 1);
}
fieldSystem->unk_4C = ov5_021D521C(fieldSystem->unk_44, ov5_021EFAD8(fieldSystem->unk_30));
if (FieldMap_InDistortionWorld(fieldSystem) == 1) {
fieldSystem->unk_04->unk_0C = NULL;
} else {
fieldSystem->unk_04->unk_0C = ov5_021D5EB8(fieldSystem);
}
fieldSystem->unk_04->unk_08 = ov5_021DD98C(fieldSystem->bgConfig);
fieldSystem->unk_64 = ov5_021E1B08(4);
fieldSystem->unk_04->unk_10 = ov5_021D5CB0();
ov5_021D5CE4(fieldSystem->unk_04->unk_10, ov5_021EFA8C(fieldSystem->unk_30));
sub_02068344(fieldSystem);
ov5_021EE7C0(fieldSystem);
SetMainCallback(fieldmap, fieldSystem);
}
static UnkStruct_ov5_021D1A68 *ov5_021D1A14(int fieldSystem, int param1)
{
int v0;
u16 *v1;
UnkStruct_ov5_021D1A68 *v2;
v2 = Heap_AllocFromHeap(fieldSystem, sizeof(UnkStruct_ov5_021D1A68));
v1 = NARC_AllocAtEndAndReadWholeMemberByIndexPair(NARC_INDEX_FIELDDATA__MM_LIST__MOVE_MODEL_LIST, param1, fieldSystem);
for (v0 = 0; v0 < 24; v0++) {
v2->unk_02[v0] = 0xffff;
}
for (v0 = 0; v0 < 24; v0++) {
v2->unk_02[v0] = v1[v0];
if (v1[v0] == 0xffff) {
break;
}
}
v2->unk_00 = v0;
Heap_FreeToHeap(v1);
return v2;
}
static const int *ov5_021D1A68(const UnkStruct_ov5_021D1A68 *param0)
{
return param0->unk_02;
}
static const int ov5_021D1A6C(const UnkStruct_ov5_021D1A68 *param0)
{
return param0->unk_00;
}
static void ov5_021D1A70(UnkStruct_ov5_021D1A68 *param0)
{
Heap_FreeToHeap(param0);
}
static BOOL FieldMap_InDistortionWorld(FieldSystem *fieldSystem)
{
UnkStruct_02027860 *v0 = sub_02027860(FieldSystem_GetSaveData(fieldSystem));
int v1 = sub_02027F80(v0);
if (v1 == 9) {
return 1;
}
return 0;
}