aboutsummaryrefslogtreecommitdiff
path: root/bullet.c
diff options
context:
space:
mode:
authorquou <quou@disroot.org>2023-05-04 14:10:41 +1000
committerquou <quou@disroot.org>2023-05-04 14:10:50 +1000
commitd61dcdcc384249ec7ea60c9cc18aab9df1f80577 (patch)
tree563e985e6a1f480461177f2c341d70ce5dd1498d /bullet.c
parentc4ac81cffcf925963acb0c02584ab22626427a73 (diff)
Add shooting.
Diffstat (limited to 'bullet.c')
-rw-r--r--bullet.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/bullet.c b/bullet.c
new file mode 100644
index 0000000..f2e1a2e
--- /dev/null
+++ b/bullet.c
@@ -0,0 +1,80 @@
+#include "bullet.h"
+#include "components.h"
+#include "error.h"
+#include "platform.h"
+#include "sprite.h"
+#include "world.h"
+
+Entity new_player_bullet(
+ World* world,
+ int x,
+ int y,
+ int vx,
+ int vy,
+ int life
+) {
+ Entity e;
+ CBullet* bullet;
+ CPosition* pos;
+ CSprite* sprite;
+ Sprite_ID sprid;
+
+ e = new_entity(world);
+
+ add_components(
+ world,
+ e,
+ ctype_sprite |
+ ctype_position |
+ ctype_bullet |
+ ctype_player_bullet
+ );
+ pos = &world->positions[e];
+ sprite = &world->sprites[e];
+ bullet = &world->bullets[e];
+ pos->x = x;
+ pos->y = y;
+
+ bullet->vx = vx;
+ bullet->vy = vy;
+ bullet->life = life;
+
+ if (vx < 0) {
+ sprid = sprite_player_bullet_left;
+ } else if (vx > 0) {
+ sprid = sprite_player_bullet_right;
+ } else if (vy < 0) {
+ sprid = sprite_player_bullet_up;
+ } else if (vy > 0) {
+ sprid = sprite_player_bullet_down;
+ }
+#ifdef DEBUG
+ else {
+ platform_log("Player bullets must have velocity\n");
+ platform_abort(error_gameplay_error);
+ }
+#endif
+
+ init_csprite(sprite, sprid);
+
+ return e;
+}
+
+void bullet_system(World* world) {
+ int i;
+ unsigned bits;
+ CPosition* pos;
+ CBullet* bullet;
+
+ for (i = 0; i < world->entity_count; i++) {
+ bits = world->bitmask[i];
+ if ((bits & ctype_position) && (bits & ctype_bullet)) {
+ pos = &world->positions[i];
+ bullet = &world->bullets[i];
+
+ pos->x += bullet->vx;
+ pos->y += bullet->vy;
+ bullet->life--;
+ }
+ }
+}