mirror of https://github.com/zeldaret/mm.git
Ishi: some docs
This commit is contained in:
parent
2b069011be
commit
3ffb6a7fcc
|
@ -22,22 +22,22 @@ void func_8095D804(Actor* thisx, PlayState* play);
|
||||||
void func_8095DABC(Actor* thisx, PlayState* play);
|
void func_8095DABC(Actor* thisx, PlayState* play);
|
||||||
void func_8095DDA8(EnIshi* this, PlayState* play);
|
void func_8095DDA8(EnIshi* this, PlayState* play);
|
||||||
void func_8095DE9C(EnIshi* this, PlayState* play);
|
void func_8095DE9C(EnIshi* this, PlayState* play);
|
||||||
void func_8095E5AC(EnIshi* this);
|
void EnIshi_SetupWaitForObject(EnIshi* this);
|
||||||
void func_8095E5C0(EnIshi* this, PlayState* play);
|
void EnIshi_WaitForObject(EnIshi* this, PlayState* play);
|
||||||
void func_8095E64C(EnIshi* this);
|
void func_8095E64C(EnIshi* this);
|
||||||
void func_8095E660(EnIshi* this, PlayState* play);
|
void func_8095E660(EnIshi* this, PlayState* play);
|
||||||
void func_8095E934(EnIshi* this);
|
void EnIshi_SetupHeldByPlayer(EnIshi* this);
|
||||||
void func_8095E95C(EnIshi* this, PlayState* play);
|
void EnIshi_HeldByPlayer(EnIshi* this, PlayState* play);
|
||||||
void func_8095EA70(EnIshi* this);
|
void EnIshi_SetupThrown(EnIshi* this);
|
||||||
void func_8095EBDC(EnIshi* this, PlayState* play);
|
void EnIshi_Thrown(EnIshi* this, PlayState* play);
|
||||||
void func_8095F060(EnIshi* this);
|
void func_8095F060(EnIshi* this);
|
||||||
void func_8095F0A4(EnIshi* this, PlayState* play);
|
void func_8095F0A4(EnIshi* this, PlayState* play);
|
||||||
void func_8095F180(EnIshi* this);
|
void func_8095F180(EnIshi* this);
|
||||||
void func_8095F194(EnIshi* this, PlayState* play);
|
void func_8095F194(EnIshi* this, PlayState* play);
|
||||||
void func_8095F210(EnIshi* this, PlayState* play);
|
void func_8095F210(EnIshi* this, PlayState* play);
|
||||||
void func_8095F36C(EnIshi* this, PlayState* play);
|
void func_8095F36C(EnIshi* this, PlayState* play);
|
||||||
void func_8095F61C(Actor* thisx, PlayState* play);
|
void EnIshi_DrawBoulder(Actor* thisx, PlayState* play);
|
||||||
void func_8095F654(Actor* thisx, PlayState* play);
|
void EnIshi_DrawSmallRock(Actor* thisx, PlayState* play);
|
||||||
|
|
||||||
static s16 D_8095F690 = 0;
|
static s16 D_8095F690 = 0;
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ ActorProfile En_Ishi_Profile = {
|
||||||
/**/ NULL,
|
/**/ NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static f32 D_8095F6B8[] = { 0.1f, 0.4f };
|
static f32 sIshiSizes[] = { 0.1f, 0.4f };
|
||||||
|
|
||||||
static f32 D_8095F6C0[] = { 58.0f, 80.0f };
|
static f32 D_8095F6C0[] = { 58.0f, 80.0f };
|
||||||
|
|
||||||
|
@ -139,33 +139,34 @@ static InitChainEntry sInitChain[][5] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static u16 D_8095F7AC[] = { NA_SE_PL_PULL_UP_ROCK, NA_SE_PL_PULL_UP_BIGROCK };
|
static u16 sIshiPullRockSfx[] = { NA_SE_PL_PULL_UP_ROCK, NA_SE_PL_PULL_UP_BIGROCK };
|
||||||
|
|
||||||
static EnIshiUnkFunc D_8095F7B0[] = { func_8095F210, func_8095F36C };
|
static EnIshiUnkFunc D_8095F7B0[] = { func_8095F210, func_8095F36C };
|
||||||
|
|
||||||
void func_8095D6E0(Actor* thisx, PlayState* play) {
|
void EnIshi_InitCollider(Actor* thisx, PlayState* play) {
|
||||||
EnIshi* this = (EnIshi*)thisx;
|
EnIshi* this = (EnIshi*)thisx;
|
||||||
|
|
||||||
Collider_InitCylinder(play, &this->collider);
|
Collider_InitCylinder(play, &this->collider);
|
||||||
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit[ENISHI_GET_1(&this->actor)]);
|
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit[ENISHI_GET_BIG_FLAG(&this->actor)]);
|
||||||
Collider_UpdateCylinder(&this->actor, &this->collider);
|
Collider_UpdateCylinder(&this->actor, &this->collider);
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 func_8095D758(EnIshi* this, PlayState* play, f32 arg2) {
|
// return true/false if hte bush is able to snap to the floor and is above BGCHECK_Y_MIN
|
||||||
Vec3f sp24;
|
s32 EnIshi_SnapToFloor(EnIshi* this, PlayState* play, f32 yOffset) {
|
||||||
|
Vec3f pos;
|
||||||
s32 bgId;
|
s32 bgId;
|
||||||
|
|
||||||
sp24.x = this->actor.world.pos.x;
|
pos.x = this->actor.world.pos.x;
|
||||||
sp24.y = this->actor.world.pos.y + 30.0f;
|
pos.y = this->actor.world.pos.y + 30.0f;
|
||||||
sp24.z = this->actor.world.pos.z;
|
pos.z = this->actor.world.pos.z;
|
||||||
this->actor.floorHeight =
|
this->actor.floorHeight = BgCheck_EntityRaycastFloor5(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &pos);
|
||||||
BgCheck_EntityRaycastFloor5(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &sp24);
|
|
||||||
if (this->actor.floorHeight > BGCHECK_Y_MIN) {
|
if (this->actor.floorHeight > BGCHECK_Y_MIN) {
|
||||||
this->actor.world.pos.y = this->actor.floorHeight + arg2;
|
this->actor.world.pos.y = this->actor.floorHeight + yOffset;
|
||||||
Math_Vec3f_Copy(&this->actor.home.pos, &this->actor.world.pos);
|
Math_Vec3f_Copy(&this->actor.home.pos, &this->actor.world.pos);
|
||||||
return true;
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_8095D804(Actor* thisx, PlayState* play) {
|
void func_8095D804(Actor* thisx, PlayState* play) {
|
||||||
|
@ -176,13 +177,13 @@ void func_8095D804(Actor* thisx, PlayState* play) {
|
||||||
Vec3f spC4;
|
Vec3f spC4;
|
||||||
Vec3f spB8;
|
Vec3f spB8;
|
||||||
|
|
||||||
if (!ENISHI_GET_8(&this->actor)) {
|
if (!ENISHI_GET_USE_OBJECT(&this->actor)) {
|
||||||
phi_s4 = gameplay_field_keep_DL_0066B0;
|
phi_s4 = gameplay_field_keep_DL_0066B0;
|
||||||
} else {
|
} else {
|
||||||
phi_s4 = gSmallRockDL;
|
phi_s4 = gSmallRockDL;
|
||||||
}
|
}
|
||||||
|
|
||||||
objectId = sObjectIds[ENISHI_GET_8(&this->actor)];
|
objectId = sObjectIds[ENISHI_GET_USE_OBJECT(&this->actor)];
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_COUNT(D_8095F74C); i++) {
|
for (i = 0; i < ARRAY_COUNT(D_8095F74C); i++) {
|
||||||
spB8.x = ((Rand_ZeroOne() - 0.5f) * 8.0f) + this->actor.world.pos.x;
|
spB8.x = ((Rand_ZeroOne() - 0.5f) * 8.0f) + this->actor.world.pos.x;
|
||||||
|
@ -293,7 +294,7 @@ void func_8095DE9C(EnIshi* this, PlayState* play) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_8095DF90(EnIshi* this, PlayState* play) {
|
void func_8095DF90(EnIshi* this, PlayState* play) {
|
||||||
if (!ENISHI_GET_1(&this->actor) && !ENISHI_GET_100(&this->actor)) {
|
if (!ENISHI_GET_BIG_FLAG(&this->actor) && !ENISHI_GET_100(&this->actor)) {
|
||||||
Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos, ENISHI_GET_F0(&this->actor) * 0x10);
|
Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos, ENISHI_GET_F0(&this->actor) * 0x10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -332,19 +333,20 @@ void func_8095DFF0(EnIshi* this, PlayState* play) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_8095E14C(EnIshi* this) {
|
void EnIshi_ApplyGravity(EnIshi* this) {
|
||||||
this->actor.velocity.y += this->actor.gravity;
|
this->actor.velocity.y += this->actor.gravity;
|
||||||
if (this->actor.velocity.y < this->actor.terminalVelocity) {
|
if (this->actor.velocity.y < this->actor.terminalVelocity) {
|
||||||
this->actor.velocity.y = this->actor.terminalVelocity;
|
this->actor.velocity.y = this->actor.terminalVelocity;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_8095E180(Vec3f* arg0, f32 arg1) {
|
// scale random velocity?
|
||||||
arg1 += ((Rand_ZeroOne() * 0.2f) - 0.1f) * arg1;
|
void EnIshi_SetVelocity(Vec3f* vel, f32 scale) {
|
||||||
|
scale += ((Rand_ZeroOne() * 0.2f) - 0.1f) * scale;
|
||||||
|
|
||||||
arg0->x -= arg0->x * arg1;
|
vel->x -= vel->x * scale;
|
||||||
arg0->y -= arg0->y * arg1;
|
vel->y -= vel->y * scale;
|
||||||
arg0->z -= arg0->z * arg1;
|
vel->z -= vel->z * scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_8095E204(EnIshi* this, PlayState* play) {
|
void func_8095E204(EnIshi* this, PlayState* play) {
|
||||||
|
@ -377,34 +379,35 @@ s32 EnIshi_IsUnderwater(EnIshi* this, PlayState* play) {
|
||||||
void EnIshi_Init(Actor* thisx, PlayState* play) {
|
void EnIshi_Init(Actor* thisx, PlayState* play) {
|
||||||
s32 pad;
|
s32 pad;
|
||||||
EnIshi* this = (EnIshi*)thisx;
|
EnIshi* this = (EnIshi*)thisx;
|
||||||
s32 sp34 = ENISHI_GET_1(&this->actor);
|
s32 isBig = ENISHI_GET_BIG_FLAG(&this->actor);
|
||||||
s32 sp30 = ENISHI_GET_4(&this->actor);
|
s32 ignoreSnapToFloor = ENISHI_GET_4(&this->actor);
|
||||||
|
|
||||||
if ((sp34 == 0) && (sp30 != 0)) {
|
if ((isBig == false) && (ignoreSnapToFloor != 0)) {
|
||||||
this->unk_197 |= 2;
|
this->flags |= 2; // TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
Actor_ProcessInitChain(&this->actor, sInitChain[sp34]);
|
Actor_ProcessInitChain(&this->actor, sInitChain[isBig]);
|
||||||
|
|
||||||
if (play->csCtx.state != CS_STATE_IDLE) {
|
if (play->csCtx.state != CS_STATE_IDLE) {
|
||||||
this->actor.cullingVolumeDistance += 1000.0f;
|
this->actor.cullingVolumeDistance += 1000.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((this->actor.shape.rot.y == 0) && !(this->unk_197 & 2)) {
|
// randomize y rotation
|
||||||
|
if ((this->actor.shape.rot.y == 0) && !(this->flags & 2)) {
|
||||||
this->actor.shape.rot.y = this->actor.world.rot.y = Rand_Next() >> 0x10;
|
this->actor.shape.rot.y = this->actor.world.rot.y = Rand_Next() >> 0x10;
|
||||||
}
|
}
|
||||||
|
|
||||||
Actor_SetScale(&this->actor, D_8095F6B8[sp34]);
|
Actor_SetScale(&this->actor, sIshiSizes[isBig]);
|
||||||
func_8095D6E0(&this->actor, play);
|
EnIshi_InitCollider(&this->actor, play);
|
||||||
|
|
||||||
if ((sp34 == 1) && Flags_GetSwitch(play, ENISHI_GET_FLAG(&this->actor))) {
|
if (( isBig == 1) && Flags_GetSwitch(play, ENISHI_GET_FLAG(&this->actor))) {
|
||||||
Actor_Kill(&this->actor);
|
Actor_Kill(&this->actor);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CollisionCheck_SetInfo(&this->actor.colChkInfo, NULL, &sColChkInfoInit);
|
CollisionCheck_SetInfo(&this->actor.colChkInfo, NULL, &sColChkInfoInit);
|
||||||
|
|
||||||
if (sp34 == 1) {
|
if ( isBig == true) {
|
||||||
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
|
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
|
||||||
this->actor.shape.shadowScale = 2.3f;
|
this->actor.shape.shadowScale = 2.3f;
|
||||||
} else {
|
} else {
|
||||||
|
@ -412,24 +415,24 @@ void EnIshi_Init(Actor* thisx, PlayState* play) {
|
||||||
this->actor.shape.shadowAlpha = 160;
|
this->actor.shape.shadowAlpha = 160;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->actor.shape.yOffset = D_8095F6C0[sp34];
|
this->actor.shape.yOffset = D_8095F6C0[isBig];
|
||||||
|
|
||||||
if ((sp30 == 0) && !func_8095D758(this, play, 0)) {
|
if ((ignoreSnapToFloor == 0) && !EnIshi_SnapToFloor(this, play, 0)) {
|
||||||
Actor_Kill(&this->actor);
|
Actor_Kill(&this->actor);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EnIshi_IsUnderwater(this, play)) {
|
if (EnIshi_IsUnderwater(this, play)) {
|
||||||
this->unk_197 |= 1;
|
this->flags |= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->objectSlot = Object_GetSlot(&play->objectCtx, sObjectIds[ENISHI_GET_8(&this->actor)]);
|
this->objectSlot = Object_GetSlot(&play->objectCtx, sObjectIds[ENISHI_GET_USE_OBJECT(&this->actor)]);
|
||||||
if (this->objectSlot <= OBJECT_SLOT_NONE) {
|
if (this->objectSlot <= OBJECT_SLOT_NONE) {
|
||||||
Actor_Kill(&this->actor);
|
Actor_Kill(&this->actor);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
func_8095E5AC(this);
|
EnIshi_SetupWaitForObject(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnIshi_Destroy(Actor* thisx, PlayState* play2) {
|
void EnIshi_Destroy(Actor* thisx, PlayState* play2) {
|
||||||
|
@ -439,40 +442,43 @@ void EnIshi_Destroy(Actor* thisx, PlayState* play2) {
|
||||||
Collider_DestroyCylinder(play, &this->collider);
|
Collider_DestroyCylinder(play, &this->collider);
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_8095E5AC(EnIshi* this) {
|
|
||||||
this->actionFunc = func_8095E5C0;
|
// While never used in vanilla, the code supports loading assets from object_ishi instead of gameplay_keep
|
||||||
|
void EnIshi_SetupWaitForObject(EnIshi* this) {
|
||||||
|
this->actionFunc = EnIshi_WaitForObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_8095E5C0(EnIshi* this, PlayState* play) {
|
void EnIshi_WaitForObject(EnIshi* this, PlayState* play) {
|
||||||
if (Object_IsLoaded(&play->objectCtx, this->objectSlot)) {
|
if (Object_IsLoaded(&play->objectCtx, this->objectSlot)) {
|
||||||
this->actor.objectSlot = this->objectSlot;
|
this->actor.objectSlot = this->objectSlot;
|
||||||
this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED;
|
this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED;
|
||||||
if (!ENISHI_GET_8(&this->actor)) {
|
if (!ENISHI_GET_USE_OBJECT(&this->actor)) {
|
||||||
this->actor.draw = func_8095F61C;
|
this->actor.draw = EnIshi_DrawBoulder;
|
||||||
} else {
|
} else {
|
||||||
this->actor.draw = func_8095F654;
|
this->actor.draw = EnIshi_DrawSmallRock;
|
||||||
}
|
}
|
||||||
func_8095E64C(this);
|
func_8095E64C(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// idle
|
||||||
void func_8095E64C(EnIshi* this) {
|
void func_8095E64C(EnIshi* this) {
|
||||||
this->actionFunc = func_8095E660;
|
this->actionFunc = func_8095E660;
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_8095E660(EnIshi* this, PlayState* play) {
|
void func_8095E660(EnIshi* this, PlayState* play) {
|
||||||
s32 pad;
|
s32 pad;
|
||||||
s32 sp38 = ENISHI_GET_1(&this->actor);
|
s32 isBig = ENISHI_GET_BIG_FLAG(&this->actor);
|
||||||
s32 sp34 = (this->collider.base.acFlags & AC_HIT) != 0;
|
s32 activeCollider = (this->collider.base.acFlags & AC_HIT) != 0;
|
||||||
s32 sp30 = this->unk_197 & 2;
|
s32 flag2 = this->flags & 2;
|
||||||
|
|
||||||
if (sp34) {
|
if (activeCollider) {
|
||||||
this->collider.base.acFlags &= ~AC_HIT;
|
this->collider.base.acFlags &= ~AC_HIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Actor_HasParent(&this->actor, play)) {
|
if (Actor_HasParent(&this->actor, play)) { // has been picked up by player
|
||||||
func_8095E934(this);
|
EnIshi_SetupHeldByPlayer(this);
|
||||||
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, D_8095F7AC[sp38]);
|
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, sIshiPullRockSfx[isBig]);
|
||||||
if (ENISHI_GET_2(&this->actor)) {
|
if (ENISHI_GET_2(&this->actor)) {
|
||||||
func_8095E204(this, play);
|
func_8095E204(this, play);
|
||||||
}
|
}
|
||||||
|
@ -480,29 +486,30 @@ void func_8095E660(EnIshi* this, PlayState* play) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sp34 && (sp38 == 0) && (this->collider.elem.acHitElem->atDmgInfo.dmgFlags & 0x508)) {
|
// huh? cutscene?
|
||||||
if (sp30 != 0) {
|
if (activeCollider && (isBig == 0) && (this->collider.elem.acHitElem->atDmgInfo.dmgFlags & 0x508)) {
|
||||||
|
if (flag2 != 0) {
|
||||||
func_8095DFF0(this, play);
|
func_8095DFF0(this, play);
|
||||||
func_8095F060(this);
|
func_8095F060(this);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
func_8095DF90(this, play);
|
func_8095DF90(this, play);
|
||||||
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, D_8095F6D4[sp38], D_8095F6D0[sp38]);
|
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, D_8095F6D4[isBig], D_8095F6D0[isBig]);
|
||||||
D_8095F6D8[sp38](&this->actor, play);
|
D_8095F6D8[isBig](&this->actor, play);
|
||||||
D_8095F6E0[sp38](this, play);
|
D_8095F6E0[isBig](this, play);
|
||||||
Actor_Kill(&this->actor);
|
Actor_Kill(&this->actor);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sp34) {
|
if (activeCollider) {
|
||||||
this->unk_195 = 5;
|
this->unk_195 = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((this->actor.xzDistToPlayer < 600.0f) || (sp30 != 0)) {
|
if ((this->actor.xzDistToPlayer < 600.0f) || (flag2 != 0)) {
|
||||||
if (this->unk_195 > 0) {
|
if (this->unk_195 > 0) {
|
||||||
this->unk_195--;
|
this->unk_195--;
|
||||||
if (this->unk_195 == 0) {
|
if (this->unk_195 == 0) {
|
||||||
this->collider.base.colMaterial = sCylinderInit[sp38].base.colMaterial;
|
this->collider.base.colMaterial = sCylinderInit[isBig].base.colMaterial;
|
||||||
} else {
|
} else {
|
||||||
this->collider.base.colMaterial = COL_MATERIAL_NONE;
|
this->collider.base.colMaterial = COL_MATERIAL_NONE;
|
||||||
}
|
}
|
||||||
|
@ -511,8 +518,8 @@ void func_8095E660(EnIshi* this, PlayState* play) {
|
||||||
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
|
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
|
||||||
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
|
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
|
||||||
|
|
||||||
if ((this->actor.xzDistToPlayer < 90.0f) && (sp30 == 0)) {
|
if ((this->actor.xzDistToPlayer < 90.0f) && (flag2 == 0)) {
|
||||||
if (sp38 == 1) {
|
if (isBig == true) {
|
||||||
Actor_OfferGetItem(&this->actor, play, GI_NONE, 80.0f, 20.0f);
|
Actor_OfferGetItem(&this->actor, play, GI_NONE, 80.0f, 20.0f);
|
||||||
} else {
|
} else {
|
||||||
Actor_OfferGetItem(&this->actor, play, GI_NONE, 50.0f, 10.0f);
|
Actor_OfferGetItem(&this->actor, play, GI_NONE, 50.0f, 10.0f);
|
||||||
|
@ -521,44 +528,47 @@ void func_8095E660(EnIshi* this, PlayState* play) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_8095E934(EnIshi* this) {
|
void EnIshi_SetupHeldByPlayer(EnIshi* this) {
|
||||||
this->actionFunc = func_8095E95C;
|
this->actionFunc = EnIshi_HeldByPlayer;
|
||||||
this->actor.room = -1;
|
this->actor.room = -1;
|
||||||
|
// huh? is there someplace in the game where the camera can gain enough distance
|
||||||
|
// where the player is in camera in the distance, and you can see it dissapear?
|
||||||
this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED;
|
this->actor.flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_8095E95C(EnIshi* this, PlayState* play) {
|
void EnIshi_HeldByPlayer(EnIshi* this, PlayState* play) {
|
||||||
s32 pad;
|
s32 pad;
|
||||||
Vec3f sp30;
|
Vec3f pos;
|
||||||
s32 bgId;
|
s32 bgId;
|
||||||
|
|
||||||
|
// player has tossed us
|
||||||
if (Actor_HasNoParent(&this->actor, play)) {
|
if (Actor_HasNoParent(&this->actor, play)) {
|
||||||
this->actor.room = play->roomCtx.curRoom.num;
|
this->actor.room = play->roomCtx.curRoom.num;
|
||||||
if (ENISHI_GET_1(&this->actor) == 1) {
|
if (ENISHI_GET_BIG_FLAG(&this->actor) == true) {
|
||||||
Flags_SetSwitch(play, ENISHI_GET_FLAG(&this->actor));
|
Flags_SetSwitch(play, ENISHI_GET_FLAG(&this->actor));
|
||||||
}
|
}
|
||||||
func_8095EA70(this);
|
EnIshi_SetupThrown(this);
|
||||||
func_8095E14C(this);
|
EnIshi_ApplyGravity(this);
|
||||||
func_8095E180(&this->actor.velocity, D_8095F6C8[ENISHI_GET_1(&this->actor)]);
|
EnIshi_SetVelocity(&this->actor.velocity, D_8095F6C8[ENISHI_GET_BIG_FLAG(&this->actor)]);
|
||||||
Actor_UpdatePos(&this->actor);
|
Actor_UpdatePos(&this->actor);
|
||||||
Actor_UpdateBgCheckInfo(play, &this->actor, 7.5f, 35.0f, 0.0f,
|
Actor_UpdateBgCheckInfo(play, &this->actor, 7.5f, 35.0f, 0.0f,
|
||||||
UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40 |
|
UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40 |
|
||||||
UPDBGCHECKINFO_FLAG_80);
|
UPDBGCHECKINFO_FLAG_80);
|
||||||
} else {
|
} else { // still being held, follow player
|
||||||
sp30.x = this->actor.world.pos.x;
|
pos.x = this->actor.world.pos.x;
|
||||||
sp30.y = this->actor.world.pos.y + 20.0f;
|
pos.y = this->actor.world.pos.y + 20.0f;
|
||||||
sp30.z = this->actor.world.pos.z;
|
pos.z = this->actor.world.pos.z;
|
||||||
this->actor.floorHeight =
|
this->actor.floorHeight =
|
||||||
BgCheck_EntityRaycastFloor5(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &sp30);
|
BgCheck_EntityRaycastFloor5(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_8095EA70(EnIshi* this) {
|
void EnIshi_SetupThrown(EnIshi* this) {
|
||||||
f32 sp24;
|
f32 sp24;
|
||||||
|
|
||||||
this->actor.velocity.x = Math_SinS(this->actor.world.rot.y) * this->actor.speed;
|
this->actor.velocity.x = Math_SinS(this->actor.world.rot.y) * this->actor.speed;
|
||||||
this->actor.velocity.z = Math_CosS(this->actor.world.rot.y) * this->actor.speed;
|
this->actor.velocity.z = Math_CosS(this->actor.world.rot.y) * this->actor.speed;
|
||||||
if (!ENISHI_GET_1(&this->actor)) {
|
if (!ENISHI_GET_BIG_FLAG(&this->actor)) {
|
||||||
sp24 = Rand_ZeroOne() - 0.9f;
|
sp24 = Rand_ZeroOne() - 0.9f;
|
||||||
D_8095F690 = sp24 * 11000.0f;
|
D_8095F690 = sp24 * 11000.0f;
|
||||||
D_8095F694 = ((Rand_ZeroOne() - 0.5f) * 3000.0f) * (fabsf(sp24) + 0.1f);
|
D_8095F694 = ((Rand_ZeroOne() - 0.5f) * 3000.0f) * (fabsf(sp24) + 0.1f);
|
||||||
|
@ -569,12 +579,12 @@ void func_8095EA70(EnIshi* this) {
|
||||||
}
|
}
|
||||||
this->actor.colChkInfo.mass = 200;
|
this->actor.colChkInfo.mass = 200;
|
||||||
this->unk_194 = 100;
|
this->unk_194 = 100;
|
||||||
this->actionFunc = func_8095EBDC;
|
this->actionFunc = EnIshi_Thrown;
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_8095EBDC(EnIshi* this, PlayState* play) {
|
void EnIshi_Thrown(EnIshi* this, PlayState* play) {
|
||||||
s32 pad;
|
s32 pad;
|
||||||
s32 sp70 = ENISHI_GET_1(&this->actor);
|
s32 isBig = ENISHI_GET_BIG_FLAG(&this->actor);
|
||||||
s16 temp_s0;
|
s16 temp_s0;
|
||||||
s32 i;
|
s32 i;
|
||||||
s16 phi_s0;
|
s16 phi_s0;
|
||||||
|
@ -589,14 +599,14 @@ void func_8095EBDC(EnIshi* this, PlayState* play) {
|
||||||
|
|
||||||
if ((this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_WALL)) || temp_v0 || (this->unk_194 <= 0)) {
|
if ((this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_WALL)) || temp_v0 || (this->unk_194 <= 0)) {
|
||||||
func_8095DF90(this, play);
|
func_8095DF90(this, play);
|
||||||
D_8095F6D8[sp70](&this->actor, play);
|
D_8095F6D8[isBig](&this->actor, play);
|
||||||
|
|
||||||
if (!(this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
|
if (!(this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
|
||||||
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, D_8095F6D4[sp70], D_8095F6D0[sp70]);
|
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, D_8095F6D4[isBig], D_8095F6D0[isBig]);
|
||||||
D_8095F6E0[sp70](this, play);
|
D_8095F6E0[isBig](this, play);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sp70 == 1) {
|
if (isBig == 1) {
|
||||||
s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
|
s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
|
||||||
|
|
||||||
Quake_SetSpeed(quakeIndex, 17232);
|
Quake_SetSpeed(quakeIndex, 17232);
|
||||||
|
@ -611,7 +621,7 @@ void func_8095EBDC(EnIshi* this, PlayState* play) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
|
if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
|
||||||
if (sp70 == 0) {
|
if (isBig == 0) {
|
||||||
sp58.x = this->actor.world.pos.x;
|
sp58.x = this->actor.world.pos.x;
|
||||||
sp58.y = this->actor.world.pos.y + this->actor.depthInWater;
|
sp58.y = this->actor.world.pos.y + this->actor.depthInWater;
|
||||||
sp58.z = this->actor.world.pos.z;
|
sp58.z = this->actor.world.pos.z;
|
||||||
|
@ -645,8 +655,8 @@ void func_8095EBDC(EnIshi* this, PlayState* play) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Math_StepToF(&this->actor.shape.yOffset, 0.0f, 2.0f);
|
Math_StepToF(&this->actor.shape.yOffset, 0.0f, 2.0f);
|
||||||
func_8095E14C(this);
|
EnIshi_ApplyGravity(this);
|
||||||
func_8095E180(&this->actor.velocity, D_8095F6C8[sp70]);
|
EnIshi_SetVelocity(&this->actor.velocity, D_8095F6C8[isBig]);
|
||||||
Actor_UpdatePos(&this->actor);
|
Actor_UpdatePos(&this->actor);
|
||||||
this->actor.shape.rot.x += D_8095F690;
|
this->actor.shape.rot.x += D_8095F690;
|
||||||
this->actor.shape.rot.y += D_8095F694;
|
this->actor.shape.rot.y += D_8095F694;
|
||||||
|
@ -666,7 +676,7 @@ void func_8095F060(EnIshi* this) {
|
||||||
|
|
||||||
void func_8095F0A4(EnIshi* this, PlayState* play) {
|
void func_8095F0A4(EnIshi* this, PlayState* play) {
|
||||||
s32 pad;
|
s32 pad;
|
||||||
s32 sp28 = ENISHI_GET_1(&this->actor);
|
s32 sp28 = ENISHI_GET_BIG_FLAG(&this->actor);
|
||||||
|
|
||||||
if (CutsceneManager_IsNext(this->actor.csId)) {
|
if (CutsceneManager_IsNext(this->actor.csId)) {
|
||||||
CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
|
CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
|
||||||
|
@ -702,7 +712,7 @@ void func_8095F210(EnIshi* this, PlayState* play) {
|
||||||
s32 pad;
|
s32 pad;
|
||||||
s32 sp28;
|
s32 sp28;
|
||||||
|
|
||||||
if ((this->actor.projectedPos.z <= 1200.0f) || ((this->unk_197 & 1) && (this->actor.projectedPos.z < 1300.0f))) {
|
if ((this->actor.projectedPos.z <= 1200.0f) || ((this->flags & 1) && (this->actor.projectedPos.z < 1300.0f))) {
|
||||||
Gfx_DrawDListOpa(play, gameplay_field_keep_DL_0066B0);
|
Gfx_DrawDListOpa(play, gameplay_field_keep_DL_0066B0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -727,7 +737,7 @@ void func_8095F36C(EnIshi* this, PlayState* play) {
|
||||||
|
|
||||||
OPEN_DISPS(play->state.gfxCtx);
|
OPEN_DISPS(play->state.gfxCtx);
|
||||||
|
|
||||||
if ((this->actor.projectedPos.z <= 2150.0f) || ((this->unk_197 & 1) && (this->actor.projectedPos.z < 2250.0f))) {
|
if ((this->actor.projectedPos.z <= 2150.0f) || ((this->flags & 1) && (this->actor.projectedPos.z < 2250.0f))) {
|
||||||
this->actor.shape.shadowAlpha = 160;
|
this->actor.shape.shadowAlpha = 160;
|
||||||
|
|
||||||
Gfx_SetupDL25_Opa(play->state.gfxCtx);
|
Gfx_SetupDL25_Opa(play->state.gfxCtx);
|
||||||
|
@ -754,12 +764,12 @@ void func_8095F36C(EnIshi* this, PlayState* play) {
|
||||||
CLOSE_DISPS(play->state.gfxCtx);
|
CLOSE_DISPS(play->state.gfxCtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_8095F61C(Actor* thisx, PlayState* play) {
|
void EnIshi_DrawBoulder(Actor* thisx, PlayState* play) {
|
||||||
EnIshi* this = (EnIshi*)thisx;
|
EnIshi* this = (EnIshi*)thisx;
|
||||||
|
|
||||||
D_8095F7B0[ENISHI_GET_1(&this->actor)](this, play);
|
D_8095F7B0[ENISHI_GET_BIG_FLAG(&this->actor)](this, play);
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_8095F654(Actor* thisx, PlayState* play) {
|
void EnIshi_DrawSmallRock(Actor* thisx, PlayState* play) {
|
||||||
Gfx_DrawDListOpa(play, gSmallRockDL);
|
Gfx_DrawDListOpa(play, gSmallRockDL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,10 +9,10 @@ typedef void (*EnIshiActionFunc)(struct EnIshi*, PlayState*);
|
||||||
typedef void (*EnIshiUnkFunc)(struct EnIshi*, PlayState*);
|
typedef void (*EnIshiUnkFunc)(struct EnIshi*, PlayState*);
|
||||||
typedef void (*EnIshiUnkFunc2)(Actor*, PlayState*);
|
typedef void (*EnIshiUnkFunc2)(Actor*, PlayState*);
|
||||||
|
|
||||||
#define ENISHI_GET_1(thisx) ((thisx)->params & 1)
|
#define ENISHI_GET_BIG_FLAG(thisx) ((thisx)->params & 1)
|
||||||
#define ENISHI_GET_2(thisx) (((thisx)->params >> 1) & 1)
|
#define ENISHI_GET_2(thisx) (((thisx)->params >> 1) & 1)
|
||||||
#define ENISHI_GET_4(thisx) (((thisx)->params >> 2) & 1)
|
#define ENISHI_GET_4(thisx) (((thisx)->params >> 2) & 1)
|
||||||
#define ENISHI_GET_8(thisx) (((thisx)->params >> 3) & 1)
|
#define ENISHI_GET_USE_OBJECT(thisx) (((thisx)->params >> 3) & 1)
|
||||||
#define ENISHI_GET_70(thisx) (((thisx)->params >> 4) & 7)
|
#define ENISHI_GET_70(thisx) (((thisx)->params >> 4) & 7)
|
||||||
#define ENISHI_GET_F0(thisx) (((thisx)->params >> 4) & 0xF)
|
#define ENISHI_GET_F0(thisx) (((thisx)->params >> 4) & 0xF)
|
||||||
#define ENISHI_GET_100(thisx) (((thisx)->params >> 8) & 1)
|
#define ENISHI_GET_100(thisx) (((thisx)->params >> 8) & 1)
|
||||||
|
@ -22,10 +22,10 @@ typedef struct EnIshi {
|
||||||
/* 0x000 */ Actor actor;
|
/* 0x000 */ Actor actor;
|
||||||
/* 0x144 */ ColliderCylinder collider;
|
/* 0x144 */ ColliderCylinder collider;
|
||||||
/* 0x190 */ EnIshiActionFunc actionFunc;
|
/* 0x190 */ EnIshiActionFunc actionFunc;
|
||||||
/* 0x194 */ s8 unk_194;
|
/* 0x194 */ s8 unk_194; // timer
|
||||||
/* 0x195 */ s8 unk_195;
|
/* 0x195 */ s8 unk_195; // timer
|
||||||
/* 0x196 */ s8 objectSlot;
|
/* 0x196 */ s8 objectSlot;
|
||||||
/* 0x197 */ u8 unk_197;
|
/* 0x197 */ u8 flags; // todo enum
|
||||||
} EnIshi; // size = 0x198
|
} EnIshi; // size = 0x198
|
||||||
|
|
||||||
#endif // Z_EN_ISHI_H
|
#endif // Z_EN_ISHI_H
|
||||||
|
|
|
@ -7279,7 +7279,7 @@ void func_808379C0(PlayState* play, Player* this) {
|
||||||
Actor* interactRangeActor = this->interactRangeActor;
|
Actor* interactRangeActor = this->interactRangeActor;
|
||||||
PlayerAnimationHeader* anim;
|
PlayerAnimationHeader* anim;
|
||||||
|
|
||||||
if ((interactRangeActor->id == ACTOR_EN_ISHI) && (ENISHI_GET_1(interactRangeActor) != 0)) {
|
if ((interactRangeActor->id == ACTOR_EN_ISHI) && (ENISHI_GET_BIG_FLAG(interactRangeActor) != 0)) {
|
||||||
Player_SetAction(play, this, Player_Action_38, 0);
|
Player_SetAction(play, this, Player_Action_38, 0);
|
||||||
anim = &gPlayerAnim_link_silver_carry;
|
anim = &gPlayerAnim_link_silver_carry;
|
||||||
} else if (((interactRangeActor->id == ACTOR_EN_BOMBF) || (interactRangeActor->id == ACTOR_EN_KUSA) ||
|
} else if (((interactRangeActor->id == ACTOR_EN_BOMBF) || (interactRangeActor->id == ACTOR_EN_KUSA) ||
|
||||||
|
|
|
@ -7759,28 +7759,28 @@
|
||||||
0x8095CFC8:("EnOwl_Draw",),
|
0x8095CFC8:("EnOwl_Draw",),
|
||||||
0x8095D074:("func_8095D074",),
|
0x8095D074:("func_8095D074",),
|
||||||
0x8095D24C:("EnOwl_ChangeMode",),
|
0x8095D24C:("EnOwl_ChangeMode",),
|
||||||
0x8095D6E0:("func_8095D6E0",),
|
0x8095D6E0:("EnIshi_InitCollider",),
|
||||||
0x8095D758:("func_8095D758",),
|
0x8095D758:("EnIshi_SnapToFloor",),
|
||||||
0x8095D804:("func_8095D804",),
|
0x8095D804:("func_8095D804",),
|
||||||
0x8095DABC:("func_8095DABC",),
|
0x8095DABC:("func_8095DABC",),
|
||||||
0x8095DDA8:("func_8095DDA8",),
|
0x8095DDA8:("func_8095DDA8",),
|
||||||
0x8095DE9C:("func_8095DE9C",),
|
0x8095DE9C:("func_8095DE9C",),
|
||||||
0x8095DF90:("func_8095DF90",),
|
0x8095DF90:("func_8095DF90",),
|
||||||
0x8095DFF0:("func_8095DFF0",),
|
0x8095DFF0:("func_8095DFF0",),
|
||||||
0x8095E14C:("func_8095E14C",),
|
0x8095E14C:("EnIshi_ApplyGravity",),
|
||||||
0x8095E180:("func_8095E180",),
|
0x8095E180:("EnIshi_SetVelocity",),
|
||||||
0x8095E204:("func_8095E204",),
|
0x8095E204:("func_8095E204",),
|
||||||
0x8095E2B0:("EnIshi_IsUnderwater",),
|
0x8095E2B0:("EnIshi_IsUnderwater",),
|
||||||
0x8095E328:("EnIshi_Init",),
|
0x8095E328:("EnIshi_Init",),
|
||||||
0x8095E580:("EnIshi_Destroy",),
|
0x8095E580:("EnIshi_Destroy",),
|
||||||
0x8095E5AC:("func_8095E5AC",),
|
0x8095E5AC:("EnIshi_SetupWaitForObject",),
|
||||||
0x8095E5C0:("func_8095E5C0",),
|
0x8095E5C0:("EnIshi_WaitForObject",),
|
||||||
0x8095E64C:("func_8095E64C",),
|
0x8095E64C:("func_8095E64C",),
|
||||||
0x8095E660:("func_8095E660",),
|
0x8095E660:("func_8095E660",),
|
||||||
0x8095E934:("func_8095E934",),
|
0x8095E934:("EnIshi_SetupHeldByPlayer",),
|
||||||
0x8095E95C:("func_8095E95C",),
|
0x8095E95C:("EnIshi_HeldByPlayer",),
|
||||||
0x8095EA70:("func_8095EA70",),
|
0x8095EA70:("EnIshi_SetupThrown",),
|
||||||
0x8095EBDC:("func_8095EBDC",),
|
0x8095EBDC:("EnIshi_Thrown",),
|
||||||
0x8095F060:("func_8095F060",),
|
0x8095F060:("func_8095F060",),
|
||||||
0x8095F0A4:("func_8095F0A4",),
|
0x8095F0A4:("func_8095F0A4",),
|
||||||
0x8095F180:("func_8095F180",),
|
0x8095F180:("func_8095F180",),
|
||||||
|
@ -7788,8 +7788,8 @@
|
||||||
0x8095F1EC:("EnIshi_Update",),
|
0x8095F1EC:("EnIshi_Update",),
|
||||||
0x8095F210:("func_8095F210",),
|
0x8095F210:("func_8095F210",),
|
||||||
0x8095F36C:("func_8095F36C",),
|
0x8095F36C:("func_8095F36C",),
|
||||||
0x8095F61C:("func_8095F61C",),
|
0x8095F61C:("EnIshi_DrawBoulder",),
|
||||||
0x8095F654:("func_8095F654",),
|
0x8095F654:("EnIshi_DrawSmallRock",),
|
||||||
0x8095FB10:("ObjHana_Init",),
|
0x8095FB10:("ObjHana_Init",),
|
||||||
0x8095FB38:("ObjHana_Destroy",),
|
0x8095FB38:("ObjHana_Destroy",),
|
||||||
0x8095FB48:("ObjHana_Update",),
|
0x8095FB48:("ObjHana_Update",),
|
||||||
|
|
Loading…
Reference in New Issue