350 lines
11 KiB
C
350 lines
11 KiB
C
#include <ultra64.h>
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
|
|
void timed_exitStaticCamera(f32);
|
|
void chTiptup_setState(Actor *this, s32 arg1);
|
|
|
|
typedef struct{
|
|
u32 unk0;
|
|
}Struct_BGS_2270_0s;
|
|
|
|
typedef struct ch_bgs_2270_s{
|
|
u32 unk0;
|
|
vector(Struct_BGS_2270_0s) *unk4;
|
|
u8 unk8;
|
|
u8 unk9;
|
|
u8 unkA;
|
|
u8 unkB;
|
|
f32 unkC;
|
|
} ActorLocal_Tiptup;
|
|
|
|
void chTiptup_update(Actor *this);
|
|
Actor *actor_draw(ActorMarker *, Gfx **, Mtx **, Vtx **);
|
|
|
|
ActorInfo chTiptup = {
|
|
MARKER_19A_TIPTUP, ACTOR_27A_TIPTUP, ASSET_3F8_MODEL_TIPTUP,
|
|
0, NULL,
|
|
chTiptup_update, NULL, actor_draw,
|
|
0, 0, 2.5f, 0
|
|
};
|
|
s16 D_80390854[] = {0, 0xC78, 0xC7A, 0xC7C}; //see again texts
|
|
s16 D_8039085C[] = {0, 0xC77, 0xC79, 0xC7B}; //success texts
|
|
u8 D_80390864[] = {3, 3, 5, 7}; //chchoirgame_sequence_length
|
|
f32 D_80390868[3] = {0.0f, 100.0f, -1020.0f}; //chchoirgame_jiggy_position
|
|
|
|
void BGS_func_80388660(ActorMarker *this){
|
|
chTiptup_setState(marker_getActor(this), 6);
|
|
}
|
|
|
|
void chTiptup_jiggySpawn(void){
|
|
jiggy_spawn(JIGGY_27_BGS_TIPTUP, D_80390868); //spawn jiggy after minigame
|
|
}
|
|
|
|
void chTiptup_activatePattern(ActorMarker *this, s32 arg1){
|
|
Actor *thisActor;
|
|
ActorLocal_Tiptup *actLocalPtr;
|
|
Struct_BGS_2270_0s *tmpPtr;
|
|
|
|
thisActor = marker_getActor(this);
|
|
actLocalPtr = (ActorLocal_Tiptup *)&thisActor->local;
|
|
actLocalPtr->unkB = arg1;
|
|
if(arg1){
|
|
tmpPtr = vector_pushBackNew(&actLocalPtr->unk4);
|
|
tmpPtr->unk0 = arg1;
|
|
}
|
|
}
|
|
|
|
void chTiptup_activateTimer(ActorMarker *this){
|
|
Actor *thisActor;
|
|
|
|
thisActor = marker_getActor(this);
|
|
item_set(ITEM_6_HOURGLASS, 1);
|
|
item_set(ITEM_0_HOURGLASS_TIMER, 30*60-1);
|
|
chTiptup_setState(thisActor, 5);
|
|
}
|
|
|
|
void chTiptup_sfxCorrectHit(void){
|
|
func_8025A6EC(COMUSIC_2B_DING_B, 28000);
|
|
}
|
|
|
|
void chTiptup_sfxIncorrectHit(void){
|
|
func_8025A6EC(COMUSIC_2C_BUZZER, 28000);
|
|
}
|
|
|
|
void chTiptup_textEvent(ActorMarker *this, enum asset_e text_id, s32 arg2){
|
|
Actor *thisActor;
|
|
|
|
thisActor = marker_getActor(this);
|
|
switch(text_id){
|
|
case 0xc72:
|
|
case 0xc74:
|
|
chTiptup_setState(thisActor, 3);
|
|
break;
|
|
case 0xc78:
|
|
case 0xc7a:
|
|
case 0xc7c:
|
|
chTiptup_setState(thisActor, 4);
|
|
break;
|
|
case 0xc77:
|
|
case 0xc79:
|
|
func_80324E38(0.0f, 0);
|
|
chTiptup_setState(thisActor, 3);
|
|
break;
|
|
case 0xc7b:
|
|
timedFunc_set_0(0.0f, chTiptup_jiggySpawn);
|
|
timed_exitStaticCamera(2.5f);
|
|
func_80324E38(2.5f, 0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void chTiptup_correctHit(ActorMarker *this){
|
|
Actor *thisActor;
|
|
ActorLocal_Tiptup *unqPtr;
|
|
s32 sp1C;
|
|
|
|
thisActor = marker_getActor(this);
|
|
unqPtr = (ActorLocal_Tiptup *)&thisActor->local;
|
|
sp1C = vector_size(unqPtr->unk4);
|
|
chTiptup_sfxCorrectHit();
|
|
if(sp1C != ++unqPtr->unk0)
|
|
return;
|
|
|
|
if(volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME)){
|
|
item_set(ITEM_6_HOURGLASS,0);
|
|
volatileFlag_set(VOLATILE_FLAG_3,0);
|
|
volatileFlag_set(VOLATILE_FLAG_5_FF_MINIGAME_WON,1);
|
|
}
|
|
else{
|
|
BGS_func_80388660(thisActor->marker);
|
|
}
|
|
}
|
|
|
|
void chTiptup_setState(Actor *this, s32 arg1){
|
|
ActorLocal_Tiptup *unqPtr;
|
|
f32 sp54;
|
|
|
|
f32 tmpf;
|
|
s32 i;
|
|
s32 j;
|
|
s32 prev_member;
|
|
s32 rand2;
|
|
Struct_BGS_2270_0s *s1;
|
|
|
|
unqPtr = (ActorLocal_Tiptup *)&this->local;
|
|
this->state = arg1;
|
|
unqPtr->unkC = 0.0f;
|
|
if(this->state == 1){
|
|
skeletalAnim_set(this->unk148, ASSET_12B_ANIM_TIPTUP_IDLE, 1.0f, 9.0f);
|
|
unqPtr->unkC = randf2(5.0f, 15.0f);
|
|
}
|
|
if(this->state == 2){
|
|
skeletalAnim_set(this->unk148, ASSET_12B_ANIM_TIPTUP_IDLE, 1.0f, 9.0f);
|
|
unqPtr->unkC = randf2(5.0f, 15.0f);
|
|
|
|
if (!this->has_met_before) {
|
|
this->has_met_before = TRUE;
|
|
|
|
if (unqPtr->unkA == 0) {
|
|
gcdialog_showText(ASSET_C72_TEXT_UNKNOWN, 0xe, this->position, this->marker, chTiptup_textEvent, 0);
|
|
}
|
|
else {
|
|
gcdialog_showText(ASSET_C74_TEXT_UNKNOWN, 0xf, this->position, this->marker, chTiptup_textEvent, 0);
|
|
}
|
|
}
|
|
else {
|
|
gcdialog_showText(D_80390854[unqPtr->unkA], 0xf, this->position, this->marker, chTiptup_textEvent, 0);
|
|
}
|
|
}
|
|
if(this->state == 3){
|
|
unqPtr->unk0 = 0;
|
|
vector_clear(unqPtr->unk4);
|
|
func_80324E38(0.0f, 3);
|
|
timed_setStaticCameraToNode(0.5f, 0);
|
|
tmpf = 0.5f;
|
|
i = 0;
|
|
prev_member = 0;
|
|
|
|
for(; i < D_80390864[unqPtr->unkA]; i++){
|
|
tmpf += randf2(1.0f, 1.5f);
|
|
while((rand2 = randi2(1,7)) == prev_member);
|
|
timedFunc_set_2(tmpf, (GenFunction_2) chTiptup_activatePattern, reinterpret_cast(s32, this->marker), rand2);
|
|
timedFunc_set_2(tmpf + 0.1, (GenFunction_2)chTiptup_activatePattern, reinterpret_cast(s32, this->marker), 0);
|
|
prev_member = rand2;
|
|
}//L80388B7C
|
|
|
|
timed_exitStaticCamera(tmpf += 2.5);
|
|
if(!unqPtr->unkA && !volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME)){
|
|
func_80324DBC(tmpf + 0.5, 0xc73, 0xe, this->position, this->marker, chTiptup_textEvent, 0);
|
|
unqPtr->unkA = 1;
|
|
}
|
|
func_80324E38(sp54 = tmpf + 0.6, 0);
|
|
if(volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME)){
|
|
timedFunc_set_1(sp54, (GenFunction_1)chTiptup_activateTimer, reinterpret_cast(s32, this->marker));
|
|
}else{
|
|
this->state = 0x05;
|
|
}
|
|
mapSpecificFlags_set(0, 0);
|
|
}//L80388C6C
|
|
if(this->state == 4){
|
|
|
|
unqPtr->unk0 = 0;
|
|
func_80324E38(0.0f, 3);
|
|
timed_setStaticCameraToNode(0.5f, 0);
|
|
tmpf = 0.5f;
|
|
for(j = 0; j < vector_size(unqPtr->unk4); j++){
|
|
s1 = (Struct_BGS_2270_0s *)vector_at(unqPtr->unk4,j);
|
|
tmpf += randf2(1.0f, 1.5f);
|
|
timedFunc_set_2(tmpf, (GenFunction_2)chTiptup_activatePattern, reinterpret_cast(s32, this->marker), s1->unk0);
|
|
timedFunc_set_2(tmpf + 0.1, (GenFunction_2)chTiptup_activatePattern, reinterpret_cast(s32, this->marker), 0);
|
|
}
|
|
timed_exitStaticCamera(tmpf += 2.5);
|
|
func_80324E38(tmpf + 0.6,0);
|
|
vector_clear(unqPtr->unk4);
|
|
this->state = 0x05;
|
|
}//L80388D8C
|
|
if(this->state == 6){
|
|
if(unqPtr->unkA == 3){
|
|
func_8025A6EC(COMUSIC_2D_PUZZLE_SOLVED_FANFARE, 28000);
|
|
}
|
|
func_80324E38(0.5f, 3);
|
|
timed_setStaticCameraToNode(1.5f, 1);
|
|
func_80324DBC(2.0f, D_8039085C[unqPtr->unkA++], 0xF, this->position, this->marker, chTiptup_textEvent, 0);
|
|
}
|
|
}
|
|
|
|
void func_80388E44(ActorMarker *arg0, ActorMarker *arg1){
|
|
func_8028F428(2,arg0);
|
|
}
|
|
|
|
s32 func_80388E70(ActorMarker *this){
|
|
Actor *ptr;
|
|
ActorLocal_Tiptup *local;
|
|
|
|
ptr = marker_getActor(this);
|
|
local = (ActorLocal_Tiptup *)&ptr->local;
|
|
return local->unkB;
|
|
}
|
|
|
|
void chTiptup_choirHitReaction(ActorMarker *this, s32 arg1){
|
|
Actor * thisActor;
|
|
ActorLocal_Tiptup *unqPtr;
|
|
Struct_BGS_2270_0s * tmp;
|
|
|
|
thisActor = marker_getActor(this);
|
|
unqPtr = (ActorLocal_Tiptup *)&thisActor->local;
|
|
if((s32)unqPtr->unk0 >= (s32) vector_size(unqPtr->unk4)){
|
|
if(!mapSpecificFlags_get(0) && gcdialog_showText(ASSET_C76_TEXT_UNKNOWN, 0, 0, 0, 0, 0))
|
|
mapSpecificFlags_set(0,1);
|
|
}else{
|
|
tmp = (Struct_BGS_2270_0s *)vector_at(unqPtr->unk4, unqPtr->unk0);
|
|
if(arg1 == tmp->unk0){
|
|
timedFunc_set_1(0.5f, (GenFunction_1)chTiptup_correctHit, reinterpret_cast(s32, thisActor->marker));
|
|
}
|
|
else{
|
|
func_8028F55C(1, thisActor->marker);
|
|
timedFunc_set_0(0.5f, chTiptup_sfxIncorrectHit);
|
|
if(!mapSpecificFlags_get(1) && !volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME) && gcdialog_showText(0xc75, 0, NULL, NULL, NULL, NULL))
|
|
mapSpecificFlags_set(1,TRUE);
|
|
}
|
|
}
|
|
}
|
|
|
|
void func_80388FC0(Actor *this){
|
|
ActorLocal_Tiptup *local;
|
|
|
|
local = (ActorLocal_Tiptup *)&this->local;
|
|
fileProgressFlag_setN(FILEPROG_0_TIPTUP_MINIGAME_PROGRESS, local->unkA, 2);
|
|
vector_free(local->unk4);
|
|
}
|
|
|
|
void func_80388FFC(ActorMarker *this, s32 *arg1, f32* arg2){
|
|
Actor *thisActor;
|
|
ActorLocal_Tiptup *localPtr;
|
|
|
|
thisActor = marker_getActor(this);
|
|
localPtr = (ActorLocal_Tiptup *)&thisActor->local;
|
|
|
|
*arg2 = 0.52 + (f64)localPtr->unk9 * 0.12;
|
|
localPtr->unk9++;
|
|
*arg1 = localPtr->unk9;
|
|
|
|
}
|
|
|
|
void chTiptup_update(Actor *this){
|
|
f32 player_position[3];
|
|
ActorLocal_Tiptup *unqPtr;
|
|
f32 sp3C;
|
|
f32 sp38;
|
|
f32 sp34;
|
|
f32 sp30;
|
|
|
|
unqPtr = (ActorLocal_Tiptup *)&this->local;
|
|
sp3C = time_getDelta();
|
|
if(!this->volatile_initialized){
|
|
this->volatile_initialized = TRUE;
|
|
this->marker->actorFreeFunc = func_80388FC0;
|
|
marker_setCollisionScripts(this->marker, func_80388E44, NULL, NULL);
|
|
|
|
unqPtr->unk0 = 0;
|
|
unqPtr->unk4 = vector_new(sizeof(Struct_BGS_2270_0s), 8);
|
|
unqPtr->unk8 = 0;
|
|
unqPtr->unk9 = 0;
|
|
unqPtr->unkA = fileProgressFlag_getN(FILEPROG_0_TIPTUP_MINIGAME_PROGRESS, 2);
|
|
unqPtr->unkB = 0;
|
|
unqPtr->unkC = 0.0f;
|
|
if(volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME)){
|
|
unqPtr->unkA = 3;
|
|
this->position_y = this->position_y - 300.0f;
|
|
}
|
|
chTiptup_setState(this, 1);
|
|
if(jiggyscore_isSpawned(JIGGY_27_BGS_TIPTUP) && !volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME) && !volatileFlag_get(VOLATILE_FLAG_1))
|
|
marker_despawn(this->marker);
|
|
}
|
|
else{
|
|
player_getPosition(player_position);
|
|
if(skeletalAnim_getAnimId(this->unk148) == ASSET_12C_ANIM_TIPTUP_TAPPING && skeletalAnim_getLoopCount(this->unk148) > 0){
|
|
skeletalAnim_set(this->unk148, ASSET_12B_ANIM_TIPTUP_IDLE, 1.0f, 9.0f);
|
|
unqPtr->unkC = randf2(5.0f, 15.0f);
|
|
}
|
|
if(ml_timer_update(&unqPtr->unkC, sp3C)){
|
|
skeletalAnim_set(this->unk148, ASSET_12C_ANIM_TIPTUP_TAPPING, 1.0f, 4.0f);
|
|
}
|
|
func_80258A4C(this->position, this->yaw - 90.0f, player_position, &sp38, &sp34, &sp30);
|
|
this->yaw = this->yaw + 5.0f*sp30;
|
|
if(this->state == 1){
|
|
if(volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME)){
|
|
if(volatileFlag_get(VOLATILE_FLAG_3)){
|
|
func_80324E38(0.0f,0);
|
|
chTiptup_setState(this, 3);
|
|
}
|
|
}
|
|
else{
|
|
if(ml_distance_vec3f(this->position, player_position) < 300.0f && player_getTransformation() == TRANSFORM_1_BANJO && !jiggyscore_isSpawned(JIGGY_27_BGS_TIPTUP)){
|
|
chTiptup_setState(this, 2);
|
|
}
|
|
}
|
|
}
|
|
if(this->state == 5){
|
|
if(volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME)){
|
|
if(item_empty(ITEM_0_HOURGLASS_TIMER)){
|
|
item_set(ITEM_6_HOURGLASS,1);
|
|
volatileFlag_set(VOLATILE_FLAG_3,0);
|
|
volatileFlag_set(VOLATILE_FLAG_5_FF_MINIGAME_WON,0);
|
|
}
|
|
} //L80389370
|
|
else{
|
|
if(ml_distance_vec3f(this->position, player_position) >= 300.0f)
|
|
chTiptup_setState(this, 1);
|
|
}
|
|
}//L803893A0
|
|
if(this->state == 6){
|
|
if(ml_distance_vec3f(this->position, player_position) < 300.0f && !unqPtr->unk8){
|
|
unqPtr->unk8 = 1;
|
|
gcdialog_showText(0xc7d, 4, 0, 0, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|