From 114c298219edd5e6bc9500727bc441bf7b3a163c Mon Sep 17 00:00:00 2001 From: codegirl-007 Date: Wed, 10 Jun 2026 00:56:21 -0700 Subject: [PATCH] commands, towers, etc --- game/commands.odin | 32 ++++++++++++++++++++++++++++++++ game/map.odin | 7 ++++++- game/render.odin | 4 ++++ game/tower.odin | 20 ++++++++++++++++++++ game/world.odin | 6 +++--- 5 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 game/commands.odin create mode 100644 game/tower.odin diff --git a/game/commands.odin b/game/commands.odin new file mode 100644 index 0000000..ba0377d --- /dev/null +++ b/game/commands.odin @@ -0,0 +1,32 @@ +package game + +import rl "vendor:raylib" +Command_Kind :: enum { + None, + Place_Tower, +} + +Command :: struct { + kind: Command_Kind, + gx: int, + gy: int, +} + +gather_commands :: proc(world: ^World) -> Command { + if rl.IsMouseButtonPressed(.LEFT) { + mouse := rl.GetMousePosition() + gx, gy := screen_to_grid(mouse.x, mouse.y) + return Command{kind = .Place_Tower, gx = gx, gy = gy} + } + + return Command{kind = .None} +} + +execute_command :: proc(world: ^World, cmd: Command) { + switch cmd.kind { + case .None: + case .Place_Tower: + try_place_tower(world, cmd.gx, cmd.gy) + } +} + diff --git a/game/map.odin b/game/map.odin index 4add8dc..ed80429 100644 --- a/game/map.odin +++ b/game/map.odin @@ -46,6 +46,11 @@ init_map :: proc(world_map: ^Map) { } } } - +} + +can_build_at :: proc(world_map: ^Map, gx, gy: int) -> bool { + if gx < 0 || gx >= MAP_W do return false + if gy < 0 || gy >= MAP_H do return false + return world_map.tiles[gy][gx] == .Build } diff --git a/game/render.odin b/game/render.odin index d9befed..0a11d2a 100644 --- a/game/render.odin +++ b/game/render.odin @@ -28,6 +28,10 @@ render_world :: proc(world: ^World) { ) } + for t in world.towers { + rl.DrawRectangle(i32(t.position.x - 14), i32(t.position.y - 14), 28, 28, rl.BLUE) + } + if (world.base_health == 0) { rl.DrawText("**GAME OVER**", 20, 20, 20, rl.RED) } diff --git a/game/tower.odin b/game/tower.odin new file mode 100644 index 0000000..b1138e3 --- /dev/null +++ b/game/tower.odin @@ -0,0 +1,20 @@ +package game + +Tower :: struct { + position: Vec2, +} + +try_place_tower :: proc(world: ^World, gx, gy: int) -> bool { + if !can_build_at(&world.world_map, gx, gy) do return false + if world.gold < TOWER_COST do return false + + pos := grid_to_center(gx, gy) + for t in world.towers { + if distance(t.position, pos) < 1 do return false + } + + world.gold -= TOWER_COST + append(&world.towers, Tower{position = pos}) + return true +} + diff --git a/game/world.odin b/game/world.odin index 2f26b04..0bf0ca2 100644 --- a/game/world.odin +++ b/game/world.odin @@ -8,6 +8,7 @@ World :: struct { world_map: Map, path: [dynamic]Vec2, enemies: [MAX_ENEMIES]Enemy, + towers: [dynamic]Tower, } init_world :: proc() -> World { @@ -22,9 +23,8 @@ init_world :: proc() -> World { // update world, never draw update_world :: proc(world: ^World, dt: f32) { - if rl.IsKeyPressed(.G) { - world.gold += 10 - } + cmd := gather_commands(world) + execute_command(world, cmd) if rl.IsKeyPressed(.SPACE) { spawn_group(world, 3)