Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/src/game/behaviors/bub.inc.c
7861 views
1
// bub.c.inc
2
3
// NOTE: These first set of functions spawn a school of bub depending on objF4's
4
// value. The later action functions seem to check Y distance to Mario and proceed
5
// to do nothing, which indicates this behavior set is incomplete.
6
#include "../settings.h"
7
8
// TODO: Rename these. These have nothing to do with birds.
9
void bub_spawner_act_0(void) {
10
s32 i;
11
s32 sp18 = o->oBirdChirpChirpUnkF4;
12
if (o->oDistanceToMario < 1500.0f * configDrawDistanceMultiplier || configDrawDistanceMultiplier <= 0.0f) {
13
for (i = 0; i < sp18; i++)
14
spawn_object(o, MODEL_BUB, bhvBub);
15
o->oAction = 1;
16
}
17
}
18
19
void bub_spawner_act_1(void) {
20
if (gMarioObject->oPosY - o->oPosY > 2000.0f)
21
o->oAction = 2;
22
}
23
24
void bub_spawner_act_2(void) {
25
o->oAction = 3;
26
}
27
28
void bub_spawner_act_3(void) {
29
o->oAction = 0;
30
}
31
32
void (*sBirdChirpChirpActions[])(void) = { bub_spawner_act_0, bub_spawner_act_1,
33
bub_spawner_act_2, bub_spawner_act_3 };
34
35
void bhv_bub_spawner_loop(void) {
36
cur_obj_call_action_function(sBirdChirpChirpActions);
37
}
38
39
void bub_move_vertically(s32 a0) {
40
f32 sp1C = o->parentObj->oPosY;
41
if (sp1C - 100.0f - o->oCheepCheepUnk104 < o->oPosY
42
&& o->oPosY < sp1C + 1000.0f + o->oCheepCheepUnk104)
43
o->oPosY = approach_f32_symmetric(o->oPosY, o->oCheepCheepUnkF8, a0);
44
else {
45
}
46
}
47
48
void bub_act_0(void) {
49
o->oCheepCheepUnkFC = random_float() * 100.0f;
50
o->oCheepCheepUnk104 = random_float() * 300.0f;
51
o->oAction = 1;
52
}
53
54
void bub_act_1(void) {
55
f32 dy;
56
if (o->oTimer == 0) {
57
o->oForwardVel = random_float() * 2 + 2;
58
o->oCheepCheepUnk108 = random_float();
59
}
60
dy = o->oPosY - gMarioObject->oPosY;
61
if (o->oPosY < o->oCheepCheepUnkF4 - 50.0f) {
62
if (dy < 0.0f)
63
dy = 0.0f - dy;
64
if (dy < 500.0f)
65
bub_move_vertically(1);
66
else
67
bub_move_vertically(4);
68
} else {
69
o->oPosY = o->oCheepCheepUnkF4 - 50.0f;
70
if (dy > 300.0f)
71
o->oPosY = o->oPosY - 1.0f;
72
}
73
if (800.0f < cur_obj_lateral_dist_from_mario_to_home())
74
o->oAngleToMario = cur_obj_angle_to_home();
75
cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x100);
76
if (o->oDistanceToMario < 200.0f)
77
if (o->oCheepCheepUnk108 < 0.5)
78
o->oAction = 2;
79
if (o->oInteractStatus & INT_STATUS_INTERACTED)
80
o->oAction = 2;
81
}
82
83
void bub_act_2(void) {
84
f32 dy;
85
if (o->oTimer < 20) {
86
if (o->oInteractStatus & INT_STATUS_INTERACTED)
87
spawn_object(o, MODEL_WHITE_PARTICLE_SMALL, bhvSmallParticleSnow);
88
} else
89
o->oInteractStatus = 0;
90
if (o->oTimer == 0)
91
cur_obj_play_sound_2(SOUND_GENERAL_MOVING_WATER);
92
if (o->oForwardVel == 0.0f)
93
o->oForwardVel = 6.0f;
94
dy = o->oPosY - gMarioObject->oPosY;
95
if (o->oPosY < o->oCheepCheepUnkF4 - 50.0f) {
96
if (dy < 0.0f)
97
dy = 0.0f - dy;
98
if (dy < 500.0f)
99
bub_move_vertically(2);
100
else
101
bub_move_vertically(4);
102
} else {
103
o->oPosY = o->oCheepCheepUnkF4 - 50.0f;
104
if (dy > 300.0f)
105
o->oPosY -= 1.0f;
106
}
107
if (cur_obj_lateral_dist_from_mario_to_home() > 800.0f)
108
o->oAngleToMario = cur_obj_angle_to_home();
109
cur_obj_rotate_yaw_toward(o->oAngleToMario + 0x8000, 0x400);
110
if (o->oTimer > 200 && o->oDistanceToMario > 600.0f)
111
o->oAction = 1;
112
}
113
114
void (*sCheepCheepActions[])(void) = { bub_act_0, bub_act_1, bub_act_2 };
115
116
void bhv_bub_loop(void) {
117
o->oCheepCheepUnkF4 = find_water_level(o->oPosX, o->oPosZ);
118
o->oCheepCheepUnkF8 = gMarioObject->oPosY + o->oCheepCheepUnkFC;
119
o->oWallHitboxRadius = 30.0f;
120
cur_obj_update_floor_and_walls();
121
cur_obj_call_action_function(sCheepCheepActions);
122
cur_obj_move_using_fvel_and_gravity();
123
if (o->parentObj->oAction == 2)
124
obj_mark_for_deletion(o);
125
}
126
127