#pragma once #include #define from_fixed(a) ((a) / 16) #define to_fixed(a) ((a) * 16) struct hitbox { unsigned left, right, top, bottom; }; static inline int hitbox_overlap(struct hitbox const a, struct hitbox const b) { return a.left <= b.right && a.right >= b.left && a.top <= b.bottom && a.bottom >= b.top; } struct vec2 { signed x, y; }; struct anim { unsigned frame; SDL_Rect rect; unsigned length; }; enum factions { FACTION_PLAYER, FACTION_ENEMY, }; struct entity { int (*update)(struct entity *self); int (*hurt)(struct entity *self, int damage); int (*draw)(struct entity *self, int camx, int camy); void (*free)(struct entity *self); int x, y; // unsigned results in a bunch of weird edge cases struct vec2 velocity; struct hitbox hitbox; struct anim anim; unsigned state; int hp; int timer; int iframes; signed facing; enum factions faction; void *texture; void *ext; }; struct warp { int (*update)(struct warp *); unsigned x, y; unsigned w, h; unsigned tox, toy; struct hitbox hitbox; unsigned timer; void *ext; }; struct projectile { int (*update)(struct projectile *self); int (*draw)(struct projectile *self, int camx, int camy); void (*free)(struct projectile *self); int x, y; // unsigned results in a bunch of weird edge cases struct vec2 velocity; struct hitbox hitbox; struct anim anim; unsigned state; int hp; int timer; int iframes; signed facing; enum factions faction; void *texture; void *ext; }; struct particle { int x, y; struct vec2 velocity; struct vec2 acceleration; SDL_Rect rect; int hp; };