pmd-red/src/unk_ds_only_feature.c
2025-12-18 07:14:45 -05:00

435 lines
10 KiB
C

#include "global.h"
#include "globaldata.h"
#include "unk_ds_only_feature.h"
#include "memory.h"
#include "game_options.h"
#include "event_flag.h"
#include "ground_main.h"
#include "ground_place.h"
#include "code_80A26CC.h"
#include "constants/ground_map.h"
#include "constants/friend_area.h"
#include "constants/dungeon.h"
// This file effectively does nothing on GBA. If I were to guess I'd say it's bottom/top screen related.
struct unkStruct_3001B68
{
u32 unk0;
u32 unk4;
u16 unk8;
u16 unkA;
u8 unkC;
u8 unkD;
u8 unkE;
u32 unk10;
s16 mapId;
s16 groundPlaceId;
u8 friendAreaId;
u8 dungeonId;
u32 unk1C;
u8 unk20;
};
static IWRAM_INIT struct unkStruct_3001B68 *sUnknown_3001B68 = {NULL};
UNUSED static const u8 sUnused[4] = {0};
static void nullsub_107();
static void nullsub_108();
static void nullsub_109();
static void nullsub_110();
static void nullsub_111();
static void nullsub_112();
static void nullsub_113();
static void nullsub_114();
static void nullsub_115();
static void nullsub_116();
void sub_809C5C4(void)
{
sUnknown_3001B68 = MemoryAlloc(sizeof(struct unkStruct_3001B68), MEMALLOC_GROUP_6);
sUnknown_3001B68->unk0 = 0;
sUnknown_3001B68->unk4 = 0;
sUnknown_3001B68->unk8 = 0;
sUnknown_3001B68->unkA = 0;
sUnknown_3001B68->unkD = 0;
sUnknown_3001B68->unkE = 0;
sUnknown_3001B68->unk10 = 0;
sUnknown_3001B68->mapId = -1;
sUnknown_3001B68->groundPlaceId = GROUND_PLACE_DIRECTION;
sUnknown_3001B68->friendAreaId = 0;
sUnknown_3001B68->dungeonId = DUNGEON_OUT_ON_RESCUE;
sUnknown_3001B68->unk1C = 0;
sUnknown_3001B68->unk20 = 0;
nullsub_107();
sub_809C63C();
}
void sub_809C618(void)
{
sub_809C63C();
nullsub_107();
nullsub_108();
FREE_AND_SET_NULL(sUnknown_3001B68);
}
void sub_809C63C(void)
{
nullsub_108();
sUnknown_3001B68->unk1C = 0;
sUnknown_3001B68->unk20 = 0;
}
void sub_809C658(void)
{
switch (sUnknown_3001B68->unkA) {
case 3:
nullsub_111();
nullsub_112();
nullsub_113();
break;
case 4:
nullsub_114();
nullsub_115();
nullsub_116();
break;
case 2:
nullsub_109();
nullsub_110();
break;
case 5:
nullsub_107();
nullsub_108();
break;
case 0:
case 1:
nullsub_107();
nullsub_108();
break;
}
}
void sub_809C6CC(u16 param_1)
{
if (sUnknown_3001B68->unk8 != param_1) {
sUnknown_3001B68->unk8 = param_1;
sUnknown_3001B68->unkE = 0;
}
}
void sub_809C6EC(void)
{
if (!sub_8098F88()) {
if (gGameOptionsRef->unkC == 0) {
sub_809C6CC(4);
}
else {
sub_809C6CC(3);
}
}
else {
sub_809C6CC(5);
}
}
UNUSED static u16 sub_809C724(void)
{
return sUnknown_3001B68->unk8;
}
bool8 sub_809C730(void)
{
return sub_809C740();
}
bool8 sub_809C740(void)
{
if (sUnknown_3001B68->unk0 == 0)
return TRUE;
else
return FALSE;
}
// Called in a number of places, like when the player changes the team leader in sub_80278B4().
void nullsub_104(void)
{
}
void sub_809C760(void)
{
sUnknown_3001B68->unkE = 1;
}
void sub_809C770(s16 mapId_, s16 groundPlaceId_)
{
u8 friendAreaId;
u8 dungeonId;
s32 scriptDungeonId;
u32 uVar6;
s32 mapId = mapId_;
s32 groundPlaceId = groundPlaceId_;
if (sUnknown_3001B68->unkE != 0) {
sUnknown_3001B68->unkE = 0;
return;
}
if (sUnknown_3001B68->unk8 == 0) {
sub_809C6EC();
}
friendAreaId = sUnknown_3001B68->friendAreaId;
dungeonId = sUnknown_3001B68->dungeonId;
switch (groundPlaceId) {
case GROUND_PLACE_FRIEND_AREAS:
friendAreaId = MapIdToFriendAreaId(mapId);
if (friendAreaId == FRIEND_AREA_NONE) {
return;
}
uVar6 = 1;
break;
case GROUND_PLACE_SQUARE:
case GROUND_PLACE_SQUARE_2:
case GROUND_PLACE_POKEMON_SQUARE:
case GROUND_PLACE_WHISCASH_POND:
case GROUND_PLACE_PELIPPER_POST_OFFICE:
case GROUND_PLACE_PELIPPER_POST_OFFICE_INSIDE:
case GROUND_PLACE_MAKUHITA_DOJO:
case GROUND_PLACE_MAKUHITA_DOJO_INSIDE:
case GROUND_PLACE_LUMINOUS_CAVE:
case GROUND_PLACE_TEAM_BASE:
case GROUND_PLACE_TEAM_BASE_INSIDE:
uVar6 = 1;
friendAreaId = FRIEND_AREA_NONE;
break;
case GROUND_PLACE_DIRECTION:
switch((s16)(mapId)) {
case MAP_FUGITIVES_FISSURE:
case MAP_FUGITIVES_FIRE:
case MAP_FUGITIVES_SNOW_ROAD:
case MAP_FUGITIVES_SNOW_FOREST:
case MAP_FUGITIVES_BLIZZARD_ROAD:
case MAP_NIGHTMARE:
case MAP_NIGHT_SKY_1:
case MAP_NIGHT_SKY_2:
case MAP_THE_END:
uVar6 = 0;
break;
default:
return;
}
break;
case GROUND_PLACE_NEW_GAME:
case GROUND_PLACE_SCENE:
case GROUND_PLACE_INVALIDITY:
uVar6 = 0;
break;
default:
switch((s16)(groundPlaceId)) {
case GROUND_PLACE_TINY_WOODS:
scriptDungeonId = 0;
break;
case GROUND_PLACE_MT_THUNDER:
case GROUND_PLACE_MT_THUNDER_MID:
scriptDungeonId = 7;
break;
case GROUND_PLACE_GREAT_CANYON:
case GROUND_PLACE_HILL_OF_THE_ANCIENTS:
scriptDungeonId = 9;
break;
case GROUND_PLACE_LAPIS_CAVE:
scriptDungeonId = 10;
break;
case GROUND_PLACE_MT_BLAZE:
case GROUND_PLACE_MT_BLAZE_MID:
scriptDungeonId = 0xb;
break;
case GROUND_PLACE_FROSTY_FOREST:
case GROUND_PLACE_FROSTY_CLEARING:
scriptDungeonId = 0xd;
break;
case GROUND_PLACE_MT_FREEZE:
case GROUND_PLACE_MT_FREEZE_MID:
scriptDungeonId = 0xf;
break;
case GROUND_PLACE_MAGMA_CAVERN:
case GROUND_PLACE_MAGMA_CAVERN_MID:
scriptDungeonId = 0x11;
break;
case GROUND_PLACE_SKY_TOWER:
case GROUND_PLACE_SKY_TOWER_MID:
scriptDungeonId = 0x13;
break;
case GROUND_PLACE_WESTERN_CAVE:
scriptDungeonId = 0x20;
break;
case GROUND_PLACE_DUNGEON:
default:
scriptDungeonId = (s16)GetScriptVarValue(NULL,DUNGEON_ENTER);
break;
}
if (scriptDungeonId == -1) {
return;
}
dungeonId = ScriptDungeonIdToDungeonId(scriptDungeonId);
uVar6 = 2;
break;
}
if (sUnknown_3001B68->unk10 != uVar6) {
sUnknown_3001B68->unk0 = 2;
sUnknown_3001B68->unkC = 1;
sUnknown_3001B68->unk20 = 1;
}
else {
if (uVar6 == 1) {
if (friendAreaId != sUnknown_3001B68->friendAreaId || sUnknown_3001B68->mapId != mapId) {
sUnknown_3001B68->unkC = 1;
sUnknown_3001B68->unk20 = 1;
}
else {
if (friendAreaId == FRIEND_AREA_NONE && sUnknown_3001B68->groundPlaceId != groundPlaceId) {
sUnknown_3001B68->unkC = 1;
}
}
}
else if (uVar6 == 2 &&
(dungeonId != sUnknown_3001B68->dungeonId || (sUnknown_3001B68->groundPlaceId != groundPlaceId)))
{
sUnknown_3001B68->unkC = 1;
sUnknown_3001B68->unk20 = 1;
}
}
if (sUnknown_3001B68->unkC != 0) {
sUnknown_3001B68->unk10 = uVar6;
sUnknown_3001B68->mapId = mapId;
sUnknown_3001B68->groundPlaceId = groundPlaceId;
sUnknown_3001B68->friendAreaId = friendAreaId;
sUnknown_3001B68->dungeonId = dungeonId;
if (sUnknown_3001B68->unk8 != 4) {
sUnknown_3001B68->unkC = 0;
sUnknown_3001B68->unk20 = 0;
}
}
}
void nullsub_105(void)
{
}
void sub_809CA20(void)
{
if (sUnknown_3001B68->unk0 != 0) {
sUnknown_3001B68->unk0 = 0;
sUnknown_3001B68->unk4 = 0x1f;
sUnknown_3001B68->unkC = 1;
}
if (sUnknown_3001B68->unkC != 0) {
sUnknown_3001B68->unkA = sUnknown_3001B68->unk8;
if (sUnknown_3001B68->unk8 == 4 && sUnknown_3001B68->unk10 == 0) {
sUnknown_3001B68->unkA = 2;
sUnknown_3001B68->unk1C = 0;
sUnknown_3001B68->unk20 = 0;
}
switch (sUnknown_3001B68->unkA) {
case 3:
nullsub_111();
nullsub_113();
nullsub_112();
sUnknown_3001B68->unkD = 1;
break;
case 4:
nullsub_114();
nullsub_115();
nullsub_116();
break;
case 2:
nullsub_109();
nullsub_110();
break;
case 5:
nullsub_107();
nullsub_108();
break;
case 0:
case 1:
nullsub_107();
nullsub_108();
break;
}
sUnknown_3001B68->unkC = 0;
}
else {
switch (sUnknown_3001B68->unkA) {
case 3:
nullsub_113();
break;
case 4:
nullsub_116();
case 0:
case 1:
case 2:
case 5:
break;
}
}
}
void nullsub_106(void)
{
}
static void nullsub_107(void)
{
}
static void nullsub_108(void)
{
}
static void nullsub_109(void)
{
}
static void nullsub_110(void)
{
}
static void nullsub_111(void)
{
}
static void nullsub_112(void)
{
}
static void nullsub_113(void)
{
}
static void nullsub_114(void)
{
}
static void nullsub_115(void)
{
}
static void nullsub_116(void)
{
}