make connections more variable

This commit is contained in:
Joachim Lusiardi 2024-11-01 12:06:50 +01:00
parent 789a41cb3f
commit 8b23c565b8
1 changed files with 29 additions and 11 deletions

View File

@ -1,4 +1,7 @@
use std::{cmp::{max, min}, ops::RangeInclusive}; use std::{
cmp::{max, min},
ops::RangeInclusive,
};
use crate::{ use crate::{
constants::{LEVEL_HEIGHT, LEVEL_WIDTH, ROOM_HEIGHT, ROOM_WIDTH}, constants::{LEVEL_HEIGHT, LEVEL_WIDTH, ROOM_HEIGHT, ROOM_WIDTH},
@ -26,12 +29,16 @@ pub struct Connection {
} }
impl Connection { impl Connection {
pub fn render(&self, rng: &mut ThreadRng, tgt: &mut [[StructureElement; LEVEL_HEIGHT]; LEVEL_WIDTH]) { pub fn render(
fn calc_range(a: usize, b:usize) -> RangeInclusive<usize>{ &self,
rng: &mut ThreadRng,
tgt: &mut [[StructureElement; LEVEL_HEIGHT]; LEVEL_WIDTH],
) {
fn calc_range(a: usize, b: usize) -> RangeInclusive<usize> {
if a > b { if a > b {
b..=a b..=a
} else { } else {
a..=b a..=b
} }
} }
// the tuples are (col, row) // the tuples are (col, row)
@ -42,7 +49,7 @@ impl Connection {
max(self.start_pos.1, self.end_pos.1) - min(self.start_pos.1, self.end_pos.1); max(self.start_pos.1, self.end_pos.1) - min(self.start_pos.1, self.end_pos.1);
if abs_d_col == 0 { if abs_d_col == 0 {
for row in calc_range(self.end_pos.1, self.start_pos.1 ) { for row in calc_range(self.end_pos.1, self.start_pos.1) {
tgt[self.end_pos.0][row] = StructureElement::Floor; tgt[self.end_pos.0][row] = StructureElement::Floor;
} }
} else if abs_d_row == 0 { } else if abs_d_row == 0 {
@ -55,8 +62,10 @@ impl Connection {
// more up/down // more up/down
let d_row = self.end_pos.1 - self.start_pos.1; let d_row = self.end_pos.1 - self.start_pos.1;
let vert_offset = if d_row > 3 { let vert_offset = if d_row > 3 {
rng.gen_range(1..=d_row-1) rng.gen_range(1..=d_row - 1)
} else {d_row/2}; } else {
d_row / 2
};
for r in self.start_pos.1..=(self.start_pos.1 + vert_offset) { for r in self.start_pos.1..=(self.start_pos.1 + vert_offset) {
tgt[self.start_pos.0][r] = StructureElement::Floor; tgt[self.start_pos.0][r] = StructureElement::Floor;
} }
@ -69,16 +78,25 @@ impl Connection {
} else { } else {
// more left/right // more left/right
let d_col = self.end_pos.0 - self.start_pos.0; let d_col = self.end_pos.0 - self.start_pos.0;
for tgt_col in tgt.iter_mut().skip(self.start_pos.0).take(d_col / 2 + 1) { let horizont_offset = if d_col > 3 {
rng.gen_range(1..=d_col - 1)
} else {
d_col / 2
};
for tgt_col in tgt
.iter_mut()
.skip(self.start_pos.0)
.take(horizont_offset + 1)
{
tgt_col[self.start_pos.1] = StructureElement::Floor; tgt_col[self.start_pos.1] = StructureElement::Floor;
} }
for r in calc_range(self.end_pos.1, self.start_pos.1) { for r in calc_range(self.end_pos.1, self.start_pos.1) {
tgt[self.start_pos.0 + d_col / 2][r] = StructureElement::Floor; tgt[self.start_pos.0 + horizont_offset][r] = StructureElement::Floor;
} }
for tgt_col in tgt for tgt_col in tgt
.iter_mut() .iter_mut()
.take(self.end_pos.0 + 1) .take(self.end_pos.0 + 1)
.skip(self.start_pos.0 + d_col / 2) .skip(self.start_pos.0 + horizont_offset)
{ {
tgt_col[self.end_pos.1] = StructureElement::Floor; tgt_col[self.end_pos.1] = StructureElement::Floor;
} }