more game.c

This commit is contained in:
theo3 2022-01-03 20:16:58 -08:00
parent 0698806e00
commit f26b2e286a
12 changed files with 530 additions and 1067 deletions

File diff suppressed because it is too large Load Diff

View File

@ -9,6 +9,7 @@ extern u32 GetTileTypeByEntity(struct Entity_*);
extern u32 GetTileTypeByPos(s32 x, s32 y, u32 layer); extern u32 GetTileTypeByPos(s32 x, s32 y, u32 layer);
extern u32 GetTileType(u32 pos, u32 layer); extern u32 GetTileType(u32 pos, u32 layer);
extern void SetTile(u32 index, u32 position, u32 layer); extern void SetTile(u32 index, u32 position, u32 layer);
extern void sub_08000108(void);
extern u32 sub_080002D0(struct Entity_*); extern u32 sub_080002D0(struct Entity_*);
extern void LoadResourceAsync(const void*, u32, u32); extern void LoadResourceAsync(const void*, u32, u32);
extern void sub_08001242(struct Entity_*); extern void sub_08001242(struct Entity_*);

View File

@ -43,6 +43,8 @@ void MemCopy(const void* src, void* dest, u32 size);
*/ */
void ReadKeyInput(void); void ReadKeyInput(void);
void zMallocInit(void);
/** /**
* Allocate memory on heap. * Allocate memory on heap.
* *

View File

@ -55,7 +55,8 @@ typedef struct {
} Main; } Main;
typedef struct { typedef struct {
/*0x00*/ u16 nextToLoad; /*0x00*/ u8 nextToLoad;
/*0x01*/ u8 _1;
/*0x02*/ u8 lastState; /*0x02*/ u8 lastState;
/*0x03*/ u8 field_0x3; /*0x03*/ u8 field_0x3;
/*0x04*/ u8 state; /*0x04*/ u8 state;

View File

@ -280,6 +280,7 @@ extern u16 gWalletSizes[];
extern PlayerState gPlayerState; extern PlayerState gPlayerState;
extern Entity gPlayerEntity; extern Entity gPlayerEntity;
u32 sub_080705AC(void);
void SetPlayerControl(PlayerControlMode mode); void SetPlayerControl(PlayerControlMode mode);
void ResetPlayer(void); void ResetPlayer(void);
void ResetPlayerVelocity(void); void ResetPlayerVelocity(void);

View File

@ -192,9 +192,13 @@ typedef enum {
extern void SetTileType(u32, u32, u32); extern void SetTileType(u32, u32, u32);
extern void InitScreenShake(u32 time, u32 magnitude); extern void InitScreenShake(u32 time, u32 magnitude);
void sub_0804AFF4(void);
void LoadRoom(void);
void SetCurrentRoomPropertyList(u32 area, u32 room);
extern void* GetCurrentRoomProperty(u32); extern void* GetCurrentRoomProperty(u32);
extern void LoadRoomTileEntities(); extern void LoadRoomTileEntities();
void sub_0804B3C4(void*); void sub_0804B3C4(void*);
void sub_0804B0B0(u32 arg0, u32 arg1);
#endif #endif

View File

@ -437,7 +437,6 @@ SECTIONS {
src/roomInit.o(.text); src/roomInit.o(.text);
src/fade.o(.text); src/fade.o(.text);
src/fileScreen.o(.text); src/fileScreen.o(.text);
asm/fileScreen.o(.text);
src/game.o(.text); src/game.o(.text);
asm/code_080526F8.o(.text); asm/code_080526F8.o(.text);
asm/modBombs.o(.text); asm/modBombs.o(.text);

View File

@ -1,4 +1,5 @@
#include "global.h" #include "global.h"
#include "asm.h"
#include "sound.h" #include "sound.h"
#include "screen.h" #include "screen.h"
#include "entity.h" #include "entity.h"
@ -15,6 +16,8 @@
#include "message.h" #include "message.h"
#include "game.h" #include "game.h"
extern u8 gUpdateVisibleTiles;
extern u8 gUnk_080FCA84[]; extern u8 gUnk_080FCA84[];
extern u8 gUnk_080FCAC8[]; extern u8 gUnk_080FCAC8[];
extern u8 gUnk_02024090[]; extern u8 gUnk_02024090[];
@ -30,6 +33,39 @@ extern void** gAreaTable[];
extern u8 gUnk_080FCAF8[]; extern u8 gUnk_080FCAF8[];
extern u16 gUnk_020178E0[]; extern u16 gUnk_020178E0[];
extern void (*gUnk_080FC9D8[])();
extern void (*gUnk_080FC9E8[])();
extern void (*gUnk_080FCA08[])();
extern void (*gUnk_080FCA14[])();
extern void (*gUnk_080FCA70[])(void);
void sub_0807CA18(void);
void sub_080300AC(void);
void sub_08049CD4(void);
void sub_0807059C(void);
void sub_080A7124(void);
void sub_0806FD8C(void);
void sub_080300C4(void);
u32 sub_0805BC04(void);
void DeleteSleepingEntities(void);
u32 sub_0805BBBC(void);
void sub_080185F8(void);
void sub_08080A40(void);
u32 sub_0804AA84(void);
void sub_08078CB4(void);
void sub_0801C344();
u32 sub_080705AC();
void CollisionMain();
void sub_0805BB74();
void CreateZeldaFollower(void);
void sub_0807C0DC();
void sub_0805E9A8();
void sub_0804AF90();
void sub_0804AFDC();
void sub_0805283C();
void UpdateScroll();
void UpdateBgAnim();
void sub_08052010();
void sub_080520C4(); void sub_080520C4();
void CleanUpGFXSlots(); void CleanUpGFXSlots();
void sub_080ADE24(); void sub_080ADE24();
@ -48,6 +84,25 @@ void sub_0807C740(void);
void sub_080197AC(void); void sub_080197AC(void);
void sub_08053390(void); void sub_08053390(void);
static void sub_08053518(void);
static void InitializeEntities(void);
static void sub_08053178(void);
static void sub_08052BF8(void);
static void sub_08051E04(void);
static void sub_08052F1C(void);
/* static */ void sub_08052C5C(void);
static void sub_08052C3C(void);
static void sub_0805340C(void);
static void sub_08051D98(void);
static void sub_08051DCC(void);
/* static */ u32 sub_080528B4(void);
/* static */ u32 HandleRoomExit(void);
static void sub_080531F8(void);
static void sub_0805329C(void);
static void InitializePlayer(void);
/* static */ void sub_08051F04(void);
/* static */ void sub_08051F9C(u32 a1, u32 a2, u32 a3, u32 a4);
static void DrawGameOverText(void);
static u32 StairsAreValid(); static u32 StairsAreValid();
static void ClearFlagArray(const u16*); static void ClearFlagArray(const u16*);
static void DummyHandler(u32* a1); static void DummyHandler(u32* a1);
@ -58,6 +113,26 @@ static void InitRoomResInfo(RoomResInfo* info, RoomHeader* hdr, u32 area, u32 ro
static void sub_080532E4(void); static void sub_080532E4(void);
static void sub_08053460(void); static void sub_08053460(void);
typedef struct {
u8 _0;
u8 _1;
u8 _2;
u8 _3;
u8 _4;
u16 _6;
} struct_08127F94;
extern struct_08127F94 gUnk_08127F94[];
typedef struct {
u8 _0;
u8 _1;
u8 _2;
u8 _3;
u16 _4;
u16 _6;
} struct_080FCA20;
extern struct_080FCA20 gUnk_080FCA20[];
typedef struct { typedef struct {
u16* dest; u16* dest;
void* gfx_dest; void* gfx_dest;
@ -85,6 +160,417 @@ typedef struct {
extern void CreateDialogBox(); extern void CreateDialogBox();
void HandleGameplayScreen(void) {
gScreenTransition.frameCount++;
gUnk_080FC9D8[gMain.funcIndex]();
#ifdef DEMO_USA
if (gSave.unk48C[7] != 0) {
if (--gSave.unk48C[7] == 0) {
DoFade(7, 2);
gMain.funcIndex = 3;
}
}
#endif
}
void sub_080519B0(void) {
if (gFadeControl.active)
return;
DispReset(1);
InitSoundPlayingInfo();
zMallocInit();
sub_080A7124();
sub_0807059C();
MemClear(&gScreenTransition, 0xB0);
sub_08049CD4();
sub_080300AC();
sub_0807CA18();
MemCopy(&gSave.saved_status, &gScreenTransition.player_status, 0x20);
gScreenTransition.transitionType = 4;
sub_08053518();
gMain.funcIndex = 1;
gMain.transition = 0;
}
void sub_08051A14(void) {
DispReset(1);
gFadeControl.mask = 0xffffffff;
MemClear(&gUnk_03000000, 0xB74);
MemClear(&gUnk_02032EC0, 0x3B4);
EraseAllEntities();
sub_080197AC();
sub_08080668();
ResetPalettes();
sub_0801CFA8(1);
sub_0806FD8C();
gRoomControls.areaID = gScreenTransition.player_status.area_next;
gRoomControls.roomID = gScreenTransition.player_status.room_next;
sub_08053320();
gGFXSlots.unk0 = 1;
gMain.funcIndex = 2;
}
void sub_08051A90(void) {
gUnk_080FC9E8[gMain.transition]();
}
void InitializeNewRoom(void) {
SetInitializationPriority();
gScreen.lcd.displayControl = 0x1740;
gMain.transition = 1;
gScreenTransition.transitioningOut = 0;
gScreenTransition.field_0x4[0] = 0;
gScreenTransition.field_0x4[1] = 0;
MessageInitialize();
sub_08052CFC();
sub_0801C370(0);
InitializeEntities();
#ifndef EU
sub_0801855C();
#endif
}
void sub_08051AF0(void) {
UpdateEntities();
if (!sub_0805BBBC())
UpdateScroll();
UpdateBgAnim();
sub_08000108();
sub_0801C344();
UpdateManagers();
FlushSprites();
sub_0801C208();
sub_08078CB4();
sub_080AD9B0();
sub_080AD918();
if (gFadeControl.active || gRoomControls.unk2 != 0)
return;
sub_08052F1C();
if (gArea.musicIndex != gArea.pMusicIndex) {
gArea.musicIndex = gArea.pMusicIndex;
SoundReq(gArea.pMusicIndex | 0x800B0000);
}
DeleteSleepingEntities();
if (sub_0805BC04())
return;
sub_08052C5C();
ResetSystemPriority();
sub_08051E04();
sub_080300C4();
gMain.transition = 2;
SetPlayerControl(0);
gUnk_02034490[0] = 0;
#if defined(USA) || defined(DEMO_USA)
if (gArea.inventoryGfxIdx != 0xff) {
sub_0801855C();
}
sub_08052BF8();
sub_08053178();
#elif defined(EU)
sub_08053178();
sub_0801855C();
#elif defined(JP)
sub_08053178();
if (gArea.inventoryGfxIdx != 0xff) {
sub_0801855C();
}
#elif defined(DEMO_JP)
if (gScreenTransition.field_0x2c[5])
sub_08053178();
if (gArea.inventoryGfxIdx != 0xff) {
sub_0801855C();
}
sub_08052BF8();
#endif
if (!gRoomVars.field_0x0) {
RequestPriorityDuration(NULL, 1);
}
}
void sub_08051BD0(void) {
if (sub_080705AC() || sub_0804AA84()) {
return;
}
sub_0805340C();
if (gMain.transition != 2) {
return;
}
if ((gMessage.doTextBox & 0x7f) || gPriorityHandler.priority_timer != 0)
sub_08078B48();
FlushSprites();
UpdateEntities();
sub_08080A40();
CollisionMain();
UpdateScroll();
UpdateBgAnim();
sub_08000108();
sub_08052C3C();
sub_0801C344();
UpdateManagers();
sub_0801C208();
sub_08078CB4();
sub_080AD9B0();
HandleRoomExit();
sub_08052C5C();
sub_080528B4();
sub_080185F8();
sub_080AD918();
switch (gRoomControls.unk2) {
case 1:
gPlayerState.queued_action = 0x17;
gMain.transition = 1;
SetRoomReloadPriority();
sub_08051D98();
break;
case 2:
gPlayerState.queued_action = 0x17;
gMain.transition = 1;
SetRoomReloadPriority();
sub_08051DCC();
break;
}
}
void sub_08051CA8(void) {
if (sub_080705AC())
return;
UpdateEntities();
CollisionMain();
sub_0801C344();
UpdateManagers();
FlushSprites();
sub_0801C208();
sub_08078CB4();
sub_080AD9B0();
HandleRoomExit();
sub_080528B4();
sub_080AD918();
if (!gFadeControl.active)
ResetSystemPriority();
}
void sub_08051CF0(void) {
FlushSprites();
sub_0801C208();
sub_080AD9B0();
gMain.pad = 1;
sub_080AD918();
if (!gFadeControl.active) {
DispReset(1);
gMain.funcIndex = 1;
gMain.transition = 0;
gScreenTransition.transitioningOut = 1;
}
}
void sub_08051D2C(void) {
#ifdef DEMO_USA
if (!gFadeControl.active)
DoSoftReset();
#else
DoFade(7, 8);
InitScreen(3);
#endif
}
static void InitializeEntities(void) {
sub_08052EA0();
sub_0804AF90();
sub_0804AFDC();
InitializePlayer();
gUnk_03004030.unk_00 = NULL;
sub_0807C740();
gUpdateVisibleTiles = 1;
sub_0805283C();
SetColor(0, 0);
LoadRoom();
CreateZeldaFollower();
sub_0804AFF4();
sub_0805329C();
sub_08000108();
sub_0805BB74(0xffffffff);
sub_080531F8();
}
void sub_08051D98(void) {
sub_08052EA0();
gRoomVars.field_0x0 = 1;
sub_0805E9A8();
sub_0804AF90();
sub_0804AFDC();
sub_0807C0DC();
sub_0805283C();
LoadRoom();
sub_0804AFF4();
SetPlayerControl(1);
}
void sub_08051DCC(void) {
gRoomControls.areaID = gScreenTransition.player_status.area_next;
gRoomControls.roomID = gScreenTransition.player_status.room_next;
RoomExitCallback();
gScreenTransition.transitionType = 3;
sub_08052CFC();
sub_08052EA0();
sub_0805E9A8();
sub_0804AF90();
sub_0804AFDC();
sub_0805283C();
}
void sub_08051E04() {
if (CheckIsOverworld()) {
struct_08127F94* i;
u32 hi_x, hi_y;
s32 x, y;
x = gPlayerEntity.x.HALF.HI;
if (x < 0)
x += 0xf;
hi_x = x >> 4;
y = gPlayerEntity.y.HALF.HI;
if (y < 0)
y += 0xf;
hi_y = y >> 4;
for (i = gUnk_08127F94; i->_0 != 0xFF; i++) {
if (i->_0 <= hi_x && i->_2 >= hi_x && i->_1 <= hi_y && i->_3 >= hi_y) {
gSave.windcrests |= 1 << i->_4;
break;
}
}
}
}
void sub_08051E68() {
gUnk_080FCA08[gMenu.menuType]();
}
void sub_08051E84() {
struct_080FCA20* p = &gUnk_080FCA20[gUnk_02032EC0.field_0x3];
gRoomControls.areaID = p->_0;
gRoomControls.roomID = p->_1;
sub_08053320();
gArea.localFlagOffset = GetFlagBankOffset(gRoomControls.areaID);
SetCurrentRoomPropertyList(p->_0, p->_1);
sub_08052FD8(p->_0, p->_1);
gRoomControls.roomScrollX = gRoomControls.roomOriginX + p->_4;
gRoomControls.roomScrollY = gRoomControls.roomOriginY + p->_6;
gMenu.field_0x0 = p->_2;
gMenu.field_0x3 = p->_3 & 0xf;
gMenu.field_0xc = (void*)p;
gMenu.menuType++;
gMenu.overlayType = 0;
gMenu.transitionTimer = 300;
sub_08051F04();
}
void sub_08051F04(void) {
gUnk_080FCA14[gMenu.field_0x0]();
FlushSprites();
UpdateEntities();
sub_080AD9B0();
sub_080AD918();
UpdateScroll();
UpdateBgAnim();
UpdateManagers();
sub_08000108();
}
void sub_08051F40(u32 a1, u32 a2, u32 a3, u32 a4) {
u32 flag = gUnk_080FCA20[gUnk_02032EC0.field_0x3]._3;
if (flag & 0xF0) {
MenuFadeIn(2, flag >> 4);
} else {
gUnk_02032EC0.nextToLoad = 3;
sub_080500F4(0x10);
MessageInitialize();
}
}
void sub_08051F78(u32 a1, u32 a2, u32 a3, u32 a4) {
u32 idx = gUnk_02032EC0.field_0x3;
struct_080FCA20* p = &gUnk_080FCA20[idx];
sub_08051F9C(p->_0, p->_1, p->_4, p->_6);
}
void sub_08051F9C(u32 a1, u32 a2, u32 a3, u32 a4) {
u32 tmp = gScreen.lcd.displayControl & 0x6000;
sub_08052FF4(a1, a2);
gRoomControls.roomScrollX = gRoomControls.roomOriginX + a3;
gRoomControls.roomScrollY = gRoomControls.roomOriginY + a4;
sub_0807C740();
gUpdateVisibleTiles = 1;
gUsedPalettes = 0;
gScreen.lcd.displayControl |= tmp;
}
void sub_08051FF0() {
sub_0804B0B0(gMenu.field_0xc[0], gMenu.field_0xc[1]);
}
void sub_08052004() {
gMenu.menuType = 2;
}
void sub_08052010() {
InitSoundPlayingInfo();
MessageInitialize();
DispReset(1);
MemClear(gBG1Buffer, 0x800);
MemClear(gBG2Buffer, 0x800);
sub_080A4D34();
LoadPaletteGroup(0xA);
SetColor(0, 0);
LoadGfxGroup(4);
MemClear((void*)0x06000000, 0x20);
MemClear(&gMenu, 0x30);
gScreen.lcd.displayControl |= 0x1000;
gScreen.bg1.control = 0x1C01;
gScreen.bg2.control = 0x1D05;
gScreen.bg1.updated = 1;
gScreen.bg2.updated = 1;
}
void HandleGameOverScreen() {
gUnk_080FCA70[gMain.funcIndex]();
if (gMain.funcIndex != 0) {
FlushSprites();
DrawGameOverText();
sub_080AD918();
}
}
void sub_080520C4(u32 idx) {
gMain.funcIndex = idx;
sub_080A7114(0);
}
void sub_080520D8(void) {
if (gFadeControl.active)
return;
sub_08052010();
gMenu.focusCoords[0] = 80;
gMenu.transitionTimer = 60;
gSave.stats.health = 24;
gMain.field_0x5 = 60;
SoundReq(BGM_GAMEOVER);
sub_080500F4(4);
gFadeControl.mask = 0xFFFF0001;
sub_080520C4(1);
}
void sub_0805212C(void) { void sub_0805212C(void) {
if (gFadeControl.active) if (gFadeControl.active)
return; return;
@ -251,7 +737,7 @@ void sub_080522F4(void) {
void nullsub_107(void) { void nullsub_107(void) {
} }
void DrawGameOverText(void) { static void DrawGameOverText(void) {
static const u8 sOffsets[] = { static const u8 sOffsets[] = {
48, 68, 88, 108, 137, 156, 174, 192, 48, 68, 88, 108, 137, 156, 174, 192,
}; };

View File

@ -80,6 +80,18 @@ void sub_08061AFC(Entity*);
extern u16* gUnk_0810B660[8]; extern u16* gUnk_0810B660[8];
void CreateZeldaFollower(void) {
Entity* npc;
if (CheckGlobalFlag(0x1c) != 0) {
npc = CreateNPC(0x2e, 0, 0);
if (npc != NULL) {
CopyPosition(&gPlayerEntity, npc);
npc->flags |= 0x20;
npc->animationState = GetAnimationState(npc);
}
}
}
// UNUSED zelda follower, probably because it was too resource heavy // UNUSED zelda follower, probably because it was too resource heavy
void NPC5(Entity* this) { void NPC5(Entity* this) {
gUnk_0810AC1C[this->type](this); gUnk_0810AC1C[this->type](this);

View File

@ -205,15 +205,3 @@ void Postman_Fusion(Entity* this) {
UpdateAnimationSingleFrame(this); UpdateAnimationSingleFrame(this);
} }
} }
void CreateZeldaFollower(void) {
Entity* npc;
if (CheckGlobalFlag(0x1c) != 0) {
npc = CreateNPC(0x2e, 0, 0);
if (npc != NULL) {
CopyPosition(&gPlayerEntity, npc);
npc->flags |= 0x20;
npc->animationState = GetAnimationState(npc);
}
}
}

View File

@ -256,6 +256,7 @@ void SurfaceAction_Water(Entity*);
void SurfaceAction_Ladder(Entity*); void SurfaceAction_Ladder(Entity*);
void SurfaceAction_AutoLadder(Entity*); void SurfaceAction_AutoLadder(Entity*);
extern void sub_080A4D88(void);
extern void RespawnPlayer(); extern void RespawnPlayer();
extern void sub_080797EC(); extern void sub_080797EC();
extern void UpdatePlayerMovement(); extern void UpdatePlayerMovement();
@ -319,6 +320,26 @@ extern u16 script_BedAtSimons;
extern Entity* gPlayerClones[]; extern Entity* gPlayerClones[];
extern ScriptExecutionContext gPlayerScriptExecutionContext; extern ScriptExecutionContext gPlayerScriptExecutionContext;
NONMATCH("asm/non_matching/playerItemPacciCane/sub_080705AC.inc", u32 sub_080705AC(void)) {
if (!((gInput.newKeys & START_BUTTON) == 0 || gFadeControl.active || gUnk_02034490[0] ||
(gMessage.doTextBox & 0x7F) || gSave.stats.health == 0 || !gSave.fillerD0[34] ||
gPlayerState.controlMode != 0 || gPriorityHandler.priority_timer != 0)) {
u32 tmp = gPlayerState.framestate ? gPlayerState.framestate : gPlayerState.framestate_last;
switch (tmp) {
case PL_STATE_DIE:
case PL_STATE_TALKEZLO:
case PL_STATE_ITEMGET:
case PL_STATE_DROWN:
case PL_STATE_STAIRS:
return 0;
}
sub_080A4D88();
return 1;
}
return 0;
}
END_NONMATCH
void DoPlayerAction(Entity* this) { void DoPlayerAction(Entity* this) {
static void (*const sPlayerActions[])(Entity*) = { static void (*const sPlayerActions[])(Entity*) = {
[PLAYER_INIT] = PlayerInit, [PLAYER_INIT] = PlayerInit,

View File

@ -8,7 +8,6 @@
extern void (*const gUnk_0811B9D8[])(Entity*); extern void (*const gUnk_0811B9D8[])(Entity*);
void sub_080704FC(Entity*); void sub_080704FC(Entity*);
extern void sub_080A4D88(void);
extern u8 gUnk_02034490[0x18]; extern u8 gUnk_02034490[0x18];
@ -29,22 +28,3 @@ ASM_FUNC("asm/non_matching/playerItemPacciCane/sub_080704FC.inc", void sub_08070
void sub_0807059C() { void sub_0807059C() {
MemClear(gUnk_02034490, sizeof(gUnk_02034490)); MemClear(gUnk_02034490, sizeof(gUnk_02034490));
} }
NONMATCH("asm/non_matching/playerItemPacciCane/sub_080705AC.inc", u32 sub_080705AC(void)) {
if (!((gInput.newKeys & 8) == 0 || gFadeControl.active || gUnk_02034490[0] || (gMessage.doTextBox & 0x7F) != 0 ||
!gSave.stats.health || !gSave.fillerD0[34] || gPlayerState.controlMode || gPriorityHandler.priority_timer)) {
u32 tmp = gPlayerState.framestate ? gPlayerState.framestate : gPlayerState.framestate_last;
switch (tmp) {
case 18:
case 19:
case 21:
case 22:
case 28:
return 0;
}
sub_080A4D88();
return 1;
}
return 0;
}
END_NONMATCH