pokeplatinum/src/overlay005/fieldmap.c
Kuruyia be823a26bb Document area data
This documents the `ov5_021EF75C.c` file, which is in charge of loading
various "area data" NARCs that, in the end, contain the textures of
maps, the textures and models of map props, and lighting information.

Also, renamed `MapProp.id` to `MapProp.modelID` for more clarity
(especially when interacting with the new area data functions).

Signed-off-by: Kuruyia <github@kuruyia.net>
2025-02-22 13:38:54 +01:00

973 lines
26 KiB
C

#include "overlay005/fieldmap.h"
#include <nitro.h>
#include <string.h>
#include "constants/field/map_load.h"
#include "constants/heap.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/area_data.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/honey_tree.h"
#include "overlay005/map_name_popup.h"
#include "overlay005/map_prop.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_021DF440.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_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 "bg_window.h"
#include "camera.h"
#include "char_transfer.h"
#include "comm_player_manager.h"
#include "easy3d.h"
#include "field_map_change.h"
#include "field_message.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_matrix.h"
#include "map_object.h"
#include "narc.h"
#include "overlay_manager.h"
#include "player_avatar.h"
#include "pltt_transfer.h"
#include "pokeradar.h"
#include "render_oam.h"
#include "savedata_misc.h"
#include "script_manager.h"
#include "system.h"
#include "unk_0200F174.h"
#include "unk_02020AEC.h"
#include "unk_0202419C.h"
#include "unk_02027F50.h"
#include "unk_020553DC.h"
#include "unk_020556C4.h"
#include "unk_020559DC.h"
#include "unk_02055C50.h"
#include "unk_02068344.h"
#include "vram_transfer.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);
VramTransfer_Process();
RenderOam_Transfer();
inline_fieldmap(fieldSystem);
}
static BOOL FieldMap_Init(OverlayManager *overlayMan, int *param1)
{
FieldSystem *fieldSystem;
BOOL ret = FALSE;
fieldSystem = OverlayManager_Args(overlayMan);
switch (*param1) {
case 0:
SetVBlankCallback(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();
VramTransfer_New(128, HEAP_ID_FIELD);
sub_02020B90(4, 4);
Easy3D_Init(HEAP_ID_FIELD);
ov5_021D15B4();
ov5_021D154C();
GXLayers_SwapDisplay();
fieldSystem->bgConfig = BgConfig_New(4);
ov5_021D1444(fieldSystem->bgConfig);
FieldMessage_LoadTextPalettes(0, TRUE);
sub_0203F5C0(fieldSystem, 4);
break;
case 1:
ov5_021D1790(fieldSystem);
AreaDataManager_Load(fieldSystem->areaDataManager);
fieldSystem->mapPropManager = MapPropManager_New(HEAP_ID_FIELD);
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;
MapPropManager_Free(fieldSystem->mapPropManager);
(*param1)++;
break;
case 1:
if (ov5_021E9300(fieldSystem->unk_28) == 1) {
AreaDataManager_Free(&fieldSystem->areaDataManager);
ov5_021E92E4(fieldSystem->unk_28);
HoneyTree_FreeShakeData(&fieldSystem->unk_A8);
ov5_021D5BA8(fieldSystem);
ov5_021D5278(&fieldSystem->unk_4C);
ov5_021E1B20(fieldSystem->unk_64);
MapNamePopUp_Destroy(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();
VramTransfer_Free();
Easy3D_Shutdown();
ov5_021D1AE4(fieldSystem->unk_04->unk_04);
SetVBlankCallback(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 mapId;
int x, y;
FieldOverworldState *fieldState;
if (FieldMap_InDistortionWorld(fieldSystem) == TRUE) {
return FALSE;
}
x = (Player_GetXPos(fieldSystem->playerAvatar) - ov5_021EA6AC(fieldSystem->unk_28)) / 32;
y = (Player_GetZPos(fieldSystem->playerAvatar) - ov5_021EA6B4(fieldSystem->unk_28)) / 32;
v0 = MapMatrix_GetMapHeaderIDAtCoords(fieldSystem->mapMatrix, x, y);
mapId = fieldSystem->location->mapId;
if (v0 == mapId) {
return FALSE;
}
fieldState = SaveData_GetFieldOverworldState(fieldSystem->saveData);
fieldSystem->location->mapId = v0;
MapHeaderData_Load(fieldSystem, v0);
FieldMapChange_UpdateGameData(fieldSystem, 1);
int objEventCount = MapHeaderData_GetNumObjectEvents(fieldSystem);
const ObjectEvent *objEventList = MapHeaderData_GetObjectEvents(fieldSystem);
sub_0206184C(fieldSystem->mapObjMan, mapId, v0, objEventCount, objEventList);
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(fieldState));
}
int v7, v8;
int v9;
v7 = MapHeader_GetMapLabelTextID(mapId);
v8 = MapHeader_GetMapLabelTextID(v0);
v9 = MapHeader_GetMapLabelWindowID(v0);
if (v7 != v8) {
if (v9 != 0) {
v9--;
}
MapNamePopUp_Show(fieldSystem->unk_04->unk_08, v8, v9);
}
return TRUE;
}
void ov5_021D12D0(FieldSystem *fieldSystem, u32 param1)
{
u32 mapId;
FieldOverworldState *fieldState;
mapId = fieldSystem->location->mapId;
fieldState = SaveData_GetFieldOverworldState(fieldSystem->saveData);
fieldSystem->location->mapId = param1;
MapHeaderData_Load(fieldSystem, param1);
FieldMapChange_UpdateGameDataDistortionWorld(fieldSystem, 1);
int objEventCount = MapHeaderData_GetNumObjectEvents(fieldSystem);
const ObjectEvent *objEventList = MapHeaderData_GetObjectEvents(fieldSystem);
sub_0206184C(fieldSystem->mapObjMan, mapId, param1, objEventCount, objEventList);
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(fieldState));
}
}
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) == TRUE) {
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();
RenderOam_Init(0, 124, 0, 31, 0, 124, 0, 31, 4);
}
static void ov5_021D1570(void)
{
RenderOam_Free();
}
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)
{
{
CharTransferTemplate v0 = {
20, 0x8000, 0x4000, 4
};
CharTransfer_InitWithVramModes(&v0, GX_OBJVRAMMODE_CHAR_1D_32K, GX_OBJVRAMMODE_CHAR_1D_32K);
}
PlttTransfer_Init(20, 4);
CharTransfer_ClearBuffers();
PlttTransfer_Clear();
}
void ov5_021D15E8(void)
{
CharTransfer_Free();
PlttTransfer_Free();
}
static void ov5_021D15F4(FieldSystem *fieldSystem)
{
MtxFx44 v0, v1;
sub_020241B4();
if (fieldSystem->unk_20 == 1) {
if (FieldMap_InDistortionWorld(fieldSystem) == TRUE) {
ov9_02249F9C(fieldSystem);
}
Camera_ComputeViewMatrixWithRoll();
} else {
Camera_ComputeViewMatrix();
}
sub_0206979C(fieldSystem);
ov5_021E91FC(fieldSystem->unk_28, fieldSystem->unk_44);
if (FieldMap_InDistortionWorld(fieldSystem) == TRUE) {
ov9_0224CA50(fieldSystem);
}
MapPropManager_Render2(fieldSystem->mapPropManager, fieldSystem->areaDataManager);
{
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) == TRUE) {
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 areaDataArchiveID, v1;
areaDataArchiveID = MapHeader_GetAreaDataArchiveID(fieldSystem->location->mapId);
fieldSystem->areaDataManager = AreaDataManager_Alloc(areaDataArchiveID, 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->mapMatrix, fieldSystem->areaDataManager, fieldSystem->unk_50, fieldSystem->unk_60);
if (FieldMap_InDistortionWorld(fieldSystem) == TRUE) {
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 = HoneyTree_ShakeDataInit();
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) == TRUE) {
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)) {
MapObjectMan_SetEndMovement(fieldSystem->mapObjMan, 0);
}
{
const u32 *v1;
if (fieldSystem->mapLoadType == MAP_LOAD_TYPE_UNDERGROUND) {
v1 = Unk_ov5_021FF7D0;
} else {
if (FieldMap_InDistortionWorld(fieldSystem) == TRUE) {
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, AreaDataManager_GetAreaLightArchiveID(fieldSystem->areaDataManager));
if (FieldMap_InDistortionWorld(fieldSystem) == TRUE) {
fieldSystem->unk_04->unk_0C = NULL;
} else {
fieldSystem->unk_04->unk_0C = ov5_021D5EB8(fieldSystem);
}
fieldSystem->unk_04->unk_08 = MapNamePopUp_Create(fieldSystem->bgConfig);
fieldSystem->unk_64 = ov5_021E1B08(4);
fieldSystem->unk_04->unk_10 = ov5_021D5CB0();
ov5_021D5CE4(fieldSystem->unk_04->unk_10, AreaDataManager_GetMapTexture(fieldSystem->areaDataManager));
sub_02068344(fieldSystem);
ov5_021EE7C0(fieldSystem);
SetVBlankCallback(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 TRUE;
}
return FALSE;
}