From aae1d1a56a935b2aeba7eb953b71106b190da974 Mon Sep 17 00:00:00 2001 From: salmonik Date: Sat, 11 Jul 2026 01:35:02 +0200 Subject: animations, introduction, no terminal --- src/main.rs | 56 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 20 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index 391bb90..a59edcd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + mod game; mod renderer; mod texture; @@ -11,17 +13,6 @@ const SCREEN_W: usize = 640; const SCREEN_H: usize = 480; fn main() { - println!("=== DUNGEON CRAWLER ==="); - println!(" W / S — forward / backward"); - println!(" A / D — strafe left / right"); - println!(" Q / E — turn 90° left / right"); - println!(" Space — attack"); - println!(" Z — use selected inventory item"); - println!(" X — discard selected inventory item"); - println!(" 1-4 — select inventory slot"); - println!(" C — skip turn"); - println!(" Esc — quit\n"); - let mut game = Game::new(); let renderer = Renderer::new(SCREEN_W, SCREEN_H); @@ -33,6 +24,9 @@ fn main() { ) .expect("Failed to create window"); + // Try to centre on screen (best-effort; not all backends support this). + window.set_position(640, 240); + let mut framebuffer = vec![0u32; SCREEN_W * SCREEN_H]; let mut last = Instant::now(); let frame_budget = std::time::Duration::from_micros(16600); // ~60 fps @@ -52,6 +46,7 @@ fn main() { let mut prev_2 = false; let mut prev_3 = false; let mut prev_4 = false; + let mut prev_any = false; while window.is_open() && !window.is_key_down(Key::Escape) { let frame_start = Instant::now(); @@ -73,9 +68,35 @@ fn main() { let cur_2 = window.is_key_down(Key::Key2); let cur_3 = window.is_key_down(Key::Key3); let cur_4 = window.is_key_down(Key::Key4); + let cur_any = cur_w + || cur_s + || cur_a + || cur_d + || cur_q + || cur_e + || cur_space + || cur_z + || cur_x + || cur_c + || cur_1 + || cur_2 + || cur_3 + || cur_4 + || window.is_key_down(Key::Enter) + || window.is_key_down(Key::Escape); + + // ---- input ---- + let was_showing_controls = game.show_controls; + + if game.show_controls { + if cur_any && !prev_any { + game.show_controls = false; + } + } - // ---- input (edge-triggered, only in WaitingForInput) ---- - if game.can_act() { + // Only process game input if controls were NOT showing at the start + // of this frame (prevents the dismissing key from triggering an action). + if !was_showing_controls && game.can_act() { if cur_w && !prev_w { game.move_forward(); } else if cur_s && !prev_s { @@ -107,7 +128,7 @@ fn main() { } } - // Update previous states. + // Update previous states for next frame. prev_w = cur_w; prev_s = cur_s; prev_a = cur_a; @@ -122,23 +143,18 @@ fn main() { prev_2 = cur_2; prev_3 = cur_3; prev_4 = cur_4; + prev_any = cur_any; // ---- advance animations / state machine ---- game.update_animation(dt); // ---- death check ---- if game.state == GameState::GameOver { - let score = (game.kills * 100) + (game.depth.pow(2) * 50) + 500; // fists = base damage 1 - println!( - "You had become yet another legend of this dungeon.\nScore: {}", - score - ); std::process::exit(0); } // ---- win check (placeholder — becomes staircase in Phase 1) ---- if game.check_win() { - println!("You found the exit in {} heartbeats!", game.heartbeats()); std::process::exit(0); } -- cgit v1.2.3