diff options
| author | salmonik <raisersoft@proton.me> | 2026-07-11 01:35:02 +0200 |
|---|---|---|
| committer | salmonik <raisersoft@proton.me> | 2026-07-11 01:35:02 +0200 |
| commit | aae1d1a56a935b2aeba7eb953b71106b190da974 (patch) | |
| tree | d87d11ca843878795f0ccbac12cb0d8d69e6ee68 /src/main.rs | |
| parent | Phase 2 (diff) | |
| download | dungeon-aae1d1a56a935b2aeba7eb953b71106b190da974.tar.gz dungeon-aae1d1a56a935b2aeba7eb953b71106b190da974.zip | |
animations, introduction, no terminal
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 56 |
1 files changed, 36 insertions, 20 deletions
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 @@ | |||
| 1 | #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] | ||
| 2 | |||
| 1 | mod game; | 3 | mod game; |
| 2 | mod renderer; | 4 | mod renderer; |
| 3 | mod texture; | 5 | mod texture; |
| @@ -11,17 +13,6 @@ const SCREEN_W: usize = 640; | |||
| 11 | const SCREEN_H: usize = 480; | 13 | const SCREEN_H: usize = 480; |
| 12 | 14 | ||
| 13 | fn main() { | 15 | fn main() { |
| 14 | println!("=== DUNGEON CRAWLER ==="); | ||
| 15 | println!(" W / S — forward / backward"); | ||
| 16 | println!(" A / D — strafe left / right"); | ||
| 17 | println!(" Q / E — turn 90° left / right"); | ||
| 18 | println!(" Space — attack"); | ||
| 19 | println!(" Z — use selected inventory item"); | ||
| 20 | println!(" X — discard selected inventory item"); | ||
| 21 | println!(" 1-4 — select inventory slot"); | ||
| 22 | println!(" C — skip turn"); | ||
| 23 | println!(" Esc — quit\n"); | ||
| 24 | |||
| 25 | let mut game = Game::new(); | 16 | let mut game = Game::new(); |
| 26 | let renderer = Renderer::new(SCREEN_W, SCREEN_H); | 17 | let renderer = Renderer::new(SCREEN_W, SCREEN_H); |
| 27 | 18 | ||
| @@ -33,6 +24,9 @@ fn main() { | |||
| 33 | ) | 24 | ) |
| 34 | .expect("Failed to create window"); | 25 | .expect("Failed to create window"); |
| 35 | 26 | ||
| 27 | // Try to centre on screen (best-effort; not all backends support this). | ||
| 28 | window.set_position(640, 240); | ||
| 29 | |||
| 36 | let mut framebuffer = vec![0u32; SCREEN_W * SCREEN_H]; | 30 | let mut framebuffer = vec![0u32; SCREEN_W * SCREEN_H]; |
| 37 | let mut last = Instant::now(); | 31 | let mut last = Instant::now(); |
| 38 | let frame_budget = std::time::Duration::from_micros(16600); // ~60 fps | 32 | let frame_budget = std::time::Duration::from_micros(16600); // ~60 fps |
| @@ -52,6 +46,7 @@ fn main() { | |||
| 52 | let mut prev_2 = false; | 46 | let mut prev_2 = false; |
| 53 | let mut prev_3 = false; | 47 | let mut prev_3 = false; |
| 54 | let mut prev_4 = false; | 48 | let mut prev_4 = false; |
| 49 | let mut prev_any = false; | ||
| 55 | 50 | ||
| 56 | while window.is_open() && !window.is_key_down(Key::Escape) { | 51 | while window.is_open() && !window.is_key_down(Key::Escape) { |
| 57 | let frame_start = Instant::now(); | 52 | let frame_start = Instant::now(); |
| @@ -73,9 +68,35 @@ fn main() { | |||
| 73 | let cur_2 = window.is_key_down(Key::Key2); | 68 | let cur_2 = window.is_key_down(Key::Key2); |
| 74 | let cur_3 = window.is_key_down(Key::Key3); | 69 | let cur_3 = window.is_key_down(Key::Key3); |
| 75 | let cur_4 = window.is_key_down(Key::Key4); | 70 | let cur_4 = window.is_key_down(Key::Key4); |
| 71 | let cur_any = cur_w | ||
| 72 | || cur_s | ||
| 73 | || cur_a | ||
| 74 | || cur_d | ||
| 75 | || cur_q | ||
| 76 | || cur_e | ||
| 77 | || cur_space | ||
| 78 | || cur_z | ||
| 79 | || cur_x | ||
| 80 | || cur_c | ||
| 81 | || cur_1 | ||
| 82 | || cur_2 | ||
| 83 | || cur_3 | ||
| 84 | || cur_4 | ||
| 85 | || window.is_key_down(Key::Enter) | ||
| 86 | || window.is_key_down(Key::Escape); | ||
| 87 | |||
| 88 | // ---- input ---- | ||
| 89 | let was_showing_controls = game.show_controls; | ||
| 90 | |||
| 91 | if game.show_controls { | ||
| 92 | if cur_any && !prev_any { | ||
| 93 | game.show_controls = false; | ||
| 94 | } | ||
| 95 | } | ||
| 76 | 96 | ||
| 77 | // ---- input (edge-triggered, only in WaitingForInput) ---- | 97 | // Only process game input if controls were NOT showing at the start |
| 78 | if game.can_act() { | 98 | // of this frame (prevents the dismissing key from triggering an action). |
| 99 | if !was_showing_controls && game.can_act() { | ||
| 79 | if cur_w && !prev_w { | 100 | if cur_w && !prev_w { |
| 80 | game.move_forward(); | 101 | game.move_forward(); |
| 81 | } else if cur_s && !prev_s { | 102 | } else if cur_s && !prev_s { |
| @@ -107,7 +128,7 @@ fn main() { | |||
| 107 | } | 128 | } |
| 108 | } | 129 | } |
| 109 | 130 | ||
| 110 | // Update previous states. | 131 | // Update previous states for next frame. |
| 111 | prev_w = cur_w; | 132 | prev_w = cur_w; |
| 112 | prev_s = cur_s; | 133 | prev_s = cur_s; |
| 113 | prev_a = cur_a; | 134 | prev_a = cur_a; |
| @@ -122,23 +143,18 @@ fn main() { | |||
| 122 | prev_2 = cur_2; | 143 | prev_2 = cur_2; |
| 123 | prev_3 = cur_3; | 144 | prev_3 = cur_3; |
| 124 | prev_4 = cur_4; | 145 | prev_4 = cur_4; |
| 146 | prev_any = cur_any; | ||
| 125 | 147 | ||
| 126 | // ---- advance animations / state machine ---- | 148 | // ---- advance animations / state machine ---- |
| 127 | game.update_animation(dt); | 149 | game.update_animation(dt); |
| 128 | 150 | ||
| 129 | // ---- death check ---- | 151 | // ---- death check ---- |
| 130 | if game.state == GameState::GameOver { | 152 | if game.state == GameState::GameOver { |
| 131 | let score = (game.kills * 100) + (game.depth.pow(2) * 50) + 500; // fists = base damage 1 | ||
| 132 | println!( | ||
| 133 | "You had become yet another legend of this dungeon.\nScore: {}", | ||
| 134 | score | ||
| 135 | ); | ||
| 136 | std::process::exit(0); | 153 | std::process::exit(0); |
| 137 | } | 154 | } |
| 138 | 155 | ||
| 139 | // ---- win check (placeholder — becomes staircase in Phase 1) ---- | 156 | // ---- win check (placeholder — becomes staircase in Phase 1) ---- |
| 140 | if game.check_win() { | 157 | if game.check_win() { |
| 141 | println!("You found the exit in {} heartbeats!", game.heartbeats()); | ||
| 142 | std::process::exit(0); | 158 | std::process::exit(0); |
| 143 | } | 159 | } |
| 144 | 160 | ||
