Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/src/game/behaviors/cannon.inc.c
7861 views
1
// cannon.c.inc
2
3
void bhv_cannon_base_unused_loop(void) {
4
o->oPosY += o->oVelY;
5
}
6
7
void opened_cannon_act_0(void) {
8
if (o->oTimer == 0) {
9
o->oInteractStatus = 0;
10
o->oPosX = o->oHomeX;
11
o->oPosY = o->oHomeY;
12
o->oPosZ = o->oHomeZ;
13
o->oMoveAnglePitch = 0;
14
o->oMoveAngleYaw = (s16)(o->oBehParams2ndByte << 8);
15
o->oCannonUnkF4 = 0;
16
o->oCannonUnk10C = 0;
17
cur_obj_enable_rendering();
18
cur_obj_become_tangible();
19
}
20
if (o->oDistanceToMario < 500.0f) {
21
cur_obj_become_tangible();
22
cur_obj_enable_rendering();
23
if (o->oInteractStatus & INT_STATUS_INTERACTED
24
&& (!(o->oInteractStatus
25
& INT_STATUS_TOUCHED_BOB_OMB))) // bob-omb explodes when it gets into a cannon
26
{
27
o->oAction = 4;
28
o->oCannonUnk10C = 1;
29
o->oCannonUnkF8 = 1;
30
} else
31
o->oInteractStatus = 0;
32
} else {
33
cur_obj_become_intangible();
34
cur_obj_disable_rendering();
35
o->oCannonUnk10C = 0;
36
}
37
}
38
39
void opened_cannon_act_4(void) {
40
if (o->oTimer == 0)
41
cur_obj_play_sound_2(SOUND_OBJ_CANNON1);
42
o->oPosY += 5.0f;
43
o->oPosX += (f32)((o->oTimer / 2 & 1) - 0.5) * 2;
44
o->oPosZ += (f32)((o->oTimer / 2 & 1) - 0.5) * 2;
45
if (o->oTimer > 67) {
46
o->oPosX += (f32)((o->oTimer / 2 & 1) - 0.5) * 4;
47
o->oPosZ += (f32)((o->oTimer / 2 & 1) - 0.5) * 4;
48
o->oAction = 6;
49
}
50
}
51
52
void opened_cannon_act_6(void) {
53
if (o->oTimer == 0)
54
cur_obj_play_sound_2(SOUND_OBJ_CANNON2);
55
if (o->oTimer < 4) {
56
o->oPosX += (f32)((o->oTimer / 2 & 1) - 0.5) * 4.0f;
57
o->oPosZ += (f32)((o->oTimer / 2 & 1) - 0.5) * 4.0f;
58
} else {
59
if (o->oTimer < 6) {
60
} else {
61
if (o->oTimer < 22) {
62
o->oMoveAngleYaw =
63
sins(o->oCannonUnkF4) * 0x4000 + ((s16)(o->oBehParams2ndByte << 8));
64
o->oCannonUnkF4 += 0x400;
65
} else if (o->oTimer < 26) {
66
} else {
67
o->oCannonUnkF4 = 0;
68
o->oAction = 5;
69
}
70
}
71
}
72
}
73
74
void opened_cannon_act_5(void) {
75
if (o->oTimer == 0)
76
cur_obj_play_sound_2(SOUND_OBJ_CANNON3);
77
if (o->oTimer < 4) {
78
} else {
79
if (o->oTimer < 20) {
80
o->oCannonUnkF4 += 0x400;
81
o->oMoveAnglePitch = sins(o->oCannonUnkF4) * 0x2000;
82
} else if (o->oTimer < 25) {
83
} else
84
o->oAction = 1;
85
}
86
}
87
88
void opened_cannon_act_1(void) {
89
UNUSED s32 unused;
90
cur_obj_become_intangible();
91
cur_obj_disable_rendering();
92
o->oCannonUnk10C = 0;
93
gMarioShotFromCannon = 1;
94
}
95
96
void opened_cannon_act_2(void) {
97
o->oAction = 3;
98
}
99
100
void opened_cannon_act_3(void) {
101
UNUSED s32 unused;
102
if (o->oTimer > 3)
103
o->oAction = 0;
104
}
105
106
void (*sOpenedCannonActions[])(void) = { opened_cannon_act_0, opened_cannon_act_1, opened_cannon_act_2,
107
opened_cannon_act_3, opened_cannon_act_4, opened_cannon_act_5,
108
opened_cannon_act_6 };
109
110
void bhv_cannon_base_loop(void) {
111
cur_obj_call_action_function(sOpenedCannonActions);
112
if (o->oCannonUnkF8)
113
o->oCannonUnkF8++;
114
o->oInteractStatus = 0;
115
}
116
117
void bhv_cannon_barrel_loop(void) {
118
struct Object *parent = o->parentObj;
119
if (parent->header.gfx.node.flags & GRAPH_RENDER_ACTIVE) {
120
cur_obj_enable_rendering();
121
obj_copy_pos(o, o->parentObj);
122
o->oMoveAngleYaw = o->parentObj->oMoveAngleYaw;
123
o->oFaceAnglePitch = o->parentObj->oMoveAnglePitch;
124
} else
125
cur_obj_disable_rendering();
126
}
127
128