summaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
authorsalmonik <raisersoft@proton.me>2026-07-11 01:35:02 +0200
committersalmonik <raisersoft@proton.me>2026-07-11 01:35:02 +0200
commitaae1d1a56a935b2aeba7eb953b71106b190da974 (patch)
treed87d11ca843878795f0ccbac12cb0d8d69e6ee68 /src/main.rs
parentPhase 2 (diff)
downloaddungeon-aae1d1a56a935b2aeba7eb953b71106b190da974.tar.gz
dungeon-aae1d1a56a935b2aeba7eb953b71106b190da974.zip
animations, introduction, no terminal
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs56
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
1mod game; 3mod game;
2mod renderer; 4mod renderer;
3mod texture; 5mod texture;
@@ -11,17 +13,6 @@ const SCREEN_W: usize = 640;
11const SCREEN_H: usize = 480; 13const SCREEN_H: usize = 480;
12 14
13fn main() { 15fn 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