Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/src/game/behaviors/butterfly.inc.c
7861 views
1
// butterfly.c.inc
2
3
void bhv_butterfly_init(void) {
4
cur_obj_init_animation(1);
5
6
o->oButterflyYPhase = random_float() * 100.0f;
7
o->header.gfx.animInfo.animFrame = random_float() * 7.0f;
8
o->oHomeX = o->oPosX;
9
o->oHomeY = o->oPosY;
10
o->oHomeZ = o->oPosZ;
11
}
12
13
// sp28 = speed
14
15
void butterfly_step(s32 speed) {
16
struct FloorGeometry *sp24;
17
s16 yaw = o->oMoveAngleYaw;
18
s16 pitch = o->oMoveAnglePitch;
19
s16 yPhase = o->oButterflyYPhase;
20
f32 floorY;
21
22
o->oVelX = sins(yaw) * (f32) speed;
23
o->oVelY = sins(pitch) * (f32) speed;
24
o->oVelZ = coss(yaw) * (f32) speed;
25
26
o->oPosX += o->oVelX;
27
o->oPosZ += o->oVelZ;
28
29
if (o->oAction == BUTTERFLY_ACT_FOLLOW_MARIO)
30
o->oPosY -= o->oVelY + coss((s32)(yPhase * 655.36)) * 20.0f / 4;
31
else
32
o->oPosY -= o->oVelY;
33
34
floorY = find_floor_height_and_data(o->oPosX, o->oPosY, o->oPosZ, &sp24);
35
36
if (o->oPosY < floorY + 2.0f)
37
o->oPosY = floorY + 2.0f;
38
39
o->oButterflyYPhase++;
40
if (o->oButterflyYPhase >= 101)
41
o->oButterflyYPhase = 0;
42
}
43
44
void butterfly_calculate_angle(void) {
45
gMarioObject->oPosX += 5 * o->oButterflyYPhase / 4;
46
gMarioObject->oPosZ += 5 * o->oButterflyYPhase / 4;
47
obj_turn_toward_object(o, gMarioObject, 16, 0x300);
48
gMarioObject->oPosX -= 5 * o->oButterflyYPhase / 4;
49
gMarioObject->oPosZ -= 5 * o->oButterflyYPhase / 4;
50
51
gMarioObject->oPosY += (5 * o->oButterflyYPhase + 0x100) / 4;
52
obj_turn_toward_object(o, gMarioObject, 15, 0x500);
53
gMarioObject->oPosY -= (5 * o->oButterflyYPhase + 0x100) / 4;
54
}
55
56
void butterfly_act_rest(void) {
57
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 1000)) {
58
cur_obj_init_animation(0);
59
60
o->oAction = BUTTERFLY_ACT_FOLLOW_MARIO;
61
o->oMoveAngleYaw = gMarioObject->header.gfx.angle[1];
62
}
63
}
64
65
void butterfly_act_follow_mario(void) {
66
butterfly_calculate_angle();
67
68
butterfly_step(7);
69
70
if (!is_point_within_radius_of_mario(o->oHomeX, o->oHomeY, o->oHomeZ, 1200))
71
o->oAction = BUTTERFLY_ACT_RETURN_HOME;
72
}
73
74
void butterfly_act_return_home(void) {
75
f32 homeDistX = o->oHomeX - o->oPosX;
76
f32 homeDistY = o->oHomeY - o->oPosY;
77
f32 homeDistZ = o->oHomeZ - o->oPosZ;
78
s16 hAngleToHome = atan2s(homeDistZ, homeDistX);
79
s16 vAngleToHome = atan2s(sqrtf(homeDistX * homeDistX + homeDistZ * homeDistZ), -homeDistY);
80
81
o->oMoveAngleYaw = approach_s16_symmetric(o->oMoveAngleYaw, hAngleToHome, 0x800);
82
o->oMoveAnglePitch = approach_s16_symmetric(o->oMoveAnglePitch, vAngleToHome, 0x50);
83
84
butterfly_step(7);
85
86
if (homeDistX * homeDistX + homeDistY * homeDistY + homeDistZ * homeDistZ < 144.0f) {
87
cur_obj_init_animation(1);
88
89
o->oAction = BUTTERFLY_ACT_RESTING;
90
o->oPosX = o->oHomeX;
91
o->oPosY = o->oHomeY;
92
o->oPosZ = o->oHomeZ;
93
}
94
}
95
96
void bhv_butterfly_loop(void) {
97
switch (o->oAction) {
98
case BUTTERFLY_ACT_RESTING:
99
butterfly_act_rest();
100
break;
101
102
case BUTTERFLY_ACT_FOLLOW_MARIO:
103
butterfly_act_follow_mario();
104
break;
105
106
case BUTTERFLY_ACT_RETURN_HOME:
107
butterfly_act_return_home();
108
break;
109
}
110
111
set_object_visibility(o, 3000);
112
}
113
114