Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/src/game/behaviors/bubba.inc.c
7861 views
1
// bubba.inc.c
2
3
static struct ObjectHitbox sBubbaHitbox = {
4
/* interactType: */ INTERACT_CLAM_OR_BUBBA,
5
/* downOffset: */ 0,
6
/* damageOrCoinValue: */ 1,
7
/* health: */ 99,
8
/* numLootCoins: */ 0,
9
/* radius: */ 300,
10
/* height: */ 200,
11
/* hurtboxRadius: */ 300,
12
/* hurtboxHeight: */ 200,
13
};
14
15
void bubba_act_0(void) {
16
f32 sp24;
17
18
sp24 = cur_obj_lateral_dist_to_home();
19
treat_far_home_as_mario(2000.0f);
20
o->oAnimState = 0;
21
22
o->oBubbaUnk1AC = obj_get_pitch_to_home(sp24);
23
24
approach_f32_ptr(&o->oBubbaUnkF4, 5.0f, 0.5f);
25
26
if (o->oBubbaUnkFC != 0) {
27
if (abs_angle_diff(o->oMoveAngleYaw, o->oBubbaUnk1AE) < 800) {
28
o->oBubbaUnkFC = 0;
29
}
30
} else {
31
if (o->oDistanceToMario >= 25000.0f) {
32
o->oBubbaUnk1AE = o->oAngleToMario;
33
o->oBubbaUnkF8 = random_linear_offset(20, 30);
34
}
35
36
if ((o->oBubbaUnkFC = o->oMoveFlags & OBJ_MOVE_HIT_WALL) != 0) {
37
o->oBubbaUnk1AE = cur_obj_reflect_move_angle_off_wall();
38
} else if (o->oTimer > 30 && o->oDistanceToMario < 2000.0f) {
39
o->oAction = 1;
40
} else if (o->oBubbaUnkF8 != 0) {
41
o->oBubbaUnkF8 -= 1;
42
} else {
43
o->oBubbaUnk1AE = obj_random_fixed_turn(0x2000);
44
o->oBubbaUnkF8 = random_linear_offset(100, 100);
45
}
46
}
47
}
48
49
void bubba_act_1(void) {
50
treat_far_home_as_mario(2500.0f);
51
if (o->oDistanceToMario > 2500.0f) {
52
o->oAction = 0;
53
} else if (o->oBubbaUnk100 != 0) {
54
if (--o->oBubbaUnk100 == 0) {
55
cur_obj_play_sound_2(SOUND_OBJ_BUBBA_CHOMP);
56
o->oAction = 0;
57
} else if (o->oBubbaUnk100 < 15) {
58
o->oAnimState = 1;
59
} else if (o->oBubbaUnk100 == 20) {
60
s16 val06 = 10000 - (s16)(20.0f * (find_water_level(o->oPosX, o->oPosZ) - o->oPosY));
61
o->oBubbaUnk1AC -= val06;
62
o->oMoveAnglePitch = o->oBubbaUnk1AC;
63
o->oBubbaUnkF4 = 40.0f;
64
obj_compute_vel_from_move_pitch(o->oBubbaUnkF4);
65
o->oAnimState = 0;
66
} else {
67
o->oBubbaUnk1AE = o->oAngleToMario;
68
o->oBubbaUnk1AC = o->oBubbaUnk104;
69
70
cur_obj_rotate_yaw_toward(o->oBubbaUnk1AE, 400);
71
obj_move_pitch_approach(o->oBubbaUnk1AC, 400);
72
}
73
} else {
74
if (abs_angle_diff(gMarioObject->oFaceAngleYaw, o->oAngleToMario) < 0x3000) {
75
s16 val04 = 0x4000 - atan2s(800.0f, o->oDistanceToMario - 800.0f);
76
if ((s16)(o->oMoveAngleYaw - o->oAngleToMario) < 0) {
77
val04 = -val04;
78
}
79
80
o->oBubbaUnk1AE = o->oAngleToMario + val04;
81
} else {
82
o->oBubbaUnk1AE = o->oAngleToMario;
83
}
84
85
o->oBubbaUnk1AC = o->oBubbaUnk104;
86
87
if (obj_is_near_to_and_facing_mario(500.0f, 3000)
88
&& abs_angle_diff(o->oBubbaUnk1AC, o->oMoveAnglePitch) < 3000) {
89
o->oBubbaUnk100 = 30;
90
o->oBubbaUnkF4 = 0;
91
o->oAnimState = 1;
92
} else {
93
approach_f32_ptr(&o->oBubbaUnkF4, 20.0f, 0.5f);
94
}
95
}
96
}
97
98
void bhv_bubba_loop(void) {
99
UNUSED s32 unused;
100
101
o->oInteractionSubtype &= ~INT_SUBTYPE_EATS_MARIO;
102
o->oBubbaUnk104 = obj_turn_pitch_toward_mario(120.0f, 0);
103
104
if (abs_angle_diff(o->oAngleToMario, o->oMoveAngleYaw) < 0x1000
105
&& abs_angle_diff(o->oBubbaUnk104 + 0x800, o->oMoveAnglePitch) < 0x2000) {
106
if (o->oAnimState != 0 && o->oDistanceToMario < 250.0f) {
107
o->oInteractionSubtype |= INT_SUBTYPE_EATS_MARIO;
108
}
109
110
o->hurtboxRadius = 100.0f;
111
} else {
112
o->hurtboxRadius = 150.0f;
113
}
114
115
cur_obj_update_floor_and_walls();
116
117
switch (o->oAction) {
118
case 0:
119
bubba_act_0();
120
break;
121
case 1:
122
bubba_act_1();
123
break;
124
}
125
126
if (o->oMoveFlags & OBJ_MOVE_MASK_IN_WATER) {
127
if (o->oMoveFlags & OBJ_MOVE_ENTERED_WATER) {
128
struct Object *sp38 = spawn_object(o, MODEL_WATER_SPLASH, bhvWaterSplash);
129
if (sp38 != NULL) {
130
obj_scale(sp38, 3.0f);
131
}
132
133
o->oBubbaUnk108 = o->oVelY;
134
o->oBubbaUnk10C = 0.0f;
135
} else {
136
approach_f32_ptr(&o->oBubbaUnk108, 0.0f, 4.0f);
137
if ((o->oBubbaUnk10C -= o->oBubbaUnk108) > 1.0f) {
138
s16 sp36 = random_u16();
139
o->oBubbaUnk10C -= 1.0f;
140
spawn_object_relative(0, 150.0f * coss(sp36), 0x64, 150.0f * sins(sp36), o,
141
MODEL_WHITE_PARTICLE_SMALL, bhvSmallParticleSnow);
142
}
143
}
144
145
obj_smooth_turn(&o->oBubbaUnk1B0, &o->oMoveAnglePitch, o->oBubbaUnk1AC, 0.05f, 10, 50, 2000);
146
obj_smooth_turn(&o->oBubbaUnk1B2, &o->oMoveAngleYaw, o->oBubbaUnk1AE, 0.05f, 10, 50, 2000);
147
obj_compute_vel_from_move_pitch(o->oBubbaUnkF4);
148
} else {
149
o->oBubbaUnkF4 = sqrtf(o->oForwardVel * o->oForwardVel + o->oVelY * o->oVelY);
150
o->oMoveAnglePitch = obj_get_pitch_from_vel();
151
obj_face_pitch_approach(o->oMoveAnglePitch, 400);
152
o->oBubbaUnk1B0 = 0;
153
}
154
155
obj_face_pitch_approach(o->oMoveAnglePitch, 400);
156
obj_check_attacks(&sBubbaHitbox, o->oAction);
157
158
cur_obj_move_standard(78);
159
160
o->oFloorHeight += 150.0f;
161
if (o->oPosY < o->oFloorHeight) {
162
o->oPosY = o->oFloorHeight;
163
}
164
}
165
166