Documented ch Tumblar

This commit is contained in:
Owlenuff
2024-10-01 10:27:28 +02:00
parent ecac4dde39
commit 4bf7028254
21 changed files with 210 additions and 174 deletions

View File

@@ -287,7 +287,7 @@ void func_80388BDC(Actor *this) {
f64 phi_f0;
func_802D3D74(this);
mapSpecificFlags_set(MMM_SPECIFIC_FLAG_1_UNKNOWN, BOOL((this->yaw > 260.0f) && (this->yaw < 330.0f)));
mapSpecificFlags_set(MMM_SPECIFIC_FLAG_TUMBLAR_BROKEN, BOOL((this->yaw > 260.0f) && (this->yaw < 330.0f)));
if (!this->volatile_initialized) {
if (this->yaw != 0.0f) {
this->lifetime_value = 0.5f;

View File

@@ -181,7 +181,7 @@ void func_8038A82C(Struct_MMM_3D50_0 * arg0){
if(arg0->unk2 == 'X'){
MMM_func_8038A54C(arg0, 1);
player_getPosition(sp44);
func_8038AD10(MMM_D_8038C510.unkC, MMM_D_8038C510.unk10, sp38);
chTumblar_copyPosition(MMM_D_8038C510.unkC, MMM_D_8038C510.unk10, sp38);
sp38[1] = sp44[1];
func_8028F620(sp38, 300.0f, -1500.0f);
return;
@@ -192,7 +192,7 @@ void func_8038A82C(Struct_MMM_3D50_0 * arg0){
MMM_func_8038A54C(arg0, 3);
if( iPtr->unk0[iPtr->unk4] == 0){
func_8038A140(5);
func_8038AF3C(MMM_D_8038C510.unkC, MMM_D_8038C510.unk10);
chTumblar_congratulate(MMM_D_8038C510.unkC, MMM_D_8038C510.unk10);
func_8025A6EC(COMUSIC_2D_PUZZLE_SOLVED_FANFARE, 32000);
}
else{
@@ -249,7 +249,7 @@ void func_8038AA44(void){
func_8038A750();
if( MMM_D_8038C510.unk8 == 1
&& MMM_D_8038C510.unkC != NULL
&& func_8038AD4C(MMM_D_8038C510.unkC, MMM_D_8038C510.unk10)
&& chTumblar_isBanjoAbove(MMM_D_8038C510.unkC, MMM_D_8038C510.unk10)
){
if(!levelSpecificFlags_get(0x2f)){
levelSpecificFlags_set(0x2f, TRUE);
@@ -265,9 +265,9 @@ void func_8038AA44(void){
func_8038A140(4);
}
else if( MMM_D_8038C510.unkC != NULL
&& func_8038AD4C(MMM_D_8038C510.unkC, MMM_D_8038C510.unk10)
&& chTumblar_isBanjoAbove(MMM_D_8038C510.unkC, MMM_D_8038C510.unk10)
){
func_8038AD10(MMM_D_8038C510.unkC, MMM_D_8038C510.unk10, sp28);
chTumblar_copyPosition(MMM_D_8038C510.unkC, MMM_D_8038C510.unk10, sp28);
tmp_v0 = func_8033F3C0(MMM_D_8038C510.unk0, sp28);
if(tmp_v0){
sp24 = func_8038A26C(tmp_v0);
@@ -286,7 +286,7 @@ void func_8038AA44(void){
}//L8038AB7C
if( MMM_D_8038C510.unk8 == 5
&& func_8038AD38(MMM_D_8038C510.unkC, MMM_D_8038C510.unk10)
&& chTumblar_isDisappeared(MMM_D_8038C510.unkC, MMM_D_8038C510.unk10)
){
func_8038A140(6);
}

View File

@@ -3,16 +3,25 @@
#include "variables.h"
#include <core1/viewport.h>
/* extern functions */
extern void sfxsource_setSampleRate(u8, s32);
extern f32 func_80258640(f32[3], f32[3]);
extern f32 ml_vec3f_horizontal_distance_zero_likely(f32[3], f32[3]);
/* data */
enum chTumblar_state_e {
TUMBLAR_STATE_0_IDLE,
TUMBLAR_STATE_1_CONGRATULATING,
TUMBLAR_STATE_2_BREAKING,
TUMBLAR_STATE_3_DISAPPEARED
};
typedef struct {
ActorMarker *unk0;
u8 unk4;
u8 pad5[3];
f32 unk8;
f32 unkC[3];
}Struct_MMM_47D0_0;
ActorMarker *jiggy_marker;
u8 state;
u8 unused[3];
f32 timer;
f32 velocity[3];
} Struct_MMM_47D0_0;
/* .code */
void MMM_func_8038ABC0(s32 arg0) {
@@ -21,172 +30,198 @@ void MMM_func_8038ABC0(s32 arg0) {
}
}
void func_8038AC04(void){
if((*(u32*)PHYS_TO_K1(0x1D0)) - 0x356BAAAE){
void func_8038AC04(void) {
if ((*(u32 *) PHYS_TO_K1(0x1D0)) - 0x356BAAAE) {
MMM_func_8038ABC0(0x820);
}
}
//BREAK???==========
void func_8038AC40(Struct_MMM_47D0_0 *arg0, struct struct_68_s *arg1, f32 position[3], f32 rotation[3], f32 scale, BKModelBin *model_bin, Gfx **gfx, Mtx **mtx, Vtx **vtx){
u8 temp_v0;
if (arg0->unk4 != 3) {
if ((arg0->unk4 == 0) || (arg0->unk4 == 1)) {
void chTumblar_draw(Struct_MMM_47D0_0 *arg0, struct struct_68_s *arg1, f32 position[3], f32 rotation[3], f32 scale, BKModelBin *model_bin, Gfx **gfx, Mtx **mtx, Vtx **vtx) {
if (arg0->state != TUMBLAR_STATE_3_DISAPPEARED) {
if (arg0->state == TUMBLAR_STATE_0_IDLE || arg0->state == TUMBLAR_STATE_1_CONGRATULATING) {
modelRender_setAlpha(0xFF);
} else if (arg0->unk4 == 2) {
modelRender_setAlpha((s32)((1 - ((f64)arg0->unk8 * 1)) * 255.0));
}
else if (arg0->state == TUMBLAR_STATE_2_BREAKING) {
modelRender_setAlpha((s32)((1 - ((f64) arg0->timer * 1)) * 255.0));
}
modelRender_setDepthMode(MODEL_RENDER_DEPTH_FULL);
modelRender_draw(gfx, mtx, position, rotation, scale, NULL, model_bin);
}
}
void func_8038AD10(s32 arg0, s32 arg1, f32 arg2[3]) {
func_8035179C(arg1, arg2);
void chTumblar_copyPosition(s32 arg0, s32 arg1, f32 arg2[3]) {
func_8035179C_copyPosition(arg1, arg2);
}
bool func_8038AD38(Struct_MMM_47D0_0 *arg0, s32 arg1){
return arg0->unk4 == 3;
bool chTumblar_isDisappeared(Struct_MMM_47D0_0 *arg0, s32 arg1) {
return arg0->state == TUMBLAR_STATE_3_DISAPPEARED;
}
bool func_8038AD4C(s32 arg0, s32 arg1) {
bool chTumblar_isBanjoAbove(s32 arg0, s32 arg1) {
f32 plyr_pos[3];
f32 sp18[3];
f32 position[3];
player_getPosition(plyr_pos);
func_8035179C(arg1, sp18);
return func_803518D4(arg1)
&& (func_80258640(sp18, plyr_pos) < 40.0f)
&& (player_getTransformation() == TRANSFORM_1_BANJO)
&& (func_8028ECAC() == 0);
func_8035179C_copyPosition(arg1, position);
return func_803518D4(arg1) &&
ml_vec3f_horizontal_distance_zero_likely(position, plyr_pos) < 40.0f &&
player_getTransformation() == TRANSFORM_1_BANJO &&
func_8028ECAC() == 0;
}
void MMM_func_8038ADF0(Struct_MMM_47D0_0 *arg0, Struct68s *arg1) {
u8 sp3F;
f32 sp38;
void chTumblar_init(Struct_MMM_47D0_0 *arg0, Struct68s *arg1) {
u8 sfxsource_index;
f32 distance_to_jiggy;
Actor *jiggy;
f32 sp28[3];
f32 position[3];
arg0->state = TUMBLAR_STATE_0_IDLE;
arg0->timer = 0.0f;
arg0->velocity[0] = 0.0f;
arg0->velocity[1] = 0.0f;
arg0->velocity[2] = 0.0f;
arg0->unk4 = 0;
arg0->unk8 = 0.0f;
arg0->unkC[0] = 0.0f;
arg0->unkC[1] = 0.0f;
arg0->unkC[2] = 0.0f;
func_8038AA30(arg0, arg1);
func_80351A14(arg1, (Struct68DrawMethod)func_8038AC40);
sp3F = func_80351758(arg1);
sfxsource_setSfxId(sp3F, SFX_3EC_CCW_DOOR_OPENING);
func_8030DD14(sp3F, 3);
sfxsource_playSfxAtVolume(sp3F, 0.6f);
sfxsource_setSampleRate(sp3F, 0);
func_8030E2C4(sp3F);
func_8035179C(arg1, sp28);
sp38 = 500.0f;
jiggy = actorArray_findClosestActorFromActorId(sp28, ACTOR_46_JIGGY, -1, &sp38);
func_80351A14(arg1, (Struct68DrawMethod) chTumblar_draw);
sfxsource_index = func_80351758_getSfxsourceIndex(arg1);
sfxsource_setSfxId(sfxsource_index, SFX_3EC_CCW_DOOR_OPENING);
func_8030DD14(sfxsource_index, 3);
sfxsource_playSfxAtVolume(sfxsource_index, 0.6f);
sfxsource_setSampleRate(sfxsource_index, 0);
func_8030E2C4(sfxsource_index);
func_8035179C_copyPosition(arg1, position);
distance_to_jiggy = 500.0f;
jiggy = actorArray_findClosestActorFromActorId(position, ACTOR_46_JIGGY, -1, &distance_to_jiggy);
if (jiggy != NULL) {
arg0->unk0 = jiggy->marker;
} else {
arg0->unk0 = NULL;
arg0->jiggy_marker = jiggy->marker;
}
else {
arg0->jiggy_marker = NULL;
}
if (arg0->unk0 != NULL) {
arg0->unk0->collidable = FALSE;
if (arg0->jiggy_marker != NULL) {
arg0->jiggy_marker->collidable = FALSE;
}
if (jiggyscore_isCollected(JIGGY_62_MMM_TUMBLAR)) {
func_80351A04(arg1, 1);
arg0->unk4 = 3;
arg0->state = TUMBLAR_STATE_3_DISAPPEARED;
}
}
void func_8038AF0C(ActorMarker *marker, enum asset_e text_id, s32 arg2) {
mapSpecificFlags_set(MMM_SPECIFIC_FLAG_1_UNKNOWN, TRUE);
void __chTumblar_congratulationTextCallback(ActorMarker *marker, enum asset_e text_id, s32 arg2) {
mapSpecificFlags_set(MMM_SPECIFIC_FLAG_TUMBLAR_BROKEN, TRUE);
}
void func_8038AF3C(Struct_MMM_47D0_0 *arg0, s32 arg1) {
gcdialog_showText(0xADB, 4, NULL, arg0->unk0, func_8038AF0C, NULL);
arg0->unk4 = 1;
void chTumblar_congratulate(Struct_MMM_47D0_0 *arg0, s32 arg1) {
gcdialog_showText(ASSET_ADB_TEXT_UNKNOWN, 4, NULL, arg0->jiggy_marker, __chTumblar_congratulationTextCallback, NULL);
arg0->state = TUMBLAR_STATE_1_CONGRATULATING;
}
void func_8038AF90(Struct_MMM_47D0_0 *arg0, Struct68s *arg1, f32 arg2) {
f32 sp7C[3];
f32 sp70[3];
f32 sp64[3];
Actor *temp_v0_2;
f32 sp54[3];
f32 sp48[3];
f32 sp40[2];
s32 sp3C;
u8 sp38;
void chTumblar_update(Struct_MMM_47D0_0 *arg0, Struct68s *arg1, f32 tick) {
f32 viewport_position[3];
f32 viewport_rotation[3];
f32 direction[3];
Actor *jiggy;
f32 position[3];
f32 plyr_pos[3];
f32 joystick[2];
s32 is_banjo_above;
u8 sfxsource_index;
arg0->timer += tick;
arg0->unk8 += arg2;
if (arg0->unk4 == 0) {
func_8035179C(arg1, sp54);
func_8024E71C(0, sp40);
sp3C = func_8038AD4C(arg0, arg1);
if (sp3C) {
if (arg0->state == TUMBLAR_STATE_0_IDLE) {
func_8035179C_copyPosition(arg1, position);
controller_getJoystick(0, joystick);
is_banjo_above = chTumblar_isBanjoAbove(arg0, arg1);
if (is_banjo_above) {
func_8028F66C(BS_INTR_D_SURF);
}
if (sp3C && ((sp40[0] != 0.0f) || (sp40[1] != 0.0f))) {
viewport_getRotation_vec3f(sp70);
sp64[0] = sp40[0];
sp64[1] = 0.0f;
sp64[2] = -sp40[1];
ml_vec3f_yaw_rotate_copy(sp64, sp64, sp70[1]);
arg0->unkC[0] += sp64[0] * 2500.0f * arg2;
arg0->unkC[2] += sp64[2] * 2500.0f * arg2;
} else {
arg0->unkC[0] *= 0.7;
arg0->unkC[2] *= 0.7;
if (is_banjo_above && (joystick[0] != 0.0f || joystick[1] != 0.0f)) {
viewport_getRotation_vec3f(viewport_rotation);
direction[0] = joystick[0];
direction[1] = 0.0f;
direction[2] = -joystick[1];
ml_vec3f_yaw_rotate_copy(direction, direction, viewport_rotation[1]);
arg0->velocity[0] += direction[0] * 2500.0f * tick;
arg0->velocity[2] += direction[2] * 2500.0f * tick;
}
if (LENGTH_VEC3F(arg0->unkC) > 400.0f) {
ml_vec3f_set_length(arg0->unkC, 400.0f);
else {
arg0->velocity[0] *= 0.7;
arg0->velocity[2] *= 0.7;
}
sp54[0] += arg0->unkC[0] * arg2;
sp54[2] += arg0->unkC[2] * arg2;
func_80351B28(arg1, sp54);
func_8035179C(arg1, sp54);
if (arg0->unk0 != NULL) {
viewport_getPosition_vec3f(sp7C);
sp64[0] = sp54[0] - sp7C[0];
sp64[2] = sp54[2] - sp7C[2];
sp64[1] = 0.0f;
ml_vec3f_normalize(sp64);
temp_v0_2 = marker_getActor(arg0->unk0);
temp_v0_2->position[0] = sp54[0] + (sp64[0] * 20.0f);
temp_v0_2->position[2] = sp54[2] + (sp64[2] * 20.0f);
if (LENGTH_VEC3F(arg0->velocity) > 400.0f) {
ml_vec3f_set_length(arg0->velocity, 400.0f);
}
} else if (arg0->unk4 == 2) {
if (arg0->unk8 >= 1.0f) {
arg0->unk4 = 3U;
if (arg0->unk0 != NULL) {
arg0->unk0->collidable = TRUE;
position[0] += arg0->velocity[0] * tick;
position[2] += arg0->velocity[2] * tick;
func_80351B28(arg1, position);
func_8035179C_copyPosition(arg1, position);
if (arg0->jiggy_marker != NULL) {
viewport_getPosition_vec3f(viewport_position);
direction[0] = position[0] - viewport_position[0];
direction[2] = position[2] - viewport_position[2];
direction[1] = 0.0f;
ml_vec3f_normalize(direction);
jiggy = marker_getActor(arg0->jiggy_marker);
jiggy->position[0] = position[0] + (direction[0] * 20.0f);
jiggy->position[2] = position[2] + (direction[2] * 20.0f);
}
}
else if (arg0->state == TUMBLAR_STATE_2_BREAKING) {
if (arg0->timer >= 1.0f) {
arg0->state = TUMBLAR_STATE_3_DISAPPEARED;
if (arg0->jiggy_marker != NULL) {
arg0->jiggy_marker->collidable = TRUE;
}
func_80351A04(arg1, 1);
}
arg0->unkC[0] *= 0.7;
arg0->unkC[2] *= 0.7;
arg0->velocity[0] *= 0.7;
arg0->velocity[2] *= 0.7;
}
if (arg0->unk4 == 1) {
sp38 = func_80351758(arg1);
sfxsource_setSampleRate(sp38, 0);
} else {
sp38 = func_80351758(arg1);
sfxsource_setSampleRate(sp38, (s32) ((LENGTH_VEC3F(arg0->unkC) / 400.0) * 15000.0));
if (arg0->state == TUMBLAR_STATE_1_CONGRATULATING) {
sfxsource_index = func_80351758_getSfxsourceIndex(arg1);
sfxsource_setSampleRate(sfxsource_index, 0);
}
player_getPosition(sp48);
func_8035179C(arg1, sp54);
if (!mapSpecificFlags_get(MMM_SPECIFIC_FLAG_0_UNKNOWN) && (arg0->unk4 == 0) && (func_80258640(sp54, sp48) < 250.0f)){
if(gcdialog_showText(0xADA, 0, NULL, NULL, NULL, NULL)) {
else {
sfxsource_index = func_80351758_getSfxsourceIndex(arg1);
sfxsource_setSampleRate(sfxsource_index, (s32)((LENGTH_VEC3F(arg0->velocity) / 400.0) * 15000.0));
}
player_getPosition(plyr_pos);
func_8035179C_copyPosition(arg1, position);
if (!mapSpecificFlags_get(MMM_SPECIFIC_FLAG_0_UNKNOWN) && arg0->state == TUMBLAR_STATE_0_IDLE && ml_vec3f_horizontal_distance_zero_likely(position, plyr_pos) < 250.0f) {
if (gcdialog_showText(ASSET_ADA_TEXT_UNKNOWN, 0, NULL, NULL, NULL, NULL)) {
mapSpecificFlags_set(0, TRUE);
}
}
if ((arg0->unk4 == 1) && mapSpecificFlags_get(MMM_SPECIFIC_FLAG_1_UNKNOWN)) {
arg0->unk4 = 2U;
arg0->unk8 = 0.0f;
mapSpecificFlags_set(MMM_SPECIFIC_FLAG_1_UNKNOWN, FALSE);
FUNC_8030E8B4(SFX_11B_TUMBLAR_DISAPPEARING_1, 1.0f, 30000, sp54, 500, 2500);
if (arg0->state == TUMBLAR_STATE_1_CONGRATULATING && mapSpecificFlags_get(MMM_SPECIFIC_FLAG_TUMBLAR_BROKEN)) {
arg0->state = TUMBLAR_STATE_2_BREAKING;
arg0->timer = 0.0f;
mapSpecificFlags_set(MMM_SPECIFIC_FLAG_TUMBLAR_BROKEN, FALSE);
FUNC_8030E8B4(SFX_11B_TUMBLAR_DISAPPEARING_1, 1.0f, 30000, position, 500, 2500);
}
}

View File

@@ -74,7 +74,7 @@ void func_8038B630(Struct5Fs *arg0, Struct68s *arg1){
f32 sp20;
sp20 = alCents2Ratio(func_80389BBC()*100);
phi_s0 = func_80351758(arg1);
phi_s0 = func_80351758_getSfxsourceIndex(arg1);
func_8030E394(phi_s0);
sfxsource_playSfxAtVolume(phi_s0, sp20);
sfxsource_setSfxId(phi_s0, 0x3f3);
@@ -118,7 +118,7 @@ void func_8038B790(Struct5Fs *arg0, Struct68s *arg1, f32 arg2) {
if (arg0->unk14 <= 0.0f) {
func_80351954(arg1);
} else if (arg0->unk14 <= 1.0f) {
sfxsource_setSampleRate(func_80351758(arg1), (s32)(arg0->unk14 * 32767.0f));
sfxsource_setSampleRate(func_80351758_getSfxsourceIndex(arg1), (s32)(arg0->unk14 * 32767.0f));
}
}