diff --git a/decompressed.pal.yaml b/decompressed.pal.yaml index cbeec075..e831f6af 100644 --- a/decompressed.pal.yaml +++ b/decompressed.pal.yaml @@ -516,8 +516,8 @@ segments: - [0xF7FD00, c, code_6B30] - [0xF7FFA0, c, ba/carriedobj] - [0xF80230, c, code_7060] - - [0xF81F70, bin, core2_untouched_text] - # - [0xF5E700, c, code_8DA0] #DONE + - [0xF81F70, c, ba/flap] + - [0xF822B0, bin, core2_untouched_text] # - [0xF5EA40, c, code_90E0] #DONE # - [0xF5EBF0, c, code_9290] #DONE # - [0xF5EDB0, c, code_9450] #DONE @@ -1383,7 +1383,7 @@ segments: - [0x0106C980, .bss, ba/marker] - [0x0106C980, .bss, code_6B30] - [0x0106C980, .bss, code_7060] - # - [0x0106C980, .bss, code_8DA0] + - [0x0106C980, .bss, ba/flap] # - [0x0106C980, .bss, code_90E0] # - [0x0106C980, .bss, code_9290] # - [0x0106C980, .bss, code_9450] diff --git a/decompressed.us.v10.yaml b/decompressed.us.v10.yaml index 8c437d92..61f10e98 100644 --- a/decompressed.us.v10.yaml +++ b/decompressed.us.v10.yaml @@ -517,7 +517,7 @@ segments: - [0xF5C490, c, code_6B30] #DONE - [0xF5C730, c, ba/carriedobj] #DONE - [0xF5C9C0, c, code_7060] #DONE - - [0xF5E700, c, code_8DA0] #DONE + - [0xF5E700, c, ba/flap] #DONE - [0xF5EA40, c, code_90E0] #DONE - [0xF5EBF0, c, code_9290] #DONE - [0xF5EDB0, c, code_9450] #DONE @@ -1381,7 +1381,7 @@ segments: - [0x1048560, .bss, ba/marker] - [0x1048560, .bss, code_6B30] - [0x1048560, .bss, code_7060] - - [0x1048560, .bss, code_8DA0] + - [0x1048560, .bss, ba/flap] - [0x1048560, .bss, code_90E0] - [0x1048560, .bss, code_9290] - [0x1048560, .bss, code_9450] diff --git a/include/core2/ba/flap.h b/include/core2/ba/flap.h new file mode 100644 index 00000000..6902d31f --- /dev/null +++ b/include/core2/ba/flap.h @@ -0,0 +1,13 @@ +#ifndef __BA_FLAP_H__ +#define __BA_FLAP_H__ + +#include + +s32 baflap_getCount(void); +bool baflap_add(f32 duration); +void baflap_reset(void); +void baflap_activate(bool active); +void baflap_update(void); + + +#endif // __BA_FLAP_H__ \ No newline at end of file diff --git a/src/core2/ba/flap.c b/src/core2/ba/flap.c new file mode 100644 index 00000000..438fb996 --- /dev/null +++ b/src/core2/ba/flap.c @@ -0,0 +1,103 @@ +#include +#include "functions.h" +#include "variables.h" + +/* .bss */ +u8 s_active; +f32 s_flap_max_timer; +f32 s_flap_list[5]; + +/* .code */ + +/** + * @brief returns the number of nonzero flap timers in `s_flap_list` + * + * @return s32 number of active flaps + */ +s32 baflap_getCount(void) { + s32 i; + s32 cnt; + + cnt = 0; + for(i = 0; i < 5; i++){ + if(s_flap_list[i] != 0.0f){ + cnt++; + } + } + return cnt; +} + +/** + * @brief add a flap duration to the flap list + * + * @param duration duration of flap in seconds + * @return true if baflap duration was extended + * @return false if baflap does not extend duration or all timers in flap queue are occupied + */ +bool baflap_add(f32 duration) { + s32 i; + + // check that timer is far enough away from any value + for(i = 0; i < 5; i++){ + if(duration - 0.25 < s_flap_list[i]){ + s_flap_max_timer = duration; + return FALSE; + } + } + // add to list + for(i = 0; i < 5; i++){ + if (s_flap_list[i] == 0.0f) { + s_flap_list[i] = duration; + return TRUE; + } + } + s_flap_max_timer = duration; + return FALSE; +} + +/** + * @brief zeros all flap timers and sets as inactive + * + */ +void baflap_reset(void) { + s32 i; + + for(i = 0; i < 5; i++){ + s_flap_list[i] = 0.0f; + } + s_active = s_flap_max_timer = 0.0f; +} + +/** + * @brief activates or deactivates flap timers + * + * @param active false (0) or true (!0) + */ +void baflap_activate(bool active){ + s_active = active; + if(!s_active){ + baflap_reset(); + } +} + +/** + * @brief updates flap timers if active + * + */ +void baflap_update(void) { + f32 temp_f0; + s32 i; + + if (s_active != 0) { + //update timers + for(i = 0; i < 5; i++){ + func_80259430(&s_flap_list[i]); + } + if (s_flap_max_timer != 0.0f) { + temp_f0 = s_flap_max_timer; + s_flap_max_timer = 0.0f; + baflap_add(temp_f0); + } + } +} + diff --git a/src/core2/bs/bFly.c b/src/core2/bs/bFly.c index fc409181..566399af 100644 --- a/src/core2/bs/bFly.c +++ b/src/core2/bs/bFly.c @@ -3,8 +3,8 @@ #include "variables.h" #include #include "core2/ba/physics.h" +#include "core2/ba/flap.h" -extern void func_8028FDC8(f32); extern void baModel_setYDisplacement(f32); extern f32 func_8029B2D0(void); extern void ncDynamicCam4_func_802BFE50(f32, f32, f32); @@ -56,8 +56,8 @@ void func_802A3430(void){ func_802A33D8(); func_80293D48(60.0f, 45.0f); func_80294378(4); - func_8028FEF0(); - func_8028FFBC(1); + baflap_reset(); + baflap_activate(1); } void func_802A34C8(void){ @@ -71,7 +71,7 @@ void func_802A34C8(void){ func_80291548(); func_80293D74(); func_80294378(1); - func_8028FFBC(0); + baflap_activate(0); } } @@ -230,13 +230,13 @@ void bsbfly_update(void){ } if(D_8037D346){ D_8037D346 = 0; - func_8028FDC8(0.35f); + baflap_add(0.35f); }else{ - func_8028FDC8(1.0f); + baflap_add(1.0f); } }//L802A3BB4 - sp30 = func_8028FD30(); + sp30 = baflap_getCount(); switch(D_8037D344){ case 0: if(sp30) @@ -306,7 +306,7 @@ void bsbfly_update(void){ if(func_802A3350()) sp54 = BS_1_IDLE; - func_8028FFF0(); + baflap_update(); bs_setState(sp54); } diff --git a/src/core2/bs/beeFly.c b/src/core2/bs/beeFly.c index 4a089c57..4b020ea7 100644 --- a/src/core2/bs/beeFly.c +++ b/src/core2/bs/beeFly.c @@ -3,6 +3,7 @@ #include "variables.h" #include "core2/ba/physics.h" +#include "core2/ba/flap.h" void func_80354030(f32*, f32); @@ -14,7 +15,6 @@ void ncDynamicCam4_func_802BFE50(f32, f32, f32); void yaw_setVelocityBounded(f32, f32); f32 func_8029B2D0(void); f32 func_8029B2DC(void); -void func_8028FDC8(f32); void func_80290B40(f32); void func_80290A6C(void); @@ -98,7 +98,7 @@ void _bsbeefly_end(void){ func_80291548(); baphysics_reset_gravity(); baphysics_reset_terminal_velocity(); - func_8028FFBC(0); + baflap_activate(0); func_8029099C(); } @@ -111,8 +111,8 @@ void func_802A07F8(void){ func_802A0724(); baphysics_set_gravity(-300.0f); baphysics_set_terminal_velocity(-99.9f); - func_8028FEF0(); - func_8028FFBC(1); + baflap_reset(); + baflap_activate(1); func_802909C4(); } @@ -161,7 +161,7 @@ void bsbeefly_enter(void){ func_802914CC(4); func_802A07F8(); if(mvmnt != 0x8b){ - func_8028FDC8(1.0f); + baflap_add(1.0f); D_8037D2C0 = 0; } else { @@ -186,12 +186,12 @@ void bsbeefly_update(void){ _bsBeeFly_updatePitch(); pitch_get(); //return value never used if(button_pressed(BUTTON_A) && (player_getYPosition() < 7500.0)){ - func_8028FDC8(1.0f); + baflap_add(1.0f); } - if(!func_8028FD30() && player_inWater()){ - func_8028FDC8(1.0f); + if((baflap_getCount() == 0) && player_inWater()){ + baflap_add(1.0f); } - sp44 = func_8028FD30(); + sp44 = baflap_getCount(); animctrl_setDuration(sp48, D_803649B0[sp44]); sp24 = &D_803649C4[sp44]; sp40 = 0.9f; @@ -255,7 +255,7 @@ void bsbeefly_update(void){ baphysics_set_target_horizontal_velocity(sp38); if(player_isStable() && !player_inWater()) sp4C = BS_85_BEE_IDLE; - func_8028FFF0(); + baflap_update(); bs_setState(sp4C); } diff --git a/src/core2/code_8DA0.c b/src/core2/code_8DA0.c deleted file mode 100644 index 1d97b649..00000000 --- a/src/core2/code_8DA0.c +++ /dev/null @@ -1,74 +0,0 @@ -#include -#include "functions.h" -#include "variables.h" - -/* .bss */ -u8 D_8037BFE0; -f32 D_8037BFE4; -f32 D_8037BFE8[5]; - -/* .code */ -s32 func_8028FD30(void) { - s32 i; - s32 cnt; - - cnt = 0; - for(i = 0; i < 5; i++){ - if(D_8037BFE8[i] != 0.0f){ - cnt++; - } - } - return cnt; -} - -bool func_8028FDC8(f32 arg0) { - s32 i; - - for(i = 0; i < 5; i++){ - if(arg0 - 0.25 < D_8037BFE8[i]){ - D_8037BFE4 = arg0; - return FALSE; - } - } - for(i = 0; i < 5; i++){ - if (D_8037BFE8[i] == 0.0f) { - D_8037BFE8[i] = arg0; - return TRUE; - } - } - D_8037BFE4 = arg0; - return FALSE; -} - -void func_8028FEF0(void) { - s32 i; - - for(i = 0; i < 5; i++){ - D_8037BFE8[i] = 0.0f; - } - D_8037BFE0 = D_8037BFE4 = 0.0f; -} - -void func_8028FFBC(bool arg0){ - D_8037BFE0 = arg0; - if(!D_8037BFE0){ - func_8028FEF0(); - } -} - -void func_8028FFF0(void) { - f32 temp_f0; - s32 i; - - if (D_8037BFE0 != 0) { - for(i = 0; i < 5; i++){ - func_80259430(&D_8037BFE8[i]); - } - if (D_8037BFE4 != 0.0f) { - temp_f0 = D_8037BFE4; - D_8037BFE4 = 0.0f; - func_8028FDC8(temp_f0); - } - } -} -