Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/src/game/behaviors/breakable_box_small.inc.c
7861 views
1
// breakable_box.c.inc
2
3
struct ObjectHitbox sBreakableBoxSmallHitbox = {
4
/* interactType: */ INTERACT_GRABBABLE,
5
/* downOffset: */ 20,
6
/* damageOrCoinValue: */ 0,
7
/* health: */ 1,
8
/* numLootCoins: */ 0,
9
/* radius: */ 150,
10
/* height: */ 250,
11
/* hurtboxRadius: */ 150,
12
/* hurtboxHeight: */ 250,
13
};
14
15
void bhv_breakable_box_small_init(void) {
16
o->oGravity = 2.5f;
17
o->oFriction = 0.99f;
18
o->oBuoyancy = 1.4f;
19
cur_obj_scale(0.4f);
20
obj_set_hitbox(o, &sBreakableBoxSmallHitbox);
21
o->oAnimState = 1;
22
o->activeFlags |= ACTIVE_FLAG_UNK9;
23
}
24
25
void small_breakable_box_spawn_dust(void) {
26
struct Object *sp24 = spawn_object(o, MODEL_SMOKE, bhvSmoke);
27
sp24->oPosX += (s32)(random_float() * 80.0f) - 40;
28
sp24->oPosZ += (s32)(random_float() * 80.0f) - 40;
29
}
30
31
void small_breakable_box_act_move(void) {
32
s16 sp1E = object_step();
33
34
obj_attack_collided_from_other_object(o);
35
if (sp1E == 1)
36
cur_obj_play_sound_2(SOUND_GENERAL_BOX_LANDING_2);
37
if (sp1E & 1) {
38
if (o->oForwardVel > 20.0f) {
39
cur_obj_play_sound_2(SOUND_ENV_SLIDING);
40
small_breakable_box_spawn_dust();
41
}
42
}
43
44
if (sp1E & 2) {
45
spawn_mist_particles();
46
spawn_triangle_break_particles(20, MODEL_DIRT_ANIMATION, 0.7f, 3);
47
obj_spawn_yellow_coins(o, 3);
48
create_sound_spawner(SOUND_GENERAL_BREAK_BOX);
49
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
50
}
51
52
obj_check_floor_death(sp1E, sObjFloor);
53
}
54
55
void breakable_box_small_released_loop(void) {
56
o->oBreakableBoxSmallFramesSinceReleased++;
57
58
// Begin flashing
59
if (o->oBreakableBoxSmallFramesSinceReleased > 810) {
60
if (o->oBreakableBoxSmallFramesSinceReleased & 1)
61
o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE;
62
else
63
o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;
64
}
65
66
// Despawn, and create a corkbox respawner
67
if (o->oBreakableBoxSmallFramesSinceReleased > 900) {
68
create_respawner(MODEL_BREAKABLE_BOX_SMALL, bhvBreakableBoxSmall, 3000);
69
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
70
}
71
}
72
73
void breakable_box_small_idle_loop(void) {
74
switch (o->oAction) {
75
case 0:
76
small_breakable_box_act_move();
77
break;
78
79
case 100:
80
obj_lava_death();
81
break;
82
83
case 101:
84
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
85
create_respawner(MODEL_BREAKABLE_BOX_SMALL, bhvBreakableBoxSmall, 3000);
86
break;
87
}
88
89
if (o->oBreakableBoxSmallReleased == 1)
90
breakable_box_small_released_loop();
91
}
92
93
void breakable_box_small_get_dropped(void) {
94
cur_obj_become_tangible();
95
cur_obj_enable_rendering();
96
cur_obj_get_dropped();
97
o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;
98
o->oHeldState = 0;
99
o->oBreakableBoxSmallReleased = 1;
100
o->oBreakableBoxSmallFramesSinceReleased = 0;
101
}
102
103
void breakable_box_small_get_thrown(void) {
104
cur_obj_become_tangible();
105
cur_obj_enable_rendering_2();
106
cur_obj_enable_rendering();
107
o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;
108
o->oHeldState = 0;
109
o->oFlags &= ~0x08;
110
o->oForwardVel = 40.0f;
111
o->oVelY = 20.0f;
112
o->oBreakableBoxSmallReleased = 1;
113
o->oBreakableBoxSmallFramesSinceReleased = 0;
114
o->activeFlags &= ~ACTIVE_FLAG_UNK9;
115
}
116
117
void bhv_breakable_box_small_loop(void) {
118
switch (o->oHeldState) {
119
case 0:
120
breakable_box_small_idle_loop();
121
break;
122
123
case 1:
124
cur_obj_disable_rendering();
125
cur_obj_become_intangible();
126
break;
127
128
case 2:
129
breakable_box_small_get_thrown();
130
break;
131
132
case 3:
133
breakable_box_small_get_dropped();
134
break;
135
}
136
137
o->oInteractStatus = 0;
138
}
139
140