From 1f451f10be01680fc12ca5b33f187836e72585f0 Mon Sep 17 00:00:00 2001 From: DavoSK Date: Thu, 2 Feb 2023 15:41:16 +0100 Subject: [PATCH] added weapon knife system --- code/foundation/src/models/components.h | 9 +++++- code/games/survival/src/game.c | 10 +++++++ code/games/survival/src/system_weapon.c | 37 +++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 code/games/survival/src/system_weapon.c diff --git a/code/foundation/src/models/components.h b/code/foundation/src/models/components.h index d7661cd..8bb0f75 100644 --- a/code/foundation/src/models/components.h +++ b/code/foundation/src/models/components.h @@ -228,9 +228,15 @@ typedef struct { } MobHuntPlayer; typedef struct { - char _unused; + char _unused; } MobMelee; +typedef struct { + uint16_t projectile_count; + uint8_t damage; + uint8_t spawn_delay; +} WeaponKnife; + #define _COMPS\ X(Vector2D)\ X(Position)\ @@ -247,6 +253,7 @@ typedef struct { X(Mob)\ X(MobHuntPlayer)\ X(MobMelee)\ + X(WeaponKnife)\ X(Classify)\ X(Vehicle)\ X(IsInVehicle)\ diff --git a/code/games/survival/src/game.c b/code/games/survival/src/game.c index ec08b59..8b49b7c 100644 --- a/code/games/survival/src/game.c +++ b/code/games/survival/src/game.c @@ -10,11 +10,13 @@ // custom systems #include "system_mob.c" +#include "system_weapon.c" void mob_systems(ecs_world_t *ecs) { ECS_SYSTEM_TICKED_EX(ecs, MobDetectPlayers, EcsPostUpdate, 100.0f, components.Position, components.Mob); ECS_SYSTEM(ecs, MobMovement, EcsPostUpdate, components.Velocity, components.Position, components.MobHuntPlayer); ECS_SYSTEM_TICKED(ecs, MobMeleeAtk, EcsPostUpdate, components.Position, components.Mob, components.MobHuntPlayer, components.MobMelee); + ECS_SYSTEM_TICKED(ecs, WeaponKnifeMechanic, EcsPostUpdate, components.WeaponKnife, components.Position, components.Input); //ECS_OBSERVER(ecs, MobDetectPlayers1, EcsOnAdd, components.Mob); } @@ -36,6 +38,14 @@ void game_setup_ecs() { void game_player_joined(uint64_t ent) { notification_push("test1", "Hello World!"); + + //NOTE(DavoSK): add weapon component for testing + ecs_world_t* world = world_ecs(); + ecs_set(world, (ecs_entity_t)ent, WeaponKnife, { + .projectile_count = 1, + .damage = 10, + .spawn_delay = WEAPON_KNIFE_SPAWN_DELAY + }); } void game_player_departed(uint64_t ent) { diff --git a/code/games/survival/src/system_weapon.c b/code/games/survival/src/system_weapon.c new file mode 100644 index 0000000..b226f70 --- /dev/null +++ b/code/games/survival/src/system_weapon.c @@ -0,0 +1,37 @@ +#define WEAPON_KNIFE_SPAWN_DELAY 20 +#define WEAPON_PROJECTILE_POS_OFFSET 0.2f +#define WEAPON_PROJECTILE_SPEED 10.0f + +//TODO(DavoSK): move to helpers, add srand +float get_rand_between(float min, float max) { + float scale = rand() / (float) RAND_MAX; /* [0, 1.0] */ + return min + scale * ( max - min ); /* [min, max] */ +} + +void WeaponKnifeMechanic(ecs_iter_t *it) { + WeaponKnife *weapon = ecs_field(it, WeaponKnife, 1); + const Position *pos = ecs_field(it, Position, 2); + const Input *input = ecs_field(it, Input, 3); + + for (int i = 0; i < it->count; i++) { + if (weapon[i].spawn_delay > 0) { + TICK_VAR(weapon[i].spawn_delay); + continue; + } + + for(int j = 0; j < weapon[i].projectile_count; j++) { + ecs_entity_t projectile_entity = ecs_new_entity(it->world, "WeaponProjectile"); + ecs_set(it->world, projectile_entity, Position, { + .x=pos[i].x, + .y=pos[i].y+get_rand_between(-WEAPON_PROJECTILE_POS_OFFSET, WEAPON_PROJECTILE_POS_OFFSET) + }); + + ecs_set(it->world, projectile_entity, Velocity, { + .x=input[i].x*WEAPON_PROJECTILE_SPEED, + .y=input[i].y*WEAPON_PROJECTILE_SPEED + }); + } + + weapon[i].spawn_delay = WEAPON_KNIFE_SPAWN_DELAY; + } +} \ No newline at end of file