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 /src | |
| parent | animations, introduction, no terminal (diff) | |
| download | dungeon-74eecc82f72c0974c7a5b6f567833f80b53335e7.tar.gz dungeon-74eecc82f72c0974c7a5b6f567833f80b53335e7.zip | |
switch to rust 2024
Diffstat (limited to 'src')
| -rw-r--r-- | src/game.rs | 42 | ||||
| -rw-r--r-- | src/texture.rs | 4 |
2 files changed, 23 insertions, 23 deletions
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 { |
