ciel

ciel

Hands-on Rust: potential bugs

I’ve caught up with B4.0. Quite enjoying it! I ran into a couple of “bugs” in the dungeon crawler game logic. I’ll point out what I am seeing, but maybe you can leave the implementation to the reader to try and figure out as a challenge.

  1. Chasing/Random movement: movers do not consider other intent_to_move when moving to the same destination at the same time. This causes mobs to converge onto the same tile. like this:

  2. The map building flow does not verify that amulet/exit positions are excluded from potential monster/item spawn positions (or vice-versa). While this isn’t an issue for the mobs (since they move), this can cause an item to be placed on top of the exit/amulet. There’s a few easy ways to fix this, but a solution in the book might require a more strict/safe solution to prevent confusion. In the current code the ordering of amulet/monster spawn lines in the implemented build() functions don’t particularly matter, but a fix for this could require a specific order.

I think the book itself prepared me to solve both of these problems on my own. Perhaps it could be something to point out to the users so they have a challenge for themselves to try and solve.

Also, It’s possible content in the future chapters might make these bugs not really relevant.

Most Liked

herbert

herbert

Author of Hands-on Rust

Thanks! This is actually a tough one to find a balance (see mikecargal’s threads on procgen for another example). On one level, I’ve had to restrain myself a bit to keep focused on teaching Rust and concepts rather than bogging down into fine details; on the other hand, it would be really nice to catch these bugs (if I had a third hand, it would be remining me that I have a page count limit!). I intend to tackle some of this (particularly constraining item placement), but probably not all of it.

My current plan is to add some constraints to item placement, at the level of generating available spawn positions. It’s relatively easy to add a few “denied” slots (such as the exit) - so it won’t be too large or trash the reader’s flow too much by vanishing down an aside. I’m hoping to squeeze in a few procgen constraints, too - a quick call to add a forced boundary around the map, maybe cull unreachable tiles (that’s easy to do). Exactly how much of that I can get in is itself constrained by page count. Worst case, it’ll be presented as a “here’s some ideas to improve this” exercise.

The monster overlap is worth discussing a little because it highlights one of the toughest issues with an ECS design. When you are building your systems to run efficiently with little data-overlap from other systems, and each entity effectively processing independently - it does make checking against other dynamic entities harder than you’d expect.

In the Rust Roguelike Tutorial (my big project before this one), I had a whole “blocked” system with an additional data construct to track tile contents. With hindsight, that was a mistake - deep into “second system syndrome”, I spent as much time catching cache invalidation problems (it’s basically a location cache) as I did benefiting from it. So I knew that this book shouldn’t go that route. It does have the nice side-effect that mobs will realize a dynamic path is unavailable and route around to attack from a different direction - but it gets huge and complex achieving that.

So I’m going to do some debugging and get the “collisions lite” setup I was aiming for working better. Check “wants to move” message destinations and simply not apply them if they result in a goblin cheerleading pyramid. I’ve been planning to clean-up the did_something code for that system anyway; it is messier than it needs to be.

Thanks, and I hope my overly long reply makes sense!

ciel

ciel

Absolutely makes sense. The dungeon crawler being built from the book is serving a specific purpose. And a bug free game isn’t the primary goal. Of course, it’d be nice, but not the primary goal. I mostly just wanted to point out cases I saw. What code should not go into the book is just as important to consider when you’re trying to teach a point.

Second system syndrome is quite the siren’s song. Making a buggy game has more value than spending all your time building an overly complex system for a game that you might not finish. I tend to still try to make the overly complex system. :sweat_smile:

Where Next?

Popular Pragmatic Bookshelf topics Top

New
belgoros
Following the steps described in Chapter 6 of the book, I’m stuck with running the migration as described on page 84: bundle exec sequel...
New
GilWright
Working through the steps (checking that the Info,plist matches exactly), run the demo game and what appears is grey but does not fill th...
New
Alexandr
Hi everyone! There is an error on the page 71 in the book “Programming machine learning from coding to depp learning” P. Perrotta. You c...
New
simonpeter
When I try the command to create a pair of migration files I get an error. user=> (create-migration "guestbook") Execution error (Ill...
New
raul
Hi Travis! Thank you for the cool book! :slight_smile: I made a list of issues and thought I could post them chapter by chapter. I’m rev...
New
AleksandrKudashkin
On the page xv there is an instruction to run bin/setup from the main folder. I downloaded the source code today (12/03/21) and can’t see...
New
curtosis
Running mix deps.get in the sensor_hub directory fails with the following error: ** (Mix) No SSH public keys found in ~/.ssh. An ssh aut...
New
kolossal
Hi, I need some help, I’m new to rust and was learning through your book. but I got stuck at the last stage of distribution. Whenever I t...
New
gorkaio
root_layout: {PentoWeb.LayoutView, :root}, This results in the following following error: no “root” html template defined for PentoWeb...
New

Other popular topics Top

New
AstonJ
What chair do you have while working… and why? Is there a ‘best’ type of chair or working position for developers?
New
siddhant3030
I’m thinking of buying a monitor that I can rotate to use as a vertical monitor? Also, I want to know if someone is using it for program...
New
PragmaticBookshelf
Design and develop sophisticated 2D games that are as much fun to make as they are to play. From particle effects and pathfinding to soci...
New
DevotionGeo
I know that -t flag is used along with -i flag for getting an interactive shell. But I cannot digest what the man page for docker run com...
New
AstonJ
I’ve been hearing quite a lot of comments relating to the sound of a keyboard, with one of the most desirable of these called ‘thock’, he...
New
AstonJ
Saw this on TikTok of all places! :lol: Anyone heard of them before? Lite:
New
PragmaticBookshelf
Author Spotlight Jamis Buck @jamis This month, we have the pleasure of spotlighting author Jamis Buck, who has written Mazes for Prog...
New
Help
I am trying to crate a game for the Nintendo switch, I wanted to use Java as I am comfortable with that programming language. Can you use...
New
New

Sub Categories: