diff --git a/armour.c b/armour.c new file mode 100644 index 0000000..1dbb3fe --- /dev/null +++ b/armour.c @@ -0,0 +1,18 @@ +typedef enum Armour { + ARMOUR_none = 0, + ARMOUR_starter = 1, +} Armour; + +Sprite_ID armour_sprite_id(Armour armour) { + switch (armour) { + case ARMOUR_starter: return SPRITE_starterarmour; break; + default: return SPRITE_nil; + } +} + +float armour_damage_multiplier(Armour armour) { + switch (armour) { + case ARMOUR_starter: return 0.8; break; + default: return 1; + } +} diff --git a/assets/starterarmour.png b/assets/starterarmour.png new file mode 100644 index 0000000..d209026 Binary files /dev/null and b/assets/starterarmour.png differ diff --git a/entity.c b/entity.c index 3819791..0c671d4 100644 --- a/entity.c +++ b/entity.c @@ -28,6 +28,7 @@ typedef struct Entity { Vector2 hitbox[4]; Entity_Archetype primary_weapon; Entity_Archetype secondary_weapon; + Armour armour; bool is_weapon; Weapon_Class weapon_class; Vector2 weapon_owner_pos; @@ -113,6 +114,7 @@ Vector2* entity_resolve_hitbox(Entity* en) { } void entity_take_damage(Entity* en, float damage) { + damage *= armour_damage_multiplier(en->armour); en->health = clamp(en->health - damage, 0, en->max_health); // todo add knockback } \ No newline at end of file diff --git a/entry_helpless.c b/entry_helpless.c index 8a1a701..6619e4f 100644 --- a/entry_helpless.c +++ b/entry_helpless.c @@ -1,5 +1,6 @@ #include "util.c" #include "sprite.c" +#include "armour.c" #include "entity.c" #include "gjk.c" #include "weapon.c" @@ -43,6 +44,7 @@ int entry(int argc, char **argv) { sprite_load(STR("assets/spider.png"), SPRITE_spider); sprite_load(STR("assets/startersword.png"), SPRITE_startersword); sprite_load(STR("assets/starterbow.png"), SPRITE_starterbow); + sprite_load(STR("assets/starterarmour.png"), SPRITE_starterarmour); sprite_load(STR("assets/arrow.png"), SPRITE_arrow); Gfx_Font* font = load_font_from_disk(STR("assets/m3x6.ttf"), get_heap_allocator()); @@ -222,6 +224,10 @@ int entry(int argc, char **argv) { xform = m4_translate(xform, v3(sprite->size.x * -0.5, sprite->size.y * -0.5, 0)); draw_image_xform(sprite->image, xform, sprite->size, COLOR_WHITE); + if (en->armour != ARMOUR_none) { + Sprite* armour_sprite = sprite_get(armour_sprite_id(en->armour)); + draw_image_xform(armour_sprite->image, xform, armour_sprite->size, COLOR_WHITE); + } } } diff --git a/player.c b/player.c index 1c6a91a..bd07d58 100644 --- a/player.c +++ b/player.c @@ -4,6 +4,7 @@ void player_setup(Entity* en) { en->is_animate = true; en->max_health = 100; en->health = en->max_health; + en->armour = ARMOUR_starter; } void player_process_input(Entity* player, Entity* player_weapon, float delta_time) { diff --git a/sprite.c b/sprite.c index 8ab48bf..0971dab 100644 --- a/sprite.c +++ b/sprite.c @@ -11,6 +11,7 @@ typedef enum Sprite_ID { SPRITE_tree, SPRITE_startersword, SPRITE_starterbow, + SPRITE_starterarmour, SPRITE_arrow, SPRITE_MAX, } Sprite_ID;