Merge branch 'master' into gyorg

This commit is contained in:
Ibot02
2022-01-09 20:46:03 +01:00
1301 changed files with 26072 additions and 28415 deletions
+2 -2
View File
@@ -43,8 +43,8 @@ typedef struct {
RoomResInfo roomResInfos[MAX_ROOMS];
RoomResInfo currentRoomInfo;
RoomResInfo* pCurrentRoomInfo;
u32 musicIndex;
u32 pMusicIndex;
u32 bgm;
u32 queued_bgm;
u8 filler5[0x20];
void* transitionManager;
void (*onEnter)();
+22 -10
View File
@@ -3,23 +3,35 @@
#include "global.h"
struct Entity_;
extern u32 Random(void);
extern void sub_08000152(u32);
extern void sub_08000152(u32, u32, u32);
extern u32 GetTileTypeByEntity(struct Entity_*);
extern u32 GetTileTypeByPos(s32 x, s32 y, u32 layer);
extern u32 GetTileType(u32 pos, u32 layer);
extern void SetTile(u32 index, u32 position, u32 layer);
extern void UpdateScrollVram(void);
extern u32 sub_080002D0(struct Entity_*);
extern u32 sub_080002F0(u32, u32, u32);
extern void LoadResourceAsync(const void*, u32, u32);
extern void sub_08001242(struct Entity_*);
extern void sub_08001290(struct Entity_*, u32);
extern void sub_08001324(struct Entity_*);
extern u32 sub_08002632(struct Entity_*);
extern u32 sub_08003FC4(struct Entity_*, u32);
extern u32 sub_080043E8(struct Entity_*);
extern void sub_08004484(struct Entity_*, struct Entity_*);
extern u32 sub_080045D4(s16, s16, u32, u32);
extern u32 sub_080045DA(s32, s32);
extern void sub_08004596(struct Entity_*, u32);
extern u32 sub_080045B4(struct Entity_*, u32, u32);
extern u32 CheckPlayerInRegion(u32 centerX, u32 centerY, u32 radiusX, u32 radiusY);
extern u32 GravityUpdate(struct Entity_*, u32);
extern u32 CheckOnScreen(struct Entity_*);
extern u32 EntityInRectRadius(struct Entity_*, struct Entity_*, u32, u32);
extern void UpdateAnimationVariableFrames(struct Entity_*, u32);
extern u32 sub_080043E8(struct Entity_*);
extern void sub_08004484(struct Entity_*, struct Entity_*);
extern void ResetCollisionLayer(struct Entity_*);
extern void sub_08004596(struct Entity_*, u32);
extern u32 sub_080045B4(struct Entity_*, u32, u32);
extern u32 sub_080045D4(u32, u32, u32, u32);
extern u32 sub_080045DA(s32, s32);
extern u32 sub_080086B4(u32, u32, u8*);
extern u32 ResolveCollisionLayer(struct Entity_*);
extern void sub_0800417E(struct Entity_*, u32);
extern u32 sub_0800442E(struct Entity_*);
#endif // ASM_H
+21
View File
@@ -0,0 +1,21 @@
#ifndef COLOR_H
#define COLOR_H
#include "global.h"
typedef struct {
u8 _0;
u8 _1;
u16 _2;
} Palette;
extern Palette gPaletteList[];
void ResetPaletteTable(u32 a1);
void sub_0801D000(u32 a1);
void LoadObjPalette(struct Entity_*, u32);
void UnloadOBJPalette(struct Entity_* entity);
void sub_0801D244(u32);
void sub_0801D28C(struct Entity_* entity, u32 palette);
void ChangeObjPalette(struct Entity_* entity, u32 palette);
#endif // COLOR_H
+126
View File
@@ -0,0 +1,126 @@
#ifndef COMMON_H
#define COMMON_H
#include "global.h"
struct Entity_;
/**
* Holds input information from system registers.
*/
typedef struct {
u16 heldKeys; /**< Keys held since last frame. */
u16 newKeys; /** Keys newly pressed this frame. */
u16 unk4;
u8 unk6;
u8 unk7;
} Input;
extern Input gInput; /**< Input instance. */
void LoadPalettes(const u8*, s32, s32);
/**
* Loads a packed group of palettes.
*
* @param group Group number.
*/
void LoadPaletteGroup(u32 group);
/**
* Loads a packed group of tiles.
*
* @param group Group number.
*/
void LoadGfxGroup(u32 group);
/**
* Set color in the palette.
*
* @param colorIndex Color index.
* @param color Color.
*/
void SetColor(u32 colorIndex, u32 color);
void SetFillColor(u32 color, u32 arg1);
/**
* Fill memory with 16 bit value.
*
* @param value Fill value.
* @param dest Destination.
* @param size Byte count.
*/
void MemFill16(u32 value, void* dest, u32 size);
/**
* Fill memory with 32 bit value.
*
* @param value Fill value.
* @param dest Destination.
* @param size Byte count.
*/
void MemFill32(u32 value, void* dest, u32 size);
/**
* Clear memory.
*
* @param dest Destination
* @param size Byte count.
*/
void MemClear(void* dest, u32 size);
/**
* Copy memory.
*
* @param src Source.
* @param dest Destination.
* @param size Byte count.
*/
void MemCopy(const void* src, void* dest, u32 size);
/**
* Refresh #gInput from system registers.
*/
void ReadKeyInput(void);
/**
* Initialize the heap.
*/
void zMallocInit(void);
/**
* Allocate memory on heap.
*
* The heap size is 0x1000 bytes and should be used sparingly.
* It is customary for entities store the returned pointer in the Entity.myHeap field.
*
* @param size u32 Size to be allocated.
* @return Pointer to allocated memory.
*/
void* zMalloc(u32 size);
/**
* Free memory from heap.
* The Entity system will automatically free the pointer stored in the Entity.myHeap field.
*
* @param ptr Pointer to be freed.
*/
void zFree(void* ptr);
/**
* Reset All display system registers.
*
* @param refresh Request refresh of HUD layer (bg 0).
*/
void DispReset(bool32 refresh);
u32 CheckPlayerProximity(u32, u32, u32, u32);
u32 CheckKinstoneFused(u32);
void sub_0801E1EC(u32, u32, u32);
void sub_0801DD58(u32, u32);
void sub_0801E1B8(u32, u32);
void sub_0801E738(u32);
void sub_0801DFB4(struct Entity_*, u32, u32, u32);
u32 sub_0801E00C(void);
#endif // COMMON_H
+1 -1
View File
@@ -17,7 +17,7 @@ void ResolveEntityBelow(Entity*, Entity*);
u32 sub_0806F5A4(u32 idx);
u32 sub_0806F3E4(Entity*);
void sub_0806F69C(Entity*);
void LinearMoveUpdate(Entity*);
extern const s16 gSineTable[64];
extern const s16 gCosineTable[256];
+114 -105
View File
@@ -4,18 +4,27 @@
#include "global.h"
#include "asm.h"
#include "audio.h"
#include "sound.h"
#include "effects.h"
#include "flags.h"
#include "utils.h"
#include "common.h"
#include "entity.h"
#include "projectile.h"
extern u32 GetNextFunction(Entity*);
extern void EnemyFunctionHandler(Entity*, void (*const func[])(Entity*));
extern void EnemyFunctionHandler(Entity*, EntityActionArray);
extern void sub_08001324(Entity*);
extern Entity* CreateDeathFx(Entity*, u32, u32);
extern Entity* sub_0804A9FC(Entity*, u32);
extern void SetChildOffset(Entity*, s32, s32, s32);
extern Entity* CreateProjectileWithParent(Entity*, u8, u8);
extern void sub_0804A7D4(Entity*);
extern void sub_08002724(void*, u8*);
extern void sub_080026C4(u8*, u8*, u8*, u32);
extern void sub_080026F2(u8*, void*, u8*, u32);
typedef enum {
/*0x00*/ OCTOROK,
@@ -123,107 +132,107 @@ typedef enum {
/*0x66*/ ENEMY_66
} Enemy;
extern void Octorok(Entity*);
extern void Chuchu(Entity*);
extern void Leever(Entity*);
extern void Peahat(Entity*);
extern void Rollobite(Entity*);
extern void DarkNut(Entity*);
extern void HangingSeed(Entity*);
extern void Beetle(Entity*);
extern void Keese(Entity*);
extern void DoorMimic(Entity*);
extern void RockChuchu(Entity*);
extern void SpinyChuchu(Entity*);
extern void CuccoChickAggr(Entity*);
extern void Moldorm(Entity*);
extern void EnemyE(Entity*);
extern void Moldworm(Entity*);
extern void Sluggula(Entity*);
extern void Pesto(Entity*);
extern void Puffstool(Entity*);
extern void ChuchuBoss(Entity*);
extern void LikeLike(Entity*);
extern void SpearMoblin(Entity*);
extern void BusinessScrub(Entity*);
extern void RupeeLike(Entity*);
extern void Madderpillar(Entity*);
extern void WaterDrop(Entity*);
extern void WallMaster(Entity*);
extern void BombPeahat(Entity*);
extern void Spark(Entity*);
extern void Chaser(Entity*);
extern void SpikedBeetle(Entity*);
extern void SensorBladeTrap(Entity*);
extern void Helmasaur(Entity*);
extern void FallingBoulder(Entity*);
extern void Bobomb(Entity*);
extern void WallMaster2(Entity*);
extern void Gleerok(Entity*);
extern void VaatiEyesMacro(Entity*);
extern void Tektite(Entity*);
extern void WizzrobeWind(Entity*);
extern void WizzrobeFire(Entity*);
extern void WizzrobeIce(Entity*);
extern void Armos(Entity*);
extern void Eyegore(Entity*);
extern void Rope(Entity*);
extern void SmallPesto(Entity*);
extern void AcroBandit(Entity*);
extern void BladeTrap(Entity*);
extern void Keaton(Entity*);
extern void Crow(Entity*);
extern void Mulldozer(Entity*);
extern void Bombarossa(Entity*);
extern void Wisp(Entity*);
extern void SpinyBeetle(Entity*);
extern void MazaalHead(Entity*);
extern void MazaalMacro(Entity*);
extern void MazaalHand(Entity*);
extern void OctorokBoss(Entity*);
extern void FlyingPot(Entity*);
extern void Gibdo(Entity*);
extern void OctorokGolden(Entity*);
extern void TektiteGolden(Entity*);
extern void RopeGolden(Entity*);
extern void CloudPiranha(Entity*);
extern void ScissorsBeetle(Entity*);
extern void CuccoAggr(Entity*);
extern void Stalfos(Entity*);
extern void FlyingSkull(Entity*);
extern void MazaalBracelet(Entity*);
extern void Takkuri(Entity*);
extern void BowMoblin(Entity*);
extern void Lakitu(Entity*);
extern void LakituCloud(Entity*);
extern void Enemy49(Entity*);
extern void VaatiRebornEnemy(Entity*);
extern void VaatiProjectile(Entity*);
extern void BallChainSoldier(Entity*);
extern void Enemy4D(Entity*);
extern void Ghini(Entity*);
extern void VaatiTransfigured(Entity*);
extern void Enemy50(Entity*);
extern void VaatiWrath(Entity*);
extern void VaatiArm(Entity*);
extern void Dust(Entity*);
extern void VaatiBall(Entity*);
extern void Slime(Entity*);
extern void MiniSlime(Entity*);
extern void FireballGuy(Entity*);
extern void MiniFireballGuy(Entity*);
extern void VaatiTransfiguredEye(Entity*);
extern void BusinessScrubPrologue(Entity*);
extern void GyorgFemale();
extern void GyorgMale();
extern void Curtain(Entity*);
extern void VaatiWrathEye(Entity*);
extern void GyorgChild();
extern void GyorgFemaleEye();
extern void Enemy62(Entity*);
extern void GyorgFemaleMouth();
extern void Enemy64(Entity*);
extern void TreeItem(Entity*);
extern void Enemy66(Entity*);
void Octorok(Entity*);
void Chuchu(Entity*);
void Leever(Entity*);
void Peahat(Entity*);
void Rollobite(Entity*);
void DarkNut(Entity*);
void HangingSeed(Entity*);
void Beetle(Entity*);
void Keese(Entity*);
void DoorMimic(Entity*);
void RockChuchu(Entity*);
void SpinyChuchu(Entity*);
void CuccoChickAggr(Entity*);
void Moldorm(Entity*);
void EnemyE(Entity*);
void Moldworm(Entity*);
void Sluggula(Entity*);
void Pesto(Entity*);
void Puffstool(Entity*);
void ChuchuBoss(Entity*);
void LikeLike(Entity*);
void SpearMoblin(Entity*);
void BusinessScrub(Entity*);
void RupeeLike(Entity*);
void Madderpillar(Entity*);
void WaterDrop(Entity*);
void WallMaster(Entity*);
void BombPeahat(Entity*);
void Spark(Entity*);
void Chaser(Entity*);
void SpikedBeetle(Entity*);
void SensorBladeTrap(Entity*);
void Helmasaur(Entity*);
void FallingBoulder(Entity*);
void Bobomb(Entity*);
void WallMaster2(Entity*);
void Gleerok(Entity*);
void VaatiEyesMacro(Entity*);
void Tektite(Entity*);
void WizzrobeWind(Entity*);
void WizzrobeFire(Entity*);
void WizzrobeIce(Entity*);
void Armos(Entity*);
void Eyegore(Entity*);
void Rope(Entity*);
void SmallPesto(Entity*);
void AcroBandit(Entity*);
void BladeTrap(Entity*);
void Keaton(Entity*);
void Crow(Entity*);
void Mulldozer(Entity*);
void Bombarossa(Entity*);
void Wisp(Entity*);
void SpinyBeetle(Entity*);
void MazaalHead(Entity*);
void MazaalMacro(Entity*);
void MazaalHand(Entity*);
void OctorokBoss(Entity*);
void FlyingPot(Entity*);
void Gibdo(Entity*);
void OctorokGolden(Entity*);
void TektiteGolden(Entity*);
void RopeGolden(Entity*);
void CloudPiranha(Entity*);
void ScissorsBeetle(Entity*);
void CuccoAggr(Entity*);
void Stalfos(Entity*);
void FlyingSkull(Entity*);
void MazaalBracelet(Entity*);
void Takkuri(Entity*);
void BowMoblin(Entity*);
void Lakitu(Entity*);
void LakituCloud(Entity*);
void Enemy49(Entity*);
void VaatiRebornEnemy(Entity*);
void VaatiProjectile(Entity*);
void BallChainSoldier(Entity*);
void Enemy4D(Entity*);
void Ghini(Entity*);
void VaatiTransfigured(Entity*);
void Enemy50(Entity*);
void VaatiWrath(Entity*);
void VaatiArm(Entity*);
void Dust(Entity*);
void VaatiBall(Entity*);
void Slime(Entity*);
void MiniSlime(Entity*);
void FireballGuy(Entity*);
void MiniFireballGuy(Entity*);
void VaatiTransfiguredEye(Entity*);
void BusinessScrubPrologue(Entity*);
void GyorgFemale();
void GyorgMale();
void Curtain(Entity*);
void VaatiWrathEye(Entity*);
void GyorgChild();
void GyorgFemaleEye();
void Enemy62(Entity*);
void GyorgFemaleMouth();
void Enemy64(Entity*);
void TreeItem(Entity*);
void Enemy66(Entity*);
#endif
+349 -174
View File
@@ -3,19 +3,73 @@
#define ENTITY_H
#include "global.h"
#include "color.h"
#include "sprite.h"
#define MAX_ENTITIES 71
/** Kinds of Entity's supported by the game. */
typedef enum {
PLAYER = 1,
ENEMY = 3,
PROJECTILE = 4,
OBJECT = 6,
NPC = 7,
PLAYER_ITEM = 8,
MANAGER = 9,
} EntityType;
PLAYER = 1, /**< There is only one id assigned to the Player kind.
* The player Entity shares much of its code with LTTP GBA, however the game only supports
* one player Entity active at a time, assigned to the global #gPlayerEntity.
* Works next to PlayerState to control player behavior.
*/
ENEMY = 3, /**< Can give and take damage in relation to the player.
* Most enemies call the a set of external helper functions which calculate what behavior to execute.
*/
PROJECTILE = 4, /**< May damage the player. They are typically spawned by enemies.
*/
OBJECT = 6, /**< Encapsulates any sort of prop. Generally they cannot be interacted with directly,
* but they may react to a player action or script event.
*/
NPC = 7, /**< May be interacted with by the player. Almost every NPC is assigned a script.
* NPCs have three entry points: one for the head, one for the body, and one for kinstone fusion.
*/
PLAYER_ITEM = 8, /**< Displays sprites for items outside of the inventory (check).
*/
MANAGER = 9, /**< Utility Entity's that serve as a proxy between gameplay and the engine.
* Examples: drawing clouds, ezlo hints, playing cutscenes.
* Updates independently of other entities, and does not add to maximum entity count.
*/
} EntityKind;
/** Entity flags. */
typedef enum {
ENT_DID_INIT = 0x1, /**< Graphics and other data loaded. */
ENT_SCRIPTED = 0x2, /**< Execute in a scripted environment. */
ENT_DELETED = 0x10, /**< Queue deletion next frame. */
ENT_PERSIST = 0x20, /**< Persist between rooms. */
ENT_COLLIDE = 0x80, /**< Collide with other Entity's. */
} EntityFlags;
/** Priority level to determine what events will block an Entity from updating. */
typedef enum {
PRIO_MIN, /**< Default priority. */
PRIO_PLAYER, /**< Default priority for player. */
PRIO_MESSAGE, /**< Do not block during message. */
PRIO_NO_BLOCK, /**< Do not block during entity requested priority. @see RequestPriority */
PRIO_4, /**< Unused. */
PRIO_5, /**< Unused. */
PRIO_PLAYER_EVENT, /**< Do not block during special player event. */
PRIO_HIGHEST, /**< Do not block EVER. */
} Priority;
/** Animation state. */
typedef enum {
IdleNorth = 0x0, /**< Idle facing north. */
IdleEast = 0x2, /**< Idle facing east. */
IdleSouth = 0x4, /**< Idle facing south. */
IdleWest = 0x6, /**< Idle facing west. */
} AnimationState;
/** Direction. */
typedef enum {
DirectionNorth = 0x00, /**< North. */
DirectionEast = 0x08, /**< East. */
DirectionSouth = 0x10, /**< South. */
DirectionWest = 0x18, /**< West. */
} Direction;
typedef struct {
void* entity1;
@@ -23,6 +77,9 @@ typedef struct {
u8 filler[14];
} UnkStruct;
/**
* Hitbox structure.
*/
typedef struct {
s8 offset_x;
s8 offset_y;
@@ -31,6 +88,9 @@ typedef struct {
u8 height;
} Hitbox;
/**
* Hitbox structure supporting depth.
*/
typedef struct {
s8 offset_x;
s8 offset_y;
@@ -41,38 +101,48 @@ typedef struct {
u8 unknown2[3];
} Hitbox3D;
typedef struct {
u8 b0 : 3; // 1-4
u8 b1 : 3; // 8
u8 b2 : 1; // 0x40
u8 b3 : 1; // 0x80
} PACKED SpritePriority;
/**
* Container for instantiable behavior.
*/
typedef struct Entity_ {
/*0x00*/ struct Entity_* prev;
/*0x04*/ struct Entity_* next;
/*0x08*/ u8 kind;
/*0x09*/ u8 id;
/*0x0a*/ u8 type;
/*0x0b*/ u8 type2;
/*0x0c*/ u8 action;
/*0x0d*/ u8 subAction;
/*0x0e*/ u8 actionDelay;
/*0x0f*/ u8 field_0xf;
/*0x10*/ u8 flags;
/*0x11*/ u8 updatePriority : 4; // Current priority -- See RequestPriority
/* */ u8 updatePriorityPrev : 4; // Priority to restore after request is over
/*0x00*/ struct Entity_* prev; /**< previous Entity */
/*0x04*/ struct Entity_* next; /**< next Entity */
/*0x08*/ u8 kind; /**< @see EntityKind */
/*0x09*/ u8 id; /**< Entity id. */
/*0x0a*/ u8 type; /**< For use internally to allow different variations. */
/*0x0b*/ u8 type2; /**< For use internally. */
/*0x0c*/ u8 action; /**< Current action. Usually used to index a function table. */
/*0x0d*/ u8 subAction; /**< Optional sub-action. */
/*0x0e*/ u8 actionDelay; /**< General purpose timer. */
/*0x0f*/ u8 field_0xf; /**< General purpose timer. */
/*0x10*/ u8 flags; /**< @see EntityFlags */
/*0x11*/ u8 updatePriority : 4; /**< Current priority. @see Priority */
/* */ u8 updatePriorityPrev : 4; /**< Priority to restore after request is over. @see RequestPriority. */
/*0x12*/ s16 spriteIndex;
/*0x14*/ u8 animationState;
/*0x15*/ u8 direction;
/*0x14*/ u8 animationState; /**< Animation state. @see AnimationState */
/*0x15*/ u8 direction; /**< Facing direction. @see Direction */
/*0x16*/ u8 field_0x16;
/*0x17*/ u8 field_0x17;
/*0x18*/ struct {
/* */ u32 draw : 2; // 1-2
/* */ u32 ss2 : 1; // 4
/* */ u32 ss3 : 1; // 8
/* */ u32 shadow : 2; //0x10-0x20
/* */ u32 flipX : 1; //0x40
/* */ u32 flipY : 1; //0x80
/* */ u32 draw : 2; /**< Draw type. 0 = disabled, 1 = clip to screen, 3 = draw always */ /* 0x2 */
/* */ u32 ss2 : 1; /* 4 */
/* */ u32 ss3 : 1; /* 8 */
/* */ u32 shadow : 2; /* 0x10-0x20 */
/* */ u32 flipX : 1; /**< Flip sprite horizontally. */ /* 0x40 */
/* */ u32 flipY : 1; /**< Flip sprite vertically. */ /* 0x80 */
/* */ } PACKED spriteSettings;
/*0x19*/ struct {
/* */ u32 b0 : 2; // 1-2
/* */ u32 alphaBlend : 2; // 4-8
/* */ u32 b2 : 2; //0x10
/* */ u32 b3 : 2; //0x40
/* */ u32 b0 : 2; /* 1-2 */
/* */ u32 alphaBlend : 2; /* 4-8 */
/* */ u32 b2 : 2; /* 0x10 */
/* */ u32 b3 : 2; /* 0x40 */
/* */ } PACKED spriteRendering;
/*0x1a*/ union {
/* */ u8 raw;
@@ -82,45 +152,41 @@ typedef struct Entity_ {
/* */ } PACKED b;
/* */ } PACKED palette;
/*0x1b*/ struct {
/* */ u32 b0 : 1;
/* */ u32 b1 : 5; //0x10
/* */ u32 flipY : 2; //0x40
/* */ u32 b0 : 1; /* 1 */
/* */ u32 b1 : 5; /* 0x2-0x10 */
/* */ u32 flipY : 2; /* 0x20-0x40 */
/* */ } PACKED spriteOrientation;
/*0x1c*/ u8 field_0x1c;
/*0x1d*/ u8 field_0x1d;
/*0x1e*/ u8 frameIndex;
/*0x1f*/ u8 lastFrameIndex;
/*0x20*/ s32 zVelocity;
/*0x24*/ s16 speed;
/*0x20*/ s32 zVelocity; /**< Z axis speed. */
/*0x24*/ s16 speed; /**< Magnitude of speed. */
/*0x26*/ u8 spriteAnimation[3];
/*0x29*/ struct {
/* */ u8 b0 : 3; // 1-4
/* */ u8 b1 : 3; // 8
/* */ u8 b2 : 2; //0x40
/* */ } PACKED spritePriority;
/*0x29*/ SpritePriority spritePriority;
/*0x2a*/ u16 collisions;
/*0x2c*/ union SplitWord x;
/*0x30*/ union SplitWord y;
/*0x34*/ union SplitWord z;
/*0x38*/ u8 collisionLayer;
/*0x2c*/ union SplitWord x; /**< X position, fixed point. */
/*0x30*/ union SplitWord y; /**< Y position, fixed point. */
/*0x34*/ union SplitWord z; /**< Z position, fixed point. */
/*0x38*/ u8 collisionLayer; /**< Collision layer. */
/*0x39*/ s8 interactType;
/*0x3a*/ u8 field_0x3a;
/*0x3b*/ u8 flags2;
/*0x3c*/ u8 field_0x3c;
/*0x3d*/ s8 iframes;
/*0x3e*/ u8 knockbackDirection;
/*0x3f*/ u8 hitType; // behavior as a collision sender
/*0x40*/ u8 hurtType; // behavior as a collision reciever
/*0x3d*/ s8 iframes; /**< Invulnerability frames. */
/*0x3e*/ u8 knockbackDirection; /**< Direction of knockback. */
/*0x3f*/ u8 hitType; /**< Behavior as a collision sender. */
/*0x40*/ u8 hurtType; /**< behavior as a collision receiver. */
/*0x41*/ u8 bitfield;
/*0x42*/ u8 knockbackDuration;
/*0x42*/ u8 knockbackDuration; /**< Duration of knockback. */
/*0x43*/ u8 field_0x43;
/*0x44*/ u8 damage;
/*0x45*/ u8 health;
/*0x44*/ u8 damage; /**< Damage this Entity inflicts. */
/*0x45*/ u8 health; /**< Health of this Entity. */
/*0x46*/ u16 field_0x46;
/*0x48*/ Hitbox* hitbox;
/*0x48*/ Hitbox* hitbox; /**< Hitbox associated with this Entity. */
/*0x4c*/ struct Entity_* field_0x4c;
/*0x50*/ struct Entity_* parent;
/*0x54*/ struct Entity_* child;
/*0x50*/ struct Entity_* parent; /**< Parent Entity. Sometimes points to associated data. */
/*0x54*/ struct Entity_* child; /**< Child Entity. Sometimes points to associated data. */
/*0x58*/ u8 animIndex;
/*0x59*/ u8 frameDuration;
/*0x5a*/ u8 frame;
@@ -129,7 +195,7 @@ typedef struct Entity_ {
/*0x60*/ u16 spriteVramOffset;
/*0x62*/ u8 spriteOffsetX;
/*0x63*/ s8 spriteOffsetY;
/*0x64*/ void* myHeap;
/*0x64*/ void* myHeap; /**< Heap data allocated with #zMalloc. */
#ifndef NENT_DEPRECATED
/*0x68*/ union SplitHWord field_0x68;
/*0x6a*/ union SplitHWord field_0x6a;
@@ -166,77 +232,24 @@ typedef struct {
/*0x86*/ union SplitHWord field_0x86;
} GenericEntity;
/**
* Entity linked list structure.
*/
typedef struct LinkedList {
Entity* last;
Entity* first;
} LinkedList;
extern LinkedList gEntityLists[9];
extern LinkedList gUnk_03003D90;
typedef void(EntityAction)(Entity*);
typedef void (*EntityActionPtr)(Entity*);
typedef void (*const* EntityActionArray)(Entity*);
extern LinkedList gUnk_03003DA0;
enum {
ENT_DID_INIT = 0x1,
ENT_SCRIPTED = 0x2,
ENT_ASLEEP = 0x10,
ENT_20 = 0x20,
ENT_COLLIDE = 0x80,
};
#define COLLISION_OFF(entity) ((entity)->flags &= ~ENT_COLLIDE)
#define COLLISION_ON(entity) ((entity)->flags |= ENT_COLLIDE)
#define TILE(x, y) \
(((((x) - gRoomControls.roomOriginX) >> 4) & 0x3F) | \
((((y) - gRoomControls.roomOriginY) >> 4) & 0x3F) << 6)
#define COORD_TO_TILE(entity) \
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))
enum {
IdleNorth = 0x0,
IdleEast = 0x2,
IdleSouth = 0x4,
IdleWest = 0x6,
};
enum {
DirectionNorth = 0x00,
DirectionEast = 0x08,
DirectionSouth = 0x10,
DirectionWest = 0x18,
};
#define AnimationStateTurnAround(expr) ((expr) ^ 0x4)
#define AnimationStateIdle(expr) ((expr) & 0x6)
#define AnimationStateWalk(expr) ((expr) & 0xe)
#define DirectionRound(expr) ((expr) & 0x18)
#define DirectionRoundUp(expr) DirectionRound((expr) + 4)
#define DirectionIsHorizontal(expr) ((expr) & 0x08)
#define DirectionIsVertical(expr) ((expr) & 0x10)
#define DirectionTurnAround(expr) ((expr) ^ 0x10)
#define DirectionToAnimationState(expr) (DirectionRoundUp(expr) >> 3)
#define DirectionFromAnimationState(expr) ((expr) << 3)
#define DirectionNormalize(expr) ((expr) & 0x1f)
#define Direction8Round(expr) ((expr) & 0x1c)
#define Direction8RoundUp(expr) Direction8Round((expr) + 2)
#define Direction8TurnAround(expr) (Direction8RoundUp(expr) ^ 0x10)
#define Direction8ToAnimationState(expr) ((expr) >> 2)
#define Direction8FromAnimationState(expr) ((expr) << 2)
Entity* GetEmptyEntity(void);
void DrawEntity(Entity*);
Entity* CreateEnemy(u32 id, u32 type);
Entity* CreateNPC(u32 id, u32 type, u32 type2);
Entity* CreateObject(u32 id, u32 type, u32 type2);
Entity* CreateObjectWithParent(Entity* parent, u32 id, u32 type, u32 type2);
Entity* CreateFx(Entity* parent, u32 type, u32 type2);
/**
* Draw an Entity.
*
* @param entity Entity to be drawn.
*/
void DrawEntity(Entity* entity);
void InitializeAnimation(Entity*, u32);
void InitAnimationForceUpdate(Entity*, u32);
@@ -247,111 +260,273 @@ u32 LoadExtraSpriteData(Entity*, SpriteLoadData*);
void SetExtraSpriteFrame(Entity*, u32, u32);
void SetSpriteSubEntryOffsetData1(Entity*, u32, u32);
void SetSpriteSubEntryOffsetData2(Entity*, u32, u32);
u32 GetFacingDirection(Entity*, Entity*);
u8* GetSpriteSubEntryOffsetDataPointer(u32, u32);
/**
* @brief Delete the entity currently in execution.
* Return the direction pointing from one Entity to another.
*
* @param origin Entity to orient.
* @param target Entity to look at.
* @return Direction facing target.
*/
u32 GetFacingDirection(Entity* origin, Entity* target);
u32 ProcessMovement(Entity*);
/// @{
/**
* Allocate a new Entity.
*
* @return Allocated Entity or NULL if failed.
*/
Entity* GetEmptyEntity(void);
Entity* CreateEnemy(u32 id, u32 type);
Entity* CreateNPC(u32 id, u32 type, u32 type2);
Entity* CreateObject(u32 id, u32 type, u32 type2);
Entity* CreateObjectWithParent(Entity* parent, u32 id, u32 type, u32 type2);
Entity* CreateFx(Entity* parent, u32 type, u32 type2);
/// @}
/**
* Iteratively execute every Entity. Call once per frame.
*/
void UpdateEntities(void);
/**
* Iteratively execute every Manager. Call once per frame.
*/
void UpdateManagers(void);
/**
* Delete a manager.
*
* @param manager Manager to delete.
*/
void DeleteManager(void* manager);
/**
* Delete Manager or Entity.
*
* @param entity Entity or Manager to be deleted.
*/
void DeleteEntityAny(Entity* entity);
/**
* Erase all Entity's.
*/
void EraseAllEntities(void);
/**
* Delete the Entity currently in execution.
*
* @see UpdateContext
*/
void DeleteThisEntity(void);
/**
* @brief Delete an entity.
* Delete an Entity.
*
* @param entity Entity to delete.
*/
void DeleteEntity(Entity*);
void DeleteEntity(Entity* entity);
/**
* Add an Entity to the end of a LinkedList.
*
* @param entity Entity to add.
* @param listIndex Target LinkedList.
*/
void AppendEntityToList(Entity* entity, u32 listIndex);
/**
* Add an Entity to the start of a LinkedList.
*
* @param entity Entity to add.
* @param listIndex Target LinkedList.
*/
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
* Find an Entity for a given kind and id, and LinkedList.
*
* @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
* 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
* Search all lists for Entity of same kind and id.
*
* @return bool32 Duplicate was found.
*/
bool32 EntityHasDuplicateID(Entity* ent);
bool32 EntityHasDuplicateID(Entity* entity);
/**
* @brief Find an entity of same kind and id in list.
* @return Entity* First result or NULL if none found
* Find an Entity of same kind and id in LinkedList.
*
* @return Entity* First result or NULL if none found.
*/
Entity* FindNextDuplicateID(Entity* ent, int listIndex);
Entity* FindNextDuplicateID(Entity* entity, int listIndex);
/**
* @brief Find Entity with full identifiers.
* @return Entity* First result or NULL if none found
* Find an 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);
void DeleteManager(void*);
void DeleteEntityAny(Entity* ent);
void UpdateEntities(void);
void UpdateManagers(void);
void EraseAllEntities(void);
enum {
PRIO_MIN = 0,
PRIO_PLAYER = 1,
PRIO_MESSAGE = 2, /* do not block during message */
PRIO_NO_BLOCK = 3, /* do not block during entity requested priority */
PRIO_PLAYER_EVENT = 6, /* do not block during special player event */
PRIO_HIGHEST = 7, /* do not block EVER */
};
/**
* @brief Set the default priority for entity.
* Set the default priority for entity.
*
* @param entity Entity to set the priority of.
* @param prio #Priority level.
*/
void SetDefaultPriority(Entity* ent, u32 prio);
void SetDefaultPriority(Entity* entity, u32 prio);
/**
* @brief Check if entity should sleep this frame (according to priority).
* Check if entity will be deleted next frame.
*/
bool32 CheckDontUpdate(Entity* this);
bool32 EntityIsDeleted(Entity* entity);
/**
* @brief Check if system or entity is blocking updates.
* Check if system or entity is blocking updates.
*/
bool32 AnyPrioritySet(void);
/// Entity Priority: Update blocking events requested by an entity.
/**
* Set the minimum Entity priority.
*
* @param prio Minimum #Priority.
* @return Success.
*/
s32 SetMinPriority(u32 prio);
void RequestPriority(Entity* this);
void RevokePriority(Entity* e);
/**
* Request indefinite priority for an Entity.
*
* @param entity Entity requesting priority.
*/
void RequestPriority(Entity* entity);
void RequestPriorityDuration(Entity* this, u32 time);
/**
* Revoke priority from an Entity.
*
* @param entity Entity which requested priority.
*/
void RevokePriority(Entity* entity);
/**
* Request update priority over other Entity's for a period of time.
*
* @param entity Entity requesting priority.
* @param time Number of frames.
*/
void RequestPriorityDuration(Entity* entity, u32 time);
/**
* Set the remaining frames of Entity priority.
*
* @param time Number of frames.
*/
void SetPriorityTimer(u32 time);
void RequestPriorityOverPlayer(Entity* this);
void RevokePriorityOverPlayer(Entity* this);
/**
* Request priority over player update.
*
* @param entity Entity requesting priority.
*/
void RequestPriorityOverPlayer(Entity* entity);
/**
* Revoke priority over player update.
*
* @param entity Entity which requested priority.
*/
void RevokePriorityOverPlayer(Entity* entity);
/**
* Reset a priority event requested by an Entity.
*/
void ResetEntityPriority(void);
/// System Priority: Update blocking events sent by the engine.
/**
* Set entity and system priority to #PRIO_PLAYER_EVENT.
*/
void SetPlayerEventPriority(void);
/**
* Reset entity and system priority to defaults.
*/
void ResetPlayerEventPriority(void);
/**
* Set system priority to #PRIO_PLAYER_EVENT.
*/
void SetRoomReloadPriority(void);
/**
* Set system priority to #PRIO_HIGHEST.
*/
void SetInitializationPriority(void);
/**
* Reset the system update priority.
*/
void ResetSystemPriority(void);
/**
* LinkedList's which point to allocate Entities.
* These work together with Entity.prev and Entity.next fields
* to allow the iteration of all Entity's.
*/
extern LinkedList gEntityLists[9];
/**
* Current number of entities.
* @see Entity
*/
extern u8 gEntCount;
/**
* Current number of managers.
* @see Manager
*/
extern u8 gManagerCount;
#endif
#define COLLISION_OFF(entity) ((entity)->flags &= ~ENT_COLLIDE)
#define COLLISION_ON(entity) ((entity)->flags |= ENT_COLLIDE)
/** @name Tile Macros */ /// @{
#define TILE(x, y) (((((x)-gRoomControls.origin_x) >> 4) & 0x3F) | ((((y)-gRoomControls.origin_y) >> 4) & 0x3F) << 6)
#define COORD_TO_TILE(entity) 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))
/// @}
/** @name Animation State Macros */ ///@{
#define AnimationStateTurnAround(expr) ((expr) ^ 0x4)
#define AnimationStateIdle(expr) ((expr)&0x6)
#define AnimationStateWalk(expr) ((expr)&0xe)
///@}
/** @name Direction Macros */ ///@{
#define DirectionRound(expr) ((expr)&0x18)
#define DirectionRoundUp(expr) DirectionRound((expr) + 4)
#define DirectionIsHorizontal(expr) ((expr) & 0x08)
#define DirectionIsVertical(expr) ((expr) & 0x10)
#define DirectionTurnAround(expr) ((expr) ^ 0x10)
#define DirectionToAnimationState(expr) (DirectionRoundUp(expr) >> 3)
#define DirectionFromAnimationState(expr) ((expr) << 3)
#define DirectionNormalize(expr) ((expr) & 0x1f)
#define Direction8Round(expr) ((expr) & 0x1c)
#define Direction8RoundUp(expr) Direction8Round((expr) + 2)
#define Direction8TurnAround(expr) (Direction8RoundUp(expr) ^ 0x10)
#define Direction8ToAnimationState(expr) ((expr) >> 2)
#define Direction8FromAnimationState(expr) ((expr) << 2)
///@}
#endif // ENTITY_H
// clang-format on
+83 -6
View File
@@ -3,16 +3,93 @@
#include "global.h"
void SetBrightness(u32 arg0);
void DoFade(u32 type, u32 speed);
/**
* @struct FadeControl
* @brief Controls screen fading effects.
* @see gFadeControl
*/
typedef struct {
bool8 active; /**< Currently fading. */
u8 unused1;
u8 color;
u8 unused2;
u32 mask; /**< Fade palette mask.
* LSB = foreground, MSB = background. */
u16 type;
u16 speed;
u16 progress;
u16 sustain; /**< Fade progress to sustain. */
s16 iris_size;
s16 iris_x;
s16 iris_y;
u16 win_inside_cnt;
u16 win_outside_cnt;
} FadeControl;
extern FadeControl gFadeControl; /**< FadeControl instance. */
void sub_08050008(void);
void sub_08050038(u32);
void sub_080500F4(u32 arg0);
void sub_08050110(u32 param_1, u32 param_2, u32 fadeType, u32 fadeSpeed);
/** Set game brightness.
* @param brightness brightness level, 0-2
*/
void SetBrightness(u32 brightness);
/**
* Start a fade effect.
*
* @param type Fade type. The following flags are supported:
* 0x1 | 0x2 | 0x4 | 0x8 | 0x10
* :-------|:------------|:--------|:-------|:-------------------------
* in/out | black/white | instant | mosaic | iris fade
* @param speed Effect speed, lower is slower. Negative values trigger an acid-like experience.
*/
void SetFade(u32 type, u32 speed);
/**
* Perform the last fade effect in reverse.
*
* @param speed Fade speed.
*/
void SetFadeInverted(u32 speed);
/**
* Peform an iris fade.
*
* @param x Screen x coordinate.
* @param y Screen y coordinate.
* @param type Fade type.
* @param speed Fade speed.
*/
void SetFadeIris(u32 x, u32 y, u32 type, u32 speed);
/**
* Set the fade progress.
*
* When used on a fade in effect, this will set the progress of the fade.
* When used on a fade out effect, progress will be sustained at the value.
*
* @param progress Progress value. 0-256.
*/
void SetFadeProgress(u32 progress);
/**
* Initialize the fade system.
*
* This will misbehave if called while a fade is active.
*/
void InitFade(void);
/**
* Entry point for the fade system.
*/
void FadeMain(void);
/**
* Fade VBlank entry point.
*/
void FadeVBlank(void);
/**
* Reset the fade palette mask.
*/
void ResetFadeMask(void);
#endif // FADE_H
+11 -5
View File
@@ -1,16 +1,22 @@
#ifndef FILESELECT_H
#define FILESELECT_H
#include "audio.h"
#include "sound.h"
#include "global.h"
#include "save.h"
typedef struct {
u8 filler0[0x5];
u8 unk_0x0;
u8 filler0[0x4];
u8 state;
u8 subState;
u16 timer;
u8 fillerA[0x26];
u8 fillerA[0x5];
s16 unk_0x10;
u16 unk_0x12;
u8 fillerB[0xC];
u8 unk_0x20;
u8 fillerC[0xF];
} ChooseFileState;
static_assert(sizeof(ChooseFileState) == 0x30);
@@ -57,13 +63,14 @@ extern struct_02019EE0 gUnk_02019EE0;
extern void sub_08056FEC(u32, struct_020227E8*);
extern void sub_0805F46C(u32, void*);
extern void RecoverUI(u32 bottomPt, u32 topPt);
extern void sub_08080668(void);
extern void ClearTilemaps(void);
extern void sub_0805194C(u32);
extern struct_02036540* sub_0805F2C8(void);
extern void sub_0805F7DC(u32, struct_02036540*);
extern void sub_0805F300(struct_02036540*);
extern void sub_08050A64(u32);
extern void sub_08050AFC(u32);
extern void sub_08050384();
extern const struct_080FC844 gUnk_080FC844;
extern const u16 gUnk_080FC85C[][3];
@@ -72,7 +79,6 @@ extern const u8 gGlobalGfxAndPalettes[];
extern void (*const gUnk_080FC93C[])();
extern u32 gUsedPalettes;
extern u8 gTextGfxBuffer[];
extern u8 gUnk_02001B40;
extern u8 gUnk_02022030;
#endif
+4 -4
View File
@@ -25,10 +25,10 @@ void SetLocalFlag(u32);
void SetLocalFlagByBank(u32, u32);
void SetRoomFlag(u32);
extern u32 ReadBit(u32*, u32);
extern u32 CheckBits(u32*, u32, u32);
extern void WriteBit(u32*, u32);
extern void ClearBit(u32*, u32);
extern u32 ReadBit(void*, u32);
extern u32 CheckBits(void*, u32, u32);
extern u32 WriteBit(void*, u32);
extern u32 ClearBit(void*, u32);
extern u32 gGlobalFlags;
extern u32 gRoomFlags;
+5 -104
View File
@@ -12,53 +12,21 @@
#include "script.h"
// Identified - to be sorted into header files
extern u32 CheckKinstoneFused(u32);
extern void ForceEquipItem(u32, u32);
extern void LoadRoomEntityList(EntityData* listPtr);
extern void SetChildOffset(Entity*, s32, s32, s32);
extern Entity* CreatePlayerItem(u32, u32, u32, u32);
extern u32 GetTileTypeByPos(s32 x, s32 y, u32 layer);
extern u32 GetTileType(u32 pos, u32 layer);
extern void SetTile(u32, u32, u32);
extern void SetDirtTile(u32);
extern Entity* CreateDeathFx(Entity*, u32, u32);
extern u8* GetSpriteSubEntryOffsetDataPointer(u32, u32);
extern bool32 LoadFixedGFX(Entity*, u32);
extern void CreateItemEntity(u32, u32, u32);
extern u32 ProcessMovement(Entity*);
extern void MenuFadeIn(u32, u32);
extern void LoadResourceAsync(const void*, u32, u32);
extern void LoadPaletteGroup(u32);
extern void TryLoadPrologueHyruleTown(void);
extern void LoadGfxGroup(u32);
extern void ResetPlayer(void);
extern u32 IsItemEquipped(u32);
extern bool32 CheckPlayerInRegion(u32 centerX, u32 centerY, u32 radiusX, u32 radiusY);
extern Entity* CreateProjectileWithParent(Entity*, u8, u8);
extern u32 GetTileTypeByEntity(Entity*);
extern u32 GetSaleItemConfirmMessageID(u32);
extern void FlushSprites(void);
extern Entity* CreateProjectile(u32);
extern void RegisterPlayerHitbox();
extern s32 GetItemPrice();
extern void DoExitTransition(const ScreenTransitionData*);
extern void CreateDustAt(s32, s32, u32);
extern void PutItemOnSlot(u32 itemID);
extern Entity* CreateSpeechBubbleQuestionMark(Entity*, s32, s32);
extern Entity* CreateSpeechBubbleExclamationMark(Entity*, s32, s32);
extern Entity* CreateSpeechBubbleSleep(Entity*, s32, s32);
// Unidentified
extern void sub_080791D0();
extern void sub_0805EC9C();
extern void sub_0805EC60(Entity*);
extern void sub_0806D0B0(Entity*);
extern void sub_0806D02C(Entity*);
extern void ChangeObjPalette(Entity*, u32);
extern void sub_0806FD3C(Entity*);
extern void sub_0805ED14(u32*);
extern void sub_080A7C18(u32, u32, u32);
extern void sub_0804AA30(Entity*, void (*const funcs[])());
extern void sub_0804AA30(Entity*, void (*const[])());
extern void sub_0804A720(Entity*);
extern u32 sub_080AEFE0(Entity*);
extern u32 sub_08049FA0(Entity*);
@@ -72,8 +40,8 @@ extern void sub_08077F50(ItemBehavior* beh, u32 arg1);
extern void sub_0807AA80(Entity*);
extern s32 sub_0807887C(Entity*, u32, u32);
extern s32 sub_08078904();
extern void sub_080AD9B0(void);
extern void sub_080AD918(void);
extern void DrawEntities(void);
extern void CopyOAM(void);
extern void sub_0801E104(void);
extern void sub_080A57F4(void);
extern void sub_08030118(u32);
@@ -89,121 +57,58 @@ extern void sub_08059278(void);
extern void sub_0804C128(u32);
extern void sub_08058324(u32);
extern void sub_0801AFE4(void);
extern u32 sub_08060354(void);
extern void sub_08057E64(void);
extern void sub_0809F814(u32);
extern void sub_080300E8(void);
extern void sub_08058D34(void);
extern void sub_0807AABC(Entity*);
extern void sub_0805B4D0(u32);
extern void sub_0804D0B4(void);
extern void sub_080534AC();
extern void sub_0807BA8C(u32, u32);
extern void sub_0804D9B0();
extern void sub_0807BB98(u32, u32, u32, u32);
extern void sub_0801D000(u32);
extern void sub_08018C58(u32);
extern void sub_080AF284(void);
extern void sub_080A71C4(u32, u32, u32, u32);
extern void sub_08054564();
extern void sub_0801DD58(u32, u32);
extern void sub_0804ED18();
extern void sub_080AF2E4(void);
extern void sub_0804F578(void);
extern void sub_08059994(void);
extern s32 sub_0801CFA8(u32);
extern void sub_080ADA14(u32, u32); // trampoline to sub_080B27F4
extern void sub_0801E1B8(u32, u32);
extern void sub_0801E1EC(s32, s32, s32);
extern void sub_080A3B74(void);
extern void sub_080A4054(void);
extern void DrawDirect(u32, u32); // trampoline to sub_080B27F4
extern void sub_0801C1D4(void);
extern void sub_0801C208(void);
extern void sub_080A4D34(void);
extern u32 sub_080A4494(void);
extern void sub_080A4528(void);
extern void sub_080A4398(void);
extern void sub_0801E738(u32);
extern void sub_080A7114(u32);
extern void DrawOAMCmd(void);
extern u32 sub_0807953C(void);
extern void sub_080AE068(Entity*);
extern u32 sub_0800445C(Entity*);
extern void sub_0807A108(void);
extern u32 sub_0801766C(Entity*);
extern void sub_08004168(Entity*);
extern void sub_08056208(void);
extern void sub_08050384();
extern u32 sub_0806F520();
extern void sub_0806F4E8(Entity*);
extern void sub_0804A7D4(Entity*);
extern void sub_08033744(Entity*);
extern void sub_0800417E(Entity*, u32);
extern void sub_080784C8();
extern u32 sub_0808288C(Entity*, u32, u32, u32);
extern void sub_0806FDA0(Entity*);
extern bool32 LoadSwapGFX(Entity*, u16, u32);
extern u32 sub_08016A30(Entity*);
extern void sub_08077728();
extern void sub_0807AEE4();
extern u32 sub_08078EFC();
extern void sub_0807921C();
extern void UpdateFloorType();
extern void sub_08079938();
extern void sub_0807ACCC(Entity*);
extern void sub_080A2BE4(Entity*, u32);
extern u32 sub_08097ADC(Entity*);
extern u32 sub_08079F8C(void);
extern void sub_080787CC(Entity*);
extern u32 sub_080044EC(Entity*, u32);
extern u32 sub_080002B8(Entity*);
extern u32 sub_08049F84(Entity*, u32);
extern void sub_0802F45C(Entity*);
extern u32 sub_0800419C(Entity*, Entity*, u32, u32);
extern void sub_08004542(Entity*);
extern void sub_08077B20();
extern bool32 sub_080040A8(Entity*);
extern u32 sub_08017850(Entity*);
extern void sub_080809D4(void);
extern void sub_08080CB4(Entity*);
extern u32 sub_0800442E(Entity*);
extern void sub_08081404(Entity*, u32);
extern void sub_0807B7D8(u32, u32, u32);
extern void sub_0800451C(Entity*);
extern u32 sub_080002F0(u32, u32, u32);
extern u32 sub_080040D8(Entity*, u8*, s32, s32);
extern void sub_08053320();
extern void SetColor(u32, u32);
extern u32 sub_0805F8F8(u32);
extern void sub_08002724(void*, u8*);
extern void sub_080026C4(u8*, u8*, u8*, u32);
extern void sub_080026F2(u8*, void*, u8*, u32);
extern u32 sub_0805F7A0(u32);
extern u32* sub_0805F25C(u32);
u32 sub_0806FCB8(Entity*, u32, u32, u32);
extern void sub_0806F62C(Entity*, u32, u32);
extern void sub_080A1ED0(u32, u32, u32);
extern u32 sub_0806F5B0(u32);
extern void sub_0801DFB4(Entity*, u32, u32, u32);
extern void sub_0801E00C();
extern void sub_08078790(Entity*, u32);
extern void sub_080788E0(Entity*);
extern void CreateEzloHint(u32, u32);
extern void sub_08078B48(void);
extern void sub_0807919C();
extern void sub_0807CAA0(u32, u32);
extern void sub_080085B0(Entity*);
extern u32 sub_08079D48();
extern u32 sub_08008B22();
extern void sub_080791BC9();
extern void sub_080791BC();
extern void MessageClose();
extern u32 sub_080542AC(u32);
extern u32 sub_08079FC4(u32);
extern void sub_0800455E(Entity*);
extern u32* sub_08008790(Entity*, u32);
extern void sub_0804ACF8();
extern void sub_0805F8E4(u32 r0, WStruct* r1);
extern Entity* sub_08077C94(ItemBehavior*, u32);
extern Entity* sub_08077C0C(ItemBehavior*, u32);
extern void sub_08077D38(ItemBehavior*, u32);
@@ -213,13 +118,9 @@ extern u32 sub_0806F948(Entity*);
extern void sub_08077DF4(ItemBehavior*, u32);
extern void sub_08077BB8(ItemBehavior*);
extern bool32 sub_08077EFC(ItemBehavior*);
extern void sub_08078E84(Entity*, Entity*);
extern void sub_080042D0(Entity*, u32, u16);
extern u32 sub_080002A8(u32, u32, u32);
extern void sub_080806BC(u32, u32, u32, u32);
extern void LoadObjPalette(Entity*, u32);
#endif
+321
View File
@@ -0,0 +1,321 @@
#ifndef GAME_H
#define GAME_H
#include "global.h"
#include "area.h"
/**
* Change the light level of the room.
*
* @param level The new light level.
*/
void ChangeLightLevel(s32 level);
/**
* Set the dislayed popup state
*
* @param type The popup type.
* @param choice_idx The choice index.
*/
void SetPopupState(u32 type, u32 choice_idx);
/**
* Check if an area is overworld (not dungeon or inside).
*
* @param area The area to check.
* @return True if the area is overworld.
*/
bool32 CheckAreaOverworld(u32 area);
/**
* Check if the current area is overworld.
*
* @return True if the current area is overworld.
*/
bool32 AreaIsOverworld(void);
/**
* Check if the current area is a dungeon.
*
* @return True if the current area is a dungeon.
*/
bool32 AreaIsDungeon(void);
/**
* Check if the current area has enemies.
*
* @return True if the current area has enemies.
*/
bool32 AreaHasEnemies(void);
/**
* Check if the current area has no enemies.
*
* @return True if the current area has no enemies.
*/
bool32 AreaHasNoEnemies(void);
/**
* Check if the current area has a map
*
* @return True if the current area has a map.
*/
bool32 AreaHasMap(void);
/**
* Check if current area has keys.
*
* @return True if the current area has keys.
*/
bool32 AreaHasKeys(void);
#ifndef EU
/**
* This function was introduced to allow warping from indoor areas (palace of winds).
*
* @return True if the current area allows warping.
*/
u32 AreaAllowsWarp(void);
/**
* Related to a music bug?
*/
void sub_08052878(void);
#endif
void sub_080526F8(s32 a1);
/**
* Check if the current dungeon has a map item.
*
* @return True if the current dungeon has a map item.
*/
bool32 HasDungeonMap(void);
/**
* Check if the current dungeon has a compass item.
*
* @return True if the current dungeon has a compass item.
*/
bool32 HasDungeonCompass(void);
/**
* Check if the current dungeon has a big key item.
*
* @return True if the current dungeon has a big key item.
*/
bool32 HasDungeonBigKey(void);
/**
* Check if the current dungeon has a small key item.
*
* @return True if the current dungeon has a small key item.
*/
bool32 HasDungeonSmallKey(void);
/**
* @brief Check if item is a sword.
*
* @param item The item to check.
* @return True if the item is a sword.
*/
bool32 ItemIsSword(u32 item);
/**
* Check if item is a shield.
*
* @return True if the item is a shield.
*/
bool32 ItemIsShield(u32 item);
/**
* @brief Get the index of the bottle containing the specified item.
*
* @param item The item to check.
* @return Bottle index, or 0 if the item is not in a bottle.
*/
u32 GetBottleContaining(u32 item);
/**
* Put an item in A or B slot.
*
* @param item The item to put.
*/
void PutItemOnSlot(u32 item);
/**
* Force equip an item.
*
* @param item The item to equip.
* @param slot The slot to equip the item in.
*/
void ForceEquipItem(u32 item, u32 slot);
/**
* Get item price.
*
* @param item The item to get the price of.
* @return The price of the item.
*/
s32 GetItemPrice(u32 item);
/**
* Get the item purchase enquiry message.
*
* @param item The item to get the message for.
* @return The message index.
*/
u32 GetSaleItemConfirmMessageID(u32 item);
/**
* Automatically load overworld graphics groups.
*/
void LoadGfxGroups(void);
/**
* Load an auxiliary room (no player present).
*
* @param area Area index.
* @param room Room index.
*/
void LoadAuxiliaryRoom(u32 area, u32 room);
/**
* Initialize a loaded room.
*/
void InitRoom(void);
/**
* Initialize a parachute room.
*/
void InitParachuteRoom(void);
/**
* Register a manager for room changes.
*
* @param mgr Manager to register.
* @param onEnter Room enter callback.
* @param onExit Room exit callback.
*/
void RegisterTransitionManager(void* mgr, void (*onEnter)(void*), void (*onExit)(void*));
/**
* Call the room exit callback.
*/
void RoomExitCallback(void);
/**
* Restore the game task from a subtask.
*
* @param a1
*/
void RestoreGameTask(u32 a1);
/**
* Check if an Ezlo message can be displayed.
*
* @return True if an Ezlo message can be displayed.
*/
bool32 CanDispEzloMessage(void);
/**
* Display an Ezlo message.
*/
void DisplayEzloMessage(void);
/**
* Set the player's world map position.
*
* @param area Area index.
* @param room Room index.
* @param x X position.
* @param y Y position.
*/
void SetWorldMapPos(u32 area, u32 room, u32 x, u32 y);
/**
* Set the player's dungeon map position.
*
* @param area Area index.
* @param room Room index.
* @param x X position.
* @param y Y position.
*/
void SetDungeonMapPos(u32 area, u32 room, u32 x, u32 y);
/**
* Get flag bank offset for area
*
* @param idx Area index.
* @return Flag bank offset.
*/
u32 GetFlagBankOffset(u32 idx);
/**
* Retrieve information about the current room.
*
* @return RoomResInfo object.
*/
RoomResInfo* GetCurrentRoomInfo(void);
void sub_08052EA0(void);
void sub_08053250(void);
void sub_080533CC(void);
void sub_08053494(void);
void sub_080534AC(void);
void InitBiggoronTimer(void);
/** Game tasks states */
typedef enum {
GAMETASK_TRANSITION, /* transition from fileselect task */
GAMETASK_INIT,
GAMETASK_MAIN,
GAMETASK_EXIT, /* gameover task or reset */
} EGameTaskState;
/** game task main substates */
typedef enum {
GAMEMAIN_INITROOM,
GAMEMAIN_CHANGEROOM,
GAMEMAIN_UPDATE,
GAMEMAIN_CHANGEAREA,
GAMEMAIN_MINISHPORTAL, /* moments after viewing portal cutscene */
GAMEMAIN_BARRELUPDATE, /* barrel in deepwood shrine */
GAMEMAIN_RESERVED,
GAMEMAIN_SUBTASK,
} EGameMainState;
/** Subtasks override the game task for short periods */
typedef enum {
SUBTASK_EXIT,
SUBTASK_PAUSEMENU,
SUBTASK_EXIT2,
SUBTASK_MAPHINT,
SUBTASK_KINSTONEMENU,
SUBTASK_AUXCUTSCENE, /* cutscene without presence of player */
SUBTASK_PORTALCUTSCENE, /* player "falling" down portal cutscene */
SUBTASK_FIGURINEMENU,
SUBTASK_WORLDEVENT,
SUBTASK_FASTTRAVEL,
SUBTASK_LOCALMAPHINT,
} ESubtask;
typedef void(Subtask)(void);
/** @name Subtask entrypoints */
///@{
/** Subtask entrypoint. */
Subtask Subtask_Exit;
Subtask Subtask_PauseMenu;
Subtask Subtask_Exit;
Subtask Subtask_MapHint;
Subtask Subtask_KinstoneMenu;
Subtask Subtask_AuxCutscene;
Subtask Subtask_PortalCutscene;
Subtask Subtask_FigurineMenu;
Subtask Subtask_WorldEvent;
Subtask Subtask_FastTravel;
Subtask Subtask_LocalMapHint;
///@}
#endif // GAME_H
+21
View File
@@ -1,6 +1,24 @@
#ifndef GUARD_GLOBAL_H
#define GUARD_GLOBAL_H
/**
* @defgroup Tasks Tasks
* @defgroup Subtasks Subtasks
*/
/** @defgroup Entities Entities */
///@{
/**
* @defgroup Player Player
* @defgroup Enemies Enemies
* @defgroup Projectiles Projectiles
* @defgroup Objects Objects
* @defgroup NPCs NPCs
* @defgroup Items Items
* @defgroup Managers Managers
*/
///@}
#include "gba/gba.h"
#include <string.h>
@@ -101,4 +119,7 @@ union SplitHWord {
#define FORCE_WORD_ALIGNED __attribute__((packed, aligned(2)))
/* forward decls */
struct Entity_;
#endif // GUARD_GLOBAL_H
+3
View File
@@ -5,6 +5,9 @@
#include "entity.h"
#include "player.h"
void CreateItemEntity(u32, u32, u32);
void sub_08081404(Entity*, u32);
extern void ItemDebug(ItemBehavior*, u32);
extern void ItemSword(ItemBehavior*, u32);
extern void ItemBomb(ItemBehavior*, u32);
+30
View File
@@ -0,0 +1,30 @@
#ifndef KINSTONE_H
#define KINSTONE_H
#include "global.h"
extern void sub_08018C58(u32);
typedef struct {
u8 unk[4];
u32 unk2;
u32 unk4;
} Unk_struct;
extern Unk_struct gUnk_03003DF0[];
typedef struct {
u8 _0;
u8 action;
u8 _2;
u8 _3;
u8 _4;
u8 _5;
u16 _6;
u16 _8;
u16 _a;
Entity* ent;
} FuseInfo;
static_assert(sizeof(FuseInfo) == 0x10);
extern FuseInfo gFuseInfo;
#endif // KINSTONE_H
+78 -46
View File
@@ -3,25 +3,16 @@
#include "global.h"
/** File signature */
#define SIGNATURE 'MCZ3'
/** Maximum message speed. */
#define MAX_MSG_SPEED 3
/** Number of save slots */
#define NUM_SAVE_SLOTS 3
/** Maximum brightness. */
#define MAX_BRIGHTNESS 3
typedef struct { // 0x03001000
u8 field_0x0;
u8 field_0x1;
u8 field_0x2;
u8 field_0x3;
u8 field_0x4;
u16 field_0x6;
u8 field_0x8;
u8 field_0x9;
u8 field_0xa;
u8 field_0xb;
u32 spritePriority;
} MainStruct;
/** Supported game languages. */
typedef enum {
LANGUAGE_JP,
LANGUAGE_EN,
@@ -38,37 +29,47 @@ typedef enum {
#define GAME_LANGUAGE LANGUAGE_JP
#endif
enum {
SCREEN_INTRO,
SCREEN_CHOOSE_FILE,
SCREEN_GAMEPLAY,
SCREEN_GAME_OVER,
SCREEN_CREDITS,
SCREEN_DEBUG_TEXT,
};
/** Program tasks. */
typedef enum {
TASK_TITLE, /**< Title task. This is the first task to be entered. */
TASK_FILE_SELECT, /**< File selection task. */
TASK_GAME, /**< Gameplay task. Overworld, menus, cutscenes are all contained here. */
TASK_GAMEOVER, /**< Gameover task. */
TASK_STAFFROLL, /**< Staffroll task. Only accessible through the script played during the game ending. */
TASK_DEBUG, /**< Debug task. Inaccessible in normal gameplay. */
} Task;
enum {
/** System sleep status. */
typedef enum {
DEFAULT,
SLEEP,
};
} SleepStatus;
/**
* Main system structure.
*/
typedef struct {
vu8 interruptFlag;
u8 sleepStatus;
u8 screen;
u8 funcIndex;
u8 transition;
u8 task; /**< Current #Task. */
u8 state; /**< State of the current #Task. */
u8 substate; /**< Substate of the current #Task. */
u8 field_0x5;
u8 muteAudio;
u8 muteAudio; /**< Mute audio. */
u8 field_0x7;
u8 pauseFrames;
u8 pauseCount;
u8 pauseInterval;
u16 ticks;
u8 pauseFrames; /**< Number of frames to pause. */
u8 pauseCount; /**< Number of pauses to make. */
u8 pauseInterval; /**< Number of frames to play between each pause. */
u8 pad;
union SplitHWord ticks; /**< Current time. */
} Main;
/**
* HUD structure.
*/
typedef struct {
/*0x00*/ u16 nextToLoad;
/*0x00*/ u8 nextToLoad;
/*0x01*/ u8 _1;
/*0x02*/ u8 lastState;
/*0x03*/ u8 field_0x3;
/*0x04*/ u8 state;
@@ -81,31 +82,62 @@ typedef struct {
} UI;
static_assert(sizeof(UI) == 0x3b4);
extern Main gMain;
extern UI gUnk_02032EC0;
extern Main gMain; /**< Main instance. */
extern UI gUnk_02032EC0; /**< UI instance. */
/**
* @brief Begin a subroutine.
* Program entry point.
*/
void InitScreen(u32 screen);
void AgbMain(void);
/**
* Begin a new task.
*
* @param task #Task to begin.
*/
void SetTask(u32 task);
/**
* Initialize the DMA system.
*/
void InitDMA(void);
/**
* Soft reset the system.
*/
void DoSoftReset(void);
/**
* Put the system into sleep mode.
*/
void SetSleepMode(void);
extern void sub_0805622C(void* a1, u32 a2, u32 a3);
extern void sub_08056208(void);
extern void ResetPalettes(void);
extern void DoSoftReset(void);
extern void SetSleepMode(void);
extern void VBlankIntrWait();
extern void FadeMain(void);
extern u8 gUnk_03003DE4;
extern void SetBrightness(u32);
extern u16 gPaletteBuffer[];
extern void VBlankInterruptWait(void);
extern void DisableInterruptsAndDMA(void);
extern void EnableVBlankIntr(void);
extern void sub_08056250(void);
extern void sub_08056208(void);
/** @name Task entrypoints */
///@{
/** Task entrypoint. */
extern void TitleTask(void);
extern void FileSelectTask(void);
extern void GameTask(void);
extern void GameOverTask(void);
extern void StaffrollTask(void);
extern void DebugTask(void);
#ifdef DEMO_USA
extern void DemoTask(void);
#endif
/// @}
extern u8 gUnk_03003DE4;
extern u16 gPaletteBuffer[];
#endif
+3 -3
View File
@@ -130,10 +130,10 @@ typedef struct Manager11 {
typedef struct {
u16 unk_00;
u8 source_roomID;
u8 source_room;
u8 unk_03;
u8 target_areaID;
u8 target_roomID;
u8 target_area;
u8 target_room;
u16 unk_06;
} DiggingCaveEntrance;
+24 -24
View File
@@ -33,30 +33,30 @@ typedef struct {
extern void sub_080A70AC(const KeyButtonLayout*);
typedef struct {
u8 field_0x0;
u8 column_idx;
u8 field_0x2;
u8 field_0x3;
u8 field_0x4;
u8 menuType;
u8 overlayType;
u8 storyPanelIndex;
u16 transitionTimer;
u16 field_0xa;
u8* field_0xc;
u8 focusCoords[2];
u8 field_0x12;
u8 unk13;
u8 unk14;
u8 unk15;
u8 unk16;
// While struct offsets are usually loaded indirectly, this one is often loaded
// directly in the code. This happens when you take the address off the field with '&`.
// Perhaps they had a macro to cast this to different sized arrays.
u8 selectMtx;
u8 filler18[0x12];
u8 unk2a;
int field_0x2c;
/*0x00*/ u8 field_0x0;
/*0x01*/ u8 column_idx;
/*0x02*/ u8 field_0x2;
/*0x03*/ u8 field_0x3;
/*0x04*/ u8 field_0x4;
/*0x05*/ u8 menuType;
/*0x06*/ u8 overlayType;
/*0x07*/ u8 storyPanelIndex;
/*0x08*/ u16 transitionTimer;
/*0x0a*/ u16 field_0xa;
/*0x0c*/ u8* field_0xc;
/*0x10*/ u8 focusCoords[2];
/*0x12*/ u8 field_0x12;
/*0x13*/ u8 unk13;
/*0x14*/ u8 unk14;
/*0x15*/ u8 unk15;
/*0x16*/ u8 unk16;
/* */ // While struct offsets are usually loaded indirectly, this one is often loaded
/* */ // directly in the code. This happens when you take the address off the field with '&`.
/* */ // Perhaps they had a macro to cast this to different sized arrays.
/*0x17*/ u8 selectMtx;
/*0x18*/ u8 filler18[0x12];
/*0x2a*/ u8 unk2a;
/*0x2c*/ int field_0x2c;
} Menu;
static_assert(sizeof(Menu) == 0x30);
+10 -5
View File
@@ -1,5 +1,5 @@
#ifndef TEXTBOX_H
#define TEXTBOX_H
#ifndef MESSAGE_H
#define MESSAGE_H
#include "global.h"
#include "entity.h"
@@ -39,7 +39,7 @@ typedef struct {
Message message;
Token curToken;
WStruct _50;
char playerName[10];
char player_name[10];
u8 _66[0x10];
u8 _76;
u8 _77[0x11];
@@ -126,6 +126,11 @@ void MessageFromTarget(u32 index);
*/
void MessageAtHeight(u32 index, u32 y);
void DispMessageFrame(u16*, u32, u32, u32);
/**
* @brief Close message.
*/
void MessageClose(void);
#endif
void DispMessageFrame(u16*, s32, s32, u32);
#endif // MESSAGE_H
+163 -163
View File
@@ -3,14 +3,14 @@
#include "global.h"
#include "asm.h"
#include "utils.h"
#include "common.h"
#include "audio.h"
#include "sound.h"
#include "effects.h"
#include "room.h"
#include "flags.h"
#include "coord.h"
#include "textbox.h"
#include "message.h"
#include "script.h"
#include "save.h"
@@ -177,166 +177,166 @@ enum NPC {
/*0x7f*/ NPC_NONE_39,
};
extern void Gentari(Entity*);
extern void Gentari_Fusion(Entity*);
extern void Festari(Entity*);
extern void Festari_Fusion(Entity*);
extern void ForestMinish(Entity*);
extern void ForestMinish_Head(Entity*);
extern void ForestMinish_Fusion(Entity*);
extern void Postman(Entity*);
extern void Postman_Fusion(Entity*);
extern void NPC5(Entity*);
extern void Townsperson(Entity*);
extern void Townsperson_Head(Entity*);
extern void Townsperson_Fusion(Entity*);
extern void Kid(Entity*);
extern void Kid_Head(Entity*);
extern void Kid_Fusion(Entity*);
extern void Guard(Entity*);
extern void Guard_Head(Entity*);
extern void NPC9(Entity*);
extern void Stamp(Entity*);
extern void Maid(Entity*);
extern void Maid_Head(Entity*);
extern void Marcy(Entity*);
extern void Wheaton(Entity*);
extern void Pita(Entity*);
extern void MinishEzlo(Entity*);
extern void MinishEzlo_Head(Entity*);
extern void Mailbox(Entity*);
extern void Beedle(Entity*);
extern void Beedle_Head(Entity*);
extern void Brocco(Entity*);
extern void Brocco_Fusion(Entity*);
extern void SittingPerson(Entity*);
extern void SittingPerson_Head(Entity*);
extern void SittingPerson_Fusion(Entity*);
extern void Pina(Entity*);
extern void Pina_Fusion(Entity*);
extern void Din(Entity*);
extern void Din_Fusion(Entity*);
extern void Nayru(Entity*);
extern void Nayru_Fusion(Entity*);
extern void Farore(Entity*);
extern void Farore_Fusion(Entity*);
extern void Sturgeon(Entity*);
extern void Sturgeon_Head(Entity*);
extern void Sturgeon_Fusion(Entity*);
extern void TingleSiblings(Entity*);
extern void TingleSiblings_Fusion(Entity*);
extern void Stockwell(Entity*);
extern void Talon(Entity*);
extern void Talon_Head(Entity*);
extern void Talon_Fusion(Entity*);
extern void Malon(Entity*);
extern void Malon_Fusion(Entity*);
extern void Epona(Entity*);
extern void Epona_Fusion(Entity*);
extern void MilkCart(Entity*);
extern void GhostBrothers(Entity*);
extern void GhostBrothers_Fusion(Entity*);
extern void Smith(Entity*);
extern void Smith_Head(Entity*);
extern void Smith_Fusion(Entity*);
extern void NPC23(Entity*);
extern void KingDaltus(Entity*);
extern void KingDaltus_Fusion(Entity*);
extern void MinisterPotho(Entity*);
extern void MinisterPotho_Fusion(Entity*);
extern void NPC26(Entity*);
extern void Vaati(Entity*);
extern void Zelda(Entity*);
extern void Mutoh(Entity*);
extern void Mutoh_Head(Entity*);
extern void Mutoh_Fusion(Entity*);
extern void Carpenter(Entity*);
extern void Carpenter_Head(Entity*);
extern void Carpenter_Fusion(Entity*);
extern void CastorWildsStatue(Entity*);
extern void CastorWildsStatue_Fusion(Entity*);
extern void Cat(Entity*);
extern void Cat_Fusion(Entity*);
extern void MountainMinish(Entity*);
extern void MountainMinish_Head(Entity*);
extern void MountainMinish_Fusion(Entity*);
extern void ZeldaFollower(Entity*);
extern void Melari(Entity*);
extern void Melari_Head(Entity*);
extern void Melari_Fusion(Entity*);
extern void BladeBrothers(Entity*);
extern void BladeBrothers_Fusion(Entity*);
extern void Cow(Entity*);
extern void Cow_Fusion(Entity*);
extern void Goron(Entity*);
extern void Goron_Fusion(Entity*);
extern void GoronMerchant(Entity*);
extern void Gorman(Entity*);
extern void Gorman_Head(Entity*);
extern void Dog(Entity*);
extern void Dog_Head(Entity*);
extern void Dog_Fusion(Entity*);
extern void Syrup(Entity*);
extern void Syrup_Head(Entity*);
extern void Rem(Entity*);
extern void TownMinish(Entity*);
extern void TownMinish_Head(Entity*);
extern void TownMinish_Fusion(Entity*);
extern void Librari(Entity*);
extern void Librari_Fusion(Entity*);
extern void Percy(Entity*);
extern void Percy_Head(Entity*);
extern void Percy_Fusion(Entity*);
extern void VaatiReborn(Entity*);
extern void MoblinLady(Entity*);
extern void Librarians(Entity*);
extern void Farmers(Entity*);
extern void Farmers_Head(Entity*);
extern void Farmers_Fusion(Entity*);
extern void Carlov(Entity*);
extern void Dampe(Entity*);
extern void Dampe_Fusion(Entity*);
extern void DrLeft(Entity*);
extern void KingGustaf(Entity*);
extern void Gina(Entity*);
extern void Gina_Fusion(Entity*);
extern void Simon(Entity*);
extern void Anju(Entity*);
extern void Anju_Fusion(Entity*);
extern void Mama(Entity*);
extern void Mama_Head(Entity*);
extern void Mama_Fusion(Entity*);
extern void Emma(Entity*);
extern void Teachers(Entity*);
extern void Teachers_Head(Entity*);
extern void Teachers_Fusion(Entity*);
extern void WindTribespeople(Entity*);
extern void WindTribespeople_Head(Entity*);
extern void WindTribespeople_Fusion(Entity*);
extern void Gregal(Entity*);
extern void Gregal_Fusion(Entity*);
extern void MayorHagen(Entity*);
extern void MayorHagen_Fusion(Entity*);
extern void BigGoron(Entity*);
extern void Ezlo(Entity*);
extern void NPC4E(Entity*);
extern void NPC4E_Fusion(Entity*);
extern void NPC4F(Entity*);
extern void ClothesRack(Entity*);
extern void PicolyteBottle(Entity*);
extern void SmallTownMinish(Entity*);
extern void HurdyGurdyMan(Entity*);
extern void HurdyGurdyMan_Head(Entity*);
extern void HurdyGurdyMan_Fusion(Entity*);
extern void Cucco(Entity*);
extern void Cucco_Fusion(Entity*);
extern void CuccoChick(Entity*);
extern void CuccoChick_Fusion(Entity*);
extern void FusionMenuNPC(Entity*);
extern void FusionMenuNPC_Head(Entity*);
extern void Phonograph(Entity*);
extern void NPC58(Entity*);
extern void NPC58_Head(Entity*);
void Gentari(Entity*);
void Gentari_Fusion(Entity*);
void Festari(Entity*);
void Festari_Fusion(Entity*);
void ForestMinish(Entity*);
void ForestMinish_Head(Entity*);
void ForestMinish_Fusion(Entity*);
void Postman(Entity*);
void Postman_Fusion(Entity*);
void NPC5(Entity*);
void Townsperson(Entity*);
void Townsperson_Head(Entity*);
void Townsperson_Fusion(Entity*);
void Kid(Entity*);
void Kid_Head(Entity*);
void Kid_Fusion(Entity*);
void Guard(Entity*);
void Guard_Head(Entity*);
void NPC9(Entity*);
void Stamp(Entity*);
void Maid(Entity*);
void Maid_Head(Entity*);
void Marcy(Entity*);
void Wheaton(Entity*);
void Pita(Entity*);
void MinishEzlo(Entity*);
void MinishEzlo_Head(Entity*);
void Mailbox(Entity*);
void Beedle(Entity*);
void Beedle_Head(Entity*);
void Brocco(Entity*);
void Brocco_Fusion(Entity*);
void SittingPerson(Entity*);
void SittingPerson_Head(Entity*);
void SittingPerson_Fusion(Entity*);
void Pina(Entity*);
void Pina_Fusion(Entity*);
void Din(Entity*);
void Din_Fusion(Entity*);
void Nayru(Entity*);
void Nayru_Fusion(Entity*);
void Farore(Entity*);
void Farore_Fusion(Entity*);
void Sturgeon(Entity*);
void Sturgeon_Head(Entity*);
void Sturgeon_Fusion(Entity*);
void TingleSiblings(Entity*);
void TingleSiblings_Fusion(Entity*);
void Stockwell(Entity*);
void Talon(Entity*);
void Talon_Head(Entity*);
void Talon_Fusion(Entity*);
void Malon(Entity*);
void Malon_Fusion(Entity*);
void Epona(Entity*);
void Epona_Fusion(Entity*);
void MilkCart(Entity*);
void GhostBrothers(Entity*);
void GhostBrothers_Fusion(Entity*);
void Smith(Entity*);
void Smith_Head(Entity*);
void Smith_Fusion(Entity*);
void NPC23(Entity*);
void KingDaltus(Entity*);
void KingDaltus_Fusion(Entity*);
void MinisterPotho(Entity*);
void MinisterPotho_Fusion(Entity*);
void NPC26(Entity*);
void Vaati(Entity*);
void Zelda(Entity*);
void Mutoh(Entity*);
void Mutoh_Head(Entity*);
void Mutoh_Fusion(Entity*);
void Carpenter(Entity*);
void Carpenter_Head(Entity*);
void Carpenter_Fusion(Entity*);
void CastorWildsStatue(Entity*);
void CastorWildsStatue_Fusion(Entity*);
void Cat(Entity*);
void Cat_Fusion(Entity*);
void MountainMinish(Entity*);
void MountainMinish_Head(Entity*);
void MountainMinish_Fusion(Entity*);
void ZeldaFollower(Entity*);
void Melari(Entity*);
void Melari_Head(Entity*);
void Melari_Fusion(Entity*);
void BladeBrothers(Entity*);
void BladeBrothers_Fusion(Entity*);
void Cow(Entity*);
void Cow_Fusion(Entity*);
void Goron(Entity*);
void Goron_Fusion(Entity*);
void GoronMerchant(Entity*);
void Gorman(Entity*);
void Gorman_Head(Entity*);
void Dog(Entity*);
void Dog_Head(Entity*);
void Dog_Fusion(Entity*);
void Syrup(Entity*);
void Syrup_Head(Entity*);
void Rem(Entity*);
void TownMinish(Entity*);
void TownMinish_Head(Entity*);
void TownMinish_Fusion(Entity*);
void Librari(Entity*);
void Librari_Fusion(Entity*);
void Percy(Entity*);
void Percy_Head(Entity*);
void Percy_Fusion(Entity*);
void VaatiReborn(Entity*);
void MoblinLady(Entity*);
void Librarians(Entity*);
void Farmers(Entity*);
void Farmers_Head(Entity*);
void Farmers_Fusion(Entity*);
void Carlov(Entity*);
void Dampe(Entity*);
void Dampe_Fusion(Entity*);
void DrLeft(Entity*);
void KingGustaf(Entity*);
void Gina(Entity*);
void Gina_Fusion(Entity*);
void Simon(Entity*);
void Anju(Entity*);
void Anju_Fusion(Entity*);
void Mama(Entity*);
void Mama_Head(Entity*);
void Mama_Fusion(Entity*);
void Emma(Entity*);
void Teachers(Entity*);
void Teachers_Head(Entity*);
void Teachers_Fusion(Entity*);
void WindTribespeople(Entity*);
void WindTribespeople_Head(Entity*);
void WindTribespeople_Fusion(Entity*);
void Gregal(Entity*);
void Gregal_Fusion(Entity*);
void MayorHagen(Entity*);
void MayorHagen_Fusion(Entity*);
void BigGoron(Entity*);
void Ezlo(Entity*);
void NPC4E(Entity*);
void NPC4E_Fusion(Entity*);
void NPC4F(Entity*);
void ClothesRack(Entity*);
void PicolyteBottle(Entity*);
void SmallTownMinish(Entity*);
void HurdyGurdyMan(Entity*);
void HurdyGurdyMan_Head(Entity*);
void HurdyGurdyMan_Fusion(Entity*);
void Cucco(Entity*);
void Cucco_Fusion(Entity*);
void CuccoChick(Entity*);
void CuccoChick_Fusion(Entity*);
void FusionMenuNPC(Entity*);
void FusionMenuNPC_Head(Entity*);
void Phonograph(Entity*);
void NPC58(Entity*);
void NPC58_Head(Entity*);
extern void (*const gNPCFunctions[128][3])(Entity*);
+201 -196
View File
@@ -3,9 +3,9 @@
#include "global.h"
#include "asm.h"
#include "utils.h"
#include "common.h"
#include "audio.h"
#include "sound.h"
#include "flags.h"
#include "effects.h"
#include "room.h"
@@ -20,9 +20,14 @@ extern void sub_080787B4(Entity*);
extern void sub_0808C650(Entity*, u32);
extern u32 sub_0808C67C(void);
extern void sub_0808C688(void);
extern void sub_080A2BE4(Entity*, u32);
void CreateDust(Entity* parent);
void CreateDustAt(s32, s32, u32);
void CreateDustSmall(Entity* parent);
Entity* CreateSpeechBubbleQuestionMark(Entity*, s32, s32);
Entity* CreateSpeechBubbleExclamationMark(Entity*, s32, s32);
Entity* CreateSpeechBubbleSleep(Entity*, s32, s32);
typedef enum {
GROUND_ITEM,
@@ -221,200 +226,200 @@ typedef enum {
OBJECT_C1,
} Object;
extern void ItemOnGround(Entity*);
extern void DeathFx(Entity*);
extern void ItemForSale(Entity*);
extern void Button(Entity*);
extern void MinishEmoticon(Entity*);
extern void Pot(Entity*);
extern void EzloCap(Entity*);
extern void BlockPushed(Entity*);
extern void LockedDoor(Entity*);
extern void Object9(Entity*);
extern void ObjectA(Entity*);
extern void ObjectB(Entity*);
extern void ChestSpawner(Entity*);
extern void ObjectD(Entity*);
extern void ObjectE(Entity*);
extern void SpecialFx(Entity*);
extern void Object10(Entity*);
extern void Object11(Entity*);
extern void Object12(Entity*);
extern void Railtrack(Entity*);
extern void LilypadLarge(Entity*);
extern void Object15(Entity*);
extern void FloatingPlatform(Entity*);
extern void Object17(Entity*);
extern void EvilSpirit(Entity*);
extern void HouseDoorExterior(Entity*);
extern void Object1A(Entity*);
extern void GreatFairy(Entity*);
extern void Object1C(Entity*);
extern void Object1D(Entity*);
extern void Object1E(Entity*);
extern void Object1F(Entity*);
extern void Object20(Entity*);
extern void Object21(Entity*);
extern void FigurineDevice(Entity*);
extern void EyeSwitch(Entity*);
extern void PressurePlate(Entity*);
extern void BigBarrel(Entity*);
extern void BarrelInside(Entity*);
extern void PushableStatue(Entity*);
extern void Object28(Entity*);
extern void AmbientClouds(Entity*);
extern void Object2A(Entity*);
extern void Object2B(Entity*);
extern void Beanstalk(Entity*);
extern void Smoke(Entity*);
extern void PushableRock(Entity*);
extern void HittableLever(Entity*);
extern void Object30(Entity*);
extern void FrozenFlower(Entity*);
extern void PullableMushroom(Entity*);
extern void Bollard(Entity*);
extern void WarpPoint(Entity*);
extern void Object35(Entity*);
extern void Object36(Entity*);
extern void Object37(Entity*);
extern void JarPortal(Entity*);
extern void BossDoor(Entity*);
extern void Object3A(Entity*);
extern void MacroMushromStalks(Entity*);
extern void MacroPlayer(Entity*);
extern void Object3D(Entity*);
extern void Object3E(Entity*);
extern void GiantLeaf(Entity*);
extern void Fairy(Entity*);
extern void LadderUp(Entity*);
extern void Object42(Entity*);
extern void Object43(Entity*);
extern void Object44(Entity*);
extern void Object45(Entity*);
extern void GiantBookLadder(Entity*);
extern void HeartContainer(Entity*);
extern void FileScreenObjects(Entity*);
extern void Object49(Entity*);
extern void BackgroundCloud(Entity*);
extern void Object4B(Entity*);
extern void PushableFurniture(Entity*);
extern void Furniture(Entity*);
extern void MinishSizedEntrance(Entity*);
extern void Archway(Entity*);
extern void GiantRock(Entity*);
extern void GiantRock2(Entity*);
extern void Object52(Entity*);
extern void Object53(Entity*);
extern void PullableLever(Entity*);
extern void Minecart(Entity*);
extern void ThoughtBubble(Entity*);
extern void HiddenLadderDown(Entity*);
extern void GentariCurtain(Entity*);
extern void LavaPlatform(Entity*);
extern void Paper(Entity*);
extern void Object5B(Entity*);
extern void Mask(Entity*);
extern void HouseDoorInterior(Entity*);
extern void Whirlwind(Entity*);
extern void ObjectBlockingStairs(Entity*);
extern void SwordsmanNewsletter(Entity*);
extern void Object61(Entity*);
extern void GiantTwig(Entity*);
extern void Object63(Entity*);
extern void Object64(Entity*);
extern void LadderHoleInBookshelf(Entity*);
extern void Object66(Entity*);
extern void Object67(Entity*);
extern void Object68(Entity*);
extern void Object69(Entity*);
extern void Object6A(Entity*);
extern void CrenalBeanSprout(Entity*);
extern void MinecartDoor(Entity*);
extern void ObjectOnPillar(Entity*);
extern void MineralWaterSource(Entity*);
extern void MinishSizedArchway(Entity*);
extern void Object70(Entity*);
extern void PushableGrave(Entity*);
extern void StoneTablet(Entity*);
extern void LilypadSmall(Entity*);
extern void Object74(Entity*);
extern void Object75(Entity*);
extern void Object76(Entity*);
extern void Bell(Entity*);
extern void MacroDecoration(Entity*);
extern void Object79(Entity*);
extern void Steam(Entity*);
extern void PushableLever(Entity*);
extern void MacroShoes(Entity*);
extern void ObjectOnSpinyBeetle(Entity*);
extern void Object7E(Entity*);
extern void PicoBloom(Entity*);
extern void Board(Entity*);
extern void Object81(Entity*);
extern void BigVortex(Entity*);
extern void BigPushableLever(Entity*);
extern void SmallIceBlock(Entity*);
extern void BigIceBlock(Entity*);
extern void Object86(Entity*);
extern void OctorokBossObject(Entity*);
extern void MacroBook(Entity*);
extern void MazaalBossObject(Entity*);
extern void CabinFurniture(Entity*);
extern void DoubleBookshelf(Entity*);
extern void Book(Entity*);
extern void Fireplace(Entity*);
extern void Object8E(Entity*);
extern void FrozenWaterElement(Entity*);
extern void Object90(Entity*);
extern void Object91(Entity*);
extern void BakerOven(Entity*);
extern void Lamp(Entity*);
extern void WindTribeFlag(Entity*);
extern void Bird(Entity*);
extern void Object96(Entity*);
extern void Object97(Entity*);
extern void Object98(Entity*);
extern void Object99(Entity*);
extern void MacroAcorn(Entity*);
extern void Object9B(Entity*);
extern void TreeHidingPortal(Entity*);
extern void LightableSwitch(Entity*);
extern void TreeThorns(Entity*);
extern void Fan(Entity*);
extern void AngryStatue(Entity*);
extern void PalaceArchway(Entity*);
extern void ObjectA2(Entity*);
extern void Cloud(Entity*);
extern void MinishLight(Entity*);
extern void FireballChain(Entity*);
extern void ObjectA6(Entity*);
extern void ObjectA7(Entity*);
extern void ObjectA8(Entity*);
extern void ObjectA9(Entity*);
extern void WaterfallOpening(Entity*);
extern void ObjectAB(Entity*);
extern void FourElements(Entity*);
extern void ObjectAD(Entity*);
extern void FloatingBlock(Entity*);
extern void ObjectAF(Entity*);
extern void MetalDoor(Entity*);
extern void JailBars(Entity*);
extern void ObjectB2(Entity*);
extern void ObjectB3(Entity*);
extern void ObjectB4(Entity*);
extern void ObjectB5(Entity*);
extern void ObjectB6(Entity*);
extern void Well(Entity*);
extern void WindTribeTeleporter(Entity*);
extern void ObjectB9(Entity*);
extern void GyorgBossObject(Entity*);
extern void Windcrest(Entity*);
extern void LitArea(Entity*);
extern void ObjectBD(Entity*);
extern void Pinwheel(Entity*);
extern void ObjectBF(Entity*);
extern void EnemyItem(Entity*);
extern void ObjectC1(Entity*);
void ItemOnGround(Entity*);
void DeathFx(Entity*);
void ItemForSale(Entity*);
void Button(Entity*);
void MinishEmoticon(Entity*);
void Pot(Entity*);
void EzloCap(Entity*);
void BlockPushed(Entity*);
void LockedDoor(Entity*);
void Object9(Entity*);
void ObjectA(Entity*);
void ObjectB(Entity*);
void ChestSpawner(Entity*);
void ObjectD(Entity*);
void ObjectE(Entity*);
void SpecialFx(Entity*);
void Object10(Entity*);
void Object11(Entity*);
void Object12(Entity*);
void Railtrack(Entity*);
void LilypadLarge(Entity*);
void Object15(Entity*);
void FloatingPlatform(Entity*);
void Object17(Entity*);
void EvilSpirit(Entity*);
void HouseDoorExterior(Entity*);
void Object1A(Entity*);
void GreatFairy(Entity*);
void Object1C(Entity*);
void Object1D(Entity*);
void Object1E(Entity*);
void Object1F(Entity*);
void Object20(Entity*);
void Object21(Entity*);
void FigurineDevice(Entity*);
void EyeSwitch(Entity*);
void PressurePlate(Entity*);
void BigBarrel(Entity*);
void BarrelInside(Entity*);
void PushableStatue(Entity*);
void Object28(Entity*);
void AmbientClouds(Entity*);
void Object2A(Entity*);
void Object2B(Entity*);
void Beanstalk(Entity*);
void Smoke(Entity*);
void PushableRock(Entity*);
void HittableLever(Entity*);
void Object30(Entity*);
void FrozenFlower(Entity*);
void PullableMushroom(Entity*);
void Bollard(Entity*);
void WarpPoint(Entity*);
void Object35(Entity*);
void Object36(Entity*);
void Object37(Entity*);
void JarPortal(Entity*);
void BossDoor(Entity*);
void Object3A(Entity*);
void MacroMushromStalks(Entity*);
void MacroPlayer(Entity*);
void Object3D(Entity*);
void Object3E(Entity*);
void GiantLeaf(Entity*);
void Fairy(Entity*);
void LadderUp(Entity*);
void Object42(Entity*);
void Object43(Entity*);
void Object44(Entity*);
void Object45(Entity*);
void GiantBookLadder(Entity*);
void HeartContainer(Entity*);
void FileScreenObjects(Entity*);
void Object49(Entity*);
void BackgroundCloud(Entity*);
void Object4B(Entity*);
void PushableFurniture(Entity*);
void Furniture(Entity*);
void MinishSizedEntrance(Entity*);
void Archway(Entity*);
void GiantRock(Entity*);
void GiantRock2(Entity*);
void Object52(Entity*);
void Object53(Entity*);
void PullableLever(Entity*);
void Minecart(Entity*);
void ThoughtBubble(Entity*);
void HiddenLadderDown(Entity*);
void GentariCurtain(Entity*);
void LavaPlatform(Entity*);
void Paper(Entity*);
void Object5B(Entity*);
void Mask(Entity*);
void HouseDoorInterior(Entity*);
void Whirlwind(Entity*);
void ObjectBlockingStairs(Entity*);
void SwordsmanNewsletter(Entity*);
void Object61(Entity*);
void GiantTwig(Entity*);
void Object63(Entity*);
void Object64(Entity*);
void LadderHoleInBookshelf(Entity*);
void Object66(Entity*);
void Object67(Entity*);
void Object68(Entity*);
void Object69(Entity*);
void Object6A(Entity*);
void CrenalBeanSprout(Entity*);
void MinecartDoor(Entity*);
void ObjectOnPillar(Entity*);
void MineralWaterSource(Entity*);
void MinishSizedArchway(Entity*);
void Object70(Entity*);
void PushableGrave(Entity*);
void StoneTablet(Entity*);
void LilypadSmall(Entity*);
void Object74(Entity*);
void Object75(Entity*);
void Object76(Entity*);
void Bell(Entity*);
void MacroDecoration(Entity*);
void Object79(Entity*);
void Steam(Entity*);
void PushableLever(Entity*);
void MacroShoes(Entity*);
void ObjectOnSpinyBeetle(Entity*);
void Object7E(Entity*);
void PicoBloom(Entity*);
void Board(Entity*);
void Object81(Entity*);
void BigVortex(Entity*);
void BigPushableLever(Entity*);
void SmallIceBlock(Entity*);
void BigIceBlock(Entity*);
void Object86(Entity*);
void OctorokBossObject(Entity*);
void MacroBook(Entity*);
void MazaalBossObject(Entity*);
void CabinFurniture(Entity*);
void DoubleBookshelf(Entity*);
void Book(Entity*);
void Fireplace(Entity*);
void Object8E(Entity*);
void FrozenWaterElement(Entity*);
void Object90(Entity*);
void Object91(Entity*);
void BakerOven(Entity*);
void Lamp(Entity*);
void WindTribeFlag(Entity*);
void Bird(Entity*);
void Object96(Entity*);
void Object97(Entity*);
void Object98(Entity*);
void Object99(Entity*);
void MacroAcorn(Entity*);
void Object9B(Entity*);
void TreeHidingPortal(Entity*);
void LightableSwitch(Entity*);
void TreeThorns(Entity*);
void Fan(Entity*);
void AngryStatue(Entity*);
void PalaceArchway(Entity*);
void ObjectA2(Entity*);
void Cloud(Entity*);
void MinishLight(Entity*);
void FireballChain(Entity*);
void ObjectA6(Entity*);
void ObjectA7(Entity*);
void ObjectA8(Entity*);
void ObjectA9(Entity*);
void WaterfallOpening(Entity*);
void ObjectAB(Entity*);
void FourElements(Entity*);
void ObjectAD(Entity*);
void FloatingBlock(Entity*);
void ObjectAF(Entity*);
void MetalDoor(Entity*);
void JailBars(Entity*);
void ObjectB2(Entity*);
void ObjectB3(Entity*);
void ObjectB4(Entity*);
void ObjectB5(Entity*);
void ObjectB6(Entity*);
void Well(Entity*);
void WindTribeTeleporter(Entity*);
void ObjectB9(Entity*);
void GyorgBossObject(Entity*);
void Windcrest(Entity*);
void LitArea(Entity*);
void ObjectBD(Entity*);
void Pinwheel(Entity*);
void ObjectBF(Entity*);
void EnemyItem(Entity*);
void ObjectC1(Entity*);
extern void (*const gObjectFunctions[194])(Entity*);
-63
View File
@@ -1,63 +0,0 @@
#ifndef OVERWORLD_H
#define OVERWORLD_H
#include "global.h"
#include "area.h"
void ChangeLightLevel(s32);
void SetPopupState(u32 type, u32 choice_idx);
bool32 CheckIsOverworld(void);
bool32 sub_08052638(u32 r0);
#ifndef EU
u32 sub_08052654(void);
#endif
u32 CheckIsDungeon(void);
u32 CheckIsInteriorWithEnemies(void);
u32 CheckIsInteriorNoEnemies(void);
u32 CheckHasMap(void);
s32 ModHealth(s32 deltaHealth);
void ModRupees(s32 rupeeDelta);
void sub_080526F8(s32 a1);
u32 sub_08052724(void);
u32 HasDungeonMap(void);
u32 HasDungeonCompass(void);
u32 HasDungeonBigKey(void);
u32 HasDungeonSmallKey(void);
void sub_080527FC(u32 a1, u32 a2);
#ifndef EU
void sub_08052878(void);
#endif
void RoomExitCallback(void);
void InitParachuteRoom(void);
u32 sub_08052B24(void);
void DisplayEzloMessage(void);
void sub_08052CA4(u32 area, u32 room, u32 x, u32 y);
void sub_08052CD0(u32 area, u32 room, u32 x, u32 y);
void sub_08052CFC(void);
/**
* @brief Get bank offset for area
*/
u32 GetFlagBankOffset(u32 idx);
RoomResInfo* GetCurrentRoomInfo(void);
void sub_08052EA0(void);
void sub_08052FD8(u32 room, u32 area);
void UpdateGlobalProgress(void);
void sub_08053250(void);
void sub_08053320(void);
void sub_080533CC(void);
void sub_08053494(void);
void sub_080534AC(void);
void sub_08053500(void);
u32 GetBottleContaining(u32);
#endif // OVERWORLD_H
+63 -27
View File
@@ -34,7 +34,7 @@ enum PlayerActions {
PLAYER_INHOLE,
PLAYER_08072C9C,
PLAYER_08074C44,
PLAYER_08072F34,
PLAYER_CLIMB,
PLAYER_USEENTRANCE,
PLAYER_PARACHUTE,
};
@@ -95,16 +95,30 @@ typedef enum {
} PlayerControlMode;
enum PlayerFlags {
PL_BUSY = (1 << 0),
PL_DROWNING = (1 << 2),
PL_NO_CAP = (1 << 3),
PL_USE_PORTAL = (1 << 5),
PL_MINISH = (1 << 7),
PL_BURNING = (1 << 10),
PL_ROLLING = (1 << 18),
PL_IN_HOLE = (1 << 20),
PL_USE_LANTERN = (1 << 23),
PL_USE_OCARINA = (1 << 28),
PL_BUSY = 0x1,
PL_DROWNING = 0x4,
PL_NO_CAP = 0x8,
PL_CAPTURED = 0x10,
PL_USE_PORTAL = 0x20,
PL_HIDDEN = 0x40,
PL_MINISH = 0x80,
PL_DISABLE_ITEMS = 0x100,
PL_FALLING = 0x200,
PL_BURNING = 0x400,
PL_FROZEN = 0x800,
PL_IN_MINECART = 0x1000,
PL_DRUGGED = 0x4000,
PL_ROLLING = 0x40000,
PL_MOLDWORM_CAPTURED = 0x80000,
PL_IN_HOLE = 0x100000,
PL_MOLDWORM_RELEASED = 0x200000,
PL_CLONING = 0x400000,
PL_USE_LANTERN = 0x800000,
PL_PARACHUTE = 0x1000000,
PL_ENTER_MINECART = 0x4000000,
PL_SWORD_THRUST = 0x8000000,
PL_USE_OCARINA = 0x10000000,
PL_CLIMBING = 0x20000000,
};
enum SurfaceType {
@@ -125,7 +139,7 @@ enum SurfaceType {
SURFACE_E,
SURFACE_F,
SURFACE_10,
SURFACE_11,
SURFACE_SWAMP,
SURFACE_DOOR,
SURFACE_DOOR_13,
SURFACE_14,
@@ -137,9 +151,9 @@ enum SurfaceType {
SURFACE_BUTTON,
SURFACE_1B,
SURFACE_1C,
SURFACE_1D,
SURFACE_1D, // nulled
SURFACE_LADDER,
SURFACE_1F,
SURFACE_1F, // nulled
SURFACE_20,
SURFACE_21,
SURFACE_22,
@@ -157,7 +171,7 @@ enum SurfaceType {
typedef struct {
/*0x00*/ u8 field_0x0[2];
/*0x02*/ u8 jumpStatus;
/*0x02*/ u8 jump_status;
/*0x03*/ u8 field_0x3[2];
/*0x05*/ u8 heldObject;
/*0x06*/ u8 pushedObject;
@@ -165,7 +179,7 @@ typedef struct {
/*0x08*/ u16 animation;
/*0x0a*/ u8 field_0xa;
/*0x0b*/ u8 keepFacing;
/*0x0c*/ u8 playerAction;
/*0x0c*/ u8 queued_action;
/*0x0d*/ u8 field_0xd;
/*0x0e*/ u8 field_0xe;
/*0x0f*/ u8 hurtBlinkSpeed;
@@ -177,18 +191,20 @@ typedef struct {
/*0x15*/ u8 field_0x15;
/*0x16*/ u16 startPosX;
/*0x18*/ u16 startPosY;
/*0x1a*/ u8 field_0x1a[2];
/*0x1a*/ u8 mobility;
/*0x1b*/ u8 sword_state;
/*0x1c*/ u8 field_0x1c;
/*0x1d*/ u8 field_0x1d;
/*0x1e*/ u8 dash_state;
/*0x1f*/ u8 field_0x1f[3];
/*0x22*/ u16 field_0x22[2];
/*0x26*/ u8 swimState;
/*0x26*/ u8 swim_state;
/*0x27*/ u8 field_0x27[5];
/*0x2c*/ Entity* item;
/*0x30*/ u32 flags;
/*0x34*/ u8 field_0x34[2];
/*0x36*/ s16 field_0x36;
/*0x36*/ u8 field_0x36;
/*0x37*/ u8 field_0x37;
/*0x38*/ u8 field_0x38;
/*0x39*/ u8 field_0x39;
/*0x3a*/ u8 field_0x3a;
@@ -198,13 +214,14 @@ typedef struct {
/* */ u8 swordBlueParticle : 1;
/* */ u8 filler14 : 6;
/*0x3f*/ u8 field_0x3f;
/*0x40*/ u8 hurtType[64];
/*0x80*/ u16 field_0x80;
/*0x40*/ u8 path_memory[64];
/*0x80*/ u16 speed_modifier;
/*0x82*/ u8 field_0x82[9];
/*0x8b*/ u8 controlMode;
/*0x8c*/ u16 vel_x;
/*0x8e*/ u16 vel_y;
/*0x90*/ union SplitWord field_0x90;
/*0x90*/ u16 field_0x90;
/*0x92*/ u16 field_0x92;
/*0x94*/ u32 field_0x94;
/*0x98*/ u16 field_0x98;
/*0x9a*/ u16 field_0x9a;
@@ -261,14 +278,33 @@ extern u8 gQuiverSizes[];
extern u16 gWalletSizes[];
extern PlayerState gPlayerState;
extern Stats gStats;
extern Entity gPlayerEntity;
extern u32 GetInventoryValue(u32);
extern s32 ModHealth(s32);
extern void ModRupees(s32);
u32 CheckPlayerInactive(void);
void SetPlayerControl(PlayerControlMode mode);
void ResetPlayer(void);
void ResetPlayerVelocity(void);
void ResetPlayerAnimationAndAction(void);
void SetPlayerActionNormal(void);
void RespawnAsMinish(void);
extern void SetPlayerControl(PlayerControlMode);
Entity* CreatePlayerItem(u32, u32, u32, u32);
void ResolvePlayerAnimation(void);
void RegisterPlayerHitbox(void);
void UpdateFloorType(void);
void CreateEzloHint(u32, u32);
u32 IsItemEquipped(u32);
u32 GetInventoryValue(u32);
s32 ModHealth(s32 delta);
void ModRupees(s32 delta);
void DeleteClones(void);
void sub_08077728();
extern void sub_08077B20();
extern u32 sub_08008B22();
extern u32* sub_08008790(Entity*, u32);
#define COPY_FLAG_FROM_TO(base, src, dest) (base) = ((base) & ~(dest)) | (((dest) * ((base) & (src))) / src)
+40
View File
@@ -1,6 +1,46 @@
#ifndef PROJECTILE_H
#define PROJECTILE_H
extern Entity* CreateProjectile(u32);
void DarkNutSwordSlash(Entity*);
void RockProjectile(Entity*);
void BoneProjectile(Entity*);
void MoblinSpear(Entity*);
void DekuSeedProjectile(Entity*);
void Projectile5(Entity*);
void DirtBallProjectile(Entity*);
void WindProjectile(Entity*);
void FireProjectile(Entity*);
void IceProjectile(Entity*);
void GleerokProjectile(Entity*);
void KeatonDagger(Entity*);
void GuardLineOfSight(Entity*);
void ArrowProjectile(Entity*);
void MazaalEnergyBeam(Entity*);
void OctorokBossProjectile(Entity*);
void StalfosProjectile(Entity*);
void LakituCloudProjectile(Entity*);
void LakituLightning(Entity*);
void MandiblesProjectile(Entity*);
void RemovableDust(Entity*);
void SpiderWeb(Entity*);
void TorchTrapProjectile(Entity*);
void GuruguruBarProjectile(Entity*);
void V1DarkMagicProjectile(Entity*);
void BallAndChain(Entity*);
void V1FireProjectile(Entity*);
void CannonballProjectile(Entity*);
void V1EyeLaser(Entity*);
void Winder(Entity*);
void SpikedRollers(Entity*);
void V2Projectile(Entity*);
void V3HandProjectile(Entity*);
void V3ElectricProjectile(Entity*);
void GyorgTail(Entity*);
void GyorgMaleEnergyProjectile(Entity*);
void V3TennisBallProjectile(Entity*);
typedef enum {
/*00*/ DARK_NUT_SWORD_SLASH,
/*01*/ ROCK_PROJECTILE,
+130 -93
View File
@@ -4,13 +4,6 @@
#include "global.h"
#include "entity.h"
/*
typedef struct {
u8 areaID;
u8 roomID;
} RoomID;
*/
enum RoomTransition {
TRANSITION_DEFAULT,
TRANSITION_CUT,
@@ -24,58 +17,66 @@ enum RoomTransition {
TRANSITION_CUT_FAST,
};
enum RoomReloadType {
RELOAD_ALL = 1,
RELOAD_ENTITIES = 2,
};
typedef struct {
/*0x00*/ u16 unk2;
/*0x00*/ u16 reload_flags;
/*0x02*/ u8 unk3;
/*0x03*/ u8 unk4;
/*0x04*/ u8 areaID;
/*0x05*/ u8 roomID;
/*0x06*/ u16 roomOriginX;
/*0x08*/ u16 roomOriginY;
/*0x0A*/ s16 roomScrollX;
/*0x0C*/ s16 roomScrollY;
/*0x04*/ u8 area;
/*0x05*/ u8 room;
/*0x06*/ u16 origin_x;
/*0x08*/ u16 origin_y;
/*0x0A*/ s16 scroll_x;
/*0x0C*/ s16 scroll_y;
/*0x0E*/ u8 unk5;
/*0x0F*/ u8 unk6;
/*0x10*/ u8 unk_10;
/*0x0F*/ u8 scroll_flags; // 0x2 = ??, 0x4 = camera scrolling
/*0x10*/ u8 scroll_direction;
/*0x11*/ s8 oam_offset_x;
/*0x12*/ s8 oam_offset_y;
/*0x13*/ u8 unk13;
/*0x14*/ u8 screenShakeMagnitude;
/*0x14*/ u8 shake_magnitude;
/*0x15*/ u8 unk7;
/*0x16*/ u16 screenShakeTime;
/*0x16*/ u16 shake_duration;
/*0x18*/ u16 filler2[3];
/*0x1E*/ u16 width;
/*0x20*/ u16 height;
/*0x22*/ u8 filler3[6];
/*0x22*/ u8 filler3[2];
/*0x24*/ s8 aff_x;
/*0x25*/ s8 aff_y;
/*0x26*/ u8 filler26[2];
/*0x28*/ union SplitWord bg3OffsetX;
/*0x2C*/ union SplitWord bg3OffsetY;
/*0x30*/ Entity* cameraTarget;
/*0x30*/ Entity* camera_target;
} RoomControls;
extern RoomControls gRoomControls;
typedef struct {
u8 field_0x0;
u8 filler_0x1;
u8 field_0x2;
u8 field_0x3;
u8 field_0x4;
u8 filler1[1];
u8 shopItemType;
u8 shopItemType2;
u8 field_0x8;
u8 field_0x9;
u8 unk2;
u8 filler2;
s16 lightLevel;
u8 filler3[2];
u8 unk_10[4];
u32 roomFlags;
u32 unk3;
u8 filler4[48];
u8 filler5[28];
u32 animFlags;
void* field_0x6c[8];
void* field_0x8c[16];
/* 0x00 */ u8 field_0x0;
/* 0x01 */ u8 filler_0x1;
/* 0x02 */ u8 field_0x2;
/* 0x03 */ u8 field_0x3;
/* 0x04 */ u8 field_0x4;
/* 0x05 */ u8 filler1[1];
/* 0x06 */ u8 shopItemType;
/* 0x07 */ u8 shopItemType2;
/* 0x08 */ u8 field_0x8;
/* 0x09 */ u8 field_0x9;
/* 0x0a */ u8 unk2;
/* 0x0b */ u8 filler2;
/* 0x0c */ s16 lightLevel;
/* 0x0e */ u8 filler3[2];
/* 0x10 */ u8 unk_10[4];
/* 0x14 */ u32 flags;
/* 0x18 */ u32 unk3;
/* 0x1c */ u8 filler4[48];
/* 0x4c */ u8 filler5[28];
/* 0x68 */ u32 animFlags;
/* 0x6c */ void* field_0x6c[8];
/* 0x8c */ void* field_0x8c[16];
} RoomVars;
static_assert(sizeof(RoomVars) == 0xCC);
extern RoomVars gRoomVars;
@@ -92,57 +93,86 @@ typedef struct {
u32 spritePtr;
} EntityData;
// Status of the player's positioning within the scene.
typedef struct {
u8 area_next;
u8 room_next;
u8 start_anim;
u8 spawn_type;
Coords start_pos;
u8 layer;
u8 field_0x15;
u8 field_0x16;
u8 field_0x17;
s16 field_0x18;
s16 field_0x1a;
s16 field_0x1c;
s16 field_0x1e;
s16 field_0x20;
s16 field_0x22;
u8 field_0x24[0x8];
} PlayerWorldStatus;
static_assert(sizeof(PlayerWorldStatus) == 0x20);
u16 field_0x0;
u16 field_0x2;
u8 field_0x4;
u8 field_0x5;
u8 field_0x6;
u8 field_0x7;
} struct_030010EC;
typedef struct {
s32 frameCount; // regular frame count? does anything reset it?
u8 field_0x4[0x2];
u16 field_0x6;
bool8 transitioningOut;
u8 transitionType; // transition when changing areas
u16 stairs_idx; // seems to be a tile type
PlayerWorldStatus player_status;
u8 field_0x2c[0x9];
u8 hint_height;
u16 hint_idx;
u8 field_0x38;
u8 field_0x39;
u8 field_0x3a;
u8 field_0x3b;
u8 field_0x3c;
u8 field_0x3d;
u16 field_0x3e;
u16 hurtType;
u16 field_0x42;
u16 field_0x44;
u16 field_0x46;
u16 field_0x48;
u16 field_0x4a;
u8 minecart_data[0x20];
u8 field_0x6c[0x40];
u16 data[32];
u16 field_0xac;
u16 field_0xae;
} ScreenTransition;
extern ScreenTransition gScreenTransition;
} struct_0300110C;
// Status of the player's positioning within the scene.
typedef struct {
/* 0x00 */ u8 area_next;
/* 0x01 */ u8 room_next;
/* 0x02 */ u8 start_anim;
/* 0x03 */ u8 spawn_type;
/* 0x04 */ s16 start_pos_x;
/* 0x06 */ s16 start_pos_y;
/* 0x08 */ u8 layer;
/* 0x09 */ u8 field_0x15;
/* 0x0a */ u8 dungeon_area;
/* 0x0b */ u8 dungeon_room;
/* 0x0c */ s16 dungeon_x;
/* 0x0e */ s16 dungeon_y;
/* 0x10 */ u16 dungeon_map_x;
/* 0x12 */ u16 dungeon_map_y;
/* 0x14 */ s16 overworld_map_x;
/* 0x16 */ s16 overworld_map_y;
/* 0x18 */ u8 field_0x24[0x8];
} PlayerRoomStatus;
static_assert(sizeof(PlayerRoomStatus) == 0x20);
typedef struct {
/* 0x00 */ s32 frameCount; // regular frame count? does anything reset it?
/* 0x04 */ u8 field_0x4[0x2];
/* 0x06 */ u16 field_0x6;
/* 0x08 */ bool8 transitioningOut;
/* 0x09 */ u8 type; // transition when changing areas
/* 0x0a */ u16 stairs_idx; // seems to be a tile type
/* 0x0c */ PlayerRoomStatus player_status;
/* 0x2c */ u8 field_0x2c[0x9];
/* 0x35 */ u8 hint_height;
/* 0x36 */ u16 hint_idx;
/* 0x38 */ u8 field_0x38;
/* 0x39 */ u8 field_0x39;
/* 0x3a */ u8 field_0x3a;
/* 0x3b */ u8 field_0x3b;
/* 0x3c */ u8 field_0x3c;
/* 0x3d */ u8 field_0x3d;
/* 0x3e */ u16 field_0x3e;
/* 0x40 */ u16 hurtType;
/* 0x42 */ u16 field_0x42;
/* 0x44 */ u16 field_0x44;
/* 0x46 */ u16 field_0x46;
/* 0x48 */ u16 field_0x48;
/* 0x4a */ u16 field_0x4a;
/* 0x4c */ struct_030010EC minecart_data[4];
/* 0x6c */ struct_0300110C armos_data;
} RoomTransition;
static_assert(sizeof(RoomTransition) == 0xB0);
extern RoomTransition gRoomTransition;
typedef struct {
u16 type;
u8 field_0x2[4];
s16 playerXPos;
s16 playerYPos;
u8 field_0xa;
u8 area;
u8 room;
u8 playerLayer;
u8 field_0xe;
u8 playerState;
u16 transitionSFX;
} ScreenTransitionData;
typedef struct {
u8 type;
@@ -169,15 +199,22 @@ typedef enum {
DESTRUCTIBLE_TILE,
GRASS_DROP_CHANGER,
LOCATION_CHANGER,
TILE_ENTITY_D
TILE_ENTITY_D,
} TileEntityType;
extern void SetTileType(u32, u32, u32);
extern void sub_08080964(u32 time, u32 magnitude); // shake screen
void SetTileType(u32, u32, u32);
void InitScreenShake(u32 time, u32 magnitude);
extern void* GetCurrentRoomProperty(u32);
extern void LoadRoomTileEntities();
void CallRoomProp5And7(void);
void LoadRoom(void);
void SetCurrentRoomPropertyList(u32 area, u32 room);
void* GetCurrentRoomProperty(u32);
void LoadRoomTileEntities();
void LoadRoomEntityList(EntityData* listPtr);
void sub_0804B3C4(void*);
void sub_0804B0B0(u32 arg0, u32 arg1);
void DoExitTransition(const ScreenTransitionData* data);
#endif
+79 -17
View File
@@ -20,47 +20,109 @@ typedef enum {
SAVE_DONE,
} SaveState;
extern SaveResult HandleSave(u32 arg0);
/**
* Attempt to save the game.
*
* @param idx The save slot.
* @return #SaveResult result.
*/
extern SaveResult HandleSave(u32 idx);
/**
* Contains all information about a save file.
* The contents of this structure are read from and written to EEPROM.
*/
typedef struct {
/*0x000*/ u8 unk_00;
/*0x000*/ u8 unk_01;
/*0x002*/ u8 messageSpeed;
/*0x003*/ u8 brightnessPref;
/*0x000*/ u8 invalid; /**< File is invalid. */
/*0x000*/ u8 initialized; /**< File is initialized. */
/*0x002*/ u8 msg_speed; /**< Message speed. */
/*0x003*/ u8 brightness; /**< Brightness. */
/*0x004*/ u8 filler4[0x2];
/*0x006*/ u8 unk6;
/*0x007*/ u8 unk7;
/*0x008*/ u8 global_progress;
/*0x008*/ u8 global_progress; /**< @see UpdateGlobalProgress */
/*0x009*/ u8 field_0x9[0x34];
/*0x040*/ u32 windcrests;
/*0x040*/ u32 windcrests; /**< Windcrest flags. */
/*0x044*/ u8 filler44[0xC];
/*0x050*/ u32 unk50;
/*0x054*/ u8 filler54[0xC];
/*0x060*/ u32 areaVisitFlags[8];
/*0x080*/ u8 playerName[FILENAME_LENGTH];
/*0x060*/ u32 areaVisitFlags[8]; /**< Area visit flags. */
/*0x080*/ char name[FILENAME_LENGTH]; /**< Save file name. */
/*0x086*/ u8 filler86[0x2];
/*0x088*/ PlayerWorldStatus saved_status;
/*0x0A8*/ Stats stats;
/*0x0D0*/ u8 fillerD0[0x71];
/*0x141*/ u8 unk141[0x1c1 - 0x141];
/*0x1C1*/ u8 unk1C1[0x45c - 0x1c1];
/*0x088*/ PlayerRoomStatus saved_status; /**< Player room status. */
/*0x0A8*/ Stats stats; /**< Player stats. */
/*0x0D0*/ u8 fillerD0[0x48];
/*0x118*/ u8 unk118[0x13];
/*0x12B*/ u8 unk12B[0x16];
/*0x141*/ u8 unk141[128];
/*0x1C1*/ u8 unk1C1[128];
/*0x241*/ u8 unk241[13];
/*0x24E*/ u8 unk24E[14];
/*0x25C*/ u8 flags[0x200]; /**< Flags. */
/*0x45C*/ u8 unk45C[0x10];
/*0x46C*/ u8 unk46C[0x20];
/*0x48C*/ u32 unk48C[8];
/*0x48C*/ u32 timers[7];
/*0x4A8*/ u32 demo_timer; /**< Demo timer. */
/*0x4AC*/ u8 filler4ac[0x8];
} SaveFile;
/**
* The current save file.
*/
extern SaveFile gSave;
/**
* Initialize the save system.
*
* @return Success
*/
u32 InitSaveData(void);
u32 Write_02000000(struct_02000000*);
/**
* Read save header.
*
* @return Success.
*/
u32 Read_02000000(SaveHeader*);
/**
* Write save header.
*
* @return Success.
*/
u32 Write_02000000(SaveHeader*);
/**
* Read save file.
*
* @return Success.
*/
s32 ReadSaveFile(u32, SaveFile*);
u32 Read_02000000(struct_02000000*);
/**
* Mark a save file as deleted.
*
* @param index The save file index.
*/
void SetFileStatusDeleted(u32 index);
extern const char gUnk_0811E470[];
/**
* Update the global progress (0 - 10).
* There are 10 different indicators of game completion:
9 : Flag SEIIKI_STAINED_GLASS
8 : Flag LV5_CLEAR
7 : Flag OUBO_KAKERA
6 : Flag LV4_CLEAR
5 : Flag LV3_CLEAR
4 : Flag SOUGEN_08_TORITSUKI
2 : Flag LV1_CLEAR
1 : Default
}
*/
void UpdateGlobalProgress(void);
#ifdef DEMO_USA
extern const u8* const demoPointers[];
extern const u8 demoUnknown1[];
+23 -24
View File
@@ -5,10 +5,10 @@
#include "fade.h"
typedef struct {
u16 displayControl;
u8 filler2[0x2];
u16 unk4;
u16 displayControlMask;
/*0x00*/ u16 displayControl;
/*0x02*/ u8 filler2[0x2];
/*0x04*/ u16 unk4;
/*0x06*/ u16 displayControlMask;
} LcdControls;
typedef struct {
@@ -28,22 +28,19 @@ typedef struct {
} BgAffSettings;
typedef struct {
u16 bg2dx;
u16 bg2dmx;
u16 bg2dy;
u16 bg2dmy;
u16 bg2xPointLeastSig;
u16 bg2xPointMostSig;
u16 bg2yPointLeastSig;
u16 bg2yPointMostSig;
u16 bg3dx;
u16 bg3dmx;
u16 bg3dy;
u16 bg3dmy;
u16 bg3xPointLeastSig;
u16 bg3xPointMostSig;
u16 bg3yPointLeastSig;
u16 bg3yPointMostSig;
u16 dx;
u16 dmx;
u16 dy;
u16 dmy;
u16 xPointLeastSig;
u16 xPointMostSig;
u16 yPointLeastSig;
u16 yPointMostSig;
} BgTransformationSettings;
typedef struct {
BgTransformationSettings bg2;
BgTransformationSettings bg3;
u16 window0HorizontalDimensions;
u16 window1HorizontalDimensions;
u16 window0VerticalDimensions;
@@ -65,20 +62,22 @@ typedef struct {
/*0x38*/ BgControls controls;
/*0x6c*/ u8 _6c;
/*0x6d*/ u8 _6d;
/*0x70*/ u32 _70;
/*0x70*/ void* _70;
/*0x74*/ u32 _74;
/*0x78*/ u32 _78;
} Screen;
struct OAMCommand {
typedef struct {
u16 x;
u16 y;
u16 _4;
u16 _6;
u16 _8;
} extern gOamCmd;
} OAMCommand;
extern BgControls gBgControls;
extern Screen gScreen;
extern OAMCommand gOamCmd;
extern void sub_080ADA04(OAMCommand*, void*);
#endif
+18 -18
View File
@@ -4,28 +4,28 @@
#include "entity.h"
typedef struct ScriptExecutionContext {
u16* scriptInstructionPointer;
u32 intVariable;
u32 postScriptActions;
u8 unk_0C[0x4]; // unused
u16 wait;
u16 unk_12;
u32 condition;
u8 unk_18;
u8 unk_19;
u8 unk_1A;
u8 unk_1B; // unused
union SplitWord x;
union SplitWord y;
/*0x00*/ u16* scriptInstructionPointer;
/*0x03*/ u32 intVariable;
/*0x08*/ u32 postScriptActions;
/*0x0C*/ u8 unk_0C[0x4]; // unused
/*0x10*/ u16 wait;
/*0x12*/ u16 unk_12;
/*0x14*/ u32 condition;
/*0x18*/ u8 unk_18;
/*0x19*/ u8 unk_19;
/*0x1A*/ u8 unk_1A;
/*0x1B*/ u8 unk_1B; // unused
/*0x1C*/ union SplitWord x;
/*0x20*/ union SplitWord y;
} ScriptExecutionContext;
typedef struct {
// Sync flags are used to synchronize scripts running on different entities
u32 syncFlags;
u16 commandIndex;
u8 commandSize;
u8 flags;
u8 unk_08;
/*0x0*/ u32 syncFlags;
/*0x4*/ u16 commandIndex;
/*0x6*/ u8 commandSize;
/*0x7*/ u8 flags;
/*0x8*/ u8 unk_08;
} ActiveScriptInfo;
extern ActiveScriptInfo gActiveScriptInfo;
+3 -3
View File
@@ -1,5 +1,5 @@
#ifndef AUDIO_H
#define AUDIO_H
#ifndef SOUND_H
#define SOUND_H
#include "global.h"
@@ -597,4 +597,4 @@ typedef enum {
SONG_BGM_0 = 0x80110000,
} Sound;
#endif // AUDIO_H
#endif // SOUND_H
+30 -46
View File
@@ -8,15 +8,15 @@
typedef struct {
int signature;
u8 saveFileId;
u8 messageSpeed;
u8 brightnessPref;
u8 gameLanguage;
u8 msg_speed;
u8 brightness;
u8 language;
u8 name[6];
u8 _e;
u8 invalid;
u8 _f;
} struct_02000000;
#define gSaveHeader ((struct_02000000*)(0x2000000))
// extern struct_02000000 gSaveHeader;
} SaveHeader;
#define gSaveHeader ((SaveHeader*)(0x2000000))
// extern SaveHeader gSaveHeader;
typedef struct {
u8 unk_00;
@@ -38,39 +38,6 @@ static_assert(sizeof(struct_02000010) == 0x20);
extern struct_02000010 gUnk_02000010;
typedef struct {
u16 transitionType;
u8 field_0x2[4];
s16 playerXPos;
s16 playerYPos;
u8 field_0xa;
u8 areaID;
u8 roomID;
u8 playerLayer;
u8 field_0xe;
u8 playerState;
u16 transitionSFX;
} ScreenTransitionData;
typedef struct {
u8 active;
u8 field_0x1;
u8 field_0x2;
u8 field_0x3;
u32 mask;
u16 fadeType; // fade in or out, are there others?
u16 fadeSpeed; // subtracted from duration
u16 fadeDuration;
u16 field_0xe;
s16 field_0x10;
s16 field_0x12;
s16 field_0x14;
u16 field_0x16;
u16 field_0x18;
} FadeControl;
extern FadeControl gFadeControl;
typedef struct {
u8 unk0;
u8 unk1;
@@ -110,7 +77,7 @@ typedef struct {
u16 a;
u16 b;
} indices;
void (*func)(Entity*);
void (*func)(Entity* e);
} data;
} Dialog;
@@ -119,10 +86,7 @@ extern u16 gBG1Buffer[0x400];
extern u16 gBG2Buffer[0x400];
extern u16 gBG3Buffer[0x800];
struct {
u8 filler[0x70];
} extern gUnk_03000B80;
// TODO extern ItemBehavior gUnk_03000B80[4];
extern ItemBehavior gUnk_03000B80[4];
static_assert(sizeof(gUnk_03000B80) == 0x70);
typedef struct {
@@ -135,7 +99,6 @@ typedef struct {
} PriorityHandler;
extern PriorityHandler gPriorityHandler;
extern u8 gUnk_02022740[];
extern u8 gUnk_02034490[];
typedef struct {
@@ -148,4 +111,25 @@ typedef struct {
void* unk8;
} WStruct;
typedef struct {
u16 unk0;
u16 unk2;
u16 unk4;
u8 unk6;
u8 unk7;
} OAMObj;
typedef struct {
u8 field_0x0;
u8 field_0x1;
u8 spritesOffset;
u8 updated;
u16 _4;
u16 _6;
u8 _0[0x18];
struct OamData oam[0x80];
OAMObj unk[0xA0]; /* todo: affine */
} OAMControls;
extern OAMControls gOAMControls;
#endif
+16
View File
@@ -0,0 +1,16 @@
#ifndef SUBTASK_H
#define SUBTASK_H
#include "global.h"
// todo: separate headers for each subtask?
extern void sub_080A4528(void);
extern void sub_080A4398(void);
extern void sub_080A7114(u32);
extern void sub_080A3B74(void);
extern void sub_080A4054(void);
extern void sub_080A4D34(void);
extern u32 sub_080A4494(void);
#endif // SUBTASK_H
-75
View File
@@ -1,75 +0,0 @@
#ifndef UTILS_H
#define UTILS_H
#include "global.h"
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*, s32, s32);
void LoadPaletteGroup(u32 group);
void SetColor(u32 colorIndex, u32 color);
void SetFillColor(u32 color, u32 arg1);
/**
* 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);
u32 CheckPlayerProximity(u32, u32, u32, u32);
#endif