summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsalmonik <raisersoft@proton.me>2026-07-11 01:41:45 +0200
committersalmonik <raisersoft@proton.me>2026-07-11 01:41:45 +0200
commit74eecc82f72c0974c7a5b6f567833f80b53335e7 (patch)
tree55fc25810de2ea541e584c727994b0087a4e27b4
parentanimations, introduction, no terminal (diff)
downloaddungeon-74eecc82f72c0974c7a5b6f567833f80b53335e7.tar.gz
dungeon-74eecc82f72c0974c7a5b6f567833f80b53335e7.zip
switch to rust 2024
-rw-r--r--Cargo.lock45
-rw-r--r--Cargo.toml4
-rw-r--r--src/game.rs42
-rw-r--r--src/texture.rs4
4 files changed, 55 insertions, 40 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 1d07e99..d3682b2 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -177,13 +177,14 @@ dependencies = [
177 177
178[[package]] 178[[package]]
179name = "getrandom" 179name = "getrandom"
180version = "0.2.17" 180version = "0.3.4"
181source = "registry+https://github.com/rust-lang/crates.io-index" 181source = "registry+https://github.com/rust-lang/crates.io-index"
182checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" 182checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
183dependencies = [ 183dependencies = [
184 "cfg-if", 184 "cfg-if",
185 "libc", 185 "libc",
186 "wasi", 186 "r-efi 5.3.0",
187 "wasip2",
187] 188]
188 189
189[[package]] 190[[package]]
@@ -194,7 +195,7 @@ checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
194dependencies = [ 195dependencies = [
195 "cfg-if", 196 "cfg-if",
196 "libc", 197 "libc",
197 "r-efi", 198 "r-efi 6.0.0",
198] 199]
199 200
200[[package]] 201[[package]]
@@ -377,26 +378,31 @@ dependencies = [
377 378
378[[package]] 379[[package]]
379name = "r-efi" 380name = "r-efi"
381version = "5.3.0"
382source = "registry+https://github.com/rust-lang/crates.io-index"
383checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
384
385[[package]]
386name = "r-efi"
380version = "6.0.0" 387version = "6.0.0"
381source = "registry+https://github.com/rust-lang/crates.io-index" 388source = "registry+https://github.com/rust-lang/crates.io-index"
382checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" 389checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
383 390
384[[package]] 391[[package]]
385name = "rand" 392name = "rand"
386version = "0.8.6" 393version = "0.9.4"
387source = "registry+https://github.com/rust-lang/crates.io-index" 394source = "registry+https://github.com/rust-lang/crates.io-index"
388checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" 395checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea"
389dependencies = [ 396dependencies = [
390 "libc",
391 "rand_chacha", 397 "rand_chacha",
392 "rand_core", 398 "rand_core",
393] 399]
394 400
395[[package]] 401[[package]]
396name = "rand_chacha" 402name = "rand_chacha"
397version = "0.3.1" 403version = "0.9.0"
398source = "registry+https://github.com/rust-lang/crates.io-index" 404source = "registry+https://github.com/rust-lang/crates.io-index"
399checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 405checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
400dependencies = [ 406dependencies = [
401 "ppv-lite86", 407 "ppv-lite86",
402 "rand_core", 408 "rand_core",
@@ -404,11 +410,11 @@ dependencies = [
404 410
405[[package]] 411[[package]]
406name = "rand_core" 412name = "rand_core"
407version = "0.6.4" 413version = "0.9.5"
408source = "registry+https://github.com/rust-lang/crates.io-index" 414source = "registry+https://github.com/rust-lang/crates.io-index"
409checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 415checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
410dependencies = [ 416dependencies = [
411 "getrandom 0.2.17", 417 "getrandom 0.3.4",
412] 418]
413 419
414[[package]] 420[[package]]
@@ -559,10 +565,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
559checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" 565checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29"
560 566
561[[package]] 567[[package]]
562name = "wasi" 568name = "wasip2"
563version = "0.11.1+wasi-snapshot-preview1" 569version = "1.0.4+wasi-0.2.12"
564source = "registry+https://github.com/rust-lang/crates.io-index" 570source = "registry+https://github.com/rust-lang/crates.io-index"
565checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 571checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
572dependencies = [
573 "wit-bindgen",
574]
566 575
567[[package]] 576[[package]]
568name = "wasm-bindgen" 577name = "wasm-bindgen"
@@ -740,6 +749,12 @@ dependencies = [
740] 749]
741 750
742[[package]] 751[[package]]
752name = "wit-bindgen"
753version = "0.57.1"
754source = "registry+https://github.com/rust-lang/crates.io-index"
755checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
756
757[[package]]
743name = "x11-dl" 758name = "x11-dl"
744version = "2.21.0" 759version = "2.21.0"
745source = "registry+https://github.com/rust-lang/crates.io-index" 760source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index b2d135e..2be2d18 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,8 +1,8 @@
1[package] 1[package]
2name = "doom" 2name = "doom"
3version = "0.1.0" 3version = "0.1.0"
4edition = "2021" 4edition = "2024"
5 5
6[dependencies] 6[dependencies]
7minifb = "0.27" 7minifb = "0.27"
8rand = "0.8" 8rand = "0.9"
diff --git a/src/game.rs b/src/game.rs
index ca30207..a17526b 100644
--- a/src/game.rs
+++ b/src/game.rs
@@ -91,16 +91,16 @@ impl Maze {
91 break; 91 break;
92 } 92 }
93 93
94 let rw = rng.gen_range(3usize..=6); 94 let rw = rng.random_range(3usize..=6);
95 let rh = rng.gen_range(3usize..=6); 95 let rh = rng.random_range(3usize..=6);
96 96
97 // Keep rooms away from the outer border by at least 2 cells 97 // Keep rooms away from the outer border by at least 2 cells
98 // so corridors have room to connect to them. 98 // so corridors have room to connect to them.
99 if rw + 2 >= w || rh + 2 >= h { 99 if rw + 2 >= w || rh + 2 >= h {
100 continue; 100 continue;
101 } 101 }
102 let rx = rng.gen_range(2..(w - rw - 2)); 102 let rx = rng.random_range(2..(w - rw - 2));
103 let ry = rng.gen_range(2..(h - rh - 2)); 103 let ry = rng.random_range(2..(h - rh - 2));
104 104
105 // Check overlap with 1-cell buffer. 105 // Check overlap with 1-cell buffer.
106 let mut overlaps = false; 106 let mut overlaps = false;
@@ -193,7 +193,7 @@ impl Maze {
193 193
194 edges.sort_by_key(|e| e.0); 194 edges.sort_by_key(|e| e.0);
195 // Pick from the nearest few for variety. 195 // Pick from the nearest few for variety.
196 let pick = rng.gen_range(0..(edges.len().min(3))); 196 let pick = rng.random_range(0..(edges.len().min(3)));
197 let (_dist, from, to) = edges[pick]; 197 let (_dist, from, to) = edges[pick];
198 198
199 carve_corridor( 199 carve_corridor(
@@ -211,8 +211,8 @@ impl Maze {
211 // ---- Phase 3: add a few extra connections for loops ---- 211 // ---- Phase 3: add a few extra connections for loops ----
212 let extra_connections = (rooms.len() / 5).max(1); 212 let extra_connections = (rooms.len() / 5).max(1);
213 for _ in 0..extra_connections { 213 for _ in 0..extra_connections {
214 let a = rng.gen_range(0..rooms.len()); 214 let a = rng.random_range(0..rooms.len());
215 let b = rng.gen_range(0..rooms.len()); 215 let b = rng.random_range(0..rooms.len());
216 if a != b { 216 if a != b {
217 let dist = manhattan( 217 let dist = manhattan(
218 rooms[a].cx as isize, 218 rooms[a].cx as isize,
@@ -404,9 +404,9 @@ fn carve_corridor(
404 let tx = x2 as isize; 404 let tx = x2 as isize;
405 let ty = y2 as isize; 405 let ty = y2 as isize;
406 406
407 let wide = rng.gen_bool(0.3); // 30% chance of 2-wide corridor 407 let wide = rng.random_bool(0.3); // 30% chance of 2-wide corridor
408 408
409 if rng.gen_bool(0.5) { 409 if rng.random_bool(0.5) {
410 // Horizontal, then vertical. 410 // Horizontal, then vertical.
411 carve_line(cells, grid_w, cx, cy, tx, cy, wide); 411 carve_line(cells, grid_w, cx, cy, tx, cy, wide);
412 carve_line(cells, grid_w, tx, cy, tx, ty, wide); 412 carve_line(cells, grid_w, tx, cy, tx, ty, wide);
@@ -493,11 +493,11 @@ fn place_entities(
493 next += 1; 493 next += 1;
494 494
495 let (hp_range, damage) = enemy_stats_for_depth(depth); 495 let (hp_range, damage) = enemy_stats_for_depth(depth);
496 let max_hp = rng.gen_range(hp_range.0..=hp_range.1); 496 let max_hp = rng.random_range(hp_range.0..=hp_range.1);
497 let dmg = if damage.0 == damage.1 { 497 let dmg = if damage.0 == damage.1 {
498 damage.0 498 damage.0
499 } else { 499 } else {
500 rng.gen_range(damage.0..=damage.1) 500 rng.random_range(damage.0..=damage.1)
501 }; 501 };
502 502
503 entities[y * w + x] = Some(Entity::Enemy { 503 entities[y * w + x] = Some(Entity::Enemy {
@@ -508,7 +508,7 @@ fn place_entities(
508 } 508 }
509 509
510 // --- hallucinations (1-2 per level) --- 510 // --- hallucinations (1-2 per level) ---
511 let hall_count = rng.gen_range(1..=2); 511 let hall_count = rng.random_range(1..=2);
512 for _ in 0..hall_count { 512 for _ in 0..hall_count {
513 if next >= candidates.len() { 513 if next >= candidates.len() {
514 break; 514 break;
@@ -544,7 +544,7 @@ fn place_entities(
544 } 544 }
545 545
546 // --- hallucinated pickups --- 546 // --- hallucinated pickups ---
547 let fake_count = if depth >= 3 { rng.gen_range(1..=2) } else { 0 }; 547 let fake_count = if depth >= 3 { rng.random_range(1..=2) } else { 0 };
548 for _ in 0..fake_count { 548 for _ in 0..fake_count {
549 if next >= candidates.len() { 549 if next >= candidates.len() {
550 break; 550 break;
@@ -567,10 +567,10 @@ fn enemy_stats_for_depth(depth: u64) -> ((u32, u32), (u32, u32)) {
567} 567}
568 568
569fn random_pickup_type(rng: &mut impl Rng, include_weapon: bool) -> PickupType { 569fn random_pickup_type(rng: &mut impl Rng, include_weapon: bool) -> PickupType {
570 let roll = rng.gen_range(0..100); 570 let roll = rng.random_range(0..100);
571 if include_weapon && roll < 15 { 571 if include_weapon && roll < 15 {
572 PickupType::Weapon { 572 PickupType::Weapon {
573 base_damage: rng.gen_range(2..=4), 573 base_damage: rng.random_range(2..=4),
574 } 574 }
575 } else if roll < 45 { 575 } else if roll < 45 {
576 PickupType::Food 576 PickupType::Food
@@ -584,7 +584,7 @@ fn random_pickup_type(rng: &mut impl Rng, include_weapon: bool) -> PickupType {
584/// Fisher-Yates shuffle on a slice. 584/// Fisher-Yates shuffle on a slice.
585fn shuffle_slice<T>(slice: &mut [T], rng: &mut impl Rng) { 585fn shuffle_slice<T>(slice: &mut [T], rng: &mut impl Rng) {
586 for i in (1..slice.len()).rev() { 586 for i in (1..slice.len()).rev() {
587 let j = rng.gen_range(0..=i); 587 let j = rng.random_range(0..=i);
588 slice.swap(i, j); 588 slice.swap(i, j);
589 } 589 }
590} 590}
@@ -681,7 +681,7 @@ fn smoothstep(t: f64) -> f64 {
681 681
682impl Game { 682impl Game {
683 pub fn new() -> Self { 683 pub fn new() -> Self {
684 let mut rng = rand::thread_rng(); 684 let mut rng = rand::rng();
685 let depth = 1; 685 let depth = 1;
686 let (maze, (start_x, start_y)) = Maze::generate(depth, &mut rng); 686 let (maze, (start_x, start_y)) = Maze::generate(depth, &mut rng);
687 let player = Player::new(start_x, start_y, 0.0); // facing east 687 let player = Player::new(start_x, start_y, 0.0); // facing east
@@ -943,7 +943,7 @@ impl Game {
943 /// Roll bonus damage: 30% chance for +1, repeat on success. 943 /// Roll bonus damage: 30% chance for +1, repeat on success.
944 fn roll_bonus_damage(&self, rng: &mut impl Rng) -> u32 { 944 fn roll_bonus_damage(&self, rng: &mut impl Rng) -> u32 {
945 let mut bonus = 0u32; 945 let mut bonus = 0u32;
946 while rng.gen_bool(0.30) { 946 while rng.random_bool(0.30) {
947 bonus += 1; 947 bonus += 1;
948 } 948 }
949 bonus 949 bonus
@@ -963,7 +963,7 @@ impl Game {
963 963
964 match entity { 964 match entity {
965 Some(Entity::Enemy { hp, damage, .. }) => { 965 Some(Entity::Enemy { hp, damage, .. }) => {
966 let mut rng = rand::thread_rng(); 966 let mut rng = rand::rng();
967 let bonus = self.roll_bonus_damage(&mut rng); 967 let bonus = self.roll_bonus_damage(&mut rng);
968 let total_dmg = self.weapon_base_damage + bonus; 968 let total_dmg = self.weapon_base_damage + bonus;
969 let new_hp = hp.saturating_sub(total_dmg); 969 let new_hp = hp.saturating_sub(total_dmg);
@@ -974,7 +974,7 @@ impl Game {
974 self.set_message(&format!("You slay the enemy! ({} dmg)", total_dmg)); 974 self.set_message(&format!("You slay the enemy! ({} dmg)", total_dmg));
975 } else { 975 } else {
976 self.maze.entity_at_mut(fx, fy).map(|e| { 976 self.maze.entity_at_mut(fx, fy).map(|e| {
977 if let Entity::Enemy { hp: ref mut h, .. } = e { 977 if let Entity::Enemy { hp: h, .. } = e {
978 *h = new_hp; 978 *h = new_hp;
979 } 979 }
980 }); 980 });
@@ -1002,7 +1002,7 @@ impl Game {
1002 self.set_message("The hallucination dissipates."); 1002 self.set_message("The hallucination dissipates.");
1003 } else { 1003 } else {
1004 self.maze.entity_at_mut(fx, fy).map(|e| { 1004 self.maze.entity_at_mut(fx, fy).map(|e| {
1005 if let Entity::Hallucination { hp: ref mut h, .. } = e { 1005 if let Entity::Hallucination { hp: h, .. } = e {
1006 *h = new_hp; 1006 *h = new_hp;
1007 } 1007 }
1008 }); 1008 });
diff --git a/src/texture.rs b/src/texture.rs
index e5720c0..4df38b8 100644
--- a/src/texture.rs
+++ b/src/texture.rs
@@ -14,7 +14,7 @@ fn hash(x: u32, y: u32, seed: u64) -> u64 {
14 14
15/// Brown cracked wall texture — 64×64, brick pattern with mortar lines and fissures. 15/// Brown cracked wall texture — 64×64, brick pattern with mortar lines and fissures.
16pub fn generate_wall_texture(rng: &mut impl Rng) -> Vec<u32> { 16pub fn generate_wall_texture(rng: &mut impl Rng) -> Vec<u32> {
17 let seed = rng.gen::<u64>(); 17 let seed = rng.random::<u64>();
18 let mut tex = vec![0u32; TEX_SIZE * TEX_SIZE]; 18 let mut tex = vec![0u32; TEX_SIZE * TEX_SIZE];
19 19
20 for y in 0..TEX_SIZE { 20 for y in 0..TEX_SIZE {
@@ -105,7 +105,7 @@ pub fn generate_exit_texture(rng: &mut impl Rng) -> Vec<u32> {
105 105
106/// Gray stone-tile floor — 64×64, checkerboard with grout and subtle colour tint. 106/// Gray stone-tile floor — 64×64, checkerboard with grout and subtle colour tint.
107pub fn generate_floor_texture(rng: &mut impl Rng) -> Vec<u32> { 107pub fn generate_floor_texture(rng: &mut impl Rng) -> Vec<u32> {
108 let seed = rng.gen::<u64>(); 108 let seed = rng.random::<u64>();
109 let mut tex = vec![0u32; TEX_SIZE * TEX_SIZE]; 109 let mut tex = vec![0u32; TEX_SIZE * TEX_SIZE];
110 110
111 for y in 0..TEX_SIZE { 111 for y in 0..TEX_SIZE {