2025-10-05 14:42:19 +01:00
|
|
|
#include "../world.h"
|
|
|
|
|
#include "../npc.h"
|
|
|
|
|
#include "../player.h"
|
2025-10-05 22:35:34 +01:00
|
|
|
#include "../aabb.h"
|
2025-10-05 14:42:19 +01:00
|
|
|
#include <SDL3/SDL_events.h>
|
2025-10-06 00:38:10 +01:00
|
|
|
#include "../map.h"
|
2025-10-05 14:42:19 +01:00
|
|
|
|
2025-10-05 16:05:57 +01:00
|
|
|
void UpdateWorld(F32 delta, World *world)
|
|
|
|
|
{
|
2025-10-05 21:05:29 +01:00
|
|
|
UpdateBandit(delta, &world->bandit, world);
|
2025-10-05 14:42:19 +01:00
|
|
|
UpdateNPCs(delta, world);
|
2025-10-05 18:05:01 +01:00
|
|
|
PlayerUpdate(delta, &world->player);
|
2025-10-05 14:42:19 +01:00
|
|
|
}
|
|
|
|
|
|
2025-10-05 16:05:57 +01:00
|
|
|
void UpdateNPCs(F32 delta, World *world)
|
|
|
|
|
{
|
|
|
|
|
for (U32 i = 0; i < world->npcCount; i++)
|
|
|
|
|
{
|
2025-10-05 23:36:50 +01:00
|
|
|
NPC *npc = &world->npcs[i];
|
|
|
|
|
UpdateNPC(delta, npc, world);
|
|
|
|
|
if(
|
|
|
|
|
world->player.controls.shot
|
|
|
|
|
&& AABB_Point(npc->collision, world->player.shotPos)
|
|
|
|
|
&& npc->currentArea == world->player.currentArea
|
|
|
|
|
) {
|
|
|
|
|
printf("You shot %*.s\n", Sv(world->npcs[i].name));
|
2025-10-05 21:05:29 +01:00
|
|
|
}
|
2025-10-05 14:42:19 +01:00
|
|
|
}
|
2025-10-05 15:17:37 +01:00
|
|
|
}
|
2025-10-05 14:42:19 +01:00
|
|
|
|
2025-10-05 16:05:57 +01:00
|
|
|
void ProcessEvents(SDL_Event *event, World *world)
|
|
|
|
|
{
|
2025-10-05 18:05:01 +01:00
|
|
|
PlayerInput(event, &world->player);
|
2025-10-05 14:42:19 +01:00
|
|
|
}
|
2025-10-05 16:49:18 +01:00
|
|
|
|
|
|
|
|
void RenderWorld(World *world, D_Context *draw) {
|
2025-10-06 00:38:10 +01:00
|
|
|
World_Tile tileTypes[] = {dirt, middlePath, middlePathEdgeTop, middlePathEdgeRight, middlePathEdgeBottom, middlePathEdgeLeft, middlePathCornerTopLeft, middlePathCornerTopRight, middlePathCornerBottomRight, middlePathCornerTurnBottomLeft};
|
|
|
|
|
for (int i = 0; i < 4800; i++)
|
|
|
|
|
{
|
|
|
|
|
D_Rect(draw, (i % 96), __floor(i / 96), .texture = tileTypes[map[i]].tile, .angle = tileTypes[map[i]].rotation);
|
|
|
|
|
}
|
2025-10-05 21:19:14 +01:00
|
|
|
for(U32 i = 0; i < world->npcCount; i++) {
|
2025-10-05 21:05:29 +01:00
|
|
|
NPC npc = world->npcs[i];
|
2025-10-05 23:36:50 +01:00
|
|
|
if(npc.currentArea == world->player.currentArea) {
|
|
|
|
|
V2f drawPos = AABB_Centre(npc.collision);
|
|
|
|
|
D_Rect(draw, drawPos.x, drawPos.y, .texture = 1);
|
|
|
|
|
D_Rect(draw, drawPos.x, drawPos.y, .texture = 0, .dim = npc.collision.size, .flags = D_RECT_IGNORE_ASPECT);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(world->bandit.currentArea == world->player.currentArea) {
|
|
|
|
|
V2f drawPos = AABB_Centre(world->bandit.collision);
|
|
|
|
|
D_Rect(draw, drawPos.x, drawPos.y, .texture = 9);
|
|
|
|
|
D_Rect(draw, drawPos.x, drawPos.y, .texture = 0, .dim = world->bandit.collision.size, .flags = D_RECT_IGNORE_ASPECT);
|
2025-10-05 16:49:18 +01:00
|
|
|
}
|
2025-10-05 21:19:14 +01:00
|
|
|
D_Rect(draw, world->player.pos.x, world->player.pos.y, .texture = 1);
|
2025-10-05 14:42:19 +01:00
|
|
|
}
|
2025-10-05 21:11:18 +01:00
|
|
|
|
|
|
|
|
void G_WorldDraw(G_State *game, World *world) {
|
|
|
|
|
D_Context *draw = &game->draw;
|
|
|
|
|
|
|
|
|
|
(void) world;
|
|
|
|
|
|
|
|
|
|
for (F32 y = -128; y < 128; y += 1.1f) {
|
|
|
|
|
for (F32 x = -128; x < 128; x += 1.1f) {
|
|
|
|
|
|
|
|
|
|
U32 ux = (U32) x;
|
|
|
|
|
U32 uy = (U32) y;
|
|
|
|
|
|
|
|
|
|
U32 tid = 15;
|
|
|
|
|
if ((ux % 11) == 0 || ((uy % 7) == 0)) {
|
|
|
|
|
tid = 16;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
D_Rect(draw, x, y, .texture = tid);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|