-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgrenade.c
More file actions
97 lines (77 loc) · 2.89 KB
/
grenade.c
File metadata and controls
97 lines (77 loc) · 2.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include "entities.h"
Grenade createGrenade(int id, Player *owner, Texture2D *texture) {
Vector2 position = { 0.0f, 0.0f };
Vector2 velocity = { 0.0f, 0.0f };
return (Grenade) { id, position, velocity, texture, owner, 0, 0 };
}
void deleteGrenade(Grenade *grenade) {
// Maybe set all fields to 0?
}
void bounceGrenade(Grenade *grenade) {
if(grenade->dead) return;
grenade->bounces++;
if(grenade->bounces == 3) {
grenade->dead = 1;
}
}
void updateGrenade(Grenade *grenade, int *levelDim, int *floors, int *walls) {
if(grenade->dead) return;
if(grenade->velocity.x != 0.0f) {
grenade->position.x += grenade->velocity.x;
int neighborTiles[8];
getNeighboringTiles(&grenade->position, levelDim[0], 0, neighborTiles); // TODO: compute only x neighboringTiles
// printf("%d,%d,%d,%d\n", neighborTiles[0], neighborTiles[1], neighborTiles[2], neighborTiles[3]);
if(walls[neighborTiles[0]] || walls[neighborTiles[7]]) {
grenade->position.x = (neighborTiles[0] % levelDim[0] + 1) * 40;
grenade->velocity.x *= -1.0f;
bounceGrenade(grenade);
}
if(walls[neighborTiles[3]] || walls[neighborTiles[4]]) {
grenade->position.x = (neighborTiles[3] % levelDim[0] - 1) * 40;
grenade->velocity.x *= -1.0f;
bounceGrenade(grenade);
}
grenade->velocity.x += grenade->velocity.x > 0 ? -0.5f : 0.5f;
if(grenade->velocity.x <= 0.5f && grenade->velocity.x >= -0.05f) {
grenade->velocity.x = 0.0f;
}
}
grenade->position.y += grenade->velocity.y;
int neighborTiles[8];
getNeighboringTiles(&grenade->position, levelDim[0], 0, neighborTiles);
if(floors[neighborTiles[1]] || floors[neighborTiles[2]]) {
grenade->position.y = (neighborTiles[1] / levelDim[0] + 1) * 40;
grenade->velocity.y *= -0.8f;
bounceGrenade(grenade);
}
if(floors[neighborTiles[5]] || floors[neighborTiles[6]]) {
grenade->position.y = (neighborTiles[5] / levelDim[0] - 1) * 40;
// grenade->velocity.y += 2; // ugly fix
grenade->velocity.y *= -0.8f;
bounceGrenade(grenade);
}
grenade->velocity.y += 2;
if(grenade->velocity.y <= 0.5f && grenade->velocity.y >= -0.5f) {
grenade->velocity.y = 0.0f;
}
}
int storeGrenade(Grenade *array, char arraySize, char *takenIndices, Grenade *obj) {
for(char i = 0; i < arraySize; i++) {
if(!takenIndices[i]) {
takenIndices[i] = 1;
array[i] = *obj;
array[i].id = 10;
return 0;
}
}
return 1;
}
Grenade *unstoreGrenade(Grenade *array, char arraySize, char *takenIndices, int id) {
for(char i = 0; i < arraySize; i++) {
if(takenIndices[i] && array[i].id == id) {
takenIndices[i] = 0;
return &array[i];
}
}
return NULL;
}