2020-03-17 04:31:30 +00:00
|
|
|
#include <ultra64.h>
|
|
|
|
#include <global.h>
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
typedef enum {
|
2020-03-17 04:31:30 +00:00
|
|
|
/* 0x00 */ DROP_RUPEE_GREEN,
|
|
|
|
/* 0x01 */ DROP_RUPEE_BLUE,
|
|
|
|
/* 0x02 */ DROP_RUPEE_RED,
|
|
|
|
/* 0x03 */ DROP_HEART,
|
|
|
|
/* 0x04 */ DROP_BOMBS_A,
|
|
|
|
/* 0x05 */ DROP_ARROWS_SINGLE,
|
|
|
|
/* 0x06 */ DROP_HEART_PIECE,
|
|
|
|
/* 0x07 */ DROP_HEART_CONTAINER,
|
|
|
|
/* 0x08 */ DROP_ARROWS_SMALL,
|
|
|
|
/* 0x09 */ DROP_ARROWS_MEDIUM,
|
|
|
|
/* 0x0A */ DROP_ARROWS_LARGE,
|
|
|
|
/* 0x0B */ DROP_BOMBS_B,
|
|
|
|
/* 0x0C */ DROP_NUTS,
|
|
|
|
/* 0x0D */ DROP_STICK,
|
|
|
|
/* 0x0E */ DROP_MAGIC_LARGE,
|
|
|
|
/* 0x0F */ DROP_MAGIC_SMALL,
|
|
|
|
/* 0x10 */ DROP_SEEDS,
|
|
|
|
/* 0x11 */ DROP_SMALL_KEY,
|
|
|
|
/* 0x12 */ DROP_FLEXIBLE,
|
|
|
|
/* 0x13 */ DROP_RUPEE_ORANGE,
|
|
|
|
/* 0x14 */ DROP_RUPEE_PURPLE,
|
|
|
|
/* 0x15 */ DROP_SHIELD_DEKU,
|
|
|
|
/* 0x16 */ DROP_SHIELD_HYLIAN,
|
|
|
|
/* 0x17 */ DROP_TUNIC_ZORA,
|
|
|
|
/* 0x18 */ DROP_TUNIC_GORON,
|
|
|
|
/* 0x19 */ DROP_BOMBS_SPECIAL
|
|
|
|
} DropType;
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
typedef struct {
|
2020-03-17 04:31:30 +00:00
|
|
|
/* 0x000 */ Actor actor;
|
|
|
|
/* 0x14C */ ActorFunc updateFunc;
|
|
|
|
/* 0x150 */ s16 collectibleFlag;
|
|
|
|
/* 0x152 */ s16 unk_152;
|
|
|
|
/* 0x154 */ s16 unk_154;
|
|
|
|
/* 0x156 */ s16 unk_156;
|
|
|
|
/* 0x158 */ s16 unk_158;
|
|
|
|
/* 0x15A */ s16 unk_15A;
|
|
|
|
/* 0x15C */ f32 unk_15C;
|
z_collision_check.c (#73)
* func_8005B280 ok
* func_8005B65C OK
* split out func_8005BD50
* func_8005B7C0 OK
* func_8005B7F4 OK
* func_8005B824 OK
* func_8005B860 ok
* improve sanity
* func_8005B6B0 ok, ColliderInit_Actor structs added
* func_8005B884 ok
* func_8005BBF8 ok, split out func_8005BF50
* split more stuff out of func_8005C050.s
* func_8005C050 OK
* func_8005BA30 fakish OK, func_8005BAD8 real OK
* func_8005BB48 OK, func_8005BA84 almost decomp'd, but type issues
* func_8005BB10 Ok
* func_8005BF50 OK
* func_8005BE50 OK
* func_8005BD50 OK
* func_8005BCC8 Ok
* func_8005BC28
* func_8005BB8C func_8005BBB0 func_8005BBD4 Ok
* save my work commit
* func_8005C2BC fake OK
* func_8005C5B0 ok
* func_8005C608 ok
* func_8005C6C0 ok
* func_8005C6F8 ok
* func_8005C730 ok
* func_8005C774 func_8005C798 func_8005C7BC OK
* func_8005C7E0 ok, func_8005C810 split
* func_8005C810 OK
* func_8005C8C8 ok
* func_8005C964 OK
* func_8005CA88 ok
* func_8005CBAC ok
* func_8005C124 func_8005C1AC func_8005C234 func_8005CC98 OK
* func_8005CD34 func_8005CDD0 Ok
* func_8005CE6C ok
* func_8005CEC4 ok
* func_8005CEDC ok
* func_8005CF90 Ok
* standardize type names/vars more
* func_8005D3BC ok
* func_8005D40C OK, z64.h CollisionCheckContext
* func_8005D4B4 func_8005D4C8 ok
* partial data section migration
* improve function documentation, OT->OC
* Actor_CollisionCheck_SetOC ok
* Actor_CollisionCheck_SetAT Actor_CollisionCheck_SetAC Ok
* func_8005BA84 ok
* func_800611A0 ok
* func_80061274 ok
* clean up func_80061274
* func_8006139C ok
* func_8005E9C0 and dependencies OK
* minor cleanup to func_8005E9C0
* func_8005EC6C OK!
* func_8005E81C ok
* func_8005E604 ok
* func_8005E2EC func_8005E4F8 OK
* func_8005DE9C OK func_8005D8AC disassembled
* func_8006146C func_8006268C ok
* func_8005EEE0 ok
* func_8005F17C
* func_8005F39C ok
* func_8005F5B0 decompiled, not matching
* func_8005F7D0 decomp, func_8005D218 and func_8005D324 OK
* func_8005FA30 ok, split more functions
* func_8005FC04 ok
* func_8005FDCC k
* func_8005FF90 OK OK OK
* func_80060204 dead
* func_800604B0 ok
* func_80060704 func_80060994 ok, func_80060C2C somewhat disassembled. AT to AC matrix doneish
* func_800635D0 ok, func_80062ECC not so much
* OcLine oks
* D_8011DF28 functions disassembled
* D_8011DF5C functions OK
* setAT_SAC. setAC_SAC, setOC_SAC OK
* func_80061C98 decompiled, func_80061BF4, func_80061C18 OK
* func_800617D4 ok, func_800614A4 disassembled
* CollisionCheck_OC D_8011DFAC functions OK
* func_80062530 ok
* CollisionCheck_generalLineOcCheck subfunctions OK
* func_800622E4 ok
* after a long fought battle, func_80061F64 has fallen.
* func_800628A4 disassembled
* func_800627A0 func_8006285C OK
* ActorCollider_Cylinder_Update, func_80062718, func_80062734 ok
* func_80062CD4 decompiled, import EffShield/EffSpark types from MM
* various SubActor98 struct functions OK
* func_8005D4DC func_8005D62C ok
* .data section migrated, more OKs, fix NON_MATCHINGs to use effect structs
* func_80060C2C ok
* minor code tweaks
* func_80061C98 ok somehow
* Attempt to fix some unknowns, move types out of z64actor, add set3 ColliderInit types
* Apply changes
* formatting
* tweak a couple function names
* krim changes, func naming
* missed some things
* function renames
* Implement GenColliderInit.py utility
* Implement pr changes, GenColliderInit.py, DamageTable.py, z_collision_btltbls.c fully matching
* func_800614A4 ok
* Implement Roman's fixes, name Collider unknowns, rename COLTYPE -> COLSHAPE and define new COLTYPE
* collisionCheckCtx -> colChkCtx, fix small things
2020-04-26 02:43:35 +00:00
|
|
|
/* 0x160 */ ColliderCylinder cylinderCollider;
|
2020-03-17 04:31:30 +00:00
|
|
|
} ActorEnItem00;
|
|
|
|
|
|
|
|
void func_8001DFC8(ActorEnItem00* this, GlobalContext* globalCtx);
|
|
|
|
void func_8001E1C8(ActorEnItem00* this, GlobalContext* globalCtx);
|
|
|
|
void func_8001E304(ActorEnItem00* this, GlobalContext* globalCtx);
|
|
|
|
void func_8001E5C8(ActorEnItem00* this, GlobalContext* globalCtx);
|
|
|
|
|
|
|
|
// TODO: Define this part of code .data here and rename the symbols
|
|
|
|
extern ActorInit En_Item00_InitVars;
|
|
|
|
extern ColliderCylinderInit D_801154E0;
|
|
|
|
extern InitChainEntry D_8011550C[];
|
|
|
|
extern Color_RGB8 D_80115510;
|
|
|
|
extern Color_RGB8 D_80115514;
|
|
|
|
extern UNK_TYPE D_80115518;
|
|
|
|
extern UNK_TYPE D_80115524;
|
|
|
|
extern u32 D_80115530[];
|
|
|
|
extern u32 D_80115544[];
|
|
|
|
extern u8 D_80115574[];
|
|
|
|
extern u8 D_80115664[];
|
|
|
|
|
|
|
|
// Internal Actor Functions
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
void En_Item00_SetNewUpdate(ActorEnItem00* this, ActorFunc newUpdateFunc) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->updateFunc = newUpdateFunc;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef NON_MATCHING
|
|
|
|
// Very close to matching, just a single ordering issue
|
2020-03-22 21:19:43 +00:00
|
|
|
void En_Item00_Init(ActorEnItem00* this, GlobalContext* globalCtx) {
|
2020-03-17 04:31:30 +00:00
|
|
|
s32 pad1;
|
|
|
|
s32 pad2;
|
|
|
|
f32 sp34;
|
|
|
|
f32 sp30;
|
|
|
|
s32 sp2C;
|
|
|
|
s16 spawnParam8000;
|
|
|
|
s32 pad3;
|
|
|
|
|
|
|
|
sp34 = 980.0f;
|
|
|
|
sp30 = 6.0f;
|
|
|
|
sp2C = 0;
|
|
|
|
|
|
|
|
spawnParam8000 = this->actor.params & 0x8000;
|
|
|
|
this->collectibleFlag = (this->actor.params & 0x3F00) >> 8;
|
|
|
|
|
|
|
|
this->actor.params = this->actor.params & 0x00FF;
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (Flags_GetCollectible(globalCtx, this->collectibleFlag)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
Actor_Kill(&this->actor);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Actor_ProcessInitChain(&this->actor, D_8011550C);
|
z_collision_check.c (#73)
* func_8005B280 ok
* func_8005B65C OK
* split out func_8005BD50
* func_8005B7C0 OK
* func_8005B7F4 OK
* func_8005B824 OK
* func_8005B860 ok
* improve sanity
* func_8005B6B0 ok, ColliderInit_Actor structs added
* func_8005B884 ok
* func_8005BBF8 ok, split out func_8005BF50
* split more stuff out of func_8005C050.s
* func_8005C050 OK
* func_8005BA30 fakish OK, func_8005BAD8 real OK
* func_8005BB48 OK, func_8005BA84 almost decomp'd, but type issues
* func_8005BB10 Ok
* func_8005BF50 OK
* func_8005BE50 OK
* func_8005BD50 OK
* func_8005BCC8 Ok
* func_8005BC28
* func_8005BB8C func_8005BBB0 func_8005BBD4 Ok
* save my work commit
* func_8005C2BC fake OK
* func_8005C5B0 ok
* func_8005C608 ok
* func_8005C6C0 ok
* func_8005C6F8 ok
* func_8005C730 ok
* func_8005C774 func_8005C798 func_8005C7BC OK
* func_8005C7E0 ok, func_8005C810 split
* func_8005C810 OK
* func_8005C8C8 ok
* func_8005C964 OK
* func_8005CA88 ok
* func_8005CBAC ok
* func_8005C124 func_8005C1AC func_8005C234 func_8005CC98 OK
* func_8005CD34 func_8005CDD0 Ok
* func_8005CE6C ok
* func_8005CEC4 ok
* func_8005CEDC ok
* func_8005CF90 Ok
* standardize type names/vars more
* func_8005D3BC ok
* func_8005D40C OK, z64.h CollisionCheckContext
* func_8005D4B4 func_8005D4C8 ok
* partial data section migration
* improve function documentation, OT->OC
* Actor_CollisionCheck_SetOC ok
* Actor_CollisionCheck_SetAT Actor_CollisionCheck_SetAC Ok
* func_8005BA84 ok
* func_800611A0 ok
* func_80061274 ok
* clean up func_80061274
* func_8006139C ok
* func_8005E9C0 and dependencies OK
* minor cleanup to func_8005E9C0
* func_8005EC6C OK!
* func_8005E81C ok
* func_8005E604 ok
* func_8005E2EC func_8005E4F8 OK
* func_8005DE9C OK func_8005D8AC disassembled
* func_8006146C func_8006268C ok
* func_8005EEE0 ok
* func_8005F17C
* func_8005F39C ok
* func_8005F5B0 decompiled, not matching
* func_8005F7D0 decomp, func_8005D218 and func_8005D324 OK
* func_8005FA30 ok, split more functions
* func_8005FC04 ok
* func_8005FDCC k
* func_8005FF90 OK OK OK
* func_80060204 dead
* func_800604B0 ok
* func_80060704 func_80060994 ok, func_80060C2C somewhat disassembled. AT to AC matrix doneish
* func_800635D0 ok, func_80062ECC not so much
* OcLine oks
* D_8011DF28 functions disassembled
* D_8011DF5C functions OK
* setAT_SAC. setAC_SAC, setOC_SAC OK
* func_80061C98 decompiled, func_80061BF4, func_80061C18 OK
* func_800617D4 ok, func_800614A4 disassembled
* CollisionCheck_OC D_8011DFAC functions OK
* func_80062530 ok
* CollisionCheck_generalLineOcCheck subfunctions OK
* func_800622E4 ok
* after a long fought battle, func_80061F64 has fallen.
* func_800628A4 disassembled
* func_800627A0 func_8006285C OK
* ActorCollider_Cylinder_Update, func_80062718, func_80062734 ok
* func_80062CD4 decompiled, import EffShield/EffSpark types from MM
* various SubActor98 struct functions OK
* func_8005D4DC func_8005D62C ok
* .data section migrated, more OKs, fix NON_MATCHINGs to use effect structs
* func_80060C2C ok
* minor code tweaks
* func_80061C98 ok somehow
* Attempt to fix some unknowns, move types out of z64actor, add set3 ColliderInit types
* Apply changes
* formatting
* tweak a couple function names
* krim changes, func naming
* missed some things
* function renames
* Implement GenColliderInit.py utility
* Implement pr changes, GenColliderInit.py, DamageTable.py, z_collision_btltbls.c fully matching
* func_800614A4 ok
* Implement Roman's fixes, name Collider unknowns, rename COLTYPE -> COLSHAPE and define new COLTYPE
* collisionCheckCtx -> colChkCtx, fix small things
2020-04-26 02:43:35 +00:00
|
|
|
Collider_InitCylinder(globalCtx, &this->cylinderCollider);
|
|
|
|
Collider_SetCylinder(globalCtx, &this->cylinderCollider, &this->actor, &D_801154E0);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
|
|
this->unk_158 = 1;
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
switch (this->actor.params) {
|
2020-03-17 04:31:30 +00:00
|
|
|
case DROP_RUPEE_GREEN:
|
|
|
|
case DROP_RUPEE_BLUE:
|
|
|
|
case DROP_RUPEE_RED:
|
|
|
|
Actor_SetScale(&this->actor, 0.015f);
|
|
|
|
this->unk_15C = 0.015f;
|
|
|
|
sp34 = 750.0f;
|
|
|
|
break;
|
|
|
|
case DROP_SMALL_KEY:
|
|
|
|
this->unk_158 = 0;
|
|
|
|
Actor_SetScale(&this->actor, 0.03f);
|
|
|
|
this->unk_15C = 0.03f;
|
|
|
|
sp34 = 350.0f;
|
|
|
|
break;
|
|
|
|
case DROP_HEART_PIECE:
|
|
|
|
this->unk_158 = 0;
|
|
|
|
sp34 = 650.0f;
|
|
|
|
Actor_SetScale(&this->actor, 0.02f);
|
|
|
|
this->unk_15C = 0.02f;
|
|
|
|
break;
|
|
|
|
case DROP_HEART:
|
|
|
|
this->actor.initPosRot.rot.z = Math_Rand_CenteredFloat(65535.0f);
|
|
|
|
sp34 = 430.0f;
|
|
|
|
Actor_SetScale(&this->actor, 0.02f);
|
|
|
|
this->unk_15C = 0.02f;
|
|
|
|
break;
|
|
|
|
case DROP_HEART_CONTAINER:
|
|
|
|
sp34 = 430.0f;
|
|
|
|
this->unk_158 = 0;
|
|
|
|
Actor_SetScale(&this->actor, 0.02f);
|
|
|
|
this->unk_15C = 0.02f;
|
|
|
|
break;
|
|
|
|
case DROP_ARROWS_SINGLE:
|
|
|
|
sp34 = 400.0f;
|
|
|
|
Actor_SetScale(&this->actor, 0.02f);
|
|
|
|
this->unk_15C = 0.02f;
|
|
|
|
break;
|
|
|
|
case DROP_ARROWS_SMALL:
|
|
|
|
case DROP_ARROWS_MEDIUM:
|
|
|
|
case DROP_ARROWS_LARGE:
|
|
|
|
Actor_SetScale(&this->actor, 0.035f);
|
|
|
|
this->unk_15C = 0.035f;
|
|
|
|
sp34 = 250.0f;
|
|
|
|
break;
|
|
|
|
case DROP_BOMBS_A:
|
|
|
|
case DROP_BOMBS_B:
|
|
|
|
case DROP_NUTS:
|
|
|
|
case DROP_STICK:
|
|
|
|
case DROP_MAGIC_SMALL:
|
|
|
|
case DROP_SEEDS:
|
|
|
|
case DROP_BOMBS_SPECIAL:
|
|
|
|
Actor_SetScale(&this->actor, 0.03f);
|
|
|
|
this->unk_15C = 0.03f;
|
|
|
|
sp34 = 320.0f;
|
|
|
|
break;
|
|
|
|
case DROP_MAGIC_LARGE:
|
|
|
|
Actor_SetScale(&this->actor, 0.045 - 1e-10);
|
|
|
|
this->unk_15C = 0.045 - 1e-10;
|
|
|
|
sp34 = 320.0f;
|
|
|
|
break;
|
|
|
|
case DROP_RUPEE_ORANGE:
|
|
|
|
Actor_SetScale(&this->actor, 0.045 - 1e-10);
|
|
|
|
this->unk_15C = 0.045 - 1e-10;
|
|
|
|
sp34 = 750.0f;
|
|
|
|
break;
|
|
|
|
case DROP_RUPEE_PURPLE:
|
|
|
|
Actor_SetScale(&this->actor, 0.03f);
|
|
|
|
this->unk_15C = 0.03f;
|
|
|
|
sp34 = 750.0f;
|
|
|
|
break;
|
|
|
|
case DROP_FLEXIBLE:
|
|
|
|
sp34 = 500.0f;
|
|
|
|
Actor_SetScale(&this->actor, 0.01f);
|
|
|
|
this->unk_15C = 0.01f;
|
|
|
|
break;
|
|
|
|
case DROP_SHIELD_DEKU:
|
|
|
|
this->actor.objBankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_SHIELD_1);
|
|
|
|
Actor_SetObjectDependency(globalCtx, &this->actor);
|
|
|
|
Actor_SetScale(&this->actor, 0.5f);
|
|
|
|
this->unk_15C = 0.5f;
|
|
|
|
sp34 = 0.0f;
|
|
|
|
sp30 = 0.6f;
|
|
|
|
this->actor.posRot.rot.x = 0x4000;
|
|
|
|
break;
|
|
|
|
case DROP_SHIELD_HYLIAN:
|
|
|
|
this->actor.objBankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_SHIELD_2);
|
|
|
|
Actor_SetObjectDependency(globalCtx, &this->actor);
|
|
|
|
Actor_SetScale(&this->actor, 0.5f);
|
|
|
|
this->unk_15C = 0.5f;
|
|
|
|
sp34 = 0.0f;
|
|
|
|
sp30 = 0.6f;
|
|
|
|
this->actor.posRot.rot.x = 0x4000;
|
|
|
|
break;
|
|
|
|
case DROP_TUNIC_ZORA:
|
|
|
|
case DROP_TUNIC_GORON:
|
|
|
|
this->actor.objBankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_CLOTHES);
|
|
|
|
Actor_SetObjectDependency(globalCtx, &this->actor);
|
|
|
|
Actor_SetScale(&this->actor, 0.5f);
|
|
|
|
this->unk_15C = 0.5f;
|
|
|
|
sp34 = 0.0f;
|
|
|
|
sp30 = 0.6f;
|
|
|
|
this->actor.posRot.rot.x = 0x4000;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
this->unk_156 = 0;
|
|
|
|
ActorShape_Init(&this->actor.shape, sp34, ActorShadow_DrawFunc_Circle, sp30);
|
|
|
|
this->actor.shape.unk_14 = 0xB4;
|
|
|
|
this->actor.posRot2.pos = this->actor.posRot.pos;
|
|
|
|
this->unk_152 = 0;
|
|
|
|
|
|
|
|
// MISMATCH: minor ordering issues here
|
2020-03-22 21:19:43 +00:00
|
|
|
if (!spawnParam8000) {
|
2020-03-17 04:31:30 +00:00
|
|
|
En_Item00_SetNewUpdate(this, (ActorFunc)func_8001DFC8);
|
|
|
|
this->unk_15A = -1;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
this->unk_15A = 15;
|
|
|
|
this->unk_154 = 35;
|
|
|
|
|
|
|
|
this->actor.speedXZ = 0.0f;
|
|
|
|
this->actor.velocity.y = 0.0f;
|
|
|
|
this->actor.gravity = 0.0f;
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
switch (this->actor.params) {
|
2020-03-17 04:31:30 +00:00
|
|
|
case DROP_RUPEE_GREEN:
|
|
|
|
Item_Give(globalCtx, ITEM_RUPEE_GREEN);
|
|
|
|
break;
|
|
|
|
case DROP_RUPEE_BLUE:
|
|
|
|
Item_Give(globalCtx, ITEM_RUPEE_BLUE);
|
|
|
|
break;
|
|
|
|
case DROP_RUPEE_RED:
|
|
|
|
Item_Give(globalCtx, ITEM_RUPEE_RED);
|
|
|
|
break;
|
|
|
|
case DROP_RUPEE_PURPLE:
|
|
|
|
Item_Give(globalCtx, ITEM_RUPEE_PURPLE);
|
|
|
|
break;
|
|
|
|
case DROP_RUPEE_ORANGE:
|
|
|
|
Item_Give(globalCtx, ITEM_RUPEE_GOLD);
|
|
|
|
break;
|
|
|
|
case DROP_HEART:
|
|
|
|
Item_Give(globalCtx, ITEM_HEART);
|
|
|
|
break;
|
|
|
|
case DROP_FLEXIBLE:
|
|
|
|
Health_ChangeBy(globalCtx, 0x70);
|
|
|
|
break;
|
|
|
|
case DROP_BOMBS_A:
|
|
|
|
case DROP_BOMBS_B:
|
|
|
|
Item_Give(globalCtx, ITEM_BOMBS_5);
|
|
|
|
break;
|
|
|
|
case DROP_ARROWS_SINGLE:
|
|
|
|
Item_Give(globalCtx, ITEM_BOW);
|
|
|
|
break;
|
|
|
|
case DROP_ARROWS_SMALL:
|
|
|
|
Item_Give(globalCtx, ITEM_ARROWS_SMALL);
|
|
|
|
break;
|
|
|
|
case DROP_ARROWS_MEDIUM:
|
|
|
|
Item_Give(globalCtx, ITEM_ARROWS_MEDIUM);
|
|
|
|
break;
|
|
|
|
case DROP_ARROWS_LARGE:
|
|
|
|
Item_Give(globalCtx, ITEM_ARROWS_LARGE);
|
|
|
|
break;
|
|
|
|
case DROP_MAGIC_SMALL:
|
|
|
|
sp2C = GI_MAGIC_SMALL;
|
|
|
|
break;
|
|
|
|
case DROP_MAGIC_LARGE:
|
|
|
|
sp2C = GI_MAGIC_LARGE;
|
|
|
|
break;
|
|
|
|
case DROP_SMALL_KEY:
|
|
|
|
Item_Give(globalCtx, ITEM_KEY_SMALL);
|
|
|
|
break;
|
|
|
|
case DROP_SEEDS:
|
|
|
|
sp2C = GI_SEEDS_5;
|
|
|
|
break;
|
|
|
|
case DROP_NUTS:
|
|
|
|
sp2C = GI_NUTS_5;
|
|
|
|
break;
|
|
|
|
case DROP_STICK:
|
|
|
|
sp2C = GI_STICKS_1;
|
|
|
|
break;
|
|
|
|
case DROP_HEART_PIECE:
|
|
|
|
case DROP_HEART_CONTAINER:
|
|
|
|
case DROP_SHIELD_DEKU:
|
|
|
|
case DROP_SHIELD_HYLIAN:
|
|
|
|
case DROP_TUNIC_ZORA:
|
|
|
|
case DROP_TUNIC_GORON:
|
|
|
|
case DROP_BOMBS_SPECIAL:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2020-03-23 23:11:21 +00:00
|
|
|
if ((sp2C != 0) && !func_8002F410(&this->actor, globalCtx)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
func_8002F554(&this->actor, globalCtx, sp2C);
|
2020-03-23 23:11:21 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
|
|
En_Item00_SetNewUpdate(this, (ActorFunc)func_8001E5C8);
|
|
|
|
this->updateFunc(this, globalCtx);
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
#pragma GLOBAL_ASM("asm/non_matchings/code/z_en_item00/En_Item00_Init.s")
|
|
|
|
#endif
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
void En_Item00_Destroy(ActorEnItem00* this, GlobalContext* globalCtx) {
|
z_collision_check.c (#73)
* func_8005B280 ok
* func_8005B65C OK
* split out func_8005BD50
* func_8005B7C0 OK
* func_8005B7F4 OK
* func_8005B824 OK
* func_8005B860 ok
* improve sanity
* func_8005B6B0 ok, ColliderInit_Actor structs added
* func_8005B884 ok
* func_8005BBF8 ok, split out func_8005BF50
* split more stuff out of func_8005C050.s
* func_8005C050 OK
* func_8005BA30 fakish OK, func_8005BAD8 real OK
* func_8005BB48 OK, func_8005BA84 almost decomp'd, but type issues
* func_8005BB10 Ok
* func_8005BF50 OK
* func_8005BE50 OK
* func_8005BD50 OK
* func_8005BCC8 Ok
* func_8005BC28
* func_8005BB8C func_8005BBB0 func_8005BBD4 Ok
* save my work commit
* func_8005C2BC fake OK
* func_8005C5B0 ok
* func_8005C608 ok
* func_8005C6C0 ok
* func_8005C6F8 ok
* func_8005C730 ok
* func_8005C774 func_8005C798 func_8005C7BC OK
* func_8005C7E0 ok, func_8005C810 split
* func_8005C810 OK
* func_8005C8C8 ok
* func_8005C964 OK
* func_8005CA88 ok
* func_8005CBAC ok
* func_8005C124 func_8005C1AC func_8005C234 func_8005CC98 OK
* func_8005CD34 func_8005CDD0 Ok
* func_8005CE6C ok
* func_8005CEC4 ok
* func_8005CEDC ok
* func_8005CF90 Ok
* standardize type names/vars more
* func_8005D3BC ok
* func_8005D40C OK, z64.h CollisionCheckContext
* func_8005D4B4 func_8005D4C8 ok
* partial data section migration
* improve function documentation, OT->OC
* Actor_CollisionCheck_SetOC ok
* Actor_CollisionCheck_SetAT Actor_CollisionCheck_SetAC Ok
* func_8005BA84 ok
* func_800611A0 ok
* func_80061274 ok
* clean up func_80061274
* func_8006139C ok
* func_8005E9C0 and dependencies OK
* minor cleanup to func_8005E9C0
* func_8005EC6C OK!
* func_8005E81C ok
* func_8005E604 ok
* func_8005E2EC func_8005E4F8 OK
* func_8005DE9C OK func_8005D8AC disassembled
* func_8006146C func_8006268C ok
* func_8005EEE0 ok
* func_8005F17C
* func_8005F39C ok
* func_8005F5B0 decompiled, not matching
* func_8005F7D0 decomp, func_8005D218 and func_8005D324 OK
* func_8005FA30 ok, split more functions
* func_8005FC04 ok
* func_8005FDCC k
* func_8005FF90 OK OK OK
* func_80060204 dead
* func_800604B0 ok
* func_80060704 func_80060994 ok, func_80060C2C somewhat disassembled. AT to AC matrix doneish
* func_800635D0 ok, func_80062ECC not so much
* OcLine oks
* D_8011DF28 functions disassembled
* D_8011DF5C functions OK
* setAT_SAC. setAC_SAC, setOC_SAC OK
* func_80061C98 decompiled, func_80061BF4, func_80061C18 OK
* func_800617D4 ok, func_800614A4 disassembled
* CollisionCheck_OC D_8011DFAC functions OK
* func_80062530 ok
* CollisionCheck_generalLineOcCheck subfunctions OK
* func_800622E4 ok
* after a long fought battle, func_80061F64 has fallen.
* func_800628A4 disassembled
* func_800627A0 func_8006285C OK
* ActorCollider_Cylinder_Update, func_80062718, func_80062734 ok
* func_80062CD4 decompiled, import EffShield/EffSpark types from MM
* various SubActor98 struct functions OK
* func_8005D4DC func_8005D62C ok
* .data section migrated, more OKs, fix NON_MATCHINGs to use effect structs
* func_80060C2C ok
* minor code tweaks
* func_80061C98 ok somehow
* Attempt to fix some unknowns, move types out of z64actor, add set3 ColliderInit types
* Apply changes
* formatting
* tweak a couple function names
* krim changes, func naming
* missed some things
* function renames
* Implement GenColliderInit.py utility
* Implement pr changes, GenColliderInit.py, DamageTable.py, z_collision_btltbls.c fully matching
* func_800614A4 ok
* Implement Roman's fixes, name Collider unknowns, rename COLTYPE -> COLSHAPE and define new COLTYPE
* collisionCheckCtx -> colChkCtx, fix small things
2020-04-26 02:43:35 +00:00
|
|
|
ColliderCylinder* cylinderCollider = &this->cylinderCollider;
|
|
|
|
Collider_DestroyCylinder(globalCtx, cylinderCollider);
|
2020-03-17 04:31:30 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
void func_8001DFC8(ActorEnItem00* this, GlobalContext* globalCtx) {
|
|
|
|
if ((this->actor.params <= DROP_RUPEE_RED) || ((this->actor.params == DROP_HEART) && (this->unk_15A < 0)) ||
|
|
|
|
(this->actor.params == DROP_HEART_PIECE)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->actor.shape.rot.y += 960;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else {
|
|
|
|
if ((this->actor.params >= DROP_SHIELD_DEKU) && (this->actor.params != DROP_BOMBS_SPECIAL)) {
|
|
|
|
if (this->unk_15A == -1) {
|
|
|
|
if (!Math_SmoothScaleMaxMinS(&this->actor.shape.rot.x, this->actor.posRot.rot.x - 0x4000, 2, 3000,
|
|
|
|
1500)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->unk_15A = -2;
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (!Math_SmoothScaleMaxMinS(&this->actor.shape.rot.x, -this->actor.posRot.rot.x - 0x4000, 2, 3000,
|
|
|
|
1500)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->unk_15A = -1;
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
}
|
|
|
|
Math_SmoothScaleMaxMinS(&this->actor.posRot.rot.x, 0, 2, 2500, 500);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->actor.params == DROP_HEART_PIECE) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->actor.shape.unk_08 = Math_Sins(this->actor.shape.rot.y) * 150.0f + 850.0f;
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
|
|
Math_SmoothScaleMaxMinF(&this->actor.speedXZ, 0.0f, 1.0f, 0.5f, 0.0f);
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->unk_154 == 0) {
|
|
|
|
if ((this->actor.params != DROP_SMALL_KEY) && (this->actor.params != DROP_HEART_PIECE) &&
|
|
|
|
(this->actor.params != DROP_HEART_CONTAINER)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->unk_154 = -1;
|
|
|
|
}
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->unk_15A == 0) {
|
|
|
|
if ((this->actor.params != DROP_SMALL_KEY) && (this->actor.params != DROP_HEART_PIECE) &&
|
|
|
|
(this->actor.params != DROP_HEART_CONTAINER)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
Actor_Kill(&this->actor);
|
|
|
|
}
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if ((this->actor.gravity != 0.0f) && !(this->actor.bgCheckFlags & 0x0001)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
En_Item00_SetNewUpdate(this, (ActorFunc)func_8001E1C8);
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
void func_8001E1C8(ActorEnItem00* this, GlobalContext* globalCtx) {
|
2020-03-17 04:31:30 +00:00
|
|
|
f32 originalVelocity;
|
|
|
|
Vec3f pos;
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->actor.params <= DROP_RUPEE_RED) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->actor.shape.rot.y += 960;
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (globalCtx->gameplayFrames & 1) {
|
2020-03-17 04:31:30 +00:00
|
|
|
pos.x = this->actor.posRot.pos.x + Math_Rand_CenteredFloat(10.0f);
|
|
|
|
pos.y = this->actor.posRot.pos.y + Math_Rand_CenteredFloat(10.0f);
|
|
|
|
pos.z = this->actor.posRot.pos.z + Math_Rand_CenteredFloat(10.0f);
|
|
|
|
func_80028B74(globalCtx, &pos, &D_80115518, &D_80115524, &D_80115510, &D_80115514);
|
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->actor.bgCheckFlags & 0x0003) {
|
2020-03-17 04:31:30 +00:00
|
|
|
originalVelocity = this->actor.velocity.y;
|
2020-03-22 21:19:43 +00:00
|
|
|
if (originalVelocity > -2.0f) {
|
2020-03-17 04:31:30 +00:00
|
|
|
En_Item00_SetNewUpdate(this, (ActorFunc)func_8001DFC8);
|
|
|
|
this->actor.velocity.y = 0.0f;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->actor.velocity.y = originalVelocity * -0.8f;
|
|
|
|
this->actor.bgCheckFlags = this->actor.bgCheckFlags & 0xFFFE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
void func_8001E304(ActorEnItem00* this, GlobalContext* globalCtx) {
|
2020-03-17 04:31:30 +00:00
|
|
|
s32 pad;
|
|
|
|
Vec3f pos;
|
|
|
|
s32 var1;
|
|
|
|
|
|
|
|
this->unk_15A++;
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->actor.params == DROP_HEART) {
|
|
|
|
if (this->actor.velocity.y < 0.0f) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->actor.speedXZ = 0.0f;
|
|
|
|
this->actor.gravity = -0.4f;
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->actor.velocity.y < -1.5f) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->actor.velocity.y = -1.5f;
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
|
|
|
this->actor.initPosRot.rot.z += (s16)((this->actor.velocity.y + 3.0f) * 1000.0f);
|
|
|
|
this->actor.posRot.pos.x +=
|
|
|
|
Math_Coss(this->actor.rotTowardsLinkY) * (-3.0f * Math_Coss(this->actor.initPosRot.rot.z));
|
|
|
|
this->actor.posRot.pos.z +=
|
|
|
|
Math_Sins(this->actor.rotTowardsLinkY) * (-3.0f * Math_Coss(this->actor.initPosRot.rot.z));
|
2020-03-17 04:31:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->actor.params <= DROP_RUPEE_RED) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->actor.shape.rot.y += 960;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if ((this->actor.params >= DROP_SHIELD_DEKU) && (this->actor.params != DROP_BOMBS_SPECIAL)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->actor.posRot.rot.x -= 700;
|
|
|
|
this->actor.shape.rot.y += 400;
|
|
|
|
this->actor.shape.rot.x = this->actor.posRot.rot.x - 0x4000;
|
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->actor.velocity.y <= 2.0f) {
|
2020-03-17 04:31:30 +00:00
|
|
|
var1 = (u16)this->actor.shape.rot.z + 10000;
|
2020-03-22 21:19:43 +00:00
|
|
|
if (var1 < 65535) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->actor.shape.rot.z += 10000;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->actor.shape.rot.z = -1;
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (!(globalCtx->gameplayFrames & 1)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
pos.x = this->actor.posRot.pos.x + (Math_Rand_ZeroOne() - 0.5f) * 10.0f;
|
|
|
|
pos.y = this->actor.posRot.pos.y + (Math_Rand_ZeroOne() - 0.5f) * 10.0f;
|
|
|
|
pos.z = this->actor.posRot.pos.z + (Math_Rand_ZeroOne() - 0.5f) * 10.0f;
|
|
|
|
func_80028B74(globalCtx, &pos, &D_80115518, &D_80115524, &D_80115510, &D_80115514);
|
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->actor.bgCheckFlags & 0x0003) {
|
2020-03-17 04:31:30 +00:00
|
|
|
En_Item00_SetNewUpdate(this, (ActorFunc)func_8001DFC8);
|
|
|
|
this->actor.shape.rot.z = 0;
|
|
|
|
this->actor.velocity.y = 0.0f;
|
|
|
|
this->actor.speedXZ = 0.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
void func_8001E5C8(ActorEnItem00* this, GlobalContext* globalCtx) {
|
2020-03-17 04:31:30 +00:00
|
|
|
Player* player = PLAYER;
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->unk_152 != 0) {
|
|
|
|
if (!func_8002F410(&this->actor, globalCtx)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
func_8002F434(&this->actor, globalCtx, this->unk_152, 50.0f, 80.0f);
|
|
|
|
this->unk_15A++;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->unk_152 = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->unk_15A == 0) {
|
2020-03-17 04:31:30 +00:00
|
|
|
Actor_Kill(&this->actor);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
this->actor.posRot.pos = player->actor.posRot.pos;
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->actor.params <= DROP_RUPEE_RED) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->actor.shape.rot.y += 960;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if (this->actor.params == DROP_HEART) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->actor.shape.rot.y = 0;
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
|
|
this->actor.posRot.pos.y += 40.0f + Math_Sins(this->unk_15A * 15000) * (this->unk_15A * 0.3f);
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if
|
|
|
|
LINK_IS_ADULT
|
|
|
|
this->actor.posRot.pos.y += 20.0f;
|
2020-03-17 04:31:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
extern s32 D_80157D90;
|
|
|
|
extern u32 D_80157D90_; // these must be defined separately for En_Item00_Update to match
|
|
|
|
extern s16 D_80157D94;
|
|
|
|
|
|
|
|
#ifdef NON_MATCHING
|
|
|
|
// Almost matching, just a few minor ordering issues
|
2020-03-22 21:19:43 +00:00
|
|
|
void En_Item00_Update(ActorEnItem00* this, GlobalContext* globalCtx) {
|
2020-03-17 04:31:30 +00:00
|
|
|
s32 pad1;
|
|
|
|
s32 pad2;
|
|
|
|
s32 sp3C;
|
|
|
|
s16 sp3A;
|
|
|
|
Actor* dynaActor;
|
|
|
|
s16 i;
|
|
|
|
|
|
|
|
sp3C = 0;
|
|
|
|
sp3A = 0;
|
|
|
|
|
2020-03-23 23:11:21 +00:00
|
|
|
if (this->unk_15A > 0) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->unk_15A--;
|
2020-03-23 23:11:21 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
2020-03-23 23:11:21 +00:00
|
|
|
if ((this->unk_15A > 0) && (this->unk_15A < 41) && (this->unk_154 <= 0)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->unk_156 = this->unk_15A;
|
2020-03-23 23:11:21 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
|
|
this->updateFunc(this, globalCtx);
|
|
|
|
|
|
|
|
Math_SmoothScaleMaxMinF(&this->actor.scale.x, this->unk_15C, 0.1f, this->unk_15C * 0.1f, 0.0f);
|
|
|
|
this->actor.scale.z = this->actor.scale.x;
|
|
|
|
this->actor.scale.y = this->actor.scale.x;
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->actor.gravity) {
|
|
|
|
if (this->actor.bgCheckFlags & 0x0003) {
|
2020-03-17 04:31:30 +00:00
|
|
|
// Separate symbols seem to be used here for 0x80157D90 since the loads and stores are completely separate
|
2020-03-22 21:19:43 +00:00
|
|
|
if (D_80157D90 != globalCtx->gameplayFrames) {
|
2020-03-17 04:31:30 +00:00
|
|
|
D_80157D90_ = globalCtx->gameplayFrames;
|
|
|
|
D_80157D94 = 0;
|
2020-03-22 21:19:43 +00:00
|
|
|
for (i = 0; i < 50; i++) {
|
|
|
|
if (globalCtx->colCtx.dyna.flags[i] & 1) {
|
2020-03-17 04:31:30 +00:00
|
|
|
dynaActor = globalCtx->colCtx.dyna.actorMeshArr[i].actor;
|
|
|
|
if ((dynaActor != NULL) && (dynaActor->update != NULL) &&
|
|
|
|
((dynaActor->posRot.pos.x != dynaActor->pos4.x) ||
|
|
|
|
(dynaActor->posRot.pos.y != dynaActor->pos4.y) ||
|
2020-03-22 21:19:43 +00:00
|
|
|
(dynaActor->posRot.pos.z != dynaActor->pos4.z))) {
|
2020-03-17 04:31:30 +00:00
|
|
|
D_80157D94++;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-03-22 21:19:43 +00:00
|
|
|
} else {
|
2020-03-17 04:31:30 +00:00
|
|
|
sp3A = 1;
|
|
|
|
Actor_MoveForward(&this->actor);
|
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (sp3A || D_80157D94) {
|
2020-03-17 04:31:30 +00:00
|
|
|
func_8002E4B4(globalCtx, &this->actor, 10.0f, 15.0f, 15.0f, 0x1D);
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->actor.unk_80 <= -10000.0f) {
|
2020-03-17 04:31:30 +00:00
|
|
|
Actor_Kill(&this->actor);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
z_collision_check.c (#73)
* func_8005B280 ok
* func_8005B65C OK
* split out func_8005BD50
* func_8005B7C0 OK
* func_8005B7F4 OK
* func_8005B824 OK
* func_8005B860 ok
* improve sanity
* func_8005B6B0 ok, ColliderInit_Actor structs added
* func_8005B884 ok
* func_8005BBF8 ok, split out func_8005BF50
* split more stuff out of func_8005C050.s
* func_8005C050 OK
* func_8005BA30 fakish OK, func_8005BAD8 real OK
* func_8005BB48 OK, func_8005BA84 almost decomp'd, but type issues
* func_8005BB10 Ok
* func_8005BF50 OK
* func_8005BE50 OK
* func_8005BD50 OK
* func_8005BCC8 Ok
* func_8005BC28
* func_8005BB8C func_8005BBB0 func_8005BBD4 Ok
* save my work commit
* func_8005C2BC fake OK
* func_8005C5B0 ok
* func_8005C608 ok
* func_8005C6C0 ok
* func_8005C6F8 ok
* func_8005C730 ok
* func_8005C774 func_8005C798 func_8005C7BC OK
* func_8005C7E0 ok, func_8005C810 split
* func_8005C810 OK
* func_8005C8C8 ok
* func_8005C964 OK
* func_8005CA88 ok
* func_8005CBAC ok
* func_8005C124 func_8005C1AC func_8005C234 func_8005CC98 OK
* func_8005CD34 func_8005CDD0 Ok
* func_8005CE6C ok
* func_8005CEC4 ok
* func_8005CEDC ok
* func_8005CF90 Ok
* standardize type names/vars more
* func_8005D3BC ok
* func_8005D40C OK, z64.h CollisionCheckContext
* func_8005D4B4 func_8005D4C8 ok
* partial data section migration
* improve function documentation, OT->OC
* Actor_CollisionCheck_SetOC ok
* Actor_CollisionCheck_SetAT Actor_CollisionCheck_SetAC Ok
* func_8005BA84 ok
* func_800611A0 ok
* func_80061274 ok
* clean up func_80061274
* func_8006139C ok
* func_8005E9C0 and dependencies OK
* minor cleanup to func_8005E9C0
* func_8005EC6C OK!
* func_8005E81C ok
* func_8005E604 ok
* func_8005E2EC func_8005E4F8 OK
* func_8005DE9C OK func_8005D8AC disassembled
* func_8006146C func_8006268C ok
* func_8005EEE0 ok
* func_8005F17C
* func_8005F39C ok
* func_8005F5B0 decompiled, not matching
* func_8005F7D0 decomp, func_8005D218 and func_8005D324 OK
* func_8005FA30 ok, split more functions
* func_8005FC04 ok
* func_8005FDCC k
* func_8005FF90 OK OK OK
* func_80060204 dead
* func_800604B0 ok
* func_80060704 func_80060994 ok, func_80060C2C somewhat disassembled. AT to AC matrix doneish
* func_800635D0 ok, func_80062ECC not so much
* OcLine oks
* D_8011DF28 functions disassembled
* D_8011DF5C functions OK
* setAT_SAC. setAC_SAC, setOC_SAC OK
* func_80061C98 decompiled, func_80061BF4, func_80061C18 OK
* func_800617D4 ok, func_800614A4 disassembled
* CollisionCheck_OC D_8011DFAC functions OK
* func_80062530 ok
* CollisionCheck_generalLineOcCheck subfunctions OK
* func_800622E4 ok
* after a long fought battle, func_80061F64 has fallen.
* func_800628A4 disassembled
* func_800627A0 func_8006285C OK
* ActorCollider_Cylinder_Update, func_80062718, func_80062734 ok
* func_80062CD4 decompiled, import EffShield/EffSpark types from MM
* various SubActor98 struct functions OK
* func_8005D4DC func_8005D62C ok
* .data section migrated, more OKs, fix NON_MATCHINGs to use effect structs
* func_80060C2C ok
* minor code tweaks
* func_80061C98 ok somehow
* Attempt to fix some unknowns, move types out of z64actor, add set3 ColliderInit types
* Apply changes
* formatting
* tweak a couple function names
* krim changes, func naming
* missed some things
* function renames
* Implement GenColliderInit.py utility
* Implement pr changes, GenColliderInit.py, DamageTable.py, z_collision_btltbls.c fully matching
* func_800614A4 ok
* Implement Roman's fixes, name Collider unknowns, rename COLTYPE -> COLSHAPE and define new COLTYPE
* collisionCheckCtx -> colChkCtx, fix small things
2020-04-26 02:43:35 +00:00
|
|
|
Collider_CylinderUpdate(&this->actor, &this->cylinderCollider);
|
|
|
|
CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->cylinderCollider);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
|
|
if ((this->actor.params == DROP_SHIELD_DEKU) || (this->actor.params == DROP_SHIELD_HYLIAN) ||
|
2020-03-22 21:19:43 +00:00
|
|
|
(this->actor.params == DROP_TUNIC_ZORA) || (this->actor.params == DROP_TUNIC_GORON)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
f32 newUnkBC = Math_Coss(this->actor.shape.rot.x) * 37.0f;
|
|
|
|
this->actor.shape.unk_08 = newUnkBC;
|
2020-03-23 23:11:21 +00:00
|
|
|
if (newUnkBC >= 0.0f) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->actor.shape.unk_08 = this->actor.shape.unk_08;
|
2020-03-23 23:11:21 +00:00
|
|
|
} else {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->actor.shape.unk_08 = -this->actor.shape.unk_08;
|
2020-03-23 23:11:21 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
}
|
|
|
|
|
2020-03-23 23:11:21 +00:00
|
|
|
if (this->unk_154 > 0) {
|
2020-03-17 04:31:30 +00:00
|
|
|
return;
|
2020-03-23 23:11:21 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
|
|
// MISMATCH: The first function argument is loaded too early here
|
2020-03-22 21:19:43 +00:00
|
|
|
if (!((this->actor.xzDistanceFromLink <= 30.0f) && (this->actor.yDistanceFromLink >= -50.0f) &&
|
2020-03-23 23:11:21 +00:00
|
|
|
(this->actor.yDistanceFromLink <= 50.0f))) {
|
|
|
|
if (!func_8002F410(&this->actor, globalCtx)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
return;
|
2020-03-23 23:11:21 +00:00
|
|
|
}
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
2020-03-23 23:11:21 +00:00
|
|
|
if (globalCtx->unk_10A20 != 0) {
|
2020-03-17 04:31:30 +00:00
|
|
|
return;
|
2020-03-23 23:11:21 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
switch (this->actor.params) {
|
2020-03-17 04:31:30 +00:00
|
|
|
case DROP_RUPEE_GREEN:
|
|
|
|
Item_Give(globalCtx, ITEM_RUPEE_GREEN);
|
|
|
|
break;
|
|
|
|
case DROP_RUPEE_BLUE:
|
|
|
|
Item_Give(globalCtx, ITEM_RUPEE_BLUE);
|
|
|
|
break;
|
|
|
|
case DROP_RUPEE_RED:
|
|
|
|
Item_Give(globalCtx, ITEM_RUPEE_RED);
|
|
|
|
break;
|
|
|
|
case DROP_RUPEE_PURPLE:
|
|
|
|
Item_Give(globalCtx, ITEM_RUPEE_PURPLE);
|
|
|
|
break;
|
|
|
|
case DROP_RUPEE_ORANGE:
|
|
|
|
Item_Give(globalCtx, ITEM_RUPEE_GOLD);
|
|
|
|
break;
|
|
|
|
case DROP_STICK:
|
|
|
|
sp3C = GI_STICKS_1;
|
|
|
|
break;
|
|
|
|
case DROP_NUTS:
|
|
|
|
sp3C = GI_NUTS_5;
|
|
|
|
break;
|
|
|
|
case DROP_HEART:
|
|
|
|
Item_Give(globalCtx, ITEM_HEART);
|
|
|
|
break;
|
|
|
|
case DROP_FLEXIBLE:
|
|
|
|
Health_ChangeBy(globalCtx, 0x70);
|
|
|
|
break;
|
|
|
|
case DROP_BOMBS_A:
|
|
|
|
case DROP_BOMBS_B:
|
|
|
|
Item_Give(globalCtx, ITEM_BOMBS_5);
|
|
|
|
break;
|
|
|
|
case DROP_ARROWS_SINGLE:
|
|
|
|
Item_Give(globalCtx, ITEM_BOW);
|
|
|
|
break;
|
|
|
|
case DROP_ARROWS_SMALL:
|
|
|
|
Item_Give(globalCtx, ITEM_ARROWS_SMALL);
|
|
|
|
break;
|
|
|
|
case DROP_ARROWS_MEDIUM:
|
|
|
|
Item_Give(globalCtx, ITEM_ARROWS_MEDIUM);
|
|
|
|
break;
|
|
|
|
case DROP_ARROWS_LARGE:
|
|
|
|
Item_Give(globalCtx, ITEM_ARROWS_LARGE);
|
|
|
|
break;
|
|
|
|
case DROP_SEEDS:
|
|
|
|
sp3C = GI_SEEDS_5;
|
|
|
|
break;
|
|
|
|
case DROP_SMALL_KEY:
|
|
|
|
sp3C = GI_KEY_SMALL;
|
|
|
|
break;
|
|
|
|
case DROP_HEART_PIECE:
|
|
|
|
sp3C = GI_HEART_PIECE;
|
|
|
|
break;
|
|
|
|
case DROP_HEART_CONTAINER:
|
|
|
|
sp3C = GI_HEART_CONTAINER;
|
|
|
|
break;
|
|
|
|
case DROP_MAGIC_LARGE:
|
|
|
|
sp3C = GI_MAGIC_LARGE;
|
|
|
|
break;
|
|
|
|
case DROP_MAGIC_SMALL:
|
|
|
|
sp3C = GI_MAGIC_SMALL;
|
|
|
|
break;
|
|
|
|
case DROP_SHIELD_DEKU:
|
|
|
|
sp3C = GI_SHIELD_DEKU;
|
|
|
|
break;
|
|
|
|
case DROP_SHIELD_HYLIAN:
|
|
|
|
sp3C = GI_SHIELD_HYLIAN;
|
|
|
|
break;
|
|
|
|
case DROP_TUNIC_ZORA:
|
|
|
|
sp3C = GI_TUNIC_ZORA;
|
|
|
|
break;
|
|
|
|
case DROP_TUNIC_GORON:
|
|
|
|
sp3C = GI_TUNIC_GORON;
|
|
|
|
break;
|
|
|
|
case DROP_BOMBS_SPECIAL:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
// MISMATCH: The first function argument is also loaded too early here
|
2020-03-23 23:11:21 +00:00
|
|
|
if ((sp3C != 0) && !func_8002F410(&this->actor, globalCtx)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
func_8002F554(&this->actor, globalCtx, sp3C);
|
2020-03-23 23:11:21 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
switch (this->actor.params) {
|
2020-03-17 04:31:30 +00:00
|
|
|
case DROP_HEART_PIECE:
|
|
|
|
case DROP_HEART_CONTAINER:
|
|
|
|
case DROP_SMALL_KEY:
|
|
|
|
case DROP_SHIELD_DEKU:
|
|
|
|
case DROP_SHIELD_HYLIAN:
|
|
|
|
case DROP_TUNIC_ZORA:
|
|
|
|
case DROP_TUNIC_GORON:
|
2020-03-22 21:19:43 +00:00
|
|
|
if (func_8002F410(&this->actor, globalCtx)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
Flags_SetCollectible(globalCtx, this->collectibleFlag);
|
|
|
|
Actor_Kill(&this->actor);
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if ((this->actor.params <= DROP_RUPEE_RED) || (this->actor.params == DROP_RUPEE_ORANGE)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
Audio_PlaySoundGeneral(NA_SE_SY_GET_RUPY, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if (sp3C != 0) {
|
|
|
|
if (func_8002F410(&this->actor, globalCtx)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
Flags_SetCollectible(globalCtx, this->collectibleFlag);
|
|
|
|
Actor_Kill(&this->actor);
|
|
|
|
}
|
|
|
|
return;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else {
|
2020-03-17 04:31:30 +00:00
|
|
|
Audio_PlaySoundGeneral(NA_SE_SY_GET_ITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
|
|
|
|
}
|
|
|
|
|
|
|
|
Flags_SetCollectible(globalCtx, this->collectibleFlag);
|
|
|
|
|
|
|
|
this->unk_15A = 15;
|
|
|
|
this->unk_154 = 35;
|
|
|
|
this->actor.shape.rot.z = 0;
|
|
|
|
this->actor.speedXZ = 0;
|
|
|
|
this->actor.velocity.y = 0;
|
|
|
|
this->actor.gravity = 0;
|
|
|
|
|
|
|
|
Actor_SetScale(&this->actor, this->unk_15C);
|
|
|
|
|
|
|
|
this->unk_152 = 0;
|
|
|
|
En_Item00_SetNewUpdate(this, (ActorFunc)func_8001E5C8);
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
#pragma GLOBAL_ASM("asm/non_matchings/code/z_en_item00/En_Item00_Update.s")
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// Draw Function prototypes (used in En_Item00_Draw)
|
|
|
|
void func_8001EF30(ActorEnItem00* this, GlobalContext* globalCtx);
|
|
|
|
void func_8001F080(ActorEnItem00* this, GlobalContext* globalCtx);
|
|
|
|
void func_8001F1F4(ActorEnItem00* this, GlobalContext* globalCtx);
|
|
|
|
void func_8001F334(ActorEnItem00* this, GlobalContext* globalCtx);
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
void En_Item00_Draw(ActorEnItem00* this, GlobalContext* globalCtx) {
|
2020-03-17 04:31:30 +00:00
|
|
|
s32 pad;
|
|
|
|
f32 unkFloat;
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (!(this->unk_156 & this->unk_158)) {
|
|
|
|
switch (this->actor.params) {
|
2020-03-17 04:31:30 +00:00
|
|
|
case DROP_RUPEE_GREEN:
|
|
|
|
case DROP_RUPEE_BLUE:
|
|
|
|
case DROP_RUPEE_RED:
|
|
|
|
case DROP_RUPEE_ORANGE:
|
|
|
|
case DROP_RUPEE_PURPLE:
|
|
|
|
func_8001EF30(this, globalCtx);
|
|
|
|
break;
|
|
|
|
case DROP_HEART_PIECE:
|
|
|
|
func_8001F334(this, globalCtx);
|
|
|
|
break;
|
|
|
|
case DROP_HEART_CONTAINER:
|
|
|
|
func_8001F1F4(this, globalCtx);
|
|
|
|
break;
|
|
|
|
case DROP_HEART:
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->unk_15A < 0) {
|
|
|
|
if (this->unk_15A == -1) {
|
2020-03-17 04:31:30 +00:00
|
|
|
s8 bankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_HEART);
|
2020-03-22 21:19:43 +00:00
|
|
|
if (Object_IsLoaded(&globalCtx->objectCtx, bankIndex)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
this->actor.objBankIndex = bankIndex;
|
|
|
|
Actor_SetObjectDependency(globalCtx, &this->actor);
|
|
|
|
this->unk_15A = -2;
|
|
|
|
}
|
2020-03-22 21:19:43 +00:00
|
|
|
} else {
|
2020-03-17 04:31:30 +00:00
|
|
|
unkFloat = 16.0f;
|
|
|
|
Matrix_Scale(unkFloat, unkFloat, unkFloat, MTXMODE_APPLY);
|
|
|
|
func_800694A0(globalCtx, 0x08);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case DROP_BOMBS_A:
|
|
|
|
case DROP_BOMBS_B:
|
|
|
|
case DROP_BOMBS_SPECIAL:
|
|
|
|
case DROP_ARROWS_SINGLE:
|
|
|
|
case DROP_ARROWS_SMALL:
|
|
|
|
case DROP_ARROWS_MEDIUM:
|
|
|
|
case DROP_ARROWS_LARGE:
|
|
|
|
case DROP_NUTS:
|
|
|
|
case DROP_STICK:
|
|
|
|
case DROP_MAGIC_LARGE:
|
|
|
|
case DROP_MAGIC_SMALL:
|
|
|
|
case DROP_SEEDS:
|
|
|
|
case DROP_SMALL_KEY:
|
|
|
|
func_8001F080(this, globalCtx);
|
|
|
|
break;
|
|
|
|
case DROP_SHIELD_DEKU:
|
|
|
|
func_800694A0(globalCtx, 0x1C);
|
|
|
|
break;
|
|
|
|
case DROP_SHIELD_HYLIAN:
|
|
|
|
func_800694A0(globalCtx, 0x2B);
|
|
|
|
break;
|
|
|
|
case DROP_TUNIC_ZORA:
|
|
|
|
func_800694A0(globalCtx, 0x3C);
|
|
|
|
break;
|
|
|
|
case DROP_TUNIC_GORON:
|
|
|
|
func_800694A0(globalCtx, 0x3B);
|
|
|
|
break;
|
|
|
|
case DROP_FLEXIBLE:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Draw Function used for Rupee types of En_Item00.
|
|
|
|
*/
|
2020-03-22 21:19:43 +00:00
|
|
|
void func_8001EF30(ActorEnItem00* this, GlobalContext* globalCtx) {
|
2020-03-17 04:31:30 +00:00
|
|
|
GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
|
|
|
|
s32 iconNb;
|
2020-04-05 17:29:30 +00:00
|
|
|
Gfx* dispRefs[5];
|
2020-03-17 04:31:30 +00:00
|
|
|
|
2020-04-05 17:29:30 +00:00
|
|
|
Graph_OpenDisps(dispRefs, globalCtx->state.gfxCtx, "../z_en_item00.c", 1546);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
|
|
func_80093D18(globalCtx->state.gfxCtx);
|
|
|
|
func_8002EBCC(&this->actor, globalCtx, 0);
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (1) { // Necessary to match
|
|
|
|
if (this->actor.params <= DROP_RUPEE_RED) {
|
2020-03-17 04:31:30 +00:00
|
|
|
iconNb = this->actor.params;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else {
|
2020-03-17 04:31:30 +00:00
|
|
|
iconNb = this->actor.params - 0x10;
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_item00.c", 1562),
|
|
|
|
G_MTX_MODELVIEW | G_MTX_LOAD);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
|
|
gSPSegment(gfxCtx->polyOpa.p++, 0x08, SEGMENTED_TO_VIRTUAL(D_80115530[iconNb]));
|
|
|
|
|
|
|
|
gSPDisplayList(gfxCtx->polyOpa.p++, &D_04042440);
|
|
|
|
|
2020-04-05 17:29:30 +00:00
|
|
|
Graph_CloseDisps(dispRefs, globalCtx->state.gfxCtx, "../z_en_item00.c", 1568);
|
2020-03-17 04:31:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Draw Function used for most collectible types of En_Item00 (ammo, bombs, sticks, nuts, magic...).
|
|
|
|
*/
|
2020-03-22 21:19:43 +00:00
|
|
|
void func_8001F080(ActorEnItem00* this, GlobalContext* globalCtx) {
|
2020-03-17 04:31:30 +00:00
|
|
|
s32 iconNb;
|
|
|
|
GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
|
2020-04-05 17:29:30 +00:00
|
|
|
Gfx* dispRefs[4];
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
|
|
iconNb = this->actor.params - 3;
|
|
|
|
|
2020-04-05 17:29:30 +00:00
|
|
|
Graph_OpenDisps(dispRefs, globalCtx->state.gfxCtx, "../z_en_item00.c", 1594);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
|
|
gfxCtx->polyOpa.p = func_800BC8A0(globalCtx, gfxCtx->polyOpa.p);
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (this->actor.params == DROP_BOMBS_SPECIAL) {
|
2020-03-17 04:31:30 +00:00
|
|
|
iconNb = 1;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if (this->actor.params >= DROP_ARROWS_SMALL) {
|
2020-03-17 04:31:30 +00:00
|
|
|
iconNb -= 3;
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
|
|
gfxCtx->polyOpa.p = func_800946E4(gfxCtx->polyOpa.p);
|
|
|
|
|
|
|
|
gSPSegment(gfxCtx->polyOpa.p++, 0x08, SEGMENTED_TO_VIRTUAL(D_80115544[iconNb]));
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_item00.c", 1607),
|
|
|
|
G_MTX_MODELVIEW | G_MTX_LOAD);
|
2020-03-17 04:31:30 +00:00
|
|
|
gSPDisplayList(gfxCtx->polyOpa.p++, &D_0403F070);
|
|
|
|
|
2020-04-05 17:29:30 +00:00
|
|
|
Graph_CloseDisps(dispRefs, globalCtx->state.gfxCtx, "../z_en_item00.c", 1611);
|
2020-03-17 04:31:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Draw Function used for the Heart Container type of En_Item00.
|
|
|
|
*/
|
2020-03-22 21:19:43 +00:00
|
|
|
void func_8001F1F4(ActorEnItem00* this, GlobalContext* globalCtx) {
|
2020-03-17 04:31:30 +00:00
|
|
|
GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
|
2020-04-05 17:29:30 +00:00
|
|
|
Gfx* dispRefs[5];
|
2020-03-17 04:31:30 +00:00
|
|
|
|
2020-04-05 17:29:30 +00:00
|
|
|
Graph_OpenDisps(dispRefs, globalCtx->state.gfxCtx, "../z_en_item00.c", 1623);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
|
|
func_80093D18(globalCtx->state.gfxCtx);
|
|
|
|
func_8002EBCC(&this->actor, globalCtx, 0);
|
2020-03-22 21:19:43 +00:00
|
|
|
gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_item00.c", 1634),
|
|
|
|
G_MTX_MODELVIEW | G_MTX_LOAD);
|
2020-03-17 04:31:30 +00:00
|
|
|
gSPDisplayList(gfxCtx->polyOpa.p++, &D_0403BBA0);
|
|
|
|
|
|
|
|
func_80093D84(globalCtx->state.gfxCtx);
|
|
|
|
func_8002ED80(&this->actor, globalCtx, 0);
|
2020-03-22 21:19:43 +00:00
|
|
|
gSPMatrix(gfxCtx->polyXlu.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_item00.c", 1644),
|
|
|
|
G_MTX_MODELVIEW | G_MTX_LOAD);
|
2020-03-17 04:31:30 +00:00
|
|
|
gSPDisplayList(gfxCtx->polyXlu.p++, &D_0403BCD8);
|
|
|
|
|
2020-04-05 17:29:30 +00:00
|
|
|
Graph_CloseDisps(dispRefs, globalCtx->state.gfxCtx, "../z_en_item00.c", 1647);
|
2020-03-17 04:31:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Draw Function used for the Piece of Heart type of En_Item00.
|
|
|
|
*/
|
2020-03-22 21:19:43 +00:00
|
|
|
void func_8001F334(ActorEnItem00* this, GlobalContext* globalCtx) {
|
2020-03-17 04:31:30 +00:00
|
|
|
GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
|
2020-04-05 17:29:30 +00:00
|
|
|
Gfx* dispRefs[5];
|
2020-03-17 04:31:30 +00:00
|
|
|
|
2020-04-05 17:29:30 +00:00
|
|
|
Graph_OpenDisps(dispRefs, globalCtx->state.gfxCtx, "../z_en_item00.c", 1658);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
|
|
func_80093D84(globalCtx->state.gfxCtx);
|
|
|
|
func_8002ED80(&this->actor, globalCtx, 0);
|
2020-03-22 21:19:43 +00:00
|
|
|
gSPMatrix(gfxCtx->polyXlu.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_item00.c", 1670),
|
|
|
|
G_MTX_MODELVIEW | G_MTX_LOAD);
|
2020-03-17 04:31:30 +00:00
|
|
|
gSPDisplayList(gfxCtx->polyXlu.p++, &D_0403B030);
|
|
|
|
|
2020-04-05 17:29:30 +00:00
|
|
|
Graph_CloseDisps(dispRefs, globalCtx->state.gfxCtx, "../z_en_item00.c", 1673);
|
2020-03-17 04:31:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Converts a given drop type ID based on link's current age, health and owned items.
|
|
|
|
* Returns a new drop type ID or -1 to cancel the drop.
|
|
|
|
*/
|
2020-03-22 21:19:43 +00:00
|
|
|
s16 func_8001F404(s16 dropId) {
|
|
|
|
if (LINK_IS_ADULT) {
|
|
|
|
if (dropId == DROP_SEEDS) {
|
2020-03-17 04:31:30 +00:00
|
|
|
dropId = DROP_ARROWS_SMALL;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if (dropId == DROP_STICK) {
|
2020-03-17 04:31:30 +00:00
|
|
|
dropId = DROP_RUPEE_GREEN;
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (dropId == DROP_ARROWS_SMALL || dropId == DROP_ARROWS_MEDIUM || dropId == DROP_ARROWS_LARGE) {
|
2020-03-17 04:31:30 +00:00
|
|
|
dropId = DROP_SEEDS;
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// This is convoluted but it seems like it must be a single condition to match
|
2020-03-22 21:19:43 +00:00
|
|
|
// clang-format off
|
2020-03-17 04:31:30 +00:00
|
|
|
if (((dropId == DROP_BOMBS_A || dropId == DROP_BOMBS_SPECIAL || dropId == DROP_BOMBS_B) && INV_CONTENT(ITEM_BOMB) == ITEM_NONE) ||
|
|
|
|
((dropId == DROP_ARROWS_SMALL || dropId == DROP_ARROWS_MEDIUM || dropId == DROP_ARROWS_LARGE) && INV_CONTENT(ITEM_BOW) == ITEM_NONE) ||
|
2020-04-16 21:36:12 +00:00
|
|
|
((dropId == DROP_MAGIC_LARGE || dropId == DROP_MAGIC_SMALL) && gSaveContext.magicLevel == 0) ||
|
2020-03-22 21:19:43 +00:00
|
|
|
((dropId == DROP_SEEDS) && INV_CONTENT(ITEM_SLINGSHOT) == ITEM_NONE)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
return -1;
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
|
|
|
// clang-format on
|
2020-03-17 04:31:30 +00:00
|
|
|
|
2020-04-16 21:36:12 +00:00
|
|
|
if (dropId == DROP_HEART && gSaveContext.healthCapacity == gSaveContext.health) {
|
2020-03-17 04:31:30 +00:00
|
|
|
return DROP_RUPEE_GREEN;
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
|
|
return dropId;
|
|
|
|
}
|
|
|
|
|
|
|
|
// External functions used by other actors to drop collectibles, which usually results in spawning an En_Item00 actor.
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
Actor* Item_DropCollectible(GlobalContext* globalCtx, Vec3f* spawnPos, s16 params) {
|
2020-03-17 04:31:30 +00:00
|
|
|
s32 pad[2];
|
|
|
|
ActorEnItem00* spawnedActor = NULL;
|
|
|
|
s16 param4000 = params & 0x4000;
|
|
|
|
s16 param8000 = params & 0x8000;
|
|
|
|
s16 param3F00 = params & 0x3F00;
|
|
|
|
|
|
|
|
params = params & 0x3FFF;
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (((params & 0x00FF) == DROP_FLEXIBLE) && !param4000) {
|
2020-03-17 04:31:30 +00:00
|
|
|
// TODO: Prevent the cast to ActorEnItem00 here since this is a different actor (En_Elf)
|
2020-03-22 21:19:43 +00:00
|
|
|
spawnedActor = (ActorEnItem00*)Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x,
|
|
|
|
spawnPos->y + 40.0f, spawnPos->z, 0, 0, 0, 0x0002);
|
2020-03-17 04:31:30 +00:00
|
|
|
func_8002A9F4(globalCtx, spawnPos, 0x28E7, 1, 1, 0x28);
|
2020-03-22 21:19:43 +00:00
|
|
|
} else {
|
|
|
|
if (!param8000) {
|
2020-03-17 04:31:30 +00:00
|
|
|
params = func_8001F404(params & 0x00FF);
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (params != -1) {
|
|
|
|
spawnedActor =
|
|
|
|
(ActorEnItem00*)Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ITEM00, spawnPos->x, spawnPos->y,
|
|
|
|
spawnPos->z, 0, 0, 0, params | param8000 | param3F00);
|
|
|
|
if ((spawnedActor != NULL) && !param8000) {
|
2020-03-17 04:31:30 +00:00
|
|
|
spawnedActor->actor.velocity.y = !param4000 ? 8.0f : -2.0f;
|
|
|
|
spawnedActor->actor.speedXZ = 2.0f;
|
|
|
|
spawnedActor->actor.gravity = -0.9f;
|
|
|
|
spawnedActor->actor.posRot.rot.y = Math_Rand_CenteredFloat(65536.0f);
|
|
|
|
Actor_SetScale(&spawnedActor->actor, 0.0f);
|
|
|
|
En_Item00_SetNewUpdate(spawnedActor, (ActorFunc)func_8001E304);
|
|
|
|
spawnedActor->unk_15A = 220;
|
|
|
|
if ((spawnedActor->actor.params != DROP_SMALL_KEY) &&
|
|
|
|
(spawnedActor->actor.params != DROP_HEART_PIECE) &&
|
2020-03-22 21:19:43 +00:00
|
|
|
(spawnedActor->actor.params != DROP_HEART_CONTAINER)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
spawnedActor->actor.room = -1;
|
|
|
|
}
|
|
|
|
spawnedActor->actor.flags |= 0x0010;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
return (Actor*)spawnedActor;
|
2020-03-17 04:31:30 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
Actor* Item_DropCollectible2(GlobalContext* globalCtx, Vec3f* spawnPos, s16 params) {
|
2020-03-17 04:31:30 +00:00
|
|
|
ActorEnItem00* spawnedActor = NULL;
|
|
|
|
s32 pad;
|
|
|
|
s16 param4000 = params & 0x4000;
|
|
|
|
s16 param8000 = params & 0x8000;
|
|
|
|
s16 param3F00 = params & 0x3F00;
|
|
|
|
|
|
|
|
params = params & 0x3FFF;
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (((params & 0x00FF) == DROP_FLEXIBLE) && !param4000) {
|
2020-03-17 04:31:30 +00:00
|
|
|
// TODO: Prevent the cast to ActorEnItem00 here since this is a different actor (En_Elf)
|
2020-03-22 21:19:43 +00:00
|
|
|
spawnedActor = (ActorEnItem00*)Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x,
|
|
|
|
spawnPos->y + 40.0f, spawnPos->z, 0, 0, 0, 0x0002);
|
2020-03-17 04:31:30 +00:00
|
|
|
func_8002A9F4(globalCtx, spawnPos, 0x28E7, 1, 1, 0x28);
|
2020-03-22 21:19:43 +00:00
|
|
|
} else {
|
2020-03-17 04:31:30 +00:00
|
|
|
params = func_8001F404(params & 0x00FF);
|
2020-03-22 21:19:43 +00:00
|
|
|
if (params != -1) {
|
|
|
|
spawnedActor =
|
|
|
|
(ActorEnItem00*)Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ITEM00, spawnPos->x, spawnPos->y,
|
|
|
|
spawnPos->z, 0, 0, 0, params | param8000 | param3F00);
|
|
|
|
if ((spawnedActor != NULL) && !param8000) {
|
2020-03-17 04:31:30 +00:00
|
|
|
spawnedActor->actor.velocity.y = 0.0f;
|
|
|
|
spawnedActor->actor.speedXZ = 0.0f;
|
|
|
|
spawnedActor->actor.gravity = param4000 ? 0.0f : -0.9f;
|
|
|
|
spawnedActor->actor.posRot.rot.y = Math_Rand_CenteredFloat(65536.0f);
|
|
|
|
spawnedActor->actor.flags |= 0x0010;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
return (Actor*)spawnedActor;
|
2020-03-17 04:31:30 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3f* spawnPos, s16 params) {
|
2020-03-17 04:31:30 +00:00
|
|
|
s32 pad;
|
|
|
|
ActorEnItem00* spawnedActor;
|
|
|
|
s16 dropQuantity;
|
|
|
|
s16 param8000;
|
|
|
|
s16 dropTableIndex;
|
|
|
|
u8 dropId;
|
|
|
|
|
|
|
|
dropTableIndex = Math_Rand_ZeroOne() * 16.0f;
|
|
|
|
param8000 = params & 0x8000;
|
|
|
|
params = params & 0x7FFF;
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (fromActor != NULL) {
|
|
|
|
if (fromActor->unk_116) {
|
|
|
|
if (fromActor->unk_116 & 0x01) {
|
2020-03-17 04:31:30 +00:00
|
|
|
params = 1 * 0x10;
|
|
|
|
dropTableIndex = 0xB;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if (fromActor->unk_116 & 0x02) {
|
2020-03-17 04:31:30 +00:00
|
|
|
params = 1 * 0x10;
|
|
|
|
dropTableIndex = 0x6;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if (fromActor->unk_116 & 0x04) {
|
2020-03-17 04:31:30 +00:00
|
|
|
params = 6 * 0x10;
|
|
|
|
dropTableIndex = 0x9;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if (fromActor->unk_116 & 0x08) {
|
2020-03-17 04:31:30 +00:00
|
|
|
params = 3 * 0x10;
|
|
|
|
dropTableIndex = 0xB;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if (fromActor->unk_116 & 0x10) {
|
2020-03-17 04:31:30 +00:00
|
|
|
params = 6 * 0x10;
|
|
|
|
dropTableIndex = 0xC;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if (fromActor->unk_116 & 0x20) {
|
2020-03-17 04:31:30 +00:00
|
|
|
params = 0 * 0x10;
|
|
|
|
dropTableIndex = 0x0;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if (fromActor->unk_116 & 0x40) {
|
2020-03-17 04:31:30 +00:00
|
|
|
params = 0 * 0x10;
|
|
|
|
dropTableIndex = 0x1;
|
|
|
|
}
|
|
|
|
}
|
2020-03-22 21:19:43 +00:00
|
|
|
if (fromActor->unk_116 & 0x20) {
|
2020-03-17 04:31:30 +00:00
|
|
|
dropId = DROP_RUPEE_PURPLE;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else {
|
2020-03-17 04:31:30 +00:00
|
|
|
dropId = D_80115574[params + dropTableIndex];
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
|
|
|
} else {
|
2020-03-17 04:31:30 +00:00
|
|
|
dropId = D_80115574[params + dropTableIndex];
|
2020-03-22 21:19:43 +00:00
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (dropId == DROP_FLEXIBLE) {
|
|
|
|
if (gSaveContext.health <= 0x10) { // 1 heart or less
|
|
|
|
Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0,
|
|
|
|
0, 0, 0x0002);
|
2020-03-17 04:31:30 +00:00
|
|
|
func_8002A9F4(globalCtx, spawnPos, 0x28E7, 1, 1, 0x28);
|
|
|
|
return;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if (gSaveContext.health <= 0x30) { // 3 hearts or less
|
2020-03-17 04:31:30 +00:00
|
|
|
params = 0xB * 0x10;
|
|
|
|
dropTableIndex = 0x0;
|
|
|
|
dropId = DROP_HEART;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if (gSaveContext.health <= 0x50) { // 5 hearts or less
|
2020-03-17 04:31:30 +00:00
|
|
|
params = 0xA * 0x10;
|
|
|
|
dropTableIndex = 0x0;
|
|
|
|
dropId = DROP_HEART;
|
2020-04-16 21:36:12 +00:00
|
|
|
} else if ((gSaveContext.magicLevel != 0) && (gSaveContext.magic == 0)) { // Empty magic meter
|
2020-03-17 04:31:30 +00:00
|
|
|
params = 0xA * 0x10;
|
|
|
|
dropTableIndex = 0x0;
|
|
|
|
dropId = DROP_MAGIC_LARGE;
|
2020-04-16 21:36:12 +00:00
|
|
|
} else if ((gSaveContext.magicLevel != 0) &&
|
|
|
|
(gSaveContext.magic <= (gSaveContext.magicLevel >> 1))) { // Half magic or less
|
2020-03-17 04:31:30 +00:00
|
|
|
params = 0xA * 0x10;
|
|
|
|
dropTableIndex = 0x0;
|
|
|
|
dropId = DROP_MAGIC_SMALL;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if (LINK_IS_CHILD && (AMMO(ITEM_SLINGSHOT) < 6)) { // Child and less then 6 deku seeds
|
2020-03-17 04:31:30 +00:00
|
|
|
params = 0xA * 0x10;
|
|
|
|
dropTableIndex = 0x0;
|
|
|
|
dropId = DROP_SEEDS;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if (LINK_IS_ADULT && (AMMO(ITEM_BOW) < 6)) { // Adult and less than 6 arrows
|
2020-03-17 04:31:30 +00:00
|
|
|
params = 0xA * 0x10;
|
|
|
|
dropTableIndex = 0x0;
|
|
|
|
dropId = DROP_ARROWS_MEDIUM;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if (AMMO(ITEM_BOMB) < 6) { // Less than 6 bombs
|
2020-03-17 04:31:30 +00:00
|
|
|
params = 0xD * 0x10;
|
|
|
|
dropTableIndex = 0x0;
|
|
|
|
dropId = DROP_BOMBS_A;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else if (gSaveContext.rupees < 11) { // Less than 11 Rupees
|
2020-03-17 04:31:30 +00:00
|
|
|
params = 0xA * 0x10;
|
|
|
|
dropTableIndex = 0x0;
|
|
|
|
dropId = DROP_RUPEE_RED;
|
2020-03-22 21:19:43 +00:00
|
|
|
} else {
|
2020-03-17 04:31:30 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-22 21:19:43 +00:00
|
|
|
if (dropId != 0xFF) {
|
2020-03-17 04:31:30 +00:00
|
|
|
dropQuantity = D_80115664[params + dropTableIndex];
|
2020-03-22 21:19:43 +00:00
|
|
|
while (dropQuantity > 0) {
|
|
|
|
if (!param8000) {
|
2020-03-17 04:31:30 +00:00
|
|
|
dropId = func_8001F404(dropId);
|
2020-03-22 21:19:43 +00:00
|
|
|
if (dropId != 0xFF) {
|
|
|
|
spawnedActor = (ActorEnItem00*)Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ITEM00,
|
|
|
|
spawnPos->x, spawnPos->y, spawnPos->z, 0, 0, 0, dropId);
|
|
|
|
if ((spawnedActor != NULL) && (dropId != 0xFF)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
spawnedActor->actor.velocity.y = 8.0f;
|
|
|
|
spawnedActor->actor.speedXZ = 2.0f;
|
|
|
|
spawnedActor->actor.gravity = -0.9f;
|
|
|
|
spawnedActor->actor.posRot.rot.y = Math_Rand_ZeroOne() * 40000.0f;
|
|
|
|
Actor_SetScale(&spawnedActor->actor, 0.0f);
|
|
|
|
En_Item00_SetNewUpdate(spawnedActor, (ActorFunc)func_8001E304);
|
|
|
|
spawnedActor->actor.flags |= 0x0010;
|
|
|
|
if ((spawnedActor->actor.params != DROP_SMALL_KEY) &&
|
|
|
|
(spawnedActor->actor.params != DROP_HEART_PIECE) &&
|
2020-03-22 21:19:43 +00:00
|
|
|
(spawnedActor->actor.params != DROP_HEART_CONTAINER)) {
|
2020-03-17 04:31:30 +00:00
|
|
|
spawnedActor->actor.room = -1;
|
|
|
|
}
|
|
|
|
spawnedActor->unk_15A = 220;
|
|
|
|
}
|
|
|
|
}
|
2020-03-22 21:19:43 +00:00
|
|
|
} else {
|
2020-03-17 04:31:30 +00:00
|
|
|
Item_DropCollectible(globalCtx, spawnPos, params | 0x8000);
|
|
|
|
}
|
|
|
|
dropQuantity--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|