z_collision_check.c (#58)

* setup

* Progress on z_collision_check.c

* Further progress on z_collision_check.c

* renamed code_0x800E03A0 to z_collision_btltbls, z_collision_check.c decompiled besides bss

* Structs changes

* Document functions

* overlayhelpers folder, colliderinit.py and ichaindis.py

* Flags, format existing ColliderInits

* Fix merge

* Few more small improvements

* Review suggestions
This commit is contained in:
Tharo
2021-03-22 17:48:15 -04:00
committed by GitHub
parent 32d0e622fd
commit 1a2e6d7ffe
28 changed files with 6520 additions and 918 deletions
+232 -232
View File
File diff suppressed because it is too large Load Diff
+62 -79
View File
@@ -358,11 +358,11 @@ extern DmaEntry dmadata[1568];
// extern UNK_TYPE1 D_801AAAB0;
// extern UNK_TYPE1 D_801AD370;
extern ActorInit En_A_Obj_InitVars;
extern ColCylinderInit enAObjCylinderInit;
extern ColliderCylinderInit enAObjCylinderInit;
extern InitChainEntry enAObjInitVar;
extern u32 enAObjDisplayLists[2];
extern ActorInit En_Item00_InitVars;
extern ColCylinderInit enItem00CylinderInit;
extern ColliderCylinderInit enItem00CylinderInit;
extern InitChainEntry enItem00InitVars[1];
// extern UNK_TYPE1 D_801ADF10;
// extern UNK_TYPE1 D_801ADF14;
@@ -856,39 +856,32 @@ extern camera_update_func cameraUpdateFuncs[71];
// extern UNK_TYPE4 D_801B9ED4;
// extern UNK_TYPE4 D_801B9F04;
// extern UNK_TYPE2 D_801B9F0C;
// extern UNK_TYPE4 D_801B9F10;
extern s800E03A0 D_801B9F20[23];
extern f32 gDamageMultipliers[16];
extern ColCommon defaultColCommon;
extern ColTouch defaultColTouch;
extern ColBump defaultColBump;
extern ColBodyInfo defaultColBodyInfo;
extern ColSphereParams defaultColSphereInfo;
extern ColCylinderParams defaultColCylinderInfo;
extern ColTriParams defaultColTriParams;
extern ColQuadParams defaultColQuadParams;
// extern UNK_TYPE1 D_801BA32C;
extern collision_add_func collisionAddATFuncs[5];
extern collision_add_func collisionAddACFuncs[5];
extern collision_add_func collisionAddOTFuncs[5];
extern UNK_PTR D_801BA374;
// extern UNK_TYPE1 D_801BA38C;
// extern UNK_TYPE1 D_801BA38D;
extern UNK_PTR D_801BA3A8;
extern collision_func collisionFuncTableATwithAC[25];
extern collision_func collisionFuncTableOTwithOT[25];
extern CollisionCheckInfo D_801BA484;
extern UNK_PTR D_801BA4A0;
// extern UNK_TYPE1 D_801BA4B4;
extern EffShieldParticleInit D_801BA4C8;
// extern UNK_TYPE1 D_801BA4F6;
// extern UNK_TYPE1 D_801BA4F8;
// extern UNK_TYPE1 D_801BA4FA;
extern EffShieldParticleInit D_801BA508;
// extern UNK_TYPE1 D_801BA536;
// extern UNK_TYPE1 D_801BA538;
// extern UNK_TYPE1 D_801BA53A;
// extern UNK_TYPE1 D_801BA550;
extern UNK_TYPE4 D_801B9F10;
extern DamageTable sDamageTablePresets[23];
extern f32 damageMultipliers[16];
extern Collider defaultCollider;
extern ColliderTouch defaultColliderTouch;
extern ColliderBump defaultColliderBump;
extern ColliderInfo defaultColliderInfo;
extern ColliderJntSphElementDim defaultColliderJntSphElementDim;
extern Cylinder16 defaultColliderCylinderDim;
extern TriNorm defaultColliderTrisElementDim;
extern ColliderQuadDim defaultColliderQuadDim;
extern Vec3f defaultLinePoint;
extern ColChkResetFunc sATResetFuncs[COLSHAPE_MAX];
extern ColChkResetFunc sACResetFuncs[COLSHAPE_MAX];
extern ColChkResetFunc sOCResetFuncs[COLSHAPE_MAX];
extern ColChkBloodFunc sBloodFuncs[6];
extern HitInfo sHitInfo[14];
extern ColChkApplyFunc sColChkApplyFuncs[COLSHAPE_MAX];
extern ColChkVsFunc sACVsFuncs[COLSHAPE_MAX][COLSHAPE_MAX];
extern ColChkVsFunc sOCVsFuncs[COLSHAPE_MAX][COLSHAPE_MAX];
extern CollisionCheckInfo defaultColChkInfo;
extern ColChkApplyFunc sApplyDamageFuncs[COLSHAPE_MAX];
extern ColChkLineFunc sOCLineCheckFuncs[COLSHAPE_MAX];
extern EffShieldParticleInit shieldParticleInitMetal;
extern EffShieldParticleInit shieldParticleInitWood;
extern UNK_TYPE1 D_801BA550;
// extern UNK_TYPE1 D_801BA750;
// extern UNK_TYPE1 D_801BA790;
// extern UNK_TYPE1 D_801BA7F0;
@@ -940,7 +933,7 @@ extern Actor* actorCutsceneCurrentCutsceneActor;
extern GlobalContext* actorCutscenesGlobalCtxt;
extern s16 actorCutsceneReturnCamera;
extern s16 D_801BD8C6;
extern ColCylinderInit fireObjCollisionInit;
extern ColliderCylinderInit fireObjCollisionInit;
extern FireObjLightParams D_801BD8FC[2];
extern GameStateOverlay initialGameStateInfo;
extern GameStateOverlay D_801BD940;
@@ -3866,8 +3859,8 @@ extern f32 D_801EDB98;
extern f32 D_801EDB9C;
extern f32 D_801EDBA0;
// extern UNK_TYPE1 D_801EDBA4;
extern ColSphereCollisionInfo D_801EDBA8;
extern ColTriParams D_801EDBB0;
extern Sphere16 D_801EDBA8;
extern TriNorm D_801EDBB0;
// extern UNK_TYPE1 D_801EDBD4;
// extern UNK_TYPE1 D_801EDBD8;
// extern UNK_TYPE1 D_801EDBDC;
@@ -3894,54 +3887,44 @@ extern s16 D_801EDBF0;
// extern UNK_TYPE1 D_801EDDE0;
// extern UNK_TYPE1 D_801EDDF0;
extern Vec3f D_801EDE00;
// extern UNK_TYPE1 D_801EDE10;
extern Vec3f D_801EDE10;
extern Vec3f D_801EDE20;
// extern UNK_TYPE1 D_801EDE30;
// extern UNK_TYPE1 D_801EDE40;
// extern UNK_TYPE1 D_801EDE78;
// extern UNK_TYPE1 D_801EDEB0;
// extern UNK_TYPE1 D_801EDEBC;
// extern UNK_TYPE1 D_801EDEC8;
// extern UNK_TYPE1 D_801EDF00;
// extern UNK_TYPE1 D_801EDF38;
// extern UNK_TYPE1 D_801EDF48;
// extern UNK_TYPE1 D_801EDF58;
// extern UNK_TYPE1 D_801EDF90;
// extern UNK_TYPE1 D_801EDFC8;
// extern UNK_TYPE1 D_801EDFD4;
// extern UNK_TYPE1 D_801EDFE0;
// extern UNK_TYPE1 D_801EDFF0;
// extern UNK_TYPE1 D_801EE000;
// extern UNK_TYPE1 D_801EE038;
// extern UNK_TYPE1 D_801EE070;
// extern UNK_TYPE1 D_801EE0A4;
// extern UNK_TYPE1 D_801EE0D8;
// extern UNK_TYPE1 D_801EE0E8;
// extern UNK_TYPE1 D_801EE11C;
// extern UNK_TYPE1 D_801EE150;
// extern UNK_TYPE1 D_801EE188;
// extern UNK_TYPE1 D_801EE1C0;
// extern UNK_TYPE1 D_801EE1C4;
// extern UNK_TYPE1 D_801EE1C8;
// extern UNK_TYPE1 D_801EE1D0;
// extern UNK_TYPE1 D_801EE1D4;
// extern UNK_TYPE1 D_801EE1D8;
// extern UNK_TYPE1 D_801EE1E0;
// extern UNK_TYPE1 D_801EE1E4;
// extern UNK_TYPE1 D_801EE1E8;
// extern UNK_TYPE1 D_801EE1F0;
extern Vec3f D_801EDE30;
extern TriNorm D_801EDE40;
extern TriNorm D_801EDE78;
extern LineSegment D_801EDEB0;
extern TriNorm D_801EDEC8;
extern TriNorm D_801EDF00;
extern Vec3f D_801EDF38;
extern Vec3f D_801EDF48;
extern TriNorm D_801EDF58;
extern TriNorm D_801EDF90;
extern LineSegment D_801EDFC8;
extern Vec3f D_801EDFE0;
extern Vec3f D_801EDFF0;
extern TriNorm D_801EE000;
extern TriNorm D_801EE038;
extern TriNorm D_801EE070[2];
extern Vec3f D_801EE0D8;
extern TriNorm D_801EE0E8[2];
extern TriNorm D_801EE150;
extern TriNorm D_801EE188;
extern Vec3f D_801EE1C0;
extern Vec3f D_801EE1D0;
extern Vec3f D_801EE1E0;
extern Vec3f D_801EE1F0;
// extern UNK_TYPE1 D_801EE1F4;
// extern UNK_TYPE1 D_801EE1F8;
extern EffSparkParams D_801EE200;
extern ColTriParams D_801EE6C8;
extern ColTriParams D_801EE700;
extern TriNorm D_801EE6C8;
extern TriNorm D_801EE700;
extern EffSparkParams D_801EE738;
extern EffSparkParams D_801EEC00;
extern EffSparkParams D_801EF0C8;
// extern UNK_TYPE1 D_801EF590;
// extern UNK_TYPE1 D_801EF5C8;
extern ColTriParams D_801EF600;
extern ColTriParams D_801EF638;
extern TriNorm D_801EF590;
extern TriNorm D_801EF5C8;
extern TriNorm D_801EF600;
extern TriNorm D_801EF638;
// extern UNK_TYPE1 D_801EF66D;
extern SaveContext gSaveContext;
// extern UNK_TYPE2 D_801F3F38;
+16 -23
View File
@@ -446,10 +446,6 @@ typedef void(*osCreateThread_func)(void*);
typedef void*(*printf_func)(void*, char*, size_t);
typedef struct {
/* 0x00 */ UNK_TYPE1 pad0[0x20];
} s800E03A0; // size = 0x20
typedef struct {
/* 0x000 */ OSThread unk0;
/* 0x1B0 */ s8 argCount;
@@ -627,11 +623,6 @@ typedef struct {
/* 0x12 */ OSContPad rel; // X/Y store adjusted
} Input; // size = 0x18
typedef struct {
/* 0x00 */ Vec3f a;
/* 0x0C */ Vec3f b;
} LineSegment; // size = 0x18
// Permanent save context, kept in regular save files
typedef struct {
/* 0x0000 */ u32 entranceIndex; // bits 0-3 : offset; 4-8: spawn index; 9-15: scene index
@@ -1264,6 +1255,12 @@ typedef struct AudioThreadStruct AudioThreadStruct;
typedef struct GlobalContext GlobalContext;
typedef s32 (*ColChkResetFunc)(GlobalContext*, Collider*);
typedef void (*ColChkBloodFunc)(GlobalContext*, Collider*, Vec3f*);
typedef void (*ColChkApplyFunc)(GlobalContext*, CollisionCheckContext*, Collider*);
typedef void (*ColChkVsFunc)(GlobalContext*, CollisionCheckContext*, Collider*, Collider*);
typedef s32 (*ColChkLineFunc)(GlobalContext*, CollisionCheckContext*, Collider*, Vec3f*, Vec3f*);
typedef struct {
/* 0x0 */ GlobalContext* ctxt;
/* 0x4 */ s32 type; // bitfield, highest set bit determines type
@@ -1271,10 +1268,6 @@ typedef struct {
/* 0xA */ s16 state; // 0 - stopped, 1 - active, 2 - setup
} Quake2Context; // size = 0xC
typedef s32(*collision_add_func)(GlobalContext*, ColCommon*);
typedef void(*collision_func)(GlobalContext*, CollisionCheckContext*, ColCommon*, ColCommon*);
typedef void(*cutscene_update_func)(GlobalContext* ctxt, CutsceneContext* cCtxt);
typedef void(*draw_func)(GlobalContext* ctxt, s16 index);
@@ -1526,7 +1519,7 @@ struct FireObj {
/* 0x28 */ u8 flags; // bit 0 - ?, bit 1 - ?
/* 0x29 */ UNK_TYPE1 pad29[0x1];
/* 0x2A */ s16 ignitionDelay;
/* 0x2C */ ColCylinder collision;
/* 0x2C */ ColliderCylinder collision;
/* 0x78 */ FireObjLight light;
}; // size = 0x8B
@@ -1687,8 +1680,8 @@ typedef struct {
typedef struct {
/* 0x000 */ Actor base;
/* 0x144 */ ColQuad unk144;
/* 0x1C4 */ ColQuad unk1C4;
/* 0x144 */ ColliderQuad unk144;
/* 0x1C4 */ ColliderQuad unk1C4;
/* 0x244 */ Vec3f unk244;
/* 0x250 */ f32 unk250;
/* 0x254 */ f32 unk254;
@@ -1711,9 +1704,9 @@ struct ActorEnBji01 {
struct ActorEnBom {
/* 0x000 */ Actor base;
/* 0x144 */ ColCylinder unk144;
/* 0x190 */ ColSphereGroup unk190;
/* 0x1B0 */ ColSphereGroupElement unk1B0[1];
/* 0x144 */ ColliderCylinder unk144;
/* 0x190 */ ColliderJntSph unk190;
/* 0x1B0 */ ColliderJntSphElement unk1B0[1];
/* 0x1F0 */ s16 unk1F0;
/* 0x1F2 */ UNK_TYPE1 pad1F2[0x6];
/* 0x1F8 */ u8 unk1F8;
@@ -1741,7 +1734,7 @@ struct ActorEnFirefly {
/* 0x2EC */ f32 unk2EC;
/* 0x2F0 */ f32 unk2F0;
/* 0x2F4 */ UNK_TYPE1 pad2F4[0x28];
/* 0x31C */ ColSphere collision;
/* 0x31C */ ColliderSphere collision;
}; // size = 0x374
struct ActorEnTest {
@@ -1771,8 +1764,8 @@ typedef struct {
struct ActorObjBell {
/* 0x000 */ Actor base;
/* 0x144 */ UNK_TYPE1 pad144[0x18];
/* 0x15C */ ColSphere unk15C;
/* 0x1B4 */ ColSphere unk1B4;
/* 0x15C */ ColliderSphere unk15C;
/* 0x1B4 */ ColliderSphere unk1B4;
/* 0x20C */ UNK_TYPE1 pad20C[0x2];
/* 0x20E */ s16 unk20E;
/* 0x210 */ UNK_TYPE1 pad210[0x4];
@@ -1782,7 +1775,7 @@ struct ActorObjBell {
struct ActorBgIknvObj {
/* 0x000 */ DynaPolyActor bg;
/* 0x15C */ ColCylinder collision;
/* 0x15C */ ColliderCylinder collision;
/* 0x1A8 */ u32 displayListAddr;
/* 0x1AC */ ActorFunc updateFunc;
}; // size = 0x1B0
+35 -18
View File
@@ -6,6 +6,9 @@
#include <z64collision_check.h>
#include <unk.h>
#define MASS_IMMOVABLE 0xFF // Cannot be pushed by OC collisions
#define MASS_HEAVY 0xFE // Can only be pushed by OC collisions with IMMOVABLE and HEAVY objects.
struct Actor;
struct GlobalContext;
struct LightMapper;
@@ -19,9 +22,38 @@ typedef struct {
} PosRot; // size = 0x14
typedef struct {
/* 0x00 */ u8 table[32];
/* 0x00 */ u8 attack[32];
} DamageTable; // size = 0x20
typedef struct {
/* 0x00 */ u8 health;
/* 0x02 */ s16 cylRadius;
/* 0x04 */ s16 cylHeight;
/* 0x06 */ u8 mass;
} CollisionCheckInfoInit;
typedef struct {
/* 0x00 */ u8 health;
/* 0x02 */ s16 cylRadius;
/* 0x04 */ s16 cylHeight;
/* 0x06 */ s16 cylYShift;
/* 0x08 */ u8 mass;
} CollisionCheckInfoInit2;
typedef struct {
/* 0x00 */ DamageTable* damageTable;
/* 0x04 */ Vec3f displacement;
/* 0x10 */ s16 cylRadius;
/* 0x12 */ s16 cylHeight;
/* 0x14 */ s16 cylYShift;
/* 0x16 */ u8 mass;
/* 0x17 */ u8 health;
/* 0x18 */ u8 damage;
/* 0x19 */ u8 damageEffect;
/* 0x1A */ u8 atHitEffect;
/* 0x1B */ u8 acHitEffect;
} CollisionCheckInfo; // size = 0x1C
typedef struct {
/* 0x00 */ s32 unk0;
/* 0x04 */ s32 unk4;
@@ -43,21 +75,6 @@ typedef struct {
/* 0x3A */ s16 unk3A;
} ActorEnTest20C; // size = 0x3C
// Related to collision?
typedef struct {
/* 0x00 */ DamageTable* damageTable;
/* 0x04 */ Vec3f displacement; // Amount to correct velocity (0x5C) by when colliding into a body
/* 0x10 */ s16 cylRadius; // Used for various purposes
/* 0x12 */ s16 cylHeight; // Used for various purposes
/* 0x14 */ s16 cylYShift; // Unused. Purpose inferred from Cylinder16 and CollisionCheck_CylSideVsLineSeg
/* 0x16 */ u8 mass; // Used to compute displacement for OC collisions
/* 0x17 */ u8 health; // Note: some actors may use their own health variable instead of this one
/* 0x18 */ u8 damage; // Amount to decrement health by
/* 0x19 */ u8 damageEffect; // Stores what effect should occur when hit by a weapon
/* 0x1A */ u8 atHitEffect; // Stores what effect should occur when AT connects with an AC
/* 0x1B */ u8 acHitEffect; // Stores what effect should occur when AC is touched by an AT
} CollisionCheckInfo; // size = 0x1C
typedef struct {
/* 0x00 */ s16 id;
/* 0x02 */ u8 type;
@@ -248,14 +265,14 @@ typedef struct {
/* 0x150 */ s16 unk150;
/* 0x152 */ s16 unk152;
/* 0x154 */ f32 unk154;
/* 0x158 */ ColCylinder collision;
/* 0x158 */ ColliderCylinder collision;
/* 0x1A4 */ UNK_TYPE1 pad1A4[0x4];
} ActorEnItem00; // size = 0x1A8
typedef struct {
/* 0x000 */ Actor base;
/* 0x144 */ ActorFunc update;
/* 0x148 */ ColCylinder collision;
/* 0x148 */ ColliderCylinder collision;
/* 0x194 */ UNK_TYPE1 pad194[0x14];
} ActorEnAObj; // size = 0x1A8
File diff suppressed because it is too large Load Diff
+87 -9
View File
@@ -5,16 +5,94 @@
#define SHT_MAX 32767.0f
typedef struct {
/* 0x0 */ f32 x;
/* 0x4 */ f32 y;
/* 0x8 */ f32 z;
} Vec3f; // size = 0xC
#define VEC_SET(V,X,Y,Z) V.x=X;V.y=Y;V.z=Z
typedef struct {
/* 0x0 */ s16 x;
/* 0x2 */ s16 y;
/* 0x4 */ s16 z;
} Vec3s; // size = 0x6
/* 0x00 */ f32 x;
/* 0x04 */ f32 y;
} Vec2f; // size = 0x08
typedef struct {
/* 0x00 */ f32 x;
/* 0x04 */ f32 y;
/* 0x08 */ f32 z;
} Vec3f; // size = 0x0C
typedef struct {
/* 0x00 */ u16 x;
/* 0x02 */ u16 y;
/* 0x04 */ u16 z;
} Vec3us; // size = 0x06
typedef struct {
/* 0x00 */ s16 x;
/* 0x02 */ s16 y;
/* 0x04 */ s16 z;
} Vec3s; // size = 0x06
typedef struct {
/* 0x00 */ s32 x;
/* 0x04 */ s32 y;
/* 0x08 */ s32 z;
} Vec3i; // size = 0x0C
typedef struct {
/* 0x00 */ Vec3s center;
/* 0x06 */ s16 radius;
} Sphere16; // size = 0x08
typedef struct {
/* 0x00 */ Vec3f center;
/* 0x0C */ f32 radius;
} Spheref; // size = 0x10
typedef struct {
/* 0x00 */ Vec3f normal;
/* 0x0C */ f32 originDist;
} Plane; // size = 0x10
typedef struct {
/* 0x00 */ Vec3f vtx[3];
/* 0x24 */ Plane plane;
} TriNorm; // size = 0x34
typedef struct {
/* 0x00 */ s16 radius;
/* 0x02 */ s16 height;
/* 0x04 */ s16 yShift;
/* 0x06 */ Vec3s pos;
} Cylinder16; // size = 0x0C
typedef struct {
/* 0x00 */ f32 radius;
/* 0x04 */ f32 height;
/* 0x08 */ f32 yShift;
/* 0x0C */ Vec3f pos;
} Cylinderf; // size = 0x18
typedef struct {
/* 0x00 */ Vec3f point;
/* 0x0C */ Vec3f dir;
} InfiniteLine; // size = 0x18
typedef struct {
/* 0x00 */ Vec3f a;
/* 0x0C */ Vec3f b;
} LineSegment; // size = 0x18
// Defines a point in the spherical coordinate system
typedef struct {
/* 0x00 */ f32 r; // radius
/* 0x04 */ s16 pitch; // polar (zenith) angle
/* 0x06 */ s16 yaw; // azimuthal angle
} VecSph; // size = 0x08
#define IS_ZERO(f) (fabsf(f) < 0.008f)
// Vector macros
#define SQXZ(vec) ((vec.x) * (vec.x) + (vec.z) * (vec.z))
#define DOTXZ(vec1, vec2) ((vec1.x) * (vec2.x) + (vec1.z) * (vec2.z))
#define SQXYZ(vec) ((vec.x) * (vec.x) + (vec.y) * (vec.y) + (vec.z) * (vec.z))
#define DOTXYZ(vec1, vec2) ((vec1.x) * (vec2.x) + (vec1.y) * (vec2.y) + (vec1.z) * (vec2.z))
#endif