This commit is contained in:
Maide
2022-02-19 20:59:15 +00:00
committed by GitHub
parent 717adf8ed8
commit 0e6cf608d2
6 changed files with 573 additions and 48 deletions
+1 -2
View File
@@ -2752,8 +2752,7 @@ beginseg
name "ovl_En_Pr"
compress
include "build/src/overlays/actors/ovl_En_Pr/z_en_pr.o"
include "build/data/ovl_En_Pr/ovl_En_Pr.data.o"
include "build/data/ovl_En_Pr/ovl_En_Pr.reloc.o"
include "build/src/overlays/actors/ovl_En_Pr/ovl_En_Pr_reloc.o"
endseg
beginseg
+525 -36
View File
@@ -5,8 +5,10 @@
*/
#include "z_en_pr.h"
#include "overlays/actors/ovl_En_Prz/z_en_prz.h"
#include "objects/object_pr/object_pr.h"
#define FLAGS 0x00000015
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10)
#define THIS ((EnPr*)thisx)
@@ -15,18 +17,21 @@ void EnPr_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnPr_Update(Actor* thisx, GlobalContext* globalCtx);
void EnPr_Draw(Actor* thisx, GlobalContext* globalCtx);
void func_80A326F0(EnPr* this);
void func_80A32740(EnPr* this, GlobalContext* globalCtx);
void func_80A32854(EnPr* this);
void func_80A3289C(EnPr* this, GlobalContext* globalCtx);
void func_80A3295C(EnPr* this);
void func_80A32984(EnPr* this, GlobalContext* globalCtx);
void func_80A32A40(EnPr* this, GlobalContext* globalCtx);
void func_80A32AF8(EnPr* this);
void func_80A32B20(EnPr* this, GlobalContext* globalCtx);
void func_80A32CDC(EnPr* this);
void func_80A32D28(EnPr* this, GlobalContext* globalCtx);
void func_80A32EA4(EnPr* this, GlobalContext* globalCtx);
void func_80A32F48(EnPr* this, GlobalContext* globalCtx);
#if 0
// static DamageTable sDamageTable = {
static DamageTable D_80A338A0 = {
static DamageTable sDamageTable = {
/* Deku Nut */ DMG_ENTRY(0, 0x0),
/* Deku Stick */ DMG_ENTRY(0, 0x0),
/* Horse trample */ DMG_ENTRY(0, 0x0),
@@ -61,6 +66,8 @@ static DamageTable D_80A338A0 = {
/* Powder Keg */ DMG_ENTRY(1, 0xF),
};
f32 D_80A338C0[PLAYER_FORM_MAX] = { 30.0f, 30.0f, 30.0f, 15.0f, 15.0f };
const ActorInit En_Pr_InitVars = {
ACTOR_EN_PR,
ACTORCAT_ENEMY,
@@ -73,64 +80,546 @@ const ActorInit En_Pr_InitVars = {
(ActorFunc)EnPr_Draw,
};
// static ColliderCylinderInit sCylinderInit = {
static ColliderCylinderInit D_80A338F4 = {
{ COLTYPE_NONE, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_TYPE_PLAYER, OC1_NONE, OC2_TYPE_1, COLSHAPE_CYLINDER, },
{ ELEMTYPE_UNK4, { 0x20000000, 0x00, 0x04 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, },
static ColliderCylinderInit sCylinderInit = {
{
COLTYPE_NONE,
AT_ON | AT_TYPE_ENEMY,
AC_ON | AC_TYPE_PLAYER,
OC1_NONE,
OC2_TYPE_1,
COLSHAPE_CYLINDER,
},
{
ELEMTYPE_UNK4,
{ 0x20000000, 0x00, 0x04 },
{ 0xF7CFFFFF, 0x00, 0x00 },
TOUCH_ON | TOUCH_SFX_NORMAL,
BUMP_ON,
OCELEM_NONE,
},
{ 18, 20, 5, { 0, 0, 0 } },
};
#endif
static AnimationHeader* sAnimations[] = {
&object_pr_Anim_0021E8, &object_pr_Anim_001E10, &object_pr_Anim_0021E8,
&object_pr_Anim_000740, &object_pr_Anim_000268,
};
extern DamageTable D_80A338A0;
extern ColliderCylinderInit D_80A338F4;
u8 D_80A33934[] = {
0, 2, 0, 0, 2,
};
extern UNK_TYPE D_060021E8;
void EnPr_Init(Actor* thisx, GlobalContext* globalCtx2) {
GlobalContext* globalCtx = globalCtx2;
EnPr* this = THIS;
EnPrz* prz;
s32 i;
s32 temp_s4;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/EnPr_Init.s")
this->actor.colChkInfo.health = 3;
this->actor.colChkInfo.mass = 50;
this->actor.hintId = 0x5C;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/EnPr_Destroy.s")
Collider_InitAndSetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A3242C.s")
this->unk_208 = 255;
this->unk_2CC = 0.01f;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A324E0.s")
Actor_SetScale(&this->actor, 0.01f);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A325E4.s")
this->actor.targetMode = 3;
this->unk_2B8 = this->actor.world.pos.y;
this->actor.shape.yOffset = 1500.0f;
this->actor.colChkInfo.damageTable = &sDamageTable;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A326F0.s")
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &object_pr_Skel_0038B8, &object_pr_Anim_0021E8, this->jointTable,
this->morphTable, 10);
this->unk_2C8 = this->actor.world.rot.z * 20.0f;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A32740.s")
if (this->unk_2C8 < 80.0f) {
this->unk_2C8 = 80.0f;
}
this->actor.world.rot.z = 0;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A32854.s")
temp_s4 = ENPR_GET_FF00(&this->actor);
if (temp_s4 > ENPR_FF00_MAX) {
temp_s4 = ENPR_FF00_MAX;
} else if (temp_s4 < ENPR_FF00_MIN) {
temp_s4 = ENPR_FF00_MIN;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A3289C.s")
this->unk_2F8 = &this->actor;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A3295C.s")
for (i = 0; i < temp_s4; i++) {
prz = (EnPrz*)Actor_SpawnAsChild(&globalCtx->actorCtx, &this->actor, globalCtx, ACTOR_EN_PRZ,
this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, 0,
this->actor.world.rot.y, 0, i + 1);
if (prz != NULL) {
prz->unk_220 = this->unk_2F8;
this->unk_2F8 = &prz->actor;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A32984.s")
this->unk_2D0 = 255;
this->unk_20E = 30;
this->unk_216 = this->actor.world.rot.y;
this->unk_214 = this->actor.world.rot.y;
this->unk_2B4 = this->actor.world.pos.y;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A32A40.s")
func_80A326F0(this);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A32AF8.s")
void EnPr_Destroy(Actor* thisx, GlobalContext* globalCtx) {
EnPr* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A32B20.s")
Collider_DestroyCylinder(globalCtx, &this->collider);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A32CDC.s")
void func_80A3242C(EnPr* this, s32 arg0) {
f32 sp34;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A32D28.s")
this->unk_21C = arg0;
sp34 = 1.0f;
this->unk_2BC = Animation_GetLastFrame(sAnimations[arg0]);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A32E60.s")
if (this->unk_21C == 2) {
sp34 = 2.0f;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A32EA4.s")
Animation_Change(&this->skelAnime, sAnimations[this->unk_21C], sp34, 0.0f, this->unk_2BC, D_80A33934[this->unk_21C],
-2.0f);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A32F48.s")
s32 func_80A324E0(EnPr* this, GlobalContext* globalCtx) {
CollisionPoly* sp54;
Vec3f sp48;
s32 sp44;
WaterBox* sp40;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A33098.s")
if (BgCheck_EntityLineTest1(&globalCtx->colCtx, &this->actor.world.pos, &this->unk_2E0, &sp48, &sp54, 1, 0, 0, 1,
&sp44)) {
return 1;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/EnPr_Update.s")
if (WaterBox_GetSurface1(globalCtx, &globalCtx->colCtx, this->actor.world.pos.x, this->actor.world.pos.z,
&this->unk_2B4, &sp40)) {
if ((this->unk_2B4 - 30.0f) < this->actor.world.pos.y) {
this->unk_2B8 = this->unk_2B4 - 30.0f;
return 2;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A3357C.s")
if (this->actor.world.pos.y < (this->actor.floorHeight + 20.0f)) {
this->unk_2B8 = this->actor.floorHeight + 20.0f;
return 2;
}
return 0;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/func_80A335B4.s")
s32 func_80A325E4(EnPr* this) {
s16 temp = this->unk_214 * 0.2f;
s32 abs = ABS_ALT(temp) & 0xFFFF;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Pr/EnPr_Draw.s")
Math_SmoothStepToS(&this->actor.world.rot.y, this->unk_22C, 1, abs + 1, 0);
this->unk_216 = this->actor.world.rot.y - this->unk_22C;
if (this->unk_216 > 10000) {
this->unk_216 = 10000;
} else if (this->unk_216 < -10000) {
this->unk_216 = -10000;
}
if (ABS_ALT(BINANG_SUB(this->actor.world.rot.y, this->unk_22C)) > 0x100) {
return true;
}
this->unk_216 = 0;
return false;
}
void func_80A326F0(EnPr* this) {
if (this->unk_21C != 0) {
func_80A3242C(this, 0);
}
this->unk_206 = 0;
this->actor.speedXZ = 1.0f;
this->actionFunc = func_80A32740;
}
void func_80A32740(EnPr* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
switch (func_80A324E0(this, globalCtx)) {
case 1:
func_80A3295C(this);
return;
case 2:
this->unk_206 = 3;
this->actionFunc = func_80A32A40;
break;
}
if (this->unk_2C8 < sqrtf(SQ(this->actor.world.pos.x - this->actor.home.pos.x) +
SQ(this->actor.world.pos.z - this->actor.home.pos.z))) {
func_80A32854(this);
} else if ((this->unk_20E == 0) && (player->stateFlags1 & 0x8000000)) {
if (sqrtf(SQ(player->actor.world.pos.x - this->actor.home.pos.x) +
SQ(player->actor.world.pos.z - this->actor.home.pos.z)) < this->unk_2C8) {
func_80A32AF8(this);
}
}
}
void func_80A32854(EnPr* this) {
if (this->unk_21C != 0) {
func_80A3242C(this, 0);
}
this->unk_206 = 1;
this->actionFunc = func_80A3289C;
}
void func_80A3289C(EnPr* this, GlobalContext* globalCtx) {
this->unk_22C = Math_Vec3f_Yaw(&this->actor.world.pos, &this->actor.home.pos);
func_80A325E4(this);
if (sqrtf(SQ(this->actor.world.pos.x - this->actor.home.pos.x) +
SQ(this->actor.world.pos.z - this->actor.home.pos.z)) < (((BREG(53) * 0.1f) + 0.5f) * this->unk_2C8)) {
this->unk_206 = 3;
this->actionFunc = func_80A32A40;
}
}
void func_80A3295C(EnPr* this) {
this->unk_22C = BINANG_ADD(this->actor.world.rot.y, 0x4000);
this->unk_206 = 2;
this->actionFunc = func_80A32984;
}
void func_80A32984(EnPr* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
if ((player->stateFlags1 & 0x8000000) && (this->unk_20E == 0)) {
this->unk_22C = this->actor.world.rot.y;
func_80A32AF8(this);
} else if (!func_80A325E4(this)) {
if (func_80A324E0(this, globalCtx)) {
this->unk_22C += 0x1000;
} else {
if (this->unk_21C != 0) {
func_80A3242C(this, 0);
}
this->unk_206 = 3;
this->actionFunc = func_80A32A40;
}
}
}
void func_80A32A40(EnPr* this, GlobalContext* globalCtx) {
Vec3f sp34;
WaterBox* sp30;
Math_Vec3f_Copy(&sp34, &this->actor.world.pos);
sp34.y = randPlusMinusPoint5Scaled(50.0f) + this->actor.home.pos.y;
if (WaterBox_GetSurface1(globalCtx, &globalCtx->colCtx, this->actor.world.pos.x, this->actor.world.pos.z,
&this->unk_2B4, &sp30)) {
if (sp34.y < (this->unk_2B4 - 30.0f)) {
this->unk_2B8 = sp34.y;
} else {
this->unk_2B8 = this->unk_2B4 - 30.0f;
}
}
this->unk_206 = 0;
this->actionFunc = func_80A32740;
}
void func_80A32AF8(EnPr* this) {
this->unk_206 = 4;
this->skelAnime.playSpeed = 2.0f;
this->actionFunc = func_80A32B20;
}
void func_80A32B20(EnPr* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
this->actor.speedXZ = BREG(57) + 3.0f;
Math_SmoothStepToS(&this->unk_22C, this->actor.yawTowardsPlayer, BREG(49) + 1, BREG(50) + 1000, BREG(51));
this->unk_2B8 = D_80A338C0[(void)0, gSaveContext.playerForm] + player->actor.world.pos.y;
func_80A324E0(this, globalCtx);
if (!(player->stateFlags1 & 0x8000000)) {
this->skelAnime.playSpeed = 1.0f;
this->actor.speedXZ = 1.0f;
func_80A32854(this);
} else if (this->unk_2C8 < sqrtf(SQ(player->actor.world.pos.x - this->actor.home.pos.x) +
SQ(player->actor.world.pos.z - this->actor.home.pos.z))) {
this->skelAnime.playSpeed = 1.0f;
this->actor.speedXZ = 1.0f;
func_80A32854(this);
} else if (!func_80A325E4(this) && (this->actor.xzDistToPlayer < 200.0f) &&
(fabsf(player->actor.world.pos.y - this->actor.world.pos.y) < 80.0f)) {
this->skelAnime.playSpeed = 1.0f;
func_80A32CDC(this);
}
}
void func_80A32CDC(EnPr* this) {
func_80A3242C(this, 3);
this->unk_206 = 5;
this->unk_20A = 400;
this->unk_2C0 = 0.0f;
this->actionFunc = func_80A32D28;
}
void func_80A32D28(EnPr* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
if (!(player->stateFlags1 & 0x8000000)) {
this->skelAnime.playSpeed = 1.0f;
this->actor.speedXZ = 1.0f;
func_80A32854(this);
} else {
Math_SmoothStepToS(&this->unk_22C, this->actor.yawTowardsPlayer, BREG(49) + 1, BREG(50) + 1000, BREG(51));
func_80A325E4(this);
this->unk_2B8 = D_80A338C0[(void)0, gSaveContext.playerForm] + player->actor.world.pos.y;
func_80A324E0(this, globalCtx);
if (this->unk_2C8 < sqrtf(SQ(player->actor.world.pos.x - this->actor.home.pos.x) +
SQ(player->actor.world.pos.z - this->actor.home.pos.z))) {
this->skelAnime.playSpeed = 1.0f;
this->actor.speedXZ = 1.0f;
func_80A32854(this);
}
}
}
void func_80A32E60(EnPr* this) {
func_80A3242C(this, 4);
this->unk_206 = 6;
this->actor.speedXZ = 0.0f;
this->actionFunc = func_80A32EA4;
}
void func_80A32EA4(EnPr* this, GlobalContext* globalCtx) {
f32 curFrame = this->skelAnime.curFrame;
if (this->unk_2BC <= curFrame) {
if (this->actor.colChkInfo.health <= 0) {
this->unk_206 = 7;
this->unk_20A = 50;
this->actor.flags |= ACTOR_FLAG_8000000;
this->unk_2C4 = 0.0f;
Enemy_StartFinishingBlow(globalCtx, &this->actor);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLEWALK_DEAD);
this->unk_216 = 0;
this->actionFunc = func_80A32F48;
} else {
func_80A326F0(this);
}
}
}
void func_80A32F48(EnPr* this, GlobalContext* globalCtx) {
WaterBox* sp2C;
if (this->unk_208 > 0) {
this->unk_208 -= 2;
} else {
this->unk_208 = 0;
}
if (WaterBox_GetSurface1(globalCtx, &globalCtx->colCtx, this->actor.world.pos.x, this->actor.world.pos.z,
&this->unk_2B4, &sp2C)) {
if ((this->unk_2B4 - 100.0f) < this->actor.world.pos.y) {
this->unk_212 += 0xBB8;
this->unk_2C4 = 2.0f * Math_SinS(this->unk_212);
}
Math_ApproachF(&this->actor.world.pos.y, (this->unk_2B4 - 16.0f) + this->unk_2C4, 0.5f, 2.0f);
Math_SmoothStepToS(&this->actor.world.rot.z, 0x7700, 0x12C, 0x3E8, 0x3E8);
}
if ((this->unk_20A == 0) && (this->unk_208 == 0)) {
this->unk_2D2 = 1;
}
if (this->unk_2D2 != 0) {
Math_SmoothStepToS(&this->unk_2D0, 0, 1, 15, 50);
if (this->unk_2D0 < 2) {
Actor_MarkForDeath(&this->actor);
}
}
}
void func_80A33098(EnPr* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
if ((this->unk_206 != 7) && (this->unk_206 != 6)) {
if (this->collider.base.acFlags & AC_HIT) {
this->collider.base.acFlags &= ~AC_HIT;
if (this->actor.colChkInfo.damageEffect == 4) {
this->unk_22E = 40;
this->unk_230 = 20;
Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_CLEAR_TAG, this->actor.focus.pos.x,
this->actor.focus.pos.y, this->actor.focus.pos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
}
if ((player->stateFlags1 & 0x8000000) && (this->actor.colChkInfo.damageEffect == 5)) {
this->unk_22E = 40;
this->unk_230 = 31;
}
if ((this->unk_206 != 6) && (this->unk_206 != 7)) {
Actor_ApplyDamage(&this->actor);
Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_BUBLEWALK_DAMAGE);
func_80A32E60(this);
}
}
}
}
void EnPr_Update(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
EnPr* this = THIS;
s32 i;
SkelAnime_Update(&this->skelAnime);
if (this->unk_20A != 0) {
this->unk_20A--;
}
if (this->unk_20E != 0) {
this->unk_20E--;
}
if (this->unk_20C != 0) {
this->unk_20C--;
}
if (this->unk_210 != 0) {
this->unk_210--;
}
this->actionFunc(this, globalCtx);
Actor_SetFocus(&this->actor, 20.0f);
func_80A33098(this, globalCtx);
Math_Vec3f_Copy(&this->unk_2E0, &this->actor.world.pos);
this->unk_2E0.x += (Math_SinS(this->actor.world.rot.y) * 70.0f);
this->unk_2E0.y = this->unk_2D4.y - 10.0f;
this->unk_2E0.z += Math_CosS(this->actor.world.rot.y) * 70.0f;
Math_SmoothStepToS(&this->unk_214, this->unk_216, 1, 0x7D0, 0);
if (this->unk_210 == 0) {
this->unk_210 = Rand_S16Offset(10, 30);
this->unk_204 = 1;
}
Actor_MoveWithGravity(&this->actor);
if (this->unk_206 != 7) {
Vec3f sp50;
s16 pitch;
Math_ApproachF(&this->actor.world.pos.y, this->unk_2B8, 0.3f, BREG(11) + 1.0f);
Math_Vec3f_Copy(&sp50, &this->actor.world.pos);
sp50.y = this->unk_2B8;
pitch = Math_Vec3f_Pitch(&this->actor.world.pos, &sp50) * 0.3f;
if (fabsf(this->actor.world.pos.y - this->unk_2B8) > 8.0f) {
Math_SmoothStepToS(&this->actor.world.rot.x, pitch, 1, BREG(48) + 500, 0);
} else {
Math_SmoothStepToS(&this->actor.world.rot.x, 0, 1, BREG(52) + 500, 0);
}
}
Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 0.0f, 30.0f, 20.0f, 0x1D);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
if (this->unk_206 != 7) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
CollisionCheck_SetAT(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
if (this->unk_204 != 0) {
Vec3f sp40;
Math_Vec3f_Copy(&sp40, &this->unk_2D4);
this->unk_204 = 0;
sp40.x += randPlusMinusPoint5Scaled(20.0f);
sp40.y += randPlusMinusPoint5Scaled(5.0f);
sp40.z += randPlusMinusPoint5Scaled(20.0f);
for (i = 0; i < (s32)Rand_ZeroFloat(5.0f) + 5; i++) {
EffectSsBubble_Spawn(globalCtx, &sp40, 0.0f, 5.0f, 5.0f, Rand_ZeroFloat(0.03f) + 0.07f);
}
}
}
}
s32 EnPr_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnPr* this = THIS;
if (limbIndex == 2) {
rot->y += this->unk_214;
}
return false;
}
void EnPr_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
Vec3f sp24 = { 0.0f, 0.0f, 0.0f };
EnPr* this = THIS;
if (limbIndex == 2) {
Matrix_InsertTranslation(0.0f, 0.0f, 0.0f, MTXMODE_APPLY);
Matrix_MultiplyVector3fByState(&sp24, &this->unk_2D4);
}
if ((limbIndex == 0) || (limbIndex == 1) || (limbIndex == 2) || (limbIndex == 3) || (limbIndex == 4) ||
(limbIndex == 5) || (limbIndex == 6) || (limbIndex == 7) || (limbIndex == 8) || (limbIndex == 9)) {
Matrix_GetStateTranslation(&this->unk_23C[this->unk_228]);
this->unk_228++;
if (this->unk_228 >= ARRAY_COUNT(this->unk_23C)) {
this->unk_228 = 0;
}
}
}
void EnPr_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnPr* this = THIS;
OPEN_DISPS(globalCtx->state.gfxCtx);
func_8012C28C(globalCtx->state.gfxCtx);
func_8012C2DC(globalCtx->state.gfxCtx);
if (this->unk_2D2 == 0) {
gDPPipeSync(POLY_OPA_DISP++);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->unk_208, this->unk_208, this->unk_208, this->unk_2D0);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, this->unk_2D0);
Scene_SetRenderModeXlu(globalCtx, 0, 1);
SkelAnime_DrawFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnPr_OverrideLimbDraw, EnPr_PostLimbDraw, &this->actor);
} else {
gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->unk_2D0);
Scene_SetRenderModeXlu(globalCtx, 1, 2);
POLY_XLU_DISP = SkelAnime_DrawFlex(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, NULL, NULL, &this->actor, POLY_XLU_DISP);
}
if (this->unk_22E != 0) {
f32 temp = this->unk_22E * 0.05f;
this->unk_238 = 0.8f;
this->unk_234 = 0.8f;
func_800BE680(globalCtx, &this->actor, this->unk_23C, 10, 0.8f, 0.8f, temp, this->unk_230);
}
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
+42 -2
View File
@@ -7,11 +7,51 @@ struct EnPr;
typedef void (*EnPrActionFunc)(struct EnPr*, GlobalContext*);
#define ENPR_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
#define ENPR_FF00_MAX 20
#define ENPR_FF00_MIN 0
typedef struct EnPr {
/* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_144[0xBC];
/* 0x0144 */ SkelAnime skelAnime;
/* 0x0188 */ Vec3s jointTable[10];
/* 0x01C4 */ Vec3s morphTable[10];
/* 0x0200 */ EnPrActionFunc actionFunc;
/* 0x0204 */ char unk_204[0x144];
/* 0x0204 */ u8 unk_204;
/* 0x0206 */ s16 unk_206;
/* 0x0208 */ s16 unk_208;
/* 0x020A */ s16 unk_20A;
/* 0x020C */ s16 unk_20C;
/* 0x020E */ s16 unk_20E;
/* 0x0210 */ s16 unk_210;
/* 0x0212 */ s16 unk_212;
/* 0x0214 */ s16 unk_214;
/* 0x0216 */ s16 unk_216;
/* 0x0218 */ UNK_TYPE1 unk218[4];
/* 0x021C */ s32 unk_21C;
/* 0x0220 */ UNK_TYPE1 unk220[0x8];
/* 0x0228 */ s32 unk_228;
/* 0x022C */ s16 unk_22C;
/* 0x022E */ s16 unk_22E;
/* 0x0230 */ s16 unk_230;
/* 0x0234 */ f32 unk_234;
/* 0x0238 */ f32 unk_238;
/* 0x023C */ Vec3f unk_23C[10];
/* 0x02B4 */ f32 unk_2B4;
/* 0x02B8 */ f32 unk_2B8;
/* 0x02BC */ f32 unk_2BC;
/* 0x02C0 */ f32 unk_2C0;
/* 0x02C4 */ f32 unk_2C4;
/* 0x02C8 */ f32 unk_2C8;
/* 0x02CC */ f32 unk_2CC;
/* 0x02D0 */ s16 unk_2D0;
/* 0x02D2 */ s16 unk_2D2;
/* 0x02D4 */ Vec3f unk_2D4;
/* 0x02E0 */ Vec3f unk_2E0;
/* 0x02EC */ UNK_TYPE1 unk2EC[0xC];
/* 0x02F8 */ Actor* unk_2F8;
/* 0x02FC */ ColliderCylinder collider;
} EnPr; // size = 0x348
extern const ActorInit En_Pr_InitVars;
+3 -1
View File
@@ -11,7 +11,9 @@ typedef struct EnPrz {
/* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_144[0x80];
/* 0x01C4 */ EnPrzActionFunc actionFunc;
/* 0x01C8 */ char unk_1C8[0xA8];
/* 0x01C8 */ char unk_1C8[0x58];
/* 0x0220 */ Actor* unk_220;
/* 0x0224 */ char unk_224[0x4C];
} EnPrz; // size = 0x270
extern const ActorInit En_Prz_InitVars;
+2 -2
View File
@@ -10186,8 +10186,8 @@
0x80A32F48:("func_80A32F48",),
0x80A33098:("func_80A33098",),
0x80A331C4:("EnPr_Update",),
0x80A3357C:("func_80A3357C",),
0x80A335B4:("func_80A335B4",),
0x80A3357C:("EnPr_OverrideLimbDraw",),
0x80A335B4:("EnPr_PostLimbDraw",),
0x80A336C0:("EnPr_Draw",),
0x80A33B00:("func_80A33B00",),
0x80A33BB4:("func_80A33BB4",),
-5
View File
@@ -1732,11 +1732,6 @@ D_06009930 = 0x06009930;
D_0600A844 = 0x0600A844;
D_06012768 = 0x06012768;
// ovl_En_Pr
D_060021E8 = 0x060021E8;
D_060038B8 = 0x060038B8;
// ovl_En_Pr2
D_06003904 = 0x06003904;