package game import "core:fmt" import rl "vendor:raylib" BOTTOM_BAR_Y :: SCREEN_H - CONTROL_BAR_H ARCHER_BUTTON_W :: 120 START_WAVE_BUTTON_W :: 110 CONTROLS_BUTTON_GAP :: 12 CONTROLS_BUTTON_H :: 24 CONTROLS_BUTTON_Y :: BOTTOM_BAR_Y + 8 CONTROLS_BUTTON_X :: (SCREEN_W - (ARCHER_BUTTON_W + CONTROLS_BUTTON_GAP + START_WAVE_BUTTON_W)) / 2 ARCHER_BUTTON_RECT :: rl.Rectangle { f32(CONTROLS_BUTTON_X), f32(CONTROLS_BUTTON_Y), ARCHER_BUTTON_W, CONTROLS_BUTTON_H, } START_WAVE_BUTTON_RECT :: rl.Rectangle { f32(CONTROLS_BUTTON_X + ARCHER_BUTTON_W + CONTROLS_BUTTON_GAP), f32(CONTROLS_BUTTON_Y), START_WAVE_BUTTON_W, CONTROLS_BUTTON_H, } poll_controls_command :: proc(world: ^World) -> Command { if world.phase != .Build do return Command{kind = .None} mouse := game_mouse() if rl.IsMouseButtonPressed(.LEFT) { if rl.CheckCollisionPointRec(mouse, ARCHER_BUTTON_RECT) { world.selected_tower = .Archer } if rl.CheckCollisionPointRec(mouse, START_WAVE_BUTTON_RECT) { return Command{kind = .Start_Wave} } } return Command{kind = .None} } draw_archer_button :: proc(world: ^World, archer: rl.Rectangle) { arch := TOWER_ARCHETYPES[.Archer] mouse := rl.GetMousePosition() arch_bg := CONTROLS_SHOP_IDLE if world.selected_tower == .Archer do arch_bg = CONTROL_SHOP_SELECTED if rl.CheckCollisionPointRec(mouse, archer) do arch_bg = CONTROLS_SHOP_HOVER label := fmt.ctprintf("Archer - %dg", arch.cost) draw_button(archer, label, arch_bg, 14, OVERLAY_TEXT_COLOR) } draw_start_wave_button :: proc(start_wave_rect: rl.Rectangle, mouse: rl.Vector2) { bg := CONTROL_BUTTON_COLOR if rl.CheckCollisionPointRec(mouse, start_wave_rect) do bg = CONTROL_BUTTON_HOVER draw_button(start_wave_rect, "Start Wave", bg, 16, OVERLAY_TEXT_COLOR) } draw_build_controls :: proc(world: ^World) { if world.phase != .Build do return mouse := game_mouse() rl.DrawRectangle(0, BOTTOM_BAR_Y, SCREEN_W, CONTROL_BAR_H, CONTROL_BAR_BG) draw_archer_button(world, ARCHER_BUTTON_RECT) draw_start_wave_button(START_WAVE_BUTTON_RECT, mouse) } render_controls :: proc(world: ^World) { switch world.phase { case .Build: draw_build_controls(world) case .Combat: draw_combat_banner() case .Game_Over, .Victory: } } draw_combat_banner :: proc() { rl.DrawRectangle(0, BOTTOM_BAR_Y, SCREEN_W, CONTROL_BAR_H, rl.Color{120, 40, 40, 200}) text: cstring = "Combat!" font: i32 = 16 tw := rl.MeasureText(text, font) rl.DrawText( text, (SCREEN_W - tw) / 2, BOTTOM_BAR_Y + (CONTROL_BAR_H - font) / 2, font, rl.Color{255, 220, 220, 255}, ) }