From 1f97d811336e7341632de6bd4c91b35c47024f30 Mon Sep 17 00:00:00 2001 From: Matt Date: Sun, 5 Oct 2025 14:42:19 +0100 Subject: [PATCH] feat: initial bandit and more npc tweaks --- code/first.c | 12 +++--- code/game/bandit.h | 59 +++++++++++++++++++++++++++++ code/game/impl/npc.c | 6 --- code/game/impl/player.c | 23 ++++++------ code/game/impl/world.c | 18 +++++++++ code/game/npc.h | 21 ++++++++++- code/game/npc_look.h | 82 +++++++++++++++++++++++++++++++++++++++++ code/game/world.h | 18 ++++++++- 8 files changed, 212 insertions(+), 27 deletions(-) create mode 100644 code/game/bandit.h create mode 100644 code/game/impl/world.c create mode 100644 code/game/npc_look.h diff --git a/code/first.c b/code/first.c index 952cda9..b836c3c 100644 --- a/code/first.c +++ b/code/first.c @@ -13,7 +13,7 @@ #include "vulkan/core.h" #include "game/core.h" -#include "game/world.h" +#include "game/impl/world.c" #include "game/impl/npc.c" #include "game/testnavmesh.h" @@ -75,9 +75,6 @@ int main(int argc, char **argv) { } bool running = true; - Player player; - player.pos.x = 0; - player.pos.y = 0; World world = { .npcCount = 2, .npcs = { @@ -98,20 +95,21 @@ int main(int argc, char **argv) { } }, .navMesh = TestNavMesh, - .npcPOI = {100} + .npcPOI = {100}, + .player = {.pos = {0,0}} }; while (running) { SDL_Event e; while (SDL_PollEvent(&e)) { - PlayerUpdate(&e, &player); if (e.type == SDL_EVENT_QUIT) { running = false; } + ProcessEvents(&e, &world); } - UpdateNPCs(1.0/60.0, &world); + UpdateWorld(1.0/60.0, &world); int w, h; SDL_GetWindowSizeInPixels(window, &w, &h); diff --git a/code/game/bandit.h b/code/game/bandit.h new file mode 100644 index 0000000..2c25215 --- /dev/null +++ b/code/game/bandit.h @@ -0,0 +1,59 @@ +#if !defined(LD_GAME_BANDIT_H_) +#define LD_GAME_BANDIT_H_ + +typedef enum BANDIT_ACTION BANDIT_ACTION; +enum BANDIT_ACTION { + BANDIT_WAITING, + BANDIT_WALKING, + BANDIT_RUNNING, + BANDIT_SHOOTOUT, +}; + +typedef struct Bandit Bandit; +struct Bandit { + //// Personal + AABB collision; + Str8 name; + + //// Actions + BANDIT_ACTION mode; + // How long they've been waiting. + F32 waitTime; + // How long they will wait in this location. + F32 maxWaitTime; + + // Places the bandit walks to / from + // E.g. hide outs, home, saloon + U32 pointsOfInterest[12]; + //// Navigation + // The bandits's current path + NavPath path; + // Which node the bandit is on in the path + U32 currentNavNode; + // The current index of the bandit's current node + U32 pathIndex; + // Target navNode index the bandit is walking to + U32 targetNavNode; + // How long the bandit has been walking to the next index + F32 walkTimer; + + // How many shots they can take. + U32 health; + // How paranoid they are about being hunted, + // this will make them more trigger happy. + F32 paranoidLevel; + // Max 6? + U8 bullets; + // How long it its between shots. + F32 shootDelay; + // After each shot this is set to shootDelay; + F32 shootCooldownTimer; + // How long it takes them to reload. + F32 reloadTime; + // Accuracy, their shots can vary between this angle either side (rads) + F32 accuracyRange; + // A the circle around the bandit where they will trigger the quicktime reaction scene + F32 agroRadius; +}; + +#endif // LD_GAME_BANDIT_H_ diff --git a/code/game/impl/npc.c b/code/game/impl/npc.c index bc3ba30..31ecda3 100644 --- a/code/game/impl/npc.c +++ b/code/game/impl/npc.c @@ -41,9 +41,3 @@ void updateNPC(F32 delta, NPC *npc, World *world) { } } -void UpdateNPCs(F32 delta, World *world) { - for(int i = 0; i < world->npcCount; i++) { - updateNPC(delta, &world->npcs[i], world); - } -} - diff --git a/code/game/impl/player.c b/code/game/impl/player.c index 4c26667..756f5f5 100644 --- a/code/game/impl/player.c +++ b/code/game/impl/player.c @@ -1,22 +1,23 @@ #include "../player.h" +#include +#include void PlayerUpdate(SDL_Event *event, Player *player) { SDL_KeyboardEvent key = event->key; - if (key.key == SDLK_W) - { + switch(key.key) { + case SDLK_W: { player->pos.y += 10; - } - if (key.key == SDLK_A) - { + } + case SDLK_A: { player->pos.x -= 10; - } - if (key.key == SDLK_D) - { + } + case SDLK_D: { player->pos.x += 10; - } - if (key.key == SDLK_S) - { + } + case SDLK_S: { player->pos.y -= 10; + } } + printf("Player: %f %f\n", player->pos.x, player->pos.y); } diff --git a/code/game/impl/world.c b/code/game/impl/world.c new file mode 100644 index 0000000..e39dd09 --- /dev/null +++ b/code/game/impl/world.c @@ -0,0 +1,18 @@ +#include "../world.h" +#include "../npc.h" +#include "../player.h" +#include + +void UpdateWorld(F32 delta, World *world) { + UpdateNPCs(delta, world); +} + +void UpdateNPCs(F32 delta, World *world) { + for(int i = 0; i < world->npcCount; i++) { + updateNPC(delta, &world->npcs[i], world); + } +} + +void ProcessEvents(SDL_Event *event, World *world) { + PlayerUpdate(event, &world->player); +} diff --git a/code/game/npc.h b/code/game/npc.h index 228f43a..9077304 100644 --- a/code/game/npc.h +++ b/code/game/npc.h @@ -2,9 +2,10 @@ #define LD_GAME_NPC_H_ #include "aabb.h" #include "nav.h" +#include "npc_look.h" #include "../core/types.h" -#define NPC_SPEED 0.2 +#define NPC_SPEED 0.1 typedef enum NPC_ACTION NPC_ACTION; enum NPC_ACTION { @@ -14,18 +15,36 @@ enum NPC_ACTION { NPC_ACTION_WALKING, }; + typedef struct NPC NPC; struct NPC { + //// Personal AABB collision; Str8 name; + NPC_LOOK look; + + //// Actions NPC_ACTION mode; + // How long they've been waiting F32 waitTime; + // How long they will wait until changing action F32 maxWaitTime; + + //// Navigation + // The NPC's current path NavPath path; + // Which node the NPC is on in the path U32 currentNavNode; + // The current index of the NPC's current node U32 pathIndex; + // Target navNode index the npc is walking to U32 targetNavNode; + // How long the npc has been walking to the next index F32 walkTimer; + + //// Knowledge + // What the NPC knows about the bandit. + NPC_LOOK banditKnowledge; }; #endif // LD_GAME_NPC_H_ diff --git a/code/game/npc_look.h b/code/game/npc_look.h new file mode 100644 index 0000000..c1d72cb --- /dev/null +++ b/code/game/npc_look.h @@ -0,0 +1,82 @@ +#if !defined(LD_GAME_NPC_LOOK_H_) +#define LD_GAME_NPC_LOOK_H_ + +typedef struct NPC_LOOK NPC_LOOK; +typedef enum NPC_HAIR_COLOUR NPC_HAIR_COLOUR; +typedef enum NPC_JACKET_COLOUR NPC_JACKET_COLOUR; +typedef enum NPC_JEANS_COLOUR NPC_JEANS_COLOUR; +typedef enum NPC_EYE_COLOUR NPC_EYE_COLOUR; +typedef enum NPC_SKIN_TONE NPC_SKIN_TONE; +typedef enum NPC_HAT NPC_HAT; +typedef enum NPC_FACIAL_FEATURE NPC_FACIAL_FEATURE; + +enum NPC_HAIR_COLOUR { + NPC_HAIR_COLOUR_UNKNOWN, + NPC_HAIR_COLOUR_BLONDE, + NPC_HAIR_COLOUR_BLACK, + NPC_HAIR_COLOUR_BRUNETTE, + NPC_HAIR_COLOUR_GIGNER, +}; + +enum NPC_JACKET_COLOUR { + NPC_JACKET_COLOUR_UNKNOWN, + NPC_JACKET_COLOUR_TAN, + NPC_JACKET_COLOUR_BLUE, + NPC_JACKET_COLOUR_WHITE, +}; + +enum NPC_JEANS_COLOUR { + NPC_JEANS_COLOUR_UNKNOWN, + NPC_JEANS_COLOUR_TAN, + NPC_JEANS_COLOUR_BLACK, + NPC_JEANS_COLOUR_BLUE, + NPC_JEANS_COLOUR_WHITE, +}; + +enum NPC_EYE_COLOUR { + NPC_EYE_COLOUR_UNKNOWN, + NPC_EYE_COLOUR_GREEN, + NPC_EYE_COLOUR_BLUE, + NPC_EYE_COLOUR_BROWN, +}; + +enum NPC_SHOE_COLOUR { + NPC_SHOE_COLOUR_UNKNOWN, + NPC_SHOE_COLOUR_BLACK, + NPC_SHOE_COLOUR_BROWN, + NPC_SHOE_COLOUR_WHITE, + NPC_SHOE_COLOUR_NAVY, +}; + +enum NPC_SKIN_TONE { + NPC_SKIN_TONE_UNKNOWN, + NPC_SKIN_TONE_WHITE, + NPC_SKIN_TONE_BLACK, +}; + +enum NPC_FACIAL_FEATURE { + NPC_FACIAL_FEATURE_UNKNOWN, + NPC_FACIAL_FEATURE_BEARD, + NPC_FACIAL_FEATURE_MUSTACHE, + NPC_FACIAL_FEATURE_GLASSES, +}; + +enum NPC_HAT { + NPC_HAT_UNKNOWN, + NPC_HAT_TEN_GALLON, + NPC_TOP_HAT, + NPC_FLAT_CAP, + NPC_NONE, +}; + +struct NPC_LOOK { + NPC_HAIR_COLOUR hair; + NPC_JACKET_COLOUR jacket; + NPC_JEANS_COLOUR jeans; + NPC_EYE_COLOUR eyes; + NPC_SKIN_TONE skinTone; + NPC_HAT hat; + NPC_FACIAL_FEATURE facialFeature; +}; + +#endif // LD_GAME_NPC_LOOK_H_ diff --git a/code/game/world.h b/code/game/world.h index 411f9b1..d3b3323 100644 --- a/code/game/world.h +++ b/code/game/world.h @@ -2,6 +2,7 @@ #define LD_GAME_WORLD_H_ #include "player.h" #include "npc.h" +#include "bandit.h" // Areas are which enum AREA { @@ -11,14 +12,27 @@ enum AREA { typedef struct World World; struct World { + //// Static stuff + NavMesh navMesh; + + //// Player + Player player; + + //// NPCs U32 npcCount; NPC npcs[128]; - NavMesh navMesh; + + ////Bandit + // The bandit the player is after. + Bandit bandit; + // NPC points of interest, places to walk to. U32 npcPOI[256]; }; -function void updateWorld(F32 delta, World *world); +function void UpdateWorld(F32 delta, World *world); +function void ProcessEvents(SDL_Event *event, World *world); function void UpdateNPCs(F32 delta, World *world); +function void updateNPC(F32 delta, NPC *npc, World *world); #endif // LD_GAME_WORLD_H_