summaryrefslogtreecommitdiffstats
path: root/src
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 /src
parentanimations, introduction, no terminal (diff)
downloaddungeon-74eecc82f72c0974c7a5b6f567833f80b53335e7.tar.gz
dungeon-74eecc82f72c0974c7a5b6f567833f80b53335e7.zip
switch to rust 2024
Diffstat (limited to 'src')
-rw-r--r--src/game.rs42
-rw-r--r--src/texture.rs4
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
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 {