summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorHenny022p <info@henny022.de>2021-03-22 10:18:20 +0100
committerHenny022p <info@henny022.de>2021-03-22 10:18:20 +0100
commit5cebf089fd0b34e017aeb36d540bfce051a4969c (patch)
treeb896213a6d2ead9a54518209d7a7e0a1ab855cbe /include
parent61b284265f37dda398a561f1f8a3ccdd8d1b39da (diff)
parent8e3bebad007d5ba082ffb14aafbb2be94dfd8fcd (diff)
Merge branch 'master' into m4a
Diffstat (limited to 'include')
-rw-r--r--include/area.h13
-rw-r--r--include/arm_proxy.h6
-rw-r--r--include/audio.h22
-rw-r--r--include/coord.h (renamed from include/position.h)7
-rw-r--r--include/createObject.h8
-rw-r--r--include/enemy.h2
-rw-r--r--include/entity.h108
-rw-r--r--include/fileScreen.h7
-rw-r--r--include/flags.h2
-rw-r--r--include/functions.h43
-rw-r--r--include/game.h6
-rw-r--r--include/gba/macro.h20
-rw-r--r--include/global.h22
-rw-r--r--include/greatFairy.h26
-rw-r--r--include/item.h17
-rw-r--r--include/main.h7
-rw-r--r--include/npc.h4
-rw-r--r--include/player.h41
-rw-r--r--include/readKeyInput.h9
-rw-r--r--include/room.h8
-rw-r--r--include/structures.h19
-rw-r--r--include/textbox.h31
-rw-r--r--include/trig.h7
-rw-r--r--include/utils.h64
24 files changed, 318 insertions, 181 deletions
diff --git a/include/area.h b/include/area.h
index 4d363a31..1c2ef424 100644
--- a/include/area.h
+++ b/include/area.h
@@ -11,14 +11,15 @@ typedef struct {
u16 localFlagOffset;
u8 filler[10];
u16 field_0x10;
- u16 field_0x12;
- u16 field_0x14;
- u8 field_0x16;
- u8 field_0x17;
+ u16 curPortalX;
+ u16 curPortalY;
+ u8 curPortalExitDirection;
+ u8 curPortalType;
u8 field_0x18;
// u8 filler3[7];
- u8 fadeOut;
- u8 filler2[14];
+ bool8 playShrinkSeq;
+ u8 unk1A;
+ u8 filler2[13];
u8 filler4[0x835];
u32 musicIndex;
u32 pMusicIndex;
diff --git a/include/arm_proxy.h b/include/arm_proxy.h
new file mode 100644
index 00000000..c07a649e
--- /dev/null
+++ b/include/arm_proxy.h
@@ -0,0 +1,6 @@
+#ifndef ARM_PROXY_H
+#define ARM_PROXY_H
+
+extern void PrepNextFrame(void);
+
+#endif
diff --git a/include/audio.h b/include/audio.h
index 0f1a1b40..ad600283 100644
--- a/include/audio.h
+++ b/include/audio.h
@@ -1,6 +1,8 @@
+#ifndef AUDIO_H
+#define AUDIO_H
typedef enum {
- NONE,
+ SFX_NONE,
BGM_CASTLE_TOURNAMENT,
BGM_VAATI_MOTIF,
BGM_TITLE_SCREEN,
@@ -210,6 +212,8 @@ typedef enum {
SFX_PLY_SHRINKING = 0x16F,
SFX_PLY_GROW,
+ SFX_EZLO_UI = 0x173,
+
SFX_LAVA_TILE_STEP = 0x17B,
SFX_LAVA_TILE_WOBBLE,
SFX_LAVA_TILE_SINK,
@@ -240,4 +244,18 @@ typedef enum {
SFX_VO_CUCCO3,
SFX_VO_CUCCO4,
SFX_VO_CUCCO5,
-} Sound; \ No newline at end of file
+
+ SND_STOP_ALL = 0x80010000,
+ SONG_VOL_ZERO = 0x80020000,
+ SND_VOL_RESET_ALL = 0x80030000,
+ SND_VSYNC_OFF = 0x80040000,
+ SONG_STOP = 0x80050000,
+ SND_VSYNC_ON = 0x80060000,
+ SONG_VOL_FADE_OUT = 0x80080000,
+ SONG_VOL_RESET = 0x800B0000,
+ SONG_VOL_CHAN1_SILENT = 0x800D0000,
+ SONG_VOL_CHAN1_RESET = 0x800E0000,
+ SONG_RESET_UNK = 0x80100000,
+} Sound;
+
+#endif // AUDIO_H
diff --git a/include/position.h b/include/coord.h
index 4635a097..b91c97b2 100644
--- a/include/position.h
+++ b/include/coord.h
@@ -4,11 +4,18 @@
#include "global.h"
#include "entity.h"
+s16 FixedMul(s16 r0, s16 r1);
+s16 FixedDiv(s16 r0, s16 r1);
+
void CopyPosition(Entity*, Entity*);
void PositionEntityOnTop(Entity*, Entity*);
void PositionRelative(Entity*, Entity*, s32, s32);
+void CopyPositionAndSpriteOffset(Entity* param_1, Entity* param_2);
void sub_0806FA90(Entity*, Entity*, s32, s32);
void ResolveEntityOnTop(Entity*, Entity*);
void sub_0806FAD8(Entity*, Entity*);
+const s16 gSineTable[64];
+const s16 gCosineTable[256];
+
#endif
diff --git a/include/createObject.h b/include/createObject.h
new file mode 100644
index 00000000..03f3632e
--- /dev/null
+++ b/include/createObject.h
@@ -0,0 +1,8 @@
+#ifndef CREATEOBJECT_H
+#define CREATEOBJECT_H
+
+// maybe a dedicated (create)Effect.h/c
+void CreateDust(Entity* parent);
+void CreateDustSmall(Entity* parent);
+
+#endif // CREATEOBJECT_H
diff --git a/include/enemy.h b/include/enemy.h
index b12a54e8..0b3e8ecb 100644
--- a/include/enemy.h
+++ b/include/enemy.h
@@ -89,7 +89,6 @@ extern void VaatiWrath(Entity*);
extern void VaatiArm(Entity*);
extern void Dust(Entity*);
extern void VaatiBall(Entity*);
-extern void Octorok(Entity*);
extern void Slime(Entity*);
extern void MiniSlime(Entity*);
extern void FireballGuy(Entity*);
@@ -110,6 +109,5 @@ extern void Enemy66(Entity*);
extern u32 GetNextFunction(Entity*);
extern void EnemyFunctionHandler(Entity*, void (*const func[])(Entity*));
-extern void sub_0804AA30(Entity*, void (*const func[])(Entity*));
extern void sub_08001324(Entity*);
#endif
diff --git a/include/entity.h b/include/entity.h
index f3a76a68..f19e0876 100644
--- a/include/entity.h
+++ b/include/entity.h
@@ -47,7 +47,7 @@ typedef struct Entity {
/*0x0a*/ u8 type; // was: form
/*0x0b*/ u8 type2; // was: parameter
/*0x0c*/ u8 action;
- /*0x0d*/ u8 previousActionFlag;
+ /*0x0d*/ u8 subAction;
/*0x0e*/ u8 actionDelay;
/*0x0f*/ u8 field_0xf;
/*0x10*/ u8 flags;
@@ -108,7 +108,7 @@ typedef struct Entity {
/*0x3a*/ u8 field_0x3a;
/*0x3b*/ u8 flags2;
/*0x3c*/ u8 field_0x3c;
- /*0x3d*/ s8 hurtBlinkTime;
+ /*0x3d*/ s8 iframes;
/*0x3e*/ u8 field_0x3e;
/*0x3f*/ u8 damageType;
/*0x40*/ u8 field_0x40;
@@ -166,37 +166,14 @@ extern LinkedList gUnk_03003D90;
extern LinkedList gUnk_03003DA0;
#define TILE(x, y) \
- ((((x - gRoomControls.roomOriginX) >> 4) & 0x3fU) | \
- (((y - gRoomControls.roomOriginY) >> 4) & 0x3fU) << 6)
+ (((((x) - gRoomControls.roomOriginX) >> 4) & 0x3fU) | \
+ ((((y) - gRoomControls.roomOriginY) >> 4) & 0x3fU) << 6)
#define COORD_TO_TILE(entity) \
- TILE(entity->x.HALF.HI, entity->y.HALF.HI)
+ TILE((entity)->x.HALF.HI, (entity)->y.HALF.HI)
#define COORD_TO_TILE_OFFSET(entity, xOff, yOff) \
- TILE(entity->x.HALF.HI - xOff, entity->y.HALF.HI - yOff)
-
-extern Entity* CreateEnemy(u32 subtype, u32 form);
-extern Entity* CreateObject(u32 subtype, u32 form, u32 parameter);
-extern Entity* CreateNPC(u32 subtype, u32 form, u32 parameter);
-extern Entity* CreateObjectWithParent(Entity* parent, u32 subtype, u32 form, u32 parameter);
-extern Entity* CreateFx(Entity* parent, u32 form, u32 parameter);
-
-extern void InitializeAnimation(Entity*, u32);
-extern void InitAnimationForceUpdate(Entity*, u32);
-extern void UpdateAnimationSingleFrame(Entity*);
-extern void UpdateSpriteForCollisionLayer(Entity*);
-extern void GetNextFrame(Entity*);
-extern u32 LoadExtraSpriteData(Entity*, SpriteLoadData*);
-extern void SetExtraSpriteFrame(Entity*, u32, u32);
-extern void SetSpriteSubEntryOffsetData1(Entity*, u32, u32);
-extern void SetSpriteSubEntryOffsetData2(Entity*, u32, u32);
-
-extern u32 GetFacingDirection(Entity*, Entity*);
-
-extern void DeleteThisEntity(void);
-extern void CopyPosition(Entity*, Entity*);
-extern void DeleteEntity(Entity*);
-extern void PositionRelative(Entity*, Entity*, s32, s32);
+ TILE((entity)->x.HALF.HI - (xOff), (entity)->y.HALF.HI - (yOff))
enum {
DirectionNorth = 0x00,
@@ -211,12 +188,81 @@ enum {
#define DirectionIsVertical(expr) ((expr) & 0x10)
#define DirectionTurnAround(expr) (DirectionRoundUp(expr) ^ 0x10)
#define DirectionToAnimationState(expr) (DirectionRoundUp(expr) >> 3)
-#define DirectionFromAnimationState(expr) (expr << 3)
+#define DirectionFromAnimationState(expr) ((expr) << 3)
#define Direction8Round(expr) ((expr) & 0x1c)
#define Direction8RoundUp(expr) Direction8Round((expr) + 2)
#define Direction8TurnAround(expr) (Direction8RoundUp(expr) ^ 0x10)
#define Direction8ToAnimationState(expr) (Direction8RoundUp(expr) >> 2)
-#define Direction8FromAnimationState(expr) (expr << 2)
+#define Direction8FromAnimationState(expr) (((expr) << 2)
+
+Entity* GetEmptyEntity(void);
+extern Entity* CreateEnemy(u32 id, u32 type);
+extern Entity* CreateNPC(u32 id, u32 type, u32 type2);
+extern Entity* CreateObject(u32 id, u32 type, u32 type2);
+extern Entity* CreateObjectWithParent(Entity* parent, u32 id, u32 type, u32 type2);
+extern Entity* CreateFx(Entity* parent, u32 type, u32 type2);
+
+extern void InitializeAnimation(Entity*, u32);
+extern void InitAnimationForceUpdate(Entity*, u32);
+extern void UpdateAnimationSingleFrame(Entity*);
+extern void UpdateSpriteForCollisionLayer(Entity*);
+extern void GetNextFrame(Entity*);
+extern u32 LoadExtraSpriteData(Entity*, SpriteLoadData*);
+extern void SetExtraSpriteFrame(Entity*, u32, u32);
+extern void SetSpriteSubEntryOffsetData1(Entity*, u32, u32);
+extern void SetSpriteSubEntryOffsetData2(Entity*, u32, u32);
+
+extern u32 GetFacingDirection(Entity*, Entity*);
+
+/**
+ * @brief Delete the entity currently in execution.
+ */
+void DeleteThisEntity(void);
+
+/**
+ * @brief Delete an entity.
+ */
+void DeleteEntity(Entity*);
+
+/**
+ * @brief Append entity to linked list.
+ */
+void AppendEntityToList(Entity* entity, u32 listIndex);
+
+/**
+ * @brief Prepend entity to linked list.
+ */
+void PrependEntityToList(Entity* entity, u32 listIndex);
+
+/**
+ * @brief Find an entity for a given kind and ID.
+ * @return Entity* First result or NULL if none found
+ */
+Entity* FindEntityByID(u32 kind, u32 id, u32 listIndex);
+
+/**
+ * @brief Search all lists for an entity of same kind and id.
+ * @return Entity* First result or NULL if none found
+ */
+Entity* DeepFindEntityByID(u32 kind, u32 id);
+
+/**
+ * @brief Search all lists for entity of same kind and id.
+ * @return bool32 Duplicate was entity found
+ */
+bool32 EntityHasDuplicateID(Entity* ent);
+
+/**
+ * @brief Find an entity of same kind and id in list.
+ * @return Entity* First result or NULL if none found
+ */
+Entity* FindNextDuplicateID(Entity* ent, int listIndex);
+
+/**
+ * @brief Find Entity with full identifiers.
+ * @return Entity* First result or NULL if none found
+ */
+Entity* FindEntity(u32 kind, u32 id, u32 listIndex, u32 type, u32 type2);
#endif
diff --git a/include/fileScreen.h b/include/fileScreen.h
index b5782093..3ec9b15b 100644
--- a/include/fileScreen.h
+++ b/include/fileScreen.h
@@ -1,13 +1,8 @@
#ifndef FILESELECT_H
#define FILESELECT_H
+#include "audio.h"
#include "global.h"
-#include "functions.h"
-#include "main.h"
-#include "player.h"
-#include "readKeyInput.h"
-#include "screen.h"
-#include "menu.h"
#include "save.h"
typedef struct {
diff --git a/include/flags.h b/include/flags.h
index 85e6937e..c68be93e 100644
--- a/include/flags.h
+++ b/include/flags.h
@@ -29,7 +29,7 @@ extern u32 gGlobalFlags;
extern u32 gRoomFlags;
enum {
- NONE,
+ FLAG_NONE,
/*0x01*/ LV0_CLEAR, /* */
/*0x02*/ LV1_CLEAR, /* */
/*0x03*/ LV2_CLEAR, /* */
diff --git a/include/functions.h b/include/functions.h
index d6ce6fb3..5c62cced 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -5,72 +5,50 @@
#include "global.h"
#include "entity.h"
#include "manager.h"
-#include "position.h"
+#include "coord.h"
#include "player.h"
-#include "structures.h"
#include "room.h"
+#include "structures.h"
// Identified - to be sorted into header files
-extern u32 Random(void);
extern void SoundReq(u32);
extern void ShowNPCDialogue(Entity*, Dialog*);
-extern u32 UpdateFuseInteraction();
-extern void DeleteEntity(Entity*);
-extern u32 __modsi3(u32, u32);
extern void DoFade(u32, u32);
-extern u32 GetInventoryValue(u32);
extern u32 CheckKinstoneFused(u32);
extern void ForceEquipItem(u32, u8);
-extern void LoadRoomEntityList();
-void CopyPosition(Entity*, Entity*);
-extern void ResolveEntityOnTop(Entity*, Entity*);
-extern void EnemyFunctionHandler(Entity*, void (*const funcs[])(Entity*));
+extern void LoadRoomEntityList(EntityData* listPtr);
extern u32 GetAnimationState(Entity*);
extern void SetChildOffset(Entity*, s32, s32, s32);
-extern u32 GetFacingDirection(Entity*, Entity*);
extern Entity* CreatePlayerItem(u32, u32, u32, u32);
-extern Entity* GetEmptyEntity(void);
extern u32 GetTileTypeByPos(s32 x, s32 y, u32 layer);
extern u32 GetTileType(u32 pos, u32 layer);
-extern void MemClear32(void* src, u32 count);
extern void EraseAllEntities(void);
extern void SetTile(u32, u32, u32);
extern void SetDirtTile(u32);
extern void LoadRoomTileEntities(); // tba
extern Entity* CreateDeathFx(Entity*, u32, u32);
extern void UpdateAnimationVariableFrames(Entity*, u32);
-extern void CopyPositionAndSpriteOffset(Entity*, Entity*);
extern u8* GetSpriteSubEntryOffsetDataPointer(u32, u32);
extern u32 LoadFixedGFX(Entity*, u32);
-extern void MemFill32(u32, void*, u32);
extern Entity* CreateItemEntity(u32, u32, u32);
-void MemCopy(const void* src, void* dst, u32 size);
extern u32 ProcessMovement(Entity*);
-extern Entity* FindEntityInListBySubtype(u32, u32, u32);
-extern Entity* FindEntityInListByForm(u32, u32, u32, u32, u32);
-extern void MemClear32(void*, u32);
extern void MenuFadeIn(u32, u32);
extern void LoadResourceAsync(const void*, u32, u32);
extern void LoadPaletteGroup(u32);
extern void TryLoadPrologueHyruleTown(void);
extern Manager* GetEmptyManager(void);
-extern void AppendEntityToList(void*, u32);
extern void LoadGfxGroup(u32);
extern void EnqueueSFX(u32);
extern void ResetPlayer(void);
-extern void CreateDust(Entity*);
extern u32 IsItemEquipped(u32);
extern void DeleteManager(Manager*);
extern bool32 CheckPlayerInRegion(u32 centerX, u32 centerY, u32 radiusX, u32 radiusY);
-extern u32 CheckIsDungeon(void);
extern u32 GetTileTypeByEntity(Entity*);
// Unidentified
extern u32 sub_0806ED78(Entity*);
-extern void sub_0806920C(Entity*);
extern u32 sub_0805ACC0(Entity*);
extern u32 sub_0801E99C(Entity*);
-extern void sub_0806924C(Entity*);
extern Entity* sub_080873AC(Entity*, u32, u32);
extern void sub_08078778(Entity*);
extern void sub_080787A8(Entity*, u32);
@@ -78,7 +56,6 @@ extern void sub_0806F118(Entity*);
extern void sub_080791D0();
extern void sub_0805EC9C();
extern void sub_0805EC60();
-extern void sub_080873D0();
extern u32 sub_080045D4(s16, s16, u32, u32);
extern void sub_0806F69C(Entity*);
extern void sub_0805E3A0(void*, u32);
@@ -91,16 +68,11 @@ extern void sub_0807000C(Entity*);
extern void sub_0805E47C(Entity*);
extern void sub_0805E584(Entity*);
extern void sub_08068BEC(Entity*, u32);
-extern void sub_08078778(Entity*);
-extern s32 sub_0806ED9C(Entity*, u32, u32);
extern s32 sub_0806F078(Entity*, s32);
extern void sub_0801D2B4(Entity*, u32);
extern void sub_0806FD3C(Entity*);
-extern u32 sub_0801E99C(Entity*);
-extern void sub_0806F118(Entity*);
extern void sub_0805ED14(u32*);
extern void sub_080A7C18(u32, u32, u32);
-extern void sub_08068BEC(Entity*, u32);
extern void sub_0804AA30(Entity*, void (*const funcs[])(Entity*));
extern Entity* sub_0804A9FC(Entity*, u32);
extern void sub_0804A720(Entity*);
@@ -110,7 +82,7 @@ extern u32 sub_08049FDC(Entity*, u32);
extern u32 sub_080041A0(Entity*, Entity*, u32, u32);
extern u32 sub_08049EE4(Entity*);
extern Entity* sub_0804A98C(Entity*, u8, u8);
-extern u32 sub_080544DC(u32);
+extern u32 GetBottleContaining(u32);
extern void sub_08077E54(Entity*);
extern void sub_080042BA(Entity*, u32);
extern void sub_08077F24(ItemBehavior*, u32);
@@ -147,7 +119,7 @@ extern u32 sub_08060354(void);
extern void sub_08057E64(void);
extern void sub_0809F814(u32);
extern void sub_080300E8(void);
-extern void sub_0801DA90(u32);
+extern void DispReset(u32);
extern void sub_08058D34(void);
extern void sub_0807AABC(Entity*);
extern void sub_08078A90(u32);
@@ -155,8 +127,6 @@ extern void sub_080530C8(void);
extern void sub_0805B4D0(u32);
extern void sub_0804D0B4(void);
extern void sub_0805308C(u32);
-extern void sub_0805AF60();
-extern void sub_0805D3C8(u32);
extern void sub_080534AC();
extern void sub_0807BA8C(u32, u32);
extern void sub_0804D9B0();
@@ -170,7 +140,6 @@ extern void sub_08054564();
extern void sub_0801DD58(u32, u32);
extern void sub_0804ED18();
extern void sub_080AF2E4(void);
-extern void sub_0805ADD8(u32);
extern void sub_0804F578(void);
extern void sub_08059994(void);
extern s32 sub_0801CFA8(u32);
@@ -262,7 +231,6 @@ u32 sub_0806FCB8(Entity*, u32, u32, u32);
extern Entity* sub_080A7EE0(u32);
extern void sub_080A1D70(Entity*, u32);
extern void sub_0806F62C(Entity*, u32, u32);
-extern u32 sub_08079F8C(void);
extern void sub_080A1ED0(u32, u32, u32);
extern u32 sub_0806F5B0(u32);
extern void sub_0801DFB4(Entity*, u32, u32, u32);
@@ -288,7 +256,6 @@ extern void sub_080791BC9();
extern void sub_080791BC();
extern void sub_08056360();
extern u32 sub_080542AC(u32);
-extern void sub_0807A108();
extern u32 sub_08079FC4(u32);
extern void sub_0800455E(Entity*);
extern void sub_08008790(Entity*, u32);
diff --git a/include/game.h b/include/game.h
new file mode 100644
index 00000000..dec15e21
--- /dev/null
+++ b/include/game.h
@@ -0,0 +1,6 @@
+#ifndef GAME_H
+#define GAME_H
+
+u32 CheckIsDungeon(void);
+
+#endif // GAME_H
diff --git a/include/gba/macro.h b/include/gba/macro.h
index b08ed921..f142d5c0 100644
--- a/include/gba/macro.h
+++ b/include/gba/macro.h
@@ -1,16 +1,16 @@
#ifndef GUARD_GBA_MACRO_H
#define GUARD_GBA_MACRO_H
-#define CPU_FILL(value, dest, size, bit) \
- { \
- vu##bit tmp = (vu##bit)(value); \
- CpuSet((void*)&tmp, dest, CPU_SET_##bit##BIT | CPU_SET_SRC_FIXED | ((size) / (bit / 8) & 0x1FFFFF)); \
+#define CPU_FILL(value, dest, size, bit) \
+ { \
+ vu##bit tmp = (vu##bit)(value); \
+ CpuSet((void*)&tmp, dest, CPU_SET_##bit##BIT | CPU_SET_SRC_FIXED | ((size) / ((bit) / 8) & 0x1FFFFF)); \
}
#define CpuFill16(value, dest, size) CPU_FILL(value, dest, size, 16)
#define CpuFill32(value, dest, size) CPU_FILL(value, dest, size, 32)
-#define CPU_COPY(src, dest, size, bit) CpuSet(src, dest, CPU_SET_##bit##BIT | ((size) / (bit / 8) & 0x1FFFFF))
+#define CPU_COPY(src, dest, size, bit) CpuSet(src, dest, CPU_SET_##bit##BIT | ((size) / ((bit) / 8) & 0x1FFFFF))
#define CpuCopy16(src, dest, size) CPU_COPY(src, dest, size, 16)
#define CpuCopy32(src, dest, size) CPU_COPY(src, dest, size, 32)
@@ -42,7 +42,7 @@
vu##bit tmp = (vu##bit)(value); \
DmaSet(dmaNum, &tmp, dest, \
(DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_FIXED | DMA_DEST_INC) << 16 | \
- ((size) / (bit / 8))); \
+ ((size) / ((bit) / 8))); \
}
#define DmaFill16(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 16)
@@ -65,7 +65,7 @@
#define DMA_COPY(dmaNum, src, dest, size, bit) \
DmaSet(dmaNum, src, dest, \
- (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_INC | DMA_DEST_INC) << 16 | ((size) / (bit / 8)))
+ (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_INC | DMA_DEST_INC) << 16 | ((size) / ((bit) / 8)))
#define DmaCopy16(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 16)
#define DmaCopy32(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 32)
@@ -112,7 +112,7 @@
#define DmaFillLarge(dmaNum, value, dest, size, block, bit) \
{ \
- void* _dest = (void*)dest; \
+ void* _dest = (void*)(dest); \
u32 _size = size; \
while (1) { \
DmaFill##bit(dmaNum, value, _dest, (block)); \
@@ -149,7 +149,7 @@
#define DmaFillDefvars(dmaNum, value, dest, size, bit) \
{ \
- void* _dest = (void*)dest; \
+ void* _dest = (void*)(dest); \
u32 _size = size; \
DmaFill##bit(dmaNum, value, _dest, _size); \
}
@@ -180,7 +180,7 @@
\
imeTemp = REG_IME; \
REG_IME = 0; \
- REG_IE |= flags; \
+ REG_IE |= (flags); \
REG_IME = imeTemp; \
}
diff --git a/include/global.h b/include/global.h
index de47c6ac..489f276d 100644
--- a/include/global.h
+++ b/include/global.h
@@ -31,9 +31,9 @@
#define SWAP(a, b, temp) \
{ \
- temp = a; \
- a = b; \
- b = temp; \
+ (temp) = a; \
+ (a) = b; \
+ (b) = temp; \
}
// useful math macros
@@ -47,25 +47,25 @@
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) >= (b) ? (a) : (b))
-#define BOOLCAST(x) ((-x | x) >> 31)
+#define BOOLCAST(x) ((-(x) | (x)) >> 31)
#define static_assert(cond) extern char assertion[(cond) ? 1 : -1]
#if NON_MATCHING
-#define asmfunc(prologue, path)
+#define ASM_FUNC(path, decl)
#else
-#define asmfunc(prologue, path) \
- NAKED prologue { \
+#define ASM_FUNC(path, decl) \
+ NAKED decl { \
asm(".include " #path); \
}
#endif
#if NON_MATCHING
-#define NONMATCH(prologue, path) prologue
+#define NONMATCH(path, decl) decl
#define END_NONMATCH
#else
-#define NONMATCH(path, prologue) \
- NAKED prologue { \
- asm(".include " #path); \
+#define NONMATCH(path, decl) \
+ NAKED decl { \
+ asm(".include " #path); \
if (0)
#define END_NONMATCH }
#endif
diff --git a/include/greatFairy.h b/include/greatFairy.h
index d5e4906b..fd325b6c 100644
--- a/include/greatFairy.h
+++ b/include/greatFairy.h
@@ -3,23 +3,9 @@
#include "screen.h"
-extern u32 __modsi3(u32, u32);
-extern void InitializeAnimation(Entity*, u32);
-extern void GreatFairy_InitializeAnimation(Entity*);
-extern u32 CheckRoomFlag();
-extern Entity* GreatFairy_CreateForm(Entity*, u32, u32);
-extern void PositionRelative();
-extern void CopyPosition();
-extern void DoFade();
-extern void SoundReq();
-extern void GetNextFrame();
-extern void sub_0805EC9C();
-extern void sub_0805EC60();
-extern void sub_080873D0();
-extern void DeleteEntity();
-extern void sub_0806F69C();
-extern Entity* FindEntityInListBySubtype(u32, u32, u32);
-extern void sub_080791D0();
+void GreatFairy_InitializeAnimation(Entity*);
+Entity* GreatFairy_CreateForm(Entity*, u32, u32);
+void sub_080873D0();
extern void (*const GreatFairy_Main[])(Entity*);
extern void (*const GreatFairy_Behaviors[])(Entity*);
extern void (*const GreatFairy_WingsBehaviors[])(Entity*);
@@ -35,15 +21,9 @@ extern void (*const GreatFairy_Form2Behaviors[])(Entity*);
extern void (*const gUnk_081207A4[])(Entity*);
extern u32 gUnk_0810C2E4;
-extern RoomControls gRoomControls;
-extern Entity gPlayerEntity;
extern const s16 GreatFairy_RippleOffsets[10];
extern u32 gUnk_02034350;
-extern RoomVars gRoomVars;
-extern Screen gScreen;
-extern struct_02033280 gActiveScriptInfo;
extern u8 gUnk_0812079C[8];
-extern s16 gSineTable[];
extern s8 gUnk_081207AC[];
#endif
diff --git a/include/item.h b/include/item.h
index e0dc4bbb..0f9fd6f2 100644
--- a/include/item.h
+++ b/include/item.h
@@ -7,36 +7,19 @@
extern void DebugItem(ItemBehavior*, u32);
extern void Sword(ItemBehavior*, u32);
-extern void Sword(ItemBehavior*, u32);
-extern void Sword(ItemBehavior*, u32);
-extern void Sword(ItemBehavior*, u32);
-extern void Sword(ItemBehavior*, u32);
-extern void Sword(ItemBehavior*, u32);
extern void Bomb(ItemBehavior*, u32);
-extern void Bomb(ItemBehavior*, u32);
-extern void Bow(ItemBehavior*, u32);
extern void Bow(ItemBehavior*, u32);
extern void sub_08075D14(ItemBehavior*, u32);
-extern void sub_08075D14(ItemBehavior*, u32);
-extern void Shield(ItemBehavior*, u32);
extern void Shield(ItemBehavior*, u32);
extern void Lantern(ItemBehavior*, u32);
-extern void Lantern(ItemBehavior*, u32);
extern void GustJar(ItemBehavior*, u32);
extern void PacciCane(ItemBehavior*, u32);
extern void MoleMitts(ItemBehavior*, u32);
extern void RocsCape(ItemBehavior*, u32);
extern void sub_08076800(ItemBehavior*, u32);
-extern void DebugItem(ItemBehavior*, u32);
extern void Ocarina(ItemBehavior*, u32);
-extern void DebugItem(ItemBehavior*, u32);
-extern void DebugItem(ItemBehavior*, u32);
-extern void DebugItem(ItemBehavior*, u32);
extern void TryPickupObject(ItemBehavior*, u32);
extern void JarEmpty(ItemBehavior*, u32);
-extern void JarEmpty(ItemBehavior*, u32);
-extern void JarEmpty(ItemBehavior*, u32);
-extern void JarEmpty(ItemBehavior*, u32);
/* On hold until naming conflicts are resolved */
/*
diff --git a/include/main.h b/include/main.h
index 39514ff7..1653a40e 100644
--- a/include/main.h
+++ b/include/main.h
@@ -77,18 +77,13 @@ static_assert(sizeof(UI) == 0x3b4);
extern Main gMain;
extern UI gUnk_02032EC0;
-void InitScreen();
+void InitScreen(u32 screen);
extern void InitSound(void);
-extern void sub_080560B8(void);
extern void sub_08056208(void);
extern void sub_0804FFE4(void);
-extern void MessageInitialize(void);
extern void sub_080ADD30(void);
-extern void InitScreen(u32);
-extern void PrepNextFrame(void);
-extern void ReadKeyInput(void);
extern void DoSoftReset(void);
extern void sub_08056260(void);
extern void VBlankIntrWait();
diff --git a/include/npc.h b/include/npc.h
index b27a82f9..ec7fc861 100644
--- a/include/npc.h
+++ b/include/npc.h
@@ -42,10 +42,6 @@ extern void SittingPerson_Head(Entity*);
extern void SittingPerson_Fusion(Entity*);
extern void Pina(Entity*);
extern void Pina_Fusion(Entity*);
-extern void Guard(Entity*);
-extern void Guard_Head(Entity*);
-extern void Maid(Entity*);
-extern void Maid_Head(Entity*);
extern void Din(Entity*);
extern void Din_Fusion(Entity*);
extern void Nayru(Entity*);
diff --git a/include/player.h b/include/player.h
index e9d96665..da6f324b 100644
--- a/include/player.h
+++ b/include/player.h
@@ -6,6 +6,41 @@
#include "global.h"
#include "entity.h"
+enum {
+ PLAYER_INIT,
+ PLAYER_NORMAL,
+ PLAYER_DUMMY,
+ PLAYER_FALL,
+ PLAYER_JUMP,
+ PLAYER_PUSH,
+ PLAYER_BOUNCE,
+ PLAYER_08070E9C,
+ PLAYER_ITEMGET,
+ PLAYER_MINISH,
+ PLAYER_MINISHDIE,
+ PLAYER_08071DB8,
+ PLAYER_EMPTYBOTTLE,
+ PLAYER_FROZEN,
+ PLAYER_0807204C,
+ PLAYER_080720DC,
+ PLAYER_PULL,
+ PLAYER_LAVA,
+ PLAYER_WARP,
+ PLAYER_08072454,
+ PLAYER_DROWN,
+ PLAYER_USEPORTAL,
+ PLAYER_TALKEZLO,
+ PLAYER_ROOMTRANSITION,
+ PLAYER_ROLL,
+ PLAYER_080728AC,
+ PLAYER_INHOLE,
+ PLAYER_08072C9C,
+ PLAYER_08074C44,
+ PLAYER_08072F34,
+ PLAYER_USEENTRANCE,
+ PLAYER_PARACHUTE,
+};
+
typedef struct {
/*0x00*/ u8 field_0x0[2];
/*0x02*/ u8 jumpStatus;
@@ -17,12 +52,14 @@ typedef struct {
/*0x0a*/ u8 field_0xa;
/*0x0b*/ u8 keepFacing;
/*0x0c*/ u8 playerAction;
- /*0x0d*/ u8 field_0xd[2];
+ /*0x0d*/ u8 field_0xd;
+ /*0x0e*/ u8 field_0xe;
/*0x0f*/ u8 hurtBlinkSpeed;
/*0x10*/ u8 field_0x10[4];
/*0x11*/ u8 field_0x14;
/*0x11*/ u8 field_0x15;
- /*0x14*/ u16 field_0x16[2];
+ /*0x14*/ u16 startPosX;
+ /*0x16*/ u16 startPosY;
/*0x1a*/ u8 field_0x1a[2];
/*0x1c*/ u8 field_0x1c;
/*0x1d*/ u8 field_0x1d[5];
diff --git a/include/readKeyInput.h b/include/readKeyInput.h
deleted file mode 100644
index 7961c2b6..00000000
--- a/include/readKeyInput.h
+++ /dev/null
@@ -1,9 +0,0 @@
-typedef struct {
- u16 heldKeys;
- u16 newKeys;
- u16 unk4;
- u8 unk6;
- u8 unk7;
-} Input;
-
-extern Input gInput;
diff --git a/include/room.h b/include/room.h
index 35ed3137..f192c164 100644
--- a/include/room.h
+++ b/include/room.h
@@ -63,13 +63,13 @@ typedef struct {
// Packets used to store which entities to load in a room
typedef struct {
- u8 type : 4;
+ u8 kind : 4;
u8 layer : 4;
u8 flags : 4;
u8 unk : 4;
- u8 subtype;
- u8 form;
- u32 parameter;
+ u8 id;
+ u8 type;
+ u32 type2;
u16 xPos;
u16 yPos;
u32 spritePtr;
diff --git a/include/structures.h b/include/structures.h
index 42e9d3ab..d47ee7a1 100644
--- a/include/structures.h
+++ b/include/structures.h
@@ -39,8 +39,7 @@ typedef struct {
u8 field_0x4[0x4];
bool8 transitioningOut;
u8 transitionType; // transition when changing areas
- u8 field_0xa; // seems to be a tile type
- u8 field_0xb;
+ u16 field_0xa; // seems to be a tile type
u8 areaID;
u8 roomID;
u8 playerState;
@@ -167,6 +166,22 @@ extern BG3Buffer gBG3Buffer;
static_assert(sizeof(BG3Buffer) == 0x1000);
*/
+struct {
+ u8 filler[0x70];
+} extern gUnk_03000B80;
+static_assert(sizeof(gUnk_03000B80) == 0x70);
+
+typedef struct {
+ u8 unk0;
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+ u8 freezeTime;
+ u8 unk9;
+} EntityHandler;
+
+extern EntityHandler gUnk_03003DC0;
+
extern u8 gUnk_02022740[];
extern u8 gUnk_02034490[];
diff --git a/include/textbox.h b/include/textbox.h
index 4b0333a5..817d50a0 100644
--- a/include/textbox.h
+++ b/include/textbox.h
@@ -56,9 +56,40 @@ typedef struct {
extern struct_02022780 gUnk_02022780;
static_assert(sizeof(struct_02022780) == 0xa8);
+/**
+ * @brief Initialize the message system.
+ */
+void MessageInitialize(void);
+
+/**
+ * @brief Show a message on screen.
+ *
+ * @param index u32 Message index
+ */
void ShowTextbox(u32 index);
+
+/**
+ * @brief Show a message at screen posiiton.
+ *
+ * @param index u32 Message index
+ * @param x u32 Screen x
+ * @param y u32 Screen y
+ */
void TextboxAtPosition(u32 index, u32 x, u32 y);
+
+/**
+ * @brief Show a message that attempts not to obscure the entity.
+ *
+ * @param index u32 Message index
+ * @param ent Entity* Your important entity
+ */
void TextboxNoOverlap(u32 index, Entity* ent);
+
+/**
+ * @brief Show a message that attempts not to obscure the camera target.
+ *
+ * @param index u32 Message index
+ */
void TextboxNoOverlapFollow(u32 index);
#endif
diff --git a/include/trig.h b/include/trig.h
deleted file mode 100644
index 0e6e44a9..00000000
--- a/include/trig.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef TRIG_H
-#define TRIG_H
-
-extern const s16 gSineTable[];
-extern const s16 gCosineTable[];
-
-#endif
diff --git a/include/utils.h b/include/utils.h
new file mode 100644
index 00000000..040eacee
--- /dev/null
+++ b/include/utils.h
@@ -0,0 +1,64 @@
+typedef struct {
+ u16 heldKeys;
+ u16 newKeys;
+ u16 unk4;
+ u8 unk6;
+ u8 unk7;
+} Input;
+
+extern Input gInput;
+
+/**
+ * Fill memory with 16 bit value.
+ */
+void MemFill16(u32 value, void* dest, u32 size);
+
+/**
+ * Fill memory with 32 bit value.
+ */
+void MemFill32(u32 value, void* dest, u32 size);
+
+/**
+ * Clear memory.
+ */
+void MemClear(void* dest, u32 size);
+
+/**
+ * Copy memory.
+ */
+void MemCopy(const void* src, void* dest, u32 size);
+
+/**
+ * Refresh gInput from hardware registers.
+ */
+void ReadKeyInput(void);
+
+void LoadPalettes(const u8*, int, int);
+void LoadPaletteGroup(u32 group);
+
+/**
+ * Allocate memory on heap.
+ *
+ * The heap size is 0x1000 bytes and should be used sparingly.
+ * It is customary for entities store the returned handle in their 'myHeap' field.
+ *
+ * @param size u32 Size to be allocated
+ * @return void* Pointer to allocated memory
+ */
+void* zMalloc(u32 size);
+
+/**
+ * Free memory from heap.
+ *
+ * The entity system will automatically free the address stored in the 'myHeap' field.
+ *
+ * @param ptr void* Handle to be freed
+ */
+void zFree(void* ptr);
+
+/**
+ * Reset All display hardware registers.
+ *
+ * @param updateHUD bool32 Request refresh of HUD layer (bg 0)
+ */
+void DispReset(bool32 updateHUD);