446 lines
12 KiB
C
446 lines
12 KiB
C
#include <ultra64.h>
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
|
|
#include "core2/ba/model.h"
|
|
#include "core2/ba/anim.h"
|
|
|
|
#include "core2/ba/physics.h"
|
|
#include "core2/ba/timer.h"
|
|
|
|
f32 func_80294438(void);
|
|
void basfx_playJumpSfx(f32, f32);
|
|
f32 bastick_distance(void);
|
|
f32 bastick_getAngleRelativeToBanjo(void);
|
|
void baanim_playForDuration_loop(s32, f32);
|
|
|
|
/* .data */
|
|
f32 D_80364CD0 = 710.0f;
|
|
f32 D_80364CD4 = -1350.0f;
|
|
f32 D_80364CD8 = 0.0f;
|
|
f32 D_80364CDC = 710.0f;
|
|
f32 D_80364CE0 = -1350.0f;
|
|
f32 D_80364CE4 = 610.0f;
|
|
|
|
/* .bss */
|
|
u8 D_8037D4C0;
|
|
u8 D_8037D4C1;
|
|
u8 D_8037D4C2;
|
|
|
|
/* .code */
|
|
void func_802B1100(void){
|
|
basfx_playJumpSfx(0.91f, 1.09f);
|
|
}
|
|
|
|
void bsjump_init(void){
|
|
AnimCtrl *aCtrl = baanim_getAnimCtrlPtr();
|
|
enum bs_e sp30;
|
|
|
|
D_8037D4C2 = baflag_isTrue(BA_FLAG_2_ON_SPRING_PAD);
|
|
sp30 = bs_getPrevState();
|
|
if(bsclimb_inSet(sp30)){
|
|
climbRelease();
|
|
}
|
|
|
|
if(sp30 == BS_11_BPECK){
|
|
anctrl_setSubRange(aCtrl, 0.0f, 0.6667f);
|
|
anctrl_setStart(aCtrl, 0.5042f);
|
|
anctrl_setDuration(aCtrl, 8.0f);
|
|
anctrl_setPlaybackType(aCtrl, ANIMCTRL_ONCE);
|
|
D_8037D4C0 = 1;
|
|
}
|
|
else {
|
|
D_8037D4C1 = (sp30 == BS_2D_SWIM_IDLE) || (sp30 == BS_2E_SWIM);
|
|
anctrl_reset(aCtrl);
|
|
anctrl_setIndex(aCtrl, ASSET_8_ANIM_BSJUMP);
|
|
anctrl_setDuration(aCtrl, 1.9f);
|
|
anctrl_setTransitionDuration(aCtrl, 0.134f);
|
|
anctrl_setStart(aCtrl, 0.3f);
|
|
anctrl_setSubRange(aCtrl, 0.0f, 0.5042f);
|
|
anctrl_setPlaybackType(aCtrl, ANIMCTRL_ONCE);
|
|
anctrl_start(aCtrl, "bsjump.c", 0x95);
|
|
func_8029C7F4(1,1,3, BA_PHYSICS_AIRBORN);
|
|
if(bastick_distance() != 0.0f){
|
|
yaw_setIdeal(bastick_getAngleRelativeToBanjo());
|
|
}
|
|
baphysics_set_target_yaw(yaw_getIdeal());
|
|
func_802B6FA8();
|
|
baphysics_set_horizontal_velocity(yaw_getIdeal(), baphysics_get_target_horizontal_velocity());
|
|
if(D_8037D4C1){
|
|
baphysics_set_vertical_velocity(D_80364CE4);
|
|
} else {
|
|
baphysics_set_vertical_velocity(D_80364CD0);
|
|
}
|
|
baphysics_set_gravity(D_80364CD4);
|
|
D_8037D4C0 = 0;
|
|
if(D_8037D4C2){
|
|
func_8030E6D4(SFX_33_BANJO_AHOO);
|
|
} else{
|
|
func_802B1100();
|
|
}
|
|
}//L802B1340
|
|
}
|
|
|
|
void bsjump_update(void){
|
|
enum bs_e sp34 = 0;
|
|
AnimCtrl *aCtrl = baanim_getAnimCtrlPtr();
|
|
f32 velocity[3];
|
|
|
|
|
|
if(D_8037D4C2)
|
|
func_8029C348();
|
|
|
|
if(baflag_isTrue(BA_FLAG_F)){
|
|
baphysics_reset_horizontal_velocity();
|
|
}else{
|
|
func_802B6FA8();
|
|
}
|
|
|
|
baphysics_get_velocity(velocity);
|
|
if((bakey_released(BUTTON_A) && 0.0f < velocity[1] && !D_8037D4C2) || !can_control_jump_height()){
|
|
baphysics_reset_gravity();
|
|
}
|
|
|
|
switch(D_8037D4C0){
|
|
case 0://L802B1428
|
|
if(anctrl_isStopped(aCtrl)){
|
|
anctrl_setSubRange(aCtrl, 0.0f, 0.6667);
|
|
anctrl_setDuration(aCtrl, 4.0f);
|
|
anctrl_setPlaybackType(aCtrl, ANIMCTRL_ONCE);
|
|
D_8037D4C0 = 1;
|
|
}
|
|
if(func_8028B254(0x82)){
|
|
anctrl_setSubRange(aCtrl, 0.0f, 1.0f);
|
|
anctrl_setDuration(aCtrl, 1.4f);
|
|
anctrl_setPlaybackType(aCtrl, ANIMCTRL_ONCE);
|
|
D_8037D4C0 = 2;
|
|
}
|
|
break;
|
|
case 1://L802B14B4
|
|
if( 500.0f < (player_getYPosition() - func_80294438())){
|
|
sp34 = BS_2F_FALL;
|
|
}
|
|
if(D_8037D4C2){
|
|
D_8037D4C2 = 0;
|
|
sp34 = BS_BSHOCK_CHARGE;
|
|
}
|
|
if(func_8028B254(0x5A)){
|
|
anctrl_setSubRange(aCtrl, 0.0, 1.0f);
|
|
anctrl_setDuration(aCtrl, 2.0f);
|
|
anctrl_setPlaybackType(aCtrl, ANIMCTRL_ONCE);
|
|
D_8037D4C0 = 2;
|
|
}
|
|
break;
|
|
case 2:
|
|
break;
|
|
}//L802B1548
|
|
|
|
if(player_isFallTumbling())
|
|
sp34 = BS_3D_FALL_TUMBLING;
|
|
|
|
if(bakey_released(BUTTON_A))
|
|
D_8037D4C2 = 0;
|
|
|
|
if(bainput_should_feathery_flap())
|
|
sp34 = BS_BFLAP;
|
|
|
|
if(bainput_should_peck())
|
|
sp34 = BS_11_BPECK;
|
|
|
|
if(bainput_should_beak_bust())
|
|
sp34 = BS_F_BBUSTER;
|
|
|
|
if(player_isStable()){
|
|
func_8029C5E8();
|
|
sp34 = BS_20_LANDING;
|
|
}
|
|
|
|
if(velocity[1] < 0.0f && player_inWater())
|
|
sp34 = BS_4C_LANDING_IN_WATER;
|
|
|
|
bs_setState(sp34);
|
|
}
|
|
|
|
void bsjump_end(void){
|
|
if(ability_hasLearned(ABILITY_A_HOLD_A_JUMP_HIGHER))
|
|
ability_use(0);
|
|
|
|
if(bs_getNextState() != BS_11_BPECK)
|
|
baphysics_reset_gravity();
|
|
}
|
|
|
|
void bsjump_fall_init(void){
|
|
AnimCtrl *aCtrl = baanim_getAnimCtrlPtr();
|
|
int sp20;
|
|
|
|
if(baflag_isTrue(BA_FLAG_7_TOUCHING_JIGGY) && 700.0f < baphysics_get_vertical_velocity())
|
|
baphysics_set_vertical_velocity(700.0f);
|
|
|
|
sp20 = (bs_getPrevState() == BS_12_BFLIP)? 0 : 1;
|
|
anctrl_reset(aCtrl);
|
|
anctrl_setSmoothTransition(aCtrl, sp20);
|
|
anctrl_setIndex(aCtrl, ASSET_B0_ANIM_BSJUMP_FALL);
|
|
anctrl_setTransitionDuration(aCtrl, 0.3f);
|
|
anctrl_setDuration(aCtrl, 0.38f);
|
|
anctrl_start(aCtrl, "bsjump.c", 0x188);
|
|
func_8029C7F4(1,1,3, BA_PHYSICS_AIRBORN);
|
|
D_8037D4C0 = 0;
|
|
}
|
|
|
|
void bsjump_fall_update(void){
|
|
enum bs_e sp2C = 0;
|
|
AnimCtrl *aCtrl = baanim_getAnimCtrlPtr();
|
|
f32 player_velocity[3];
|
|
|
|
if(baflag_isTrue(BA_FLAG_F))
|
|
baphysics_reset_horizontal_velocity();
|
|
else
|
|
func_802B6FA8();
|
|
|
|
baphysics_get_velocity(player_velocity);
|
|
|
|
switch(D_8037D4C0){
|
|
case 0://L802B17B8
|
|
if(func_8028B254(0x5a)){
|
|
anctrl_reset(aCtrl);
|
|
anctrl_setIndex(aCtrl, ASSET_8_ANIM_BSJUMP);
|
|
anctrl_setStart(aCtrl, 0.6667f);
|
|
anctrl_setDuration(aCtrl, 2.0f);
|
|
anctrl_setPlaybackType(aCtrl, ANIMCTRL_ONCE);
|
|
anctrl_start(aCtrl, "bsjump.c", 0x1b5);
|
|
D_8037D4C0 = 1;
|
|
}
|
|
break;
|
|
case 1:
|
|
break;
|
|
}//L802B1824
|
|
if(baflag_isFalse(BA_FLAG_F)){
|
|
if(player_isFallTumbling())
|
|
sp2C = BS_3D_FALL_TUMBLING;
|
|
|
|
if(bainput_should_feathery_flap() && baflag_isFalse(BA_FLAG_5_HAS_PECKED))
|
|
sp2C = BS_BFLAP;
|
|
|
|
if(bainput_should_peck())
|
|
sp2C = BS_11_BPECK;
|
|
|
|
if(bainput_should_beak_bust())
|
|
sp2C = BS_F_BBUSTER;
|
|
|
|
if(player_inWater())
|
|
sp2C = BS_4C_LANDING_IN_WATER;
|
|
}
|
|
else if(player_inWater()){
|
|
func_8029CCC4();
|
|
if(baflag_isTrue(BA_FLAG_6) || baflag_isTrue(BA_FLAG_14_LOSE_BOGGY_RACE)){
|
|
sp2C = BS_D_TIMEOUT;
|
|
}
|
|
|
|
}//L802B18E8
|
|
|
|
if(player_isStable()){
|
|
func_8029C5E8();
|
|
sp2C = BS_20_LANDING;
|
|
}
|
|
|
|
bs_setState(sp2C);
|
|
}
|
|
|
|
void bsjump_fall_end(void){}
|
|
|
|
void func_802B1928(void) {
|
|
AnimCtrl *anim_ctrl;
|
|
|
|
anim_ctrl = baanim_getAnimCtrlPtr();
|
|
climbRelease();
|
|
anctrl_reset(anim_ctrl);
|
|
anctrl_setIndex(anim_ctrl, ASSET_8_ANIM_BSJUMP);
|
|
anctrl_setDuration(anim_ctrl, 1.9f);
|
|
anctrl_setTransitionDuration(anim_ctrl, 0.134f);
|
|
anctrl_setStart(anim_ctrl, 0.3f);
|
|
anctrl_setSubRange(anim_ctrl, 0.0f, 0.5042f);
|
|
anctrl_setPlaybackType(anim_ctrl, ANIMCTRL_ONCE);
|
|
anctrl_start(anim_ctrl, "bsjump.c", 0x201);
|
|
baanim_setUpdateType(BAANIM_UPDATE_1_NORMAL);
|
|
yaw_setUpdateState(1);
|
|
func_8029957C(3);
|
|
baphysics_set_type(BA_PHYSICS_LOCKED_ROTATION);
|
|
baphysics_set_target_yaw(yaw_getIdeal());
|
|
baphysics_set_target_horizontal_velocity(60.0f);
|
|
baphysics_set_horizontal_velocity(yaw_getIdeal(), baphysics_get_target_horizontal_velocity());
|
|
baphysics_set_vertical_velocity(D_80364CDC);
|
|
baphysics_set_gravity(D_80364CE0);
|
|
func_80294378(6);
|
|
D_8037D4C0 = 0;
|
|
func_802B1100();
|
|
}
|
|
|
|
void func_802B1A54(void) {
|
|
s32 next_state;
|
|
AnimCtrl *anim_ctrl;
|
|
f32 velocity[3];
|
|
|
|
next_state = 0;
|
|
anim_ctrl = baanim_getAnimCtrlPtr();
|
|
baphysics_get_velocity(velocity);
|
|
if (velocity[1] < 0.0f) {
|
|
func_80294378(1);
|
|
}
|
|
switch (D_8037D4C0) {
|
|
case 0:
|
|
if (anctrl_isStopped(anim_ctrl)) {
|
|
anctrl_setSubRange(anim_ctrl, 0.0f, 0.6667f);
|
|
anctrl_setDuration(anim_ctrl, 4.0f);
|
|
anctrl_setPlaybackType(anim_ctrl, ANIMCTRL_ONCE);
|
|
D_8037D4C0 = 1;
|
|
}
|
|
if (func_8028B254(130)) {
|
|
anctrl_setSubRange(anim_ctrl, 0.0f, 1.0f);
|
|
anctrl_setDuration(anim_ctrl, 1.4f);
|
|
anctrl_setPlaybackType(anim_ctrl, ANIMCTRL_ONCE);
|
|
D_8037D4C0 = 2;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (func_8028B254(90)) {
|
|
anctrl_setSubRange(anim_ctrl, 0.0f, 1.0f);
|
|
anctrl_setDuration(anim_ctrl, 2.0f);
|
|
anctrl_setPlaybackType(anim_ctrl, ANIMCTRL_ONCE);
|
|
D_8037D4C0 = 2;
|
|
}
|
|
break;
|
|
case 2:
|
|
break;
|
|
}
|
|
if (player_isStable()) {
|
|
func_8029C5E8();
|
|
next_state = BS_20_LANDING;
|
|
}
|
|
bs_setState(next_state);
|
|
}
|
|
|
|
void func_802B1BCC(void){
|
|
func_80294378(1);
|
|
baphysics_reset_gravity();
|
|
}
|
|
|
|
void func_802B1BF4(void) {
|
|
AnimCtrl *anim_ctrl;
|
|
bool smooth_transition;
|
|
|
|
anim_ctrl = baanim_getAnimCtrlPtr();
|
|
smooth_transition = TRUE;
|
|
if(bs_getPrevState() == BS_12_BFLIP){
|
|
smooth_transition = FALSE;
|
|
}
|
|
anctrl_reset(anim_ctrl);
|
|
anctrl_setSmoothTransition(anim_ctrl, smooth_transition);
|
|
anctrl_setIndex(anim_ctrl, ASSET_8_ANIM_BSJUMP);
|
|
anctrl_setTransitionDuration(anim_ctrl, 0.3f);
|
|
anctrl_setDuration(anim_ctrl, 1.9f);
|
|
anctrl_setStart(anim_ctrl, 0.6667f);
|
|
anctrl_setPlaybackType(anim_ctrl, ANIMCTRL_STOPPED);
|
|
anctrl_start(anim_ctrl, "bsjump.c", 0x298);
|
|
yaw_setIdeal(func_8029B41C());
|
|
baanim_setUpdateType(BAANIM_UPDATE_1_NORMAL);
|
|
yaw_setUpdateState(1);
|
|
func_8029957C(3);
|
|
baphysics_set_type(BA_PHYSICS_AIRBORN);
|
|
baphysics_set_target_horizontal_velocity(0.0f);
|
|
baphysics_set_velocity(0);
|
|
D_8037D4C0 = 0;
|
|
baMarker_collisionOff();
|
|
}
|
|
|
|
void func_802B1CF8(void) {
|
|
enum bs_e next_state;
|
|
AnimCtrl *anim_ctrl;
|
|
f32 velocity[3];
|
|
|
|
next_state = 0;
|
|
anim_ctrl = baanim_getAnimCtrlPtr();
|
|
baphysics_get_velocity(velocity);
|
|
switch (D_8037D4C0) {
|
|
case 0:
|
|
if (func_8028B254(90)) {
|
|
anctrl_setSubRange(anim_ctrl, 0.0f, 1.0f);
|
|
anctrl_setDuration(anim_ctrl, 2.0f);
|
|
anctrl_setPlaybackType(anim_ctrl, ANIMCTRL_ONCE);
|
|
D_8037D4C0 = 1;
|
|
}
|
|
break;
|
|
case 1:
|
|
break;
|
|
}
|
|
if (player_isStable() != 0) {
|
|
next_state = 1;
|
|
}
|
|
bs_setState(next_state);
|
|
}
|
|
|
|
void func_802B1DA4(void){
|
|
baMarker_collisionOn();
|
|
}
|
|
|
|
bool bsjump_jumpingFromWater(void){
|
|
return D_8037D4C1;
|
|
}
|
|
|
|
void bsjump_tumble_init(void){
|
|
baanim_playForDuration_loop(ASSET_68_ANIM_BSJUMP_TUMBLE, 0.35f);
|
|
func_8029C7F4(1,1,3, BA_PHYSICS_AIRBORN);
|
|
baModel_setYDisplacement(60.0f);
|
|
if(bafalldamage_get_state() == 1){
|
|
batimer_set(0, 0.5f);
|
|
batimer_set(1, 0.41f);
|
|
basfx_80299CF4(SFX_52_BANJO_YAH_OH, 1.0f, 22000);
|
|
}else{
|
|
batimer_set(0, 0.0f);
|
|
batimer_set(1, 0.01f);
|
|
}
|
|
D_8037D4C0 = 0;
|
|
}
|
|
|
|
void bsjump_tumble_update(void){
|
|
enum bs_e sp1C = 0;
|
|
if(batimer_decrement(1))
|
|
basfx_80299CF4(SFX_63_BANJO_UWAAAAOOH, 1.0f, 32000);
|
|
|
|
batimer_decrement(0);
|
|
func_802B6FA8();
|
|
if(batimer_isZero(1)){
|
|
pitch_setIdeal(pitch_getIdeal() + 20.0f);
|
|
}
|
|
if(batimer_isNonzero(0)){
|
|
if(bainput_should_feathery_flap())
|
|
sp1C = BS_BFLAP;
|
|
|
|
if(bainput_should_peck())
|
|
sp1C = BS_11_BPECK;
|
|
|
|
if(bainput_should_beak_bust())
|
|
sp1C = BS_F_BBUSTER;
|
|
}//L802B1F2C
|
|
|
|
if(player_inWater())
|
|
sp1C = BS_4C_LANDING_IN_WATER;
|
|
|
|
if(player_isStable())
|
|
sp1C = BS_SPLAT;
|
|
|
|
bs_setState(sp1C);
|
|
}
|
|
|
|
void bsjump_tumble_end(void){
|
|
enum bs_e next_state = bs_getNextState();
|
|
if( next_state == BS_F_BBUSTER
|
|
|| next_state == BS_BFLAP
|
|
|| next_state == BS_11_BPECK
|
|
){
|
|
bafalldamage_set_state(3);
|
|
}
|
|
func_8029CB84();
|
|
baModel_setYDisplacement(0.0f);
|
|
basfx_80299E6C();
|
|
}
|