fix broken maps

This commit is contained in:
AmadeusWM
2025-04-06 19:00:17 +02:00
parent 282ae11958
commit 45ed9f6d54

View File

@@ -76,7 +76,7 @@ fn spawn_level(
// Transform::from_xyz(-500.0, 3.0, -500.0),
// ));
// let map = GameMap::test();
let map = GameMap::new(10);
let map = GameMap::new((0, 0), 5);
map.print_map();
for ((x, z), node) in map.nodes.into_iter() {
@@ -207,11 +207,9 @@ fn spawn_level(
}
let (x,z) = map.end_node;
commands.spawn((
Mesh3d(meshes.add(Cuboid::new(3.0, 3.0, 3.0))),
Mesh3d(meshes.add(Cuboid::new(1.0, 3.0, 1.0))),
MeshMaterial3d(materials.add(Color::srgb_u8(255, 0, 0))),
Transform::from_xyz(2.0*x as f32, 0.5, -2.0*z as f32),
RigidBody::Fixed,
Collider::cuboid(0.5, 0.5, 0.5),
));
}
@@ -248,15 +246,15 @@ struct GameMap {
}
impl GameMap {
fn new(grid_size: i32) -> Self {
fn new(initial_point: (i32, i32), grid_size: i32) -> Self {
let mut nodes = HashMap::new();
let mut start_node = MapNode::new();
start_node.north = Side::Connection;
start_node.south = Side::Connection;
start_node.east = Side::Connection;
start_node.west = Side::Connection;
nodes.insert((0, 0), start_node);
let mut m = GameMap { nodes, grid_size, end_node: (0, 0) };
nodes.insert(initial_point, start_node);
let mut m = GameMap { nodes, grid_size, end_node: initial_point };
m.generate_map();
m
}
@@ -336,23 +334,23 @@ impl GameMap {
}
}
fn ensure_connection(&self, node: &mut MapNode) {
fn ensure_connection(&self, node: &mut MapNode, (x, y): (i32, i32)) {
let am_connections = (node.north == Side::Connection) as u8 +
(node.south == Side::Connection) as u8 +
(node.east == Side::Connection) as u8 +
(node.west == Side::Connection) as u8;
if am_connections <= 2 {
if node.north != Side::Connection {
if node.north != Side::Connection && !self.nodes.contains_key(&(x, y + 1)) {
node.north = Side::Connection
}
else if node.south != Side::Connection {
else if node.south != Side::Connection && !self.nodes.contains_key(&(x, y - 1)) {
node.south = Side::Connection
}
else if node.east != Side::Connection {
else if node.east != Side::Connection && !self.nodes.contains_key(&(x + 1, y)) {
node.east = Side::Connection
}
else if node.west != Side::Connection {
else if node.west != Side::Connection && !self.nodes.contains_key(&(x - 1, y)) {
node.west = Side::Connection
}
}
@@ -384,7 +382,7 @@ impl GameMap {
new_node.west = west.map_or_else(|| self.choose_side(current_idx), |w| w.east);
if !(current_idx.0 > self.grid_size || current_idx.1 > self.grid_size || current_idx.0 < 0 || current_idx.1 < 0) {
self.ensure_connection(&mut new_node);
self.ensure_connection(&mut new_node, current_idx);
}
if new_node.north == Side::Connection && !self.nodes.contains_key(&(x, y + 1)) {
nodes_to_process.push((x, y + 1));
@@ -401,6 +399,14 @@ impl GameMap {
self.nodes.insert(current_idx, new_node);
}
let end_node = self.nodes.get_mut(&self.end_node).unwrap();
if self.end_node.1 >= self.end_node.0 {
end_node.north = Side::Connection;
}
else if self.end_node.0 >= self.end_node.1 {
end_node.east = Side::Connection;
}
}
fn print_map(&self) {