diff options
| author | salmonik <raisersoft@proton.me> | 2026-07-11 01:41:45 +0200 |
|---|---|---|
| committer | salmonik <raisersoft@proton.me> | 2026-07-11 01:41:45 +0200 |
| commit | 74eecc82f72c0974c7a5b6f567833f80b53335e7 (patch) | |
| tree | 55fc25810de2ea541e584c727994b0087a4e27b4 | |
| parent | animations, introduction, no terminal (diff) | |
| download | dungeon-74eecc82f72c0974c7a5b6f567833f80b53335e7.tar.gz dungeon-74eecc82f72c0974c7a5b6f567833f80b53335e7.zip | |
switch to rust 2024
| -rw-r--r-- | Cargo.lock | 45 | ||||
| -rw-r--r-- | Cargo.toml | 4 | ||||
| -rw-r--r-- | src/game.rs | 42 | ||||
| -rw-r--r-- | src/texture.rs | 4 |
4 files changed, 55 insertions, 40 deletions
| @@ -177,13 +177,14 @@ dependencies = [ | |||
| 177 | 177 | ||
| 178 | [[package]] | 178 | [[package]] |
| 179 | name = "getrandom" | 179 | name = "getrandom" |
| 180 | version = "0.2.17" | 180 | version = "0.3.4" |
| 181 | source = "registry+https://github.com/rust-lang/crates.io-index" | 181 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 182 | checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" | 182 | checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" |
| 183 | dependencies = [ | 183 | dependencies = [ |
| 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" | |||
| 194 | dependencies = [ | 195 | dependencies = [ |
| 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]] |
| 379 | name = "r-efi" | 380 | name = "r-efi" |
| 381 | version = "5.3.0" | ||
| 382 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 383 | checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" | ||
| 384 | |||
| 385 | [[package]] | ||
| 386 | name = "r-efi" | ||
| 380 | version = "6.0.0" | 387 | version = "6.0.0" |
| 381 | source = "registry+https://github.com/rust-lang/crates.io-index" | 388 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 382 | checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" | 389 | checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" |
| 383 | 390 | ||
| 384 | [[package]] | 391 | [[package]] |
| 385 | name = "rand" | 392 | name = "rand" |
| 386 | version = "0.8.6" | 393 | version = "0.9.4" |
| 387 | source = "registry+https://github.com/rust-lang/crates.io-index" | 394 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 388 | checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" | 395 | checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" |
| 389 | dependencies = [ | 396 | dependencies = [ |
| 390 | "libc", | ||
| 391 | "rand_chacha", | 397 | "rand_chacha", |
| 392 | "rand_core", | 398 | "rand_core", |
| 393 | ] | 399 | ] |
| 394 | 400 | ||
| 395 | [[package]] | 401 | [[package]] |
| 396 | name = "rand_chacha" | 402 | name = "rand_chacha" |
| 397 | version = "0.3.1" | 403 | version = "0.9.0" |
| 398 | source = "registry+https://github.com/rust-lang/crates.io-index" | 404 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 399 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" | 405 | checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" |
| 400 | dependencies = [ | 406 | dependencies = [ |
| 401 | "ppv-lite86", | 407 | "ppv-lite86", |
| 402 | "rand_core", | 408 | "rand_core", |
| @@ -404,11 +410,11 @@ dependencies = [ | |||
| 404 | 410 | ||
| 405 | [[package]] | 411 | [[package]] |
| 406 | name = "rand_core" | 412 | name = "rand_core" |
| 407 | version = "0.6.4" | 413 | version = "0.9.5" |
| 408 | source = "registry+https://github.com/rust-lang/crates.io-index" | 414 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 409 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" | 415 | checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" |
| 410 | dependencies = [ | 416 | dependencies = [ |
| 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" | |||
| 559 | checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" | 565 | checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" |
| 560 | 566 | ||
| 561 | [[package]] | 567 | [[package]] |
| 562 | name = "wasi" | 568 | name = "wasip2" |
| 563 | version = "0.11.1+wasi-snapshot-preview1" | 569 | version = "1.0.4+wasi-0.2.12" |
| 564 | source = "registry+https://github.com/rust-lang/crates.io-index" | 570 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| 565 | checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" | 571 | checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" |
| 572 | dependencies = [ | ||
| 573 | "wit-bindgen", | ||
| 574 | ] | ||
| 566 | 575 | ||
| 567 | [[package]] | 576 | [[package]] |
| 568 | name = "wasm-bindgen" | 577 | name = "wasm-bindgen" |
| @@ -740,6 +749,12 @@ dependencies = [ | |||
| 740 | ] | 749 | ] |
| 741 | 750 | ||
| 742 | [[package]] | 751 | [[package]] |
| 752 | name = "wit-bindgen" | ||
| 753 | version = "0.57.1" | ||
| 754 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 755 | checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" | ||
| 756 | |||
| 757 | [[package]] | ||
| 743 | name = "x11-dl" | 758 | name = "x11-dl" |
| 744 | version = "2.21.0" | 759 | version = "2.21.0" |
| 745 | source = "registry+https://github.com/rust-lang/crates.io-index" | 760 | source = "registry+https://github.com/rust-lang/crates.io-index" |
| @@ -1,8 +1,8 @@ | |||
| 1 | [package] | 1 | [package] |
| 2 | name = "doom" | 2 | name = "doom" |
| 3 | version = "0.1.0" | 3 | version = "0.1.0" |
| 4 | edition = "2021" | 4 | edition = "2024" |
| 5 | 5 | ||
| 6 | [dependencies] | 6 | [dependencies] |
| 7 | minifb = "0.27" | 7 | minifb = "0.27" |
| 8 | rand = "0.8" | 8 | rand = "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 | ||
| 569 | fn random_pickup_type(rng: &mut impl Rng, include_weapon: bool) -> PickupType { | 569 | fn 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. |
| 585 | fn shuffle_slice<T>(slice: &mut [T], rng: &mut impl Rng) { | 585 | fn 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 | ||
| 682 | impl Game { | 682 | impl 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. |
| 16 | pub fn generate_wall_texture(rng: &mut impl Rng) -> Vec<u32> { | 16 | pub 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. |
| 107 | pub fn generate_floor_texture(rng: &mut impl Rng) -> Vec<u32> { | 107 | pub 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 { |
