amethyst / rustrogueliketutorial

Roguelike Tutorial in Rust - using RLTK
MIT License
894 stars 155 forks source link

Chapter-26 BSP Interiors: Entities spawning in walls #202

Open DireTabacchi opened 1 year ago

DireTabacchi commented 1 year ago

I was testing what I had of the BSP Interiors chapter (up to right before resetting the build_random_map function to build a random map with all three builders), and I found several entities (items and foes) sometimes spawning in the walls. I double checked my potential errors with a recent clone of the repo and compiling the code for this chapter, I found that the same thing was happening: items and foes in walls.

After some investigation, I believe it may be something about the southern and eastern walls of each new room not being calculated correctly and the spawner thinking that they are valid places to place entities, as it seems that the walls they are spawning in are the southern and eastern ones of the rooms they are supposed to spawn in.

These items are unobtainable as the tiles with walls are still counted as walls and not traverse-able. However foes that spawn in walls are still able to move out of walls if their pathing takes them to a tile that is a traverse-able tile.

Here is an example of what I find, with the cloned-repo code. image

Another example: image

Didgety commented 7 months ago

~I need to verify this doesn't cause bugs with any other maps before creating a PR, but~ in spawner.rs:

Changing:

pub fn spawn_room(ecs: &mut World, room : &Rect, map_depth : i32) {
    // ...
    while !added && tries < 20 {
        let x = (room.x1 + rng.roll_dice(1, i32::abs(room.x2 - room.x1))) as usize;
        let y = (room.y1 + rng.roll_dice(1, i32::abs(room.y2 - room.y1))) as usize;
    // ...
    }
}

To:

pub fn spawn_room(ecs: &mut World, room : &Rect, map_depth : i32) {
    // ...
    while !added && tries < 20 {
        let x = (room.x1 + rng.roll_dice(1, i32::abs(room.x2 - room.x1)) - 1) as usize;
        let y = (room.y1 + rng.roll_dice(1, i32::abs(room.y2 - room.y1)) - 1) as usize;
    // ...
    }
}

Fixes the issue, but causes an off-by-one in the west and north directions on the maps from preceding chapters. I haven't figured out the root cause of why this specific map type has the wrong coordinates for items. However, it's addressed in the next chapter