Friday, October 4, 2013

Worldgen and dungeon variations in Pugnacious Wizards 2


I want to share the basic world generation algorithm used in Pugnacious Wizards 2 and some things I did to add as much replayability, variety, and interest to the world generation. Hopefully you can try some of these ideas in your roguelikes.

In case you haven't seen it yet, the game takes place in a densely packed single level castle that's made of a 9 by 9 grid of 7 by 7 rooms. Here's an example of what the entire game looks like on the first turn without FOV applied:

Here's the basic algorithm that Pugnacious Wizards 2 uses to create a level. It can be adapted to other roguelikes too:

  1. Start with a perfect maze. A perfect maze is a maze with no loops - there's one and only one way from each room to each room. This means there's lots of choices since most rooms will have two or three doors that you can go through. This also means there's lots of dead ends. There's a ton of great resources on the internet about maze types, maze making algorithms, and maze solving algorithms. I don't think dead ends are fun so that's what the next step solves.
  2. Add extra connections. Decide how many dead ends you want to have and as long as there are more dead ends than that, connect a dead end to a random neighboring room. I choose to make each dungeon have up to 12 dead ends - each with it's own treasure. Three dead ends have amulets that you collect to win, six dead ends have a spell that you can pick up, and the remaining few dead ends have heart containers that will heal you.
  3. Place themed rooms. Now that all the rooms are connected, assign a random theme to each one and place them on the actual map. There's about a dozen themes: empty rooms, wall traps, floor traps, courtyard, treasure room, portal room, etc. Most rooms also have extra walls that follow a preset pattern and maybe a few randomly placed wall tiles. Trees are also added. This adds a bit more variability and tactical options. You can hide behind walls to avoid traps and burn trees to damage others or yourself. Room themes that include treasures, traps, guards, archers, or wizards will also place those at this time. Finally, each room has a very small percent of being a special version: a courtyard will be completely filled with trees, an empty room will be filled with skeletons, a trap room will have far more traps, etc.
  4. Place regional themes. Each treasure room with an amulet is guarded by a fire wizard, a poison wizard, or an ice wizard. That room and three rooms joined to it are rethemed with the appropriate element: all the traps are changed to that element and visible floor traps are placed in the corners of each room. Also the element is applied to each tile; water gets frozen or poisoned, grass and trees get burnt or poisoned, etc. This means you can tell when you're close to the amulets and is sort of like a mini-level in the dungeon. Most games have ice levels or fire levels and this is one way to get that same feeling in a single dungeon. In the above example picture, you can see how the poison region near the center of the castle has greenish poisoned water in one room and the fire region in the upper right of the castle has grass that's on fire. If there were any towers or traps then they would also be themed.
  5. Place extra stuff. Additional gold, blood, bone piles, and see-through wall tiles are added at random.

So that's the basic algorithm. A perfect maze with extra connections, treasures in the dead ends, themed rooms, themed areas, and extra loot.

But that's not all that happens. The real variety comes from tweaking the worldgen algorithm itself.

Tweak the variables. These variables include what percent of grass tiles are trees, what percent of walls that have see-through tiles added, what percent of doors are unburnable stone doors, how many extra room connections are added, how much total gold there is, and a few other things. In the above example picture, you can see how trees are common in the courtyards and as decorations in other rooms.

Tweak the lists. It starts with a list of every room theme: 12 or so in total. Then a few are removed at random - they won't show up in this game. Then a few are chosen from the remaining at random and added to the list again - these themes will show up more often than others. This small difference means you can play a few games before seeing each theme. It can also change the feel quite a bit. A dungeon with lots of portals plays differently than one with no portals and a dungeon with lots of anti-magic rooms plays differently than one with lots of trap rooms or lots of creature rooms. In the above example picture, you can see how there are plenty of archer barracks but no guard barracks: they must have been removed from the list of room themes.

Apply explicit variations. There's a list of 30 or so variations. Two, three, or four are picked at random and applied to the map and added to the subtitle. Some variations just make one room theme far more common by adding it to the list of themes 9 times, some will change the stats of archers or guards, some change how much damage is done by fire, ice, poison, arrows, or melee, and some have other small effects like changing the prices of spells, how large explosions are, etc. A game where skeletons regenerate in only a few turns is very different than a game where fire traps are far more common and do double damage. In the above example picture, you can see how archer barracks, which have an "a" pattern on the floor, and portal rooms, which have a glowing block in the center, are far more common than other rooms. These variations also affect the subtitle.

Monday, September 30, 2013

Pugnacious Wizards 2 retrospective

I did it! I spent six weeks on remaking and improving my 7DRL Pugnacious Wizards. Time for a retrospective.


What went well.
  • I finished. I picked ambitious goals, a deadline of the 2014 ARRP, and actually did it. I've started a lot of programming projects but finished few of them - it feels good to finish a project.
  • Cleaner magic code. The code for the magic spells is much cleaner than the 7DRL version.

What went poorly.
  • Screen size. It's supposed to be played 800x640 like at the website but if you download it and play it in the standalone Flash Player, you can resize it and get some ugliness. I remember that happening with the 7DRL version, but I guess I forgot to display a warning if it is at an unexpected resolution.
  • Separating objects from their display. I tried to really separate the objects and the display of the objects. The tiles, items, creatures, effects, etc don't say what symbols or colors they display with.  I figured it was ok for them to know that but I wanted to try something different and see if it's really cleaner to make the objects not know anything about their display. For PW2, the WorldDisplay class has a few giant switches and a bunch of if statements to determine what the background color, foreground color, and glyphs for each object in the game is. It's a mess but I tested a hypothesis and learned my lesson: don't go overboard with separating the objects and their display.

What should be done differently next time.
  • There were a few weeks where I was throwin' out features every other day and times where I'd go a few weeks with only one update. Maybe having monthly goals would help smooth that out. I don't know if that was a real problem or not though.
  • Parameterizable tiles. I really pushed the Tile class to the extreme and it got ugly. The tiles are all single instances of things like light_floor, dark_floor, tower, ice_tower, fire_tower, etc. I made them all the same instance for performance reasons and because that's what I'm used to but I'm not sure if it's worth it. Maybe I should have made each tile a full fledged object oriented parameterizable object instead of something like an enum.
  • Feedback. I got some feedback but most updates didn't get any at all. I've been posting to the roguelike development forums and trying to get more visibility. I'll contribute more to other's projects and maybe that will help direct some eyes and feedback to my next project. Game Hunter did do an amazing LP but that was after the final version.


Sunday, September 22, 2013

Pugnacious Wizards 2: version 1.0

Version 1.0 mostly adds variations. Each game you play will have 2, 3, or 4 "variations" added. Variations will tweak how the castle is made; how much treasure, enemies, or other things there are; your enemy stats; or a couple other things. You can tell which variations are in play by looking at the subtitle at the top of the screen.

This is the last planned release of Pugnacious Wizards 2. I'm done with it. I didn't add all the spells I could think of - and there's more that could be done with it - but I think it's good enough for me to move on. I tried some new things in the code as well as some new ideas about magic and traps and worldgen. It's a nice little game and I'm pretty happy with it. My next post will be a retrospective where I'll go into that further.

As always, any feedback is welcome.

github source

download swf

Monday, September 9, 2013

Pugnacious Wizards 2, version 0.8

Version 0.8 adds mouse support as well as several small tweaks and a few new spells.

As always, any feedback is welcome.

github source

download swf

update the latest version is at http://trystans.blogspot.com/2013/09/pugnacious-wizards-2-version-10.html

Tuesday, August 6, 2013

Pugnacious Wizards 2, version 0.7

Version 0.7 doesn't add any major features but manages to tweak so many things so much that it deserves a release of its own. I added lots of little performance improvements, new poison traps, some new dungeon architecture, a few new spells, new dungeon themed areas, and several tweaks to the interface, spells, effects, and ai.

As always, any feedback is welcome.

github source

download swf

update the latest version is at http://trystans.blogspot.com/2013/09/pugnacious-wizards-2-version-10.html

Friday, August 2, 2013

Pugnacious Wizards 2, version 0.6

Version 0.6 adds several new spells, enemy wizards, gold to pickup and spend, and performance improvements.

As always, any feedback is welcome.

github source

download swf

update the latest version is at http://trystans.blogspot.com/2013/09/pugnacious-wizards-2-version-10.html

Tuesday, June 25, 2013

Pugnacious Wizards 2, version 0.4 (now worth playing!)

Version 0.4 adds several new spells - 9 total. There's a bit of a slowdown sometimes, but I'm looking into that.

This is mostly what I want. The next few updates will probably just add content (like new spells) with very few major changes.

As always, any feedback is welcome.

github source

download swf

update the latest version is at http://trystans.blogspot.com/2013/09/pugnacious-wizards-2-version-10.html