Entity no longer stores sprite_id, sprite_get_id_from_arch()

This commit is contained in:
Abdulmujeeb Raji 2024-08-29 18:39:19 +01:00
parent 702a64d0e3
commit cf888244fe
3 changed files with 37 additions and 11 deletions

View file

@ -21,7 +21,6 @@ typedef struct Entity {
bool renderable; bool renderable;
Entity_Archetype arch; Entity_Archetype arch;
Vector2 pos; Vector2 pos;
Sprite_ID sprite_id;
bool is_animate; bool is_animate;
float32 health, damage; float32 health, damage;
Vector2 hitbox[4]; Vector2 hitbox[4];

View file

@ -1,11 +1,10 @@
#include "util.c" #include "util.c"
#include "sprite.c"
#include "entity.c" #include "entity.c"
#include "sprite.c"
#include "gjk.c" #include "gjk.c"
void player_setup(Entity* en) { void player_setup(Entity* en) {
en->arch = ARCH_player; en->arch = ARCH_player;
en->sprite_id = SPRITE_player;
en->renderable = true; en->renderable = true;
en->is_animate = true; en->is_animate = true;
en->health = 100; en->health = 100;
@ -13,7 +12,6 @@ void player_setup(Entity* en) {
void spider_setup(Entity* en) { void spider_setup(Entity* en) {
en->arch = ARCH_spider; en->arch = ARCH_spider;
en->sprite_id = SPRITE_spider;
en->renderable = true; en->renderable = true;
en->is_animate = true; en->is_animate = true;
en->health = 30; en->health = 30;
@ -30,7 +28,6 @@ void weapon_setup(Entity* en, Entity_Archetype weapon_type) {
en->is_weapon = true; en->is_weapon = true;
switch (weapon_type) { switch (weapon_type) {
case ARCH_startersword: { case ARCH_startersword: {
en->sprite_id = SPRITE_startersword;
en->weapon_class = WEAPON_melee; en->weapon_class = WEAPON_melee;
en->damage = 10; en->damage = 10;
en->hitbox[0] = v2(0, 0); en->hitbox[0] = v2(0, 0);
@ -41,7 +38,6 @@ void weapon_setup(Entity* en, Entity_Archetype weapon_type) {
} break; } break;
case ARCH_starterbow: { case ARCH_starterbow: {
en->sprite_id = SPRITE_starterbow;
en->weapon_class = WEAPON_ranged; en->weapon_class = WEAPON_ranged;
en->damage = 5; en->damage = 5;
en->weapon_speed = 3; en->weapon_speed = 3;
@ -55,9 +51,9 @@ void weapon_setup(Entity* en, Entity_Archetype weapon_type) {
void arrow_setup(Entity* en, Vector2 start_pos, Vector2 fire_dir, float32 base_dmg) { void arrow_setup(Entity* en, Vector2 start_pos, Vector2 fire_dir, float32 base_dmg) {
en->arch = ARCH_arrow; en->arch = ARCH_arrow;
en->sprite_id = SPRITE_arrow;
en->renderable = true; en->renderable = true;
en->is_projectile = true; en->is_projectile = true;
en->is_animate = false; // idk why this was on in the first place?
en->projectile_range = 200; en->projectile_range = 200;
en->projectile_fire_dir = fire_dir; en->projectile_fire_dir = fire_dir;
en->projectile_start_pos = start_pos; en->projectile_start_pos = start_pos;
@ -170,11 +166,22 @@ int entry(int argc, char **argv) {
if (en->is_animate && en->health <= 0) { if (en->is_animate && en->health <= 0) {
en->alive = false; en->alive = false;
} }
// TODO Finish dis
// if (en->is_item && is_key_just_pressed('C')) {
// Vector2* player_hitbox = entity_resolve_hitbox(player);
// Vector2* item_hitbox = entity_resolve_hitbox(en);
// if (gjk(player_hitbox, 4, item_hitbox, 4)) {
// entity_destroy(en);
// }
// }
if (en->is_weapon) { if (en->is_weapon) {
en->weapon_cooldown_secs -= 1.0 * delta_time; // decreases by 1 every second en->weapon_cooldown_secs -= 1.0 * delta_time; // decreases by 1 every second
if (is_key_just_pressed('Z') && en->weapon_cooldown_secs <= 0) { if (is_key_just_pressed('Z') && en->weapon_cooldown_secs <= 0) {
en->weapon_cooldown_secs = 1 / (en->weapon_speed); en->weapon_cooldown_secs = 1 / (en->weapon_speed);
switch (en->weapon_class) { switch (en->weapon_class) {
case WEAPON_melee: { case WEAPON_melee: {
Vector2* hitbox = entity_resolve_hitbox(en); Vector2* hitbox = entity_resolve_hitbox(en);
@ -199,6 +206,7 @@ int entry(int argc, char **argv) {
} }
if (en->is_projectile) { if (en->is_projectile) {
en->pos = v2_add(en->pos, v2_mulf(en->projectile_fire_dir, en->projectile_speed * 50.0 * delta_time));
if (en->pos.x < en->projectile_start_pos.x + en->projectile_range && if (en->pos.x < en->projectile_start_pos.x + en->projectile_range &&
en->pos.y < en->projectile_start_pos.y + en->projectile_range) { en->pos.y < en->projectile_start_pos.y + en->projectile_range) {
Vector2* hitbox = entity_resolve_hitbox(en); Vector2* hitbox = entity_resolve_hitbox(en);
@ -211,18 +219,16 @@ int entry(int argc, char **argv) {
} }
} }
en->pos = v2_add(en->pos, v2_mulf(en->projectile_fire_dir, en->projectile_speed * 50.0 * delta_time));
} else { } else {
entity_destroy(en); entity_destroy(en);
} }
} }
} }
// :rendering // :entity rendering
// TODO add a layer system, so that you place render instructions anywhere
for (Entity* en = 0; entity_increment(&en);) { for (Entity* en = 0; entity_increment(&en);) {
if (en->alive && en->renderable) { if (en->alive && en->renderable) {
Sprite* sprite = sprite_get(en->sprite_id); Sprite* sprite = sprite_get(sprite_get_id_from_arch(en->arch));
Matrix4 xform = m4_scalar(1.0); Matrix4 xform = m4_scalar(1.0);
if (en->is_projectile) { if (en->is_projectile) {
@ -251,6 +257,13 @@ int entry(int argc, char **argv) {
draw_image_xform(sprite->image, xform, sprite->size, COLOR_WHITE); draw_image_xform(sprite->image, xform, sprite->size, COLOR_WHITE);
} }
} }
// :ui rendering
{
// TODO Set projection
// TODO Weapon Slots
// TODO Health Bar
}
os_update(); os_update();
gfx_update(); gfx_update();

View file

@ -4,6 +4,7 @@ typedef struct Sprite {
} Sprite; } Sprite;
typedef enum Sprite_ID { typedef enum Sprite_ID {
SPRITE_nil,
SPRITE_player, SPRITE_player,
SPRITE_spider, SPRITE_spider,
SPRITE_mutant, SPRITE_mutant,
@ -27,4 +28,17 @@ Sprite* sprite_get(Sprite_ID id) {
return &sprites[id]; return &sprites[id];
} }
return &sprites[0]; return &sprites[0];
}
Sprite_ID sprite_get_id_from_arch(Entity_Archetype arch) {
switch (arch) {
case ARCH_player: return SPRITE_player; break;
case ARCH_spider: return SPRITE_spider ; break;
case ARCH_mutant: return SPRITE_mutant ; break;
case ARCH_tree: return SPRITE_tree ; break;
case ARCH_startersword: return SPRITE_startersword ; break;
case ARCH_starterbow: return SPRITE_starterbow ; break;
case ARCH_arrow: return SPRITE_arrow ; break;
default: return 0;
}
} }