<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>GamingYourWay - Dungeon Creation</title>
    <link>http://blog.gamingyourway.com/</link>
    <description>may contain nuts.</description>
    <language>en-us</language>
    <copyright>GamingYourWay.com</copyright>
    <lastBuildDate>Thu, 02 Sep 2010 15:29:48 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>info@gamingyourway.com</managingEditor>
    <webMaster>info@gamingyourway.com</webMaster>
    <item>
      <trackback:ping>http://blog.gamingyourway.com/Trackback.aspx?guid=477a0435-e7a2-437e-a486-12177b6df92e</trackback:ping>
      <pingback:server>http://blog.gamingyourway.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.gamingyourway.com/PermaLink,guid,477a0435-e7a2-437e-a486-12177b6df92e.aspx</pingback:target>
      <dc:creator>Squize</dc:creator>
      <wfw:comment>http://blog.gamingyourway.com/CommentView,guid,477a0435-e7a2-437e-a486-12177b6df92e.aspx</wfw:comment>
      <wfw:commentRss>http://blog.gamingyourway.com/SyndicationService.asmx/GetEntryCommentsRss?guid=477a0435-e7a2-437e-a486-12177b6df92e</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">Sorry we've been a bit quiet here recently,
both Olli and I have been beavering away like a couple of mentals on projects which
hasn't given us any free time to devote to the blog ( Also we didn't have that much
of interest to say ).<br /><br />
Knight's Quest, our first Facebook and our first RPG, has been my main focus for weeks.
It's finally starting to come together after weeks of just working on the techy side,
so I thought it may be of some interest to go over some bits and bobs from it.<br /><br />
The game is iso, which is a pain at the best of times. Z-sorting is murder. How I've
gone about it is to split the map into sectors. Each sector is 16x16 tiles, and we
only z-sort on those visible areas ( Also we turn off any plotting in sectors which
aren't visible ).<br />
This really reduces the sorting to just what is needed, also the floor tiles are burned
into their own bitmap ( See this <a href="http://blog.gamingyourway.com/2010/07/16/MuchAdoAboutNothing.aspx">old
post</a> ) so we're only having to sort tiles and sprites, which helps.<br />
Also as we're using the <a href="http://blog.gamingyourway.com/2010/06/17/BlitterEngineBenchmarks.aspx">blitter</a> we
don't have to worry about sequential indexes, it's like as2 all over again, where
you could give a sprite any old depth and not care about it.<br /><br />
Next up, the dungeons. I've used Olli's generator ( He's written tons about it <a href="http://blog.gamingyourway.com/CategoryView,category,DungeonCreation.aspx">previously</a> )
and it works a treat. Basically it creates "cells" which are in this case 4x4 tiles.
The cells tell us which walls or doors are present. Rather than just randomly plot
tiles I've set up a lot of mc blocks, eg.<br /><br /><div align="center"><img src="http://blog.gamingyourway.com/content/binary/KQ_tiles.png" alt="KQ_tiles.png" border="0" height="314" width="259" /><br /><div align="left">This may be tricky to explain well so stick with me. As we read
each cell we know what's there, let's say for example a north and east wall. From
there we look up the array which contains all the blocks with a north and east wall
and pick one at random.<br />
The floor is burnt into the background bitmap and the wall tiles ( Or cauldron placeholders
) are converted into blitter sprites ( Bobs ) which can then be plotted / sorted etc.<br />
The reason for this is that we can then hand design a lot of different wall blocks
and use them randomly ( Rather than just picking one random tile at a time ). It should
make the dungeons look more hand designed, which is what we want.<br />
It's important that we create the impression that someone has slaved over each dungeon
to make it look as non-random as possible.<br /></div></div><br />
I think that's about it for now, there will be more to share real soon.<br /><br />
Squize.<br /><br /><p></p><img width="0" height="0" src="http://blog.gamingyourway.com/aggbug.ashx?id=477a0435-e7a2-437e-a486-12177b6df92e" /></body>
      <title>Knight's Quest, the story so far...</title>
      <guid isPermaLink="false">http://blog.gamingyourway.com/PermaLink,guid,477a0435-e7a2-437e-a486-12177b6df92e.aspx</guid>
      <link>http://blog.gamingyourway.com/2010/09/02/KnightsQuestTheStorySoFar.aspx</link>
      <pubDate>Thu, 02 Sep 2010 15:29:48 GMT</pubDate>
      <description>Sorry we've been a bit quiet here recently, both Olli and I have been beavering away like a couple of mentals on projects which hasn't given us any free time to devote to the blog ( Also we didn't have that much of interest to say ).&lt;br&gt;
&lt;br&gt;
Knight's Quest, our first Facebook and our first RPG, has been my main focus for weeks.
It's finally starting to come together after weeks of just working on the techy side,
so I thought it may be of some interest to go over some bits and bobs from it.&lt;br&gt;
&lt;br&gt;
The game is iso, which is a pain at the best of times. Z-sorting is murder. How I've
gone about it is to split the map into sectors. Each sector is 16x16 tiles, and we
only z-sort on those visible areas ( Also we turn off any plotting in sectors which
aren't visible ).&lt;br&gt;
This really reduces the sorting to just what is needed, also the floor tiles are burned
into their own bitmap ( See this &lt;a href="http://blog.gamingyourway.com/2010/07/16/MuchAdoAboutNothing.aspx"&gt;old
post&lt;/a&gt; ) so we're only having to sort tiles and sprites, which helps.&lt;br&gt;
Also as we're using the &lt;a href="http://blog.gamingyourway.com/2010/06/17/BlitterEngineBenchmarks.aspx"&gt;blitter&lt;/a&gt; we
don't have to worry about sequential indexes, it's like as2 all over again, where
you could give a sprite any old depth and not care about it.&lt;br&gt;
&lt;br&gt;
Next up, the dungeons. I've used Olli's generator ( He's written tons about it &lt;a href="http://blog.gamingyourway.com/CategoryView,category,DungeonCreation.aspx"&gt;previously&lt;/a&gt; )
and it works a treat. Basically it creates "cells" which are in this case 4x4 tiles.
The cells tell us which walls or doors are present. Rather than just randomly plot
tiles I've set up a lot of mc blocks, eg.&lt;br&gt;
&lt;br&gt;
&lt;div align="center"&gt;&lt;img src="http://blog.gamingyourway.com/content/binary/KQ_tiles.png" alt="KQ_tiles.png" border="0" height="314" width="259"&gt;
&lt;br&gt;
&lt;div align="left"&gt;This may be tricky to explain well so stick with me. As we read
each cell we know what's there, let's say for example a north and east wall. From
there we look up the array which contains all the blocks with a north and east wall
and pick one at random.&lt;br&gt;
The floor is burnt into the background bitmap and the wall tiles ( Or cauldron placeholders
) are converted into blitter sprites ( Bobs ) which can then be plotted / sorted etc.&lt;br&gt;
The reason for this is that we can then hand design a lot of different wall blocks
and use them randomly ( Rather than just picking one random tile at a time ). It should
make the dungeons look more hand designed, which is what we want.&lt;br&gt;
It's important that we create the impression that someone has slaved over each dungeon
to make it look as non-random as possible.&lt;br&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
I think that's about it for now, there will be more to share real soon.&lt;br&gt;
&lt;br&gt;
Squize.&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.gamingyourway.com/aggbug.ashx?id=477a0435-e7a2-437e-a486-12177b6df92e" /&gt;</description>
      <comments>http://blog.gamingyourway.com/CommentView,guid,477a0435-e7a2-437e-a486-12177b6df92e.aspx</comments>
      <category>Dungeon Creation</category>
      <category>game development</category>
    </item>
    <item>
      <trackback:ping>http://blog.gamingyourway.com/Trackback.aspx?guid=1cbd6c24-2381-45a2-85ac-e2da7b14ffdd</trackback:ping>
      <pingback:server>http://blog.gamingyourway.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.gamingyourway.com/PermaLink,guid,1cbd6c24-2381-45a2-85ac-e2da7b14ffdd.aspx</pingback:target>
      <dc:creator>nGFX</dc:creator>
      <wfw:comment>http://blog.gamingyourway.com/CommentView,guid,1cbd6c24-2381-45a2-85ac-e2da7b14ffdd.aspx</wfw:comment>
      <wfw:commentRss>http://blog.gamingyourway.com/SyndicationService.asmx/GetEntryCommentsRss?guid=1cbd6c24-2381-45a2-85ac-e2da7b14ffdd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">I guess you won't remember me (nGFX) as
for ages only Squize has done all the posting. Not that I have been lazy, but there
hasn't been a single line of interesting code on my side, nor something mildly game
related.<br /><br />
I've been coding some large scale foto archive software. To sell our really vast collection
of black/white press fotos (180 000 of the 1.5 million negatives should be available
in the end) and coding the backend and the frontend (with lots of ajax). Right now
last bits and bobs of the user handling needs to be done and there are still a good
number of negatives to be scanned (alas, thank fuck I'm not in charge there).<br /><br /><img src="http://blog.gamingyourway.com/content/binary/images/fotoarchiv_00.jpg" alt="fotoarchiv_00.jpg" border="0" height="336" width="480" /><br /><br />
Ok, back to something game related at last ...<br /><br />
While Squize is churning out flash games like mad, I've jumped on the Unity train
(of course) and been tinkering with it for a while now. I've started with porting
the dungeon creation code over to C# and played with dynamic maps, which proved to
be working just nicely. In order to get more out of this project I thought it might
be helpfull to get deeper into Unity with smaller game.<br /><br />
A remake of one of my games seemed a good idea, I've got the AS2 code to look at and
knew how the game should work (and added some minor additions). So here's something
I've learned besides the usual "oh damnit" ...<br /><br /><h3>Unity's animation editor is good enough to make things easier, but don't trust
it on time critical problems.
</h3>
The game involves things moving along tracks - so my first idea was to save some code
and use animations for that. I wanted to use a container that I can just move from
tile to tile and let the "car" move inside it from the start of the tile to the end
of it, then an animation event should be fired, telling the engin to move the "car"
to the next tile and start the correct animation.<br /><br />
I did a few tests (of course) and it seemed to work, so I did all the animations (straight
tracks, junctions, ramps and so on) which roughly saved some 500 lines of code (compared
to the flash version) - oh lovely - same game, less code, I was on fire.<br /><br />
Of course it didn't work.<br /><br />
I tested it locally, online in a browser and all went well until I noticed that the
timing can get off the track and cause visual glitches. These showed themself as "jumping"
car, where the car jumped ahead one tile for a single frame and then continued as
intended. This happened every time I started a level - but not always at the same
time (hence I didn't see it in my tests).<br />
After a good night of debugging, tracing (or Debug.Log()) I found out what happend.<br /><br />
Unlike flash the "timeline" in Unity doesn't sync visuals and code - and in fact Unity
has no "timeline" - point taken, lesson learned :| .<br />
So this happened (and caused the glitch)<br />
1. [engine] sendMessage -&gt; [car] "goto next tile"<br />
2. [car] move to next tile, rewind animation, play it<br />
3. (glitch might occur)<br />
4. [car] sendMessage -&gt; [engine] "done, give me next tile"<br />
...<br /><br />
Because the code isn't tied to the visuals, the code in 2 can be executed, but the
visuals from the animation might start on the next frame, hence the container is moved
to the next tile, but the animation is still on the last frame (at the and of the
track) ...<br /><br />
... I ended up coding the movement in the end ...<br /><br /><h3>Editor scripts can do a lot of damage (or just be utterly helpfull)
</h3>
In order to get the levels into the game I needed an level editor, but was too lazy
to write one - so I decided to dig into editor scripts in Unity, which allow you to
do all kind of dangerous things.<br />
I wanted to be able to drag my level into the Unity editor window, grab it and save
it to a file (which works just wonderfull). the first big "shit" came when I added
a function to clear the level from screen (so I could do a new level) and carelessly
allowed "DestroyImmediate" to delete from the asset window (and not checking if the
GameObject I want to destroy is a child of my Playground) - oh well.<br /><br />
Anyway, you can easily add you own menu entries, access files or manipulate your current
scenes with editor scripts.<br /><br />
And now some screenies ...<br /><br /><h3>Project Hellstrom
</h3><img src="http://blog.gamingyourway.com/content/binary/images/hellstrom_00.jpg" alt="hellstrom_00.jpg" border="0" height="360" width="480" /><br />
The ponytailed lady is just my scaler model, in the end I guess it'll be 1st person.<br />
Right now you can walk around a dynamic generated map (with temp mapping) - A LOT
of work left to do.<br /><br /><br /><h3>ToyGame - the game without a name yet
</h3><img src="http://blog.gamingyourway.com/content/binary/images/toygame_00.jpg" alt="toygame_00.jpg" border="0" height="262" width="480" /><br />
Inside Unity's editor, the first level in progress ...<br /><br /><img src="http://blog.gamingyourway.com/content/binary/images/toygame_01.jpg" alt="toygame_01.jpg" border="0" height="360" width="480" /><br />
Playing level 1, just crashed 2 toys ...<br /><br />
And with this I descent back into the hell that is js/css and html ...<br /><br />
nGFX<br /><br /><br /><br /><br /><br /><p></p><img width="0" height="0" src="http://blog.gamingyourway.com/aggbug.ashx?id=1cbd6c24-2381-45a2-85ac-e2da7b14ffdd" /></body>
      <title>first post in ages - and a jolly short one too.</title>
      <guid isPermaLink="false">http://blog.gamingyourway.com/PermaLink,guid,1cbd6c24-2381-45a2-85ac-e2da7b14ffdd.aspx</guid>
      <link>http://blog.gamingyourway.com/2010/06/25/firstPostInAgesAndAJollyShortOneToo.aspx</link>
      <pubDate>Fri, 25 Jun 2010 10:10:10 GMT</pubDate>
      <description>I guess you won't remember me (nGFX) as for ages only Squize has done all the posting. Not that I have been lazy, but there hasn't been a single line of interesting code on my side, nor something mildly game related.&lt;br&gt;
&lt;br&gt;
I've been coding some large scale foto archive software. To sell our really vast collection
of black/white press fotos (180 000 of the 1.5 million negatives should be available
in the end) and coding the backend and the frontend (with lots of ajax). Right now
last bits and bobs of the user handling needs to be done and there are still a good
number of negatives to be scanned (alas, thank fuck I'm not in charge there).&lt;br&gt;
&lt;br&gt;
&lt;img src="http://blog.gamingyourway.com/content/binary/images/fotoarchiv_00.jpg" alt="fotoarchiv_00.jpg" border="0" height="336" width="480"&gt;
&lt;br&gt;
&lt;br&gt;
Ok, back to something game related at last ...&lt;br&gt;
&lt;br&gt;
While Squize is churning out flash games like mad, I've jumped on the Unity train
(of course) and been tinkering with it for a while now. I've started with porting
the dungeon creation code over to C# and played with dynamic maps, which proved to
be working just nicely. In order to get more out of this project I thought it might
be helpfull to get deeper into Unity with smaller game.&lt;br&gt;
&lt;br&gt;
A remake of one of my games seemed a good idea, I've got the AS2 code to look at and
knew how the game should work (and added some minor additions). So here's something
I've learned besides the usual "oh damnit" ...&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;Unity's animation editor is good enough to make things easier, but don't trust
it on time critical problems.
&lt;/h3&gt;
The game involves things moving along tracks - so my first idea was to save some code
and use animations for that. I wanted to use a container that I can just move from
tile to tile and let the "car" move inside it from the start of the tile to the end
of it, then an animation event should be fired, telling the engin to move the "car"
to the next tile and start the correct animation.&lt;br&gt;
&lt;br&gt;
I did a few tests (of course) and it seemed to work, so I did all the animations (straight
tracks, junctions, ramps and so on) which roughly saved some 500 lines of code (compared
to the flash version) - oh lovely - same game, less code, I was on fire.&lt;br&gt;
&lt;br&gt;
Of course it didn't work.&lt;br&gt;
&lt;br&gt;
I tested it locally, online in a browser and all went well until I noticed that the
timing can get off the track and cause visual glitches. These showed themself as "jumping"
car, where the car jumped ahead one tile for a single frame and then continued as
intended. This happened every time I started a level - but not always at the same
time (hence I didn't see it in my tests).&lt;br&gt;
After a good night of debugging, tracing (or Debug.Log()) I found out what happend.&lt;br&gt;
&lt;br&gt;
Unlike flash the "timeline" in Unity doesn't sync visuals and code - and in fact Unity
has no "timeline" - point taken, lesson learned :| .&lt;br&gt;
So this happened (and caused the glitch)&lt;br&gt;
1. [engine] sendMessage -&amp;gt; [car] "goto next tile"&lt;br&gt;
2. [car] move to next tile, rewind animation, play it&lt;br&gt;
3. (glitch might occur)&lt;br&gt;
4. [car] sendMessage -&amp;gt; [engine] "done, give me next tile"&lt;br&gt;
...&lt;br&gt;
&lt;br&gt;
Because the code isn't tied to the visuals, the code in 2 can be executed, but the
visuals from the animation might start on the next frame, hence the container is moved
to the next tile, but the animation is still on the last frame (at the and of the
track) ...&lt;br&gt;
&lt;br&gt;
... I ended up coding the movement in the end ...&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;Editor scripts can do a lot of damage (or just be utterly helpfull)
&lt;/h3&gt;
In order to get the levels into the game I needed an level editor, but was too lazy
to write one - so I decided to dig into editor scripts in Unity, which allow you to
do all kind of dangerous things.&lt;br&gt;
I wanted to be able to drag my level into the Unity editor window, grab it and save
it to a file (which works just wonderfull). the first big "shit" came when I added
a function to clear the level from screen (so I could do a new level) and carelessly
allowed "DestroyImmediate" to delete from the asset window (and not checking if the
GameObject I want to destroy is a child of my Playground) - oh well.&lt;br&gt;
&lt;br&gt;
Anyway, you can easily add you own menu entries, access files or manipulate your current
scenes with editor scripts.&lt;br&gt;
&lt;br&gt;
And now some screenies ...&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;Project Hellstrom
&lt;/h3&gt;
&lt;img src="http://blog.gamingyourway.com/content/binary/images/hellstrom_00.jpg" alt="hellstrom_00.jpg" border="0" height="360" width="480"&gt;
&lt;br&gt;
The ponytailed lady is just my scaler model, in the end I guess it'll be 1st person.&lt;br&gt;
Right now you can walk around a dynamic generated map (with temp mapping) - A LOT
of work left to do.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;ToyGame - the game without a name yet
&lt;/h3&gt;
&lt;img src="http://blog.gamingyourway.com/content/binary/images/toygame_00.jpg" alt="toygame_00.jpg" border="0" height="262" width="480"&gt;
&lt;br&gt;
Inside Unity's editor, the first level in progress ...&lt;br&gt;
&lt;br&gt;
&lt;img src="http://blog.gamingyourway.com/content/binary/images/toygame_01.jpg" alt="toygame_01.jpg" border="0" height="360" width="480"&gt;
&lt;br&gt;
Playing level 1, just crashed 2 toys ...&lt;br&gt;
&lt;br&gt;
And with this I descent back into the hell that is js/css and html ...&lt;br&gt;
&lt;br&gt;
nGFX&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.gamingyourway.com/aggbug.ashx?id=1cbd6c24-2381-45a2-85ac-e2da7b14ffdd" /&gt;</description>
      <comments>http://blog.gamingyourway.com/CommentView,guid,1cbd6c24-2381-45a2-85ac-e2da7b14ffdd.aspx</comments>
      <category>Dungeon Creation</category>
      <category>game development</category>
      <category>General</category>
      <category>Unity</category>
    </item>
    <item>
      <trackback:ping>http://blog.gamingyourway.com/Trackback.aspx?guid=6209e2f8-d592-4283-985e-e40a042318a1</trackback:ping>
      <pingback:server>http://blog.gamingyourway.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.gamingyourway.com/PermaLink,guid,6209e2f8-d592-4283-985e-e40a042318a1.aspx</pingback:target>
      <dc:creator>nGFX</dc:creator>
      <wfw:comment>http://blog.gamingyourway.com/CommentView,guid,6209e2f8-d592-4283-985e-e40a042318a1.aspx</wfw:comment>
      <wfw:commentRss>http://blog.gamingyourway.com/SyndicationService.asmx/GetEntryCommentsRss?guid=6209e2f8-d592-4283-985e-e40a042318a1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Let's start with a little rant.<br /><br />
So there are all these shiny things you can do with css, alas they might not work
in all the browsers, knowing what works (or to know how to fake/correct it) is for
me some sort of art form. I'm not even talking about the possibilites of JS and DOM
based development.<br />
But I do believe that there is something utterly wrong with css in parts if there
are people out there (thanks guys) who devote a damn good deal of time to write bloody
FRAMEWORKS so that you can do something as trivial as a 3 colum layout. It gets worse
if you want a header and a footer - alas not a footer that is always BELOW each of
the 3 columns and not just the main column).<br /><br />
I needed to get that out.<br /><br />
What else? Ah the redesign - yet again - what first seemed a good idea, wasn't that
good when done. Back to start then. (Meanwhile we just continue here.)<br /><br />
Speaking of things that seemed to be a good idea ...<br /><br />
Last time I wrote about the map format used for the current game (or that I'm thinking
about it) the last one I had seemed to be a good idea too. I guess I can say that
I was wrong :) .<br /><br />
My first idea was to a tilebased map and to create it from the dungeon data I've got
out of the <a href="http://blog.gamingyourway.com/CategoryView,category,Dungeon%2BCreation.aspx">dungeon
creation</a> code. Basically I wanted to convert each cell into an 6x6 piece of tiles,
so there could have been a wall 1 tile wide and so on.<br />
This worked quite well until I had the idea that I don't need a tile based map at
all and just could plot the floor of a cell in one go (as for the new idea I don't
needed walls in the tiles) - this worked also quite well.<br /><br />
I could reduce the code needed to convert the dungeon by some 75% - and was quite
please with the outcome as it was also quite fast, the scroller needed to plot less
tiles and everybody was happy, I used simple vector math for wall/door/trigger collision
tests. Untill ...<br /><br />
While recoding the converter there was a nagging feeling that I forgot something,
that I *needed* the tile information for something and right just as I finished the
converter I dwaned on my why I wanted to use them in the first place - pathfinding.<br /><br />
Darn.<br /><br />
I know I could use nodebased pathfinding or some other utterly clever method (I've
got heaps of books about that) but honestly there is nothing as simple as a tilebased
pathfinding ... so I'm adding a simple tile map info back in (using a bool map). Joy.<br /><br />
Well, good thzat I haven't just deleted the old code ...<br /><br />
nGFX<br /><br /><p></p><img width="0" height="0" src="http://blog.gamingyourway.com/aggbug.ashx?id=6209e2f8-d592-4283-985e-e40a042318a1" /></body>
      <title>The good things in life aren't for free ...</title>
      <guid isPermaLink="false">http://blog.gamingyourway.com/PermaLink,guid,6209e2f8-d592-4283-985e-e40a042318a1.aspx</guid>
      <link>http://blog.gamingyourway.com/2010/03/16/TheGoodThingsInLifeArentForFree.aspx</link>
      <pubDate>Tue, 16 Mar 2010 07:59:57 GMT</pubDate>
      <description>Let's start with a little rant.&lt;br&gt;
&lt;br&gt;
So there are all these shiny things you can do with css, alas they might not work
in all the browsers, knowing what works (or to know how to fake/correct it) is for
me some sort of art form. I'm not even talking about the possibilites of JS and DOM
based development.&lt;br&gt;
But I do believe that there is something utterly wrong with css in parts if there
are people out there (thanks guys) who devote a damn good deal of time to write bloody
FRAMEWORKS so that you can do something as trivial as a 3 colum layout. It gets worse
if you want a header and a footer - alas not a footer that is always BELOW each of
the 3 columns and not just the main column).&lt;br&gt;
&lt;br&gt;
I needed to get that out.&lt;br&gt;
&lt;br&gt;
What else? Ah the redesign - yet again - what first seemed a good idea, wasn't that
good when done. Back to start then. (Meanwhile we just continue here.)&lt;br&gt;
&lt;br&gt;
Speaking of things that seemed to be a good idea ...&lt;br&gt;
&lt;br&gt;
Last time I wrote about the map format used for the current game (or that I'm thinking
about it) the last one I had seemed to be a good idea too. I guess I can say that
I was wrong :) .&lt;br&gt;
&lt;br&gt;
My first idea was to a tilebased map and to create it from the dungeon data I've got
out of the &lt;a href="http://blog.gamingyourway.com/CategoryView,category,Dungeon%2BCreation.aspx"&gt;dungeon
creation&lt;/a&gt; code. Basically I wanted to convert each cell into an 6x6 piece of tiles,
so there could have been a wall 1 tile wide and so on.&lt;br&gt;
This worked quite well until I had the idea that I don't need a tile based map at
all and just could plot the floor of a cell in one go (as for the new idea I don't
needed walls in the tiles) - this worked also quite well.&lt;br&gt;
&lt;br&gt;
I could reduce the code needed to convert the dungeon by some 75% - and was quite
please with the outcome as it was also quite fast, the scroller needed to plot less
tiles and everybody was happy, I used simple vector math for wall/door/trigger collision
tests. Untill ...&lt;br&gt;
&lt;br&gt;
While recoding the converter there was a nagging feeling that I forgot something,
that I *needed* the tile information for something and right just as I finished the
converter I dwaned on my why I wanted to use them in the first place - pathfinding.&lt;br&gt;
&lt;br&gt;
Darn.&lt;br&gt;
&lt;br&gt;
I know I could use nodebased pathfinding or some other utterly clever method (I've
got heaps of books about that) but honestly there is nothing as simple as a tilebased
pathfinding ... so I'm adding a simple tile map info back in (using a bool map). Joy.&lt;br&gt;
&lt;br&gt;
Well, good thzat I haven't just deleted the old code ...&lt;br&gt;
&lt;br&gt;
nGFX&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.gamingyourway.com/aggbug.ashx?id=6209e2f8-d592-4283-985e-e40a042318a1" /&gt;</description>
      <comments>http://blog.gamingyourway.com/CommentView,guid,6209e2f8-d592-4283-985e-e40a042318a1.aspx</comments>
      <category>Dungeon Creation</category>
      <category>game development</category>
    </item>
    <item>
      <trackback:ping>http://blog.gamingyourway.com/Trackback.aspx?guid=755da489-1e82-413c-b01a-17ef55d9087b</trackback:ping>
      <pingback:server>http://blog.gamingyourway.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.gamingyourway.com/PermaLink,guid,755da489-1e82-413c-b01a-17ef55d9087b.aspx</pingback:target>
      <dc:creator>nGFX</dc:creator>
      <wfw:comment>http://blog.gamingyourway.com/CommentView,guid,755da489-1e82-413c-b01a-17ef55d9087b.aspx</wfw:comment>
      <wfw:commentRss>http://blog.gamingyourway.com/SyndicationService.asmx/GetEntryCommentsRss?guid=755da489-1e82-413c-b01a-17ef55d9087b</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">So after the set of articles about random
level generation I wanted to put that into use (alas not in the scale I planed it
out - mind you) - so I came up with a nice little 3 week project - that was 5 weeks
ago.<br /><br />
The basic idea is a simple top/down shooter blended with a good portion of Gauntlet
added (hordes of enemies, maybe). And while it's fun to watch levels being created
by code it involves a good deal of additional work, like changing the tilesets, adding
dirt and stains.<br /><br />
The X entries seemed to be a good idea, so I'm going to publish a few wip builds soon,
too (alas not as many as Squize).<br /><br />
In order to see something at all (except the test visuals from the article tests)
I needed to convert the cell based dungeons into someting tile based, and write a
simple scroller to display the created maps. I decided that each cell should consist
of 6 by 6 tiles, so I could use a one tile wide border for the walls (if any) and
still have 4 tiles walking space. Next point on the list was the question about how
to store the data generated - as I didn't wanted to convert cells/tiles at runtime
before they're being displayed. Storing them in an array seemed a good idea, but I
wanted to try something new...<br /><br />
Not to mention that converting 50x50 cell dungeon would result in an 300x300 array.<br /><br />
After a few minutes I thought that using BitmapData would be a nice try to store the
map, as it'll give me a quite quick direct access 3 dim array (x,y, R,G,B,A) which
I could use multiple times. so I used the alpha chanel for the tileset, the red one
for the actual tile, blue for pathfinding and green for effects/2nd layer.<br /><br /><h3>Right, why storing a tileset?
</h3>
In my idea each room has basically the same tiles (ie. walls, doors, corners and floor)
and the conversion would be much easier if I would use the same tiles over and over.
So I came up with storing tiles in tilesets, which offsets the tiles on the tilesheet.<br />
The creation process is quite easy this way:<br /><br />
First I have to create a tileset and give it a name, say "Corridor".<br /><br /><font face="Courier New">myTileset = new Tileset("Corridor");</font><br /><br />
Then add tiles to that tileset, giving it a name and and x/y offset in the tilesheet
(I wrote data class for that):<br /><br /><font face="Courier New">myTileset.addTile(new Tile("empty", 0, 0));<br />
myTileset.addTile(new Tile("Floor00", 1, 0));<br />
myTileset.addTile(new Tile("WallN", 0, 1));<br />
myTileset.addTile(new Tile("CornerInN", 1, 1));</font><br /><br />
Internally I use the tile's index, but the cell/tile converter just uses the name:<br /><p><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (!myCell.isUnused)
{<br />
                        <br />
    iTile <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> myTileset.index(strFloor);<br />
    iPath <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0<br />
    iSpecial <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;<br />
    bmpdMap.fillRect(<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">new</span> Rectangle(xx,
yy, iTilesPerCell, iTilesPerCell), <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.rgba(iTile,
iSpecial, iPath, iTileset));<br />
    <br />
    <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
walls</span><br />
    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">for</span> (i <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;
i &lt; Dir.NUM_BASEDIR; i++) {<br />
        <br />
        <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (!myCell.isOpen(i))
{<br />
            cx <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> xx <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span> aWall[i].x;<br />
            cy <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> yy <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span> aWall[i].y;<br />
            <br />
            iTile <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> myTileset.index(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Wall"</span><span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span> Dir.shortName(i));<br />
            iPath <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 255;    <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
so you can't walk there (for the bool map pathfinding)</span><br />
            iSpecial <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;<br />
            bmpdMap.fillRect(<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">new</span> Rectangle(cx,
cy, aWall[i].width, aWall[i].height), <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.rgba(iTile,
iSpecial, iPath, iTileset));<br />
            <br />
            <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
door</span><br />
            <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (myCell.hasDoor(i))
{<br />
                <br />
                <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
door frames are painted "above" the floor, so I use the special layer for that</span><br />
                iTile <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> myTileset.index(strFloor);<br />
                iPath <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 127;<br />
                iSpecial <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> myTileset.index(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Door"</span><span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span> Dir.shortName(i) <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span><span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"0"</span>);<br />
                bmpdMap.setPixel(cx <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span> aDoor[i][0].x,
cy <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span> aDoor[i][0].y, <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.rgba(iTile,
iSpecial, iPath, iTileset));<br />
                <br />
                iSpecial <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> myTileset.index(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Door"</span><span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span> Dir.shortName(i) <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span><span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"1"</span>);<br />
                bmpdMap.setPixel(cx <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span> aDoor[i][1].x,
cy <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span> aDoor[i][1].y, <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.rgba(iTile,
iSpecial, iPath, iTileset));<br />
                <br />
            } <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
ToDo: add windows if possible ...</span><br />
            <br />
        }<br />
        <br />
    }<br />
    <br />
    <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
... draw corner and outer coners [skipped]</span><br />
}</span></p>
Ah. Nice and easy :)<br /><br />
So by using a different tileset you can easily control the visuals of a room.<br /><br />
Next thing on the list: the scroller - more thinking here ...<br /><br />
I wrote the Scroller class as extension to Sprite so I could add my own sprites and
use the Sprites scrollrect for clipping. Adding a Scoller to the stage became easy
as 123:<br /><br /><font face="Courier New">this._Scroller = new Scroller(620, 460, 20, 20); // width,
height, tilewidth and tileheight<br />
this._Scroller.name = "scroller";<br />
this._Scroller.x = 10;<br />
this._Scroller.y = 10;<br /><br />
this.addChild(this._Scroller);<br /><br />
this._Scroller.setTileset(this._bmpdTileset, this._TilesetCollection);<br />
this._Scroller.setMap(this._bmpdMap); // the freshly generated map<br />
this._Scroller.setCenter(310, 230);   // alows offsettin the origin, so
0,0 can be at the center of the scroller<br /><br />
this._Scroller.xPos = 0;<br />
this._Scroller.yPos = 0;<br />
this._Scroller.draw();</font> // updates the visuals of the scroller<br /><br />
the way the scroller is set up (I still need to optimize redrawing, though) makes
it possible to use it with tween utils like TweenLite:<br /><font face="Courier New">TweenLite.to(this._Scroller, 1, [xPos: 100, yPos: 100, onUpdate:
this._Scroller.draw});</font><br /><br />
So after a few days of coding it looks like this:<br /><img src="http://blog.gamingyourway.com/content/binary/dungeon/DialZ_pre_00_small.jpg" alt="DialZ_pre_00_small.jpg" border="0" height="360" width="480" /><br />
(scaled version)<br /><br />
The visibilty test is in place (you can only see the room you're currently in and
vector boundaries are created (the green rect in the room, door triggers (blue rect)).
The map in the left corner is shwoing the pathfinding bounds (helpfull for testing,
too) and will be replaced by a minimap later (circular, hopefully).<br /><br />
Right now I'm writing the vector intersection methods (I'm using math instead of the
tiledate for collisions) - so I thing the next entry will feature that.<br /><br />
nGFX<br /><p></p><img width="0" height="0" src="http://blog.gamingyourway.com/aggbug.ashx?id=755da489-1e82-413c-b01a-17ef55d9087b" /></body>
      <title>Dial Z for Zombie - dev diary</title>
      <guid isPermaLink="false">http://blog.gamingyourway.com/PermaLink,guid,755da489-1e82-413c-b01a-17ef55d9087b.aspx</guid>
      <link>http://blog.gamingyourway.com/2009/08/06/DialZForZombieDevDiary.aspx</link>
      <pubDate>Thu, 06 Aug 2009 12:28:03 GMT</pubDate>
      <description>So after the set of articles about random level generation I wanted to put that into use (alas not in the scale I planed it out - mind you) - so I came up with a nice little 3 week project - that was 5 weeks ago.&lt;br&gt;
&lt;br&gt;
The basic idea is a simple top/down shooter blended with a good portion of Gauntlet
added (hordes of enemies, maybe). And while it's fun to watch levels being created
by code it involves a good deal of additional work, like changing the tilesets, adding
dirt and stains.&lt;br&gt;
&lt;br&gt;
The X entries seemed to be a good idea, so I'm going to publish a few wip builds soon,
too (alas not as many as Squize).&lt;br&gt;
&lt;br&gt;
In order to see something at all (except the test visuals from the article tests)
I needed to convert the cell based dungeons into someting tile based, and write a
simple scroller to display the created maps. I decided that each cell should consist
of 6 by 6 tiles, so I could use a one tile wide border for the walls (if any) and
still have 4 tiles walking space. Next point on the list was the question about how
to store the data generated - as I didn't wanted to convert cells/tiles at runtime
before they're being displayed. Storing them in an array seemed a good idea, but I
wanted to try something new...&lt;br&gt;
&lt;br&gt;
Not to mention that converting 50x50 cell dungeon would result in an 300x300 array.&lt;br&gt;
&lt;br&gt;
After a few minutes I thought that using BitmapData would be a nice try to store the
map, as it'll give me a quite quick direct access 3 dim array (x,y, R,G,B,A) which
I could use multiple times. so I used the alpha chanel for the tileset, the red one
for the actual tile, blue for pathfinding and green for effects/2nd layer.&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;Right, why storing a tileset?
&lt;/h3&gt;
In my idea each room has basically the same tiles (ie. walls, doors, corners and floor)
and the conversion would be much easier if I would use the same tiles over and over.
So I came up with storing tiles in tilesets, which offsets the tiles on the tilesheet.&lt;br&gt;
The creation process is quite easy this way:&lt;br&gt;
&lt;br&gt;
First I have to create a tileset and give it a name, say "Corridor".&lt;br&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;myTileset = new Tileset("Corridor");&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
Then add tiles to that tileset, giving it a name and and x/y offset in the tilesheet
(I wrote data class for that):&lt;br&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;myTileset.addTile(new Tile("empty", 0, 0));&lt;br&gt;
myTileset.addTile(new Tile("Floor00", 1, 0));&lt;br&gt;
myTileset.addTile(new Tile("WallN", 0, 1));&lt;br&gt;
myTileset.addTile(new Tile("CornerInN", 1, 1));&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
Internally I use the tile's index, but the cell/tile converter just uses the name:&lt;br&gt;
&lt;p&gt;
&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (!myCell.isUnused)
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iTile &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myTileset.index(strFloor);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iPath &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iSpecial &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bmpdMap.fillRect(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; Rectangle(xx,
yy, iTilesPerCell, iTilesPerCell), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.rgba(iTile,
iSpecial, iPath, iTileset));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
walls&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;for&lt;/span&gt; (i &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;
i &amp;lt; Dir.NUM_BASEDIR; i++) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (!myCell.isOpen(i))
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cx &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; xx &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; aWall[i].x;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cy &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; yy &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; aWall[i].y;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iTile &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myTileset.index(&lt;span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;"&gt;"Wall"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; Dir.shortName(i));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iPath &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 255;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
so you can't walk there (for the bool map pathfinding)&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iSpecial &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bmpdMap.fillRect(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; Rectangle(cx,
cy, aWall[i].width, aWall[i].height), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.rgba(iTile,
iSpecial, iPath, iTileset));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
door&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (myCell.hasDoor(i))
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
door frames are painted "above" the floor, so I use the special layer for that&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iTile &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myTileset.index(strFloor);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iPath &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 127;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iSpecial &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myTileset.index(&lt;span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;"&gt;"Door"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; Dir.shortName(i) &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; &lt;span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;"&gt;"0"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bmpdMap.setPixel(cx &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; aDoor[i][0].x,
cy &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; aDoor[i][0].y, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.rgba(iTile,
iSpecial, iPath, iTileset));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iSpecial &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myTileset.index(&lt;span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;"&gt;"Door"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; Dir.shortName(i) &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; &lt;span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;"&gt;"1"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bmpdMap.setPixel(cx &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; aDoor[i][1].x,
cy &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; aDoor[i][1].y, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.rgba(iTile,
iSpecial, iPath, iTileset));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
ToDo: add windows if possible ...&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
... draw corner and outer coners [skipped]&lt;/span&gt;
&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
Ah. Nice and easy :)&lt;br&gt;
&lt;br&gt;
So by using a different tileset you can easily control the visuals of a room.&lt;br&gt;
&lt;br&gt;
Next thing on the list: the scroller - more thinking here ...&lt;br&gt;
&lt;br&gt;
I wrote the Scroller class as extension to Sprite so I could add my own sprites and
use the Sprites scrollrect for clipping. Adding a Scoller to the stage became easy
as 123:&lt;br&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;this._Scroller = new Scroller(620, 460, 20, 20); // width,
height, tilewidth and tileheight&lt;br&gt;
this._Scroller.name = "scroller";&lt;br&gt;
this._Scroller.x = 10;&lt;br&gt;
this._Scroller.y = 10;&lt;br&gt;
&lt;br&gt;
this.addChild(this._Scroller);&lt;br&gt;
&lt;br&gt;
this._Scroller.setTileset(this._bmpdTileset, this._TilesetCollection);&lt;br&gt;
this._Scroller.setMap(this._bmpdMap); // the freshly generated map&lt;br&gt;
this._Scroller.setCenter(310, 230);&amp;nbsp;&amp;nbsp; // alows offsettin the origin, so
0,0 can be at the center of the scroller&lt;br&gt;
&lt;br&gt;
this._Scroller.xPos = 0;&lt;br&gt;
this._Scroller.yPos = 0;&lt;br&gt;
this._Scroller.draw();&lt;/font&gt; // updates the visuals of the scroller&lt;br&gt;
&lt;br&gt;
the way the scroller is set up (I still need to optimize redrawing, though) makes
it possible to use it with tween utils like TweenLite:&lt;br&gt;
&lt;font face="Courier New"&gt;TweenLite.to(this._Scroller, 1, [xPos: 100, yPos: 100, onUpdate:
this._Scroller.draw});&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
So after a few days of coding it looks like this:&lt;br&gt;
&lt;img src="http://blog.gamingyourway.com/content/binary/dungeon/DialZ_pre_00_small.jpg" alt="DialZ_pre_00_small.jpg" border="0" height="360" width="480"&gt;
&lt;br&gt;
(scaled version)&lt;br&gt;
&lt;br&gt;
The visibilty test is in place (you can only see the room you're currently in and
vector boundaries are created (the green rect in the room, door triggers (blue rect)).
The map in the left corner is shwoing the pathfinding bounds (helpfull for testing,
too) and will be replaced by a minimap later (circular, hopefully).&lt;br&gt;
&lt;br&gt;
Right now I'm writing the vector intersection methods (I'm using math instead of the
tiledate for collisions) - so I thing the next entry will feature that.&lt;br&gt;
&lt;br&gt;
nGFX&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.gamingyourway.com/aggbug.ashx?id=755da489-1e82-413c-b01a-17ef55d9087b" /&gt;</description>
      <comments>http://blog.gamingyourway.com/CommentView,guid,755da489-1e82-413c-b01a-17ef55d9087b.aspx</comments>
      <category>coding ideas</category>
      <category>Dungeon Creation</category>
      <category>game development</category>
    </item>
    <item>
      <trackback:ping>http://blog.gamingyourway.com/Trackback.aspx?guid=794a7731-c193-4c75-9ad6-07d66f6a5654</trackback:ping>
      <pingback:server>http://blog.gamingyourway.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.gamingyourway.com/PermaLink,guid,794a7731-c193-4c75-9ad6-07d66f6a5654.aspx</pingback:target>
      <dc:creator>nGFX</dc:creator>
      <wfw:comment>http://blog.gamingyourway.com/CommentView,guid,794a7731-c193-4c75-9ad6-07d66f6a5654.aspx</wfw:comment>
      <wfw:commentRss>http://blog.gamingyourway.com/SyndicationService.asmx/GetEntryCommentsRss?guid=794a7731-c193-4c75-9ad6-07d66f6a5654</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">In the last two articles  we made
a <a href="http://blog.gamingyourway.com/PermaLink,guid,238c0cda-9177-4b8d-89b4-2d1f9615a24d.aspx">maze</a> and
then destroyed it by adding a lot of <a href="http://blog.gamingyourway.com/PermaLink,guid,3f48b9a0-4873-4710-95c0-c0233881d030.aspx">free
space</a>. In part 3 of this articles I'm going to add some rooms to the empty space
and add some doors ...<br /><br /><h3>Part 3 - part 1 - why seperate things and make rooms?
</h3>
At a first glance it might not be necessary to seperate data into dungeon, room and
cell, but thinking ahead a bit it should make sense ...<br />
My idea is that you can have the dungeon which holds the complete map (with the basic
room data rendered into it) and the rooms so you access them easier and most important
do some magic with them later. One of the neat things is that you could use a different
tiling for rooms making them more detailed or use the additional map data for skinning
(when rendering the dungeon into a tile based map).<br /><br />
The main difference between a room and a dungeon is that the room consists of empty
cells and has walls along it's boundaries. So the first additional method we'd add
to the Room class will be the init method, which simply sets all cells so they form
a rectangular room.<br /><p><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">public</span> function
initCells ():<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">void</span> {<br />
            <br />
    var x:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">uint</span>;<br />
    var y:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">uint</span>;<br />
    var cellTmp:Cell;<br />
            <br />
    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">for</span> (x <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;
x &lt; <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.iWidth;
x++) {<br />
        <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">for</span> (y <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;
y &lt; <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.iHeight;
y++) {<br />
                    <br />
            cellTmp <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.cell2(x,
y);<br />
            cellTmp.setWalls(WallType.OPEN);<br />
                   
<br />
            <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (x
== 0) cellTmp.setWall(Dir.WEST, WallType.WALL);<br />
            <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (x
== (<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.iWidth <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">-</span> 1))
cellTmp.setWall(Dir.EAST, WallType.WALL);<br />
            <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (y
== 0) cellTmp.setWall(Dir.NORTH, WallType.WALL);<br />
            <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (y
== (<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.iHeight <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">-</span> 1))
cellTmp.setWall(Dir.SOUTH, WallType.WALL);<br />
        }<br />
    }<br />
}</span></p>
We could later add methods to create different rooms (ie. two overlapping rectangles,
circular rooms), but for now that will do ...<br /><br />
I also added a getter setter for Offset to the room, so we can modify the x and y
pos of the bounding rect that we stored in the map class (you'll see later what's
that for).<br /><br />
So we now have a room, but how do we get that sucker into the map, or (as just putting
it into the map isn't really an issue) where can we place it *best*.<br /><br />
There are a few things that I want to watch when placing the rooms ...<br />
- a room should not overlap any existing room, we rather don't at it<br />
- placing a room at a place where it doesn't touch anything, is something we don't
want, too<br />
- rooms overlapping corridors should be avoided<br />
- rooms touching dead ends is something we want (what's nice than finding a room after
a long winded corridor?)<br />
- rooms touching any sort of wall is OK, too<br /><br />
Yet again we (as humans) could just look at the map and say "here, there and there"
and done, but that stupic piece of plastic cannot... we need to apply some sort of
scoring to the whole placement mess.<br /><br />
Here's a bit of pseudo code ...<br /><ul><li>
start with a VERY high best score, lets say 999999999999 and set current score to
0 ...<br /></li><li>
Loop over every cell in the dungeon</li><ul><li>
at any given position check if the new room overlaps any rooms already in there<br />
if so, we add 5000 to our current score, otherwise we add nothing</li><li>
now loop over every cell in the room and compare it with the current dungeon cell
(offsetting the room to the current position)</li><ul><li>
if the current room cell touches an empty cell (in the dungeon), add 10</li></ul></ul><ul><ul><li>
if we touch a wall, add 3</li><li>
if we touch a dead end, add 1</li></ul><li>
if the final current score is lower than the best score, sreplace the best score and
store the current position as the best possible location</li></ul><li>
if the score is higher than the "room overlaps room" score, assume that it only can
be placed overlapping a room and drop it, otherwise add it to the dungeon</li></ul>
Here is the scoring code:<br /><p><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">private</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">const</span> TOUCH_DEADEND:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 1;<br /><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">private</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">const</span> TOUCH_WALL:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 3;<br /><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">private</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">const</span> TOUCH_EMPTY:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 10;<br /><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">private</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">const</span> OVERLAP_ROOM:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 5000;<br /><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">private</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">const</span> OVERLAP_CORRIDOR:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 100;<br />
        <br /><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">public</span> function
fitMazeRoom (myRoom:Room):Boolean {<br />
    <br />
    var iBestScore:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 999999999;<br />
    var iScore:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;<br />
    var pBestPos:Point <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">new</span> Point(0,
0);<br />
    var pOffset:Point <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">new</span> Point(0,
0);<br />
    <br />
    var cellDungeon:Cell;<br />
    var cellNext:Cell;<br />
    <br />
    var rectTmp:Rectangle <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> myRoom.rectBound.clone();<br />
    <br />
    var i:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">uint</span>;<br />
    <br />
    var x:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">int</span>;<br />
    var y:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">int</span>;<br />
    <br />
    var xx:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">int</span>;<br />
    var yy:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">int</span>;<br />
    <br />
    var iRoomID:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">uint</span>;<br />
    <br />
    var bAddRoom:Boolean <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">false</span>;<br />
    <br />
    <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
loop over map (- roomsize)</span><br />
    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">for</span> (y <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;
y &lt; (<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.iHeight <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">-</span> myRoom.iHeight <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span> 1);
y++) {<br />
        <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">for</span> (x <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;
x &lt; (<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.iWidth <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">-</span> myRoom.iWidth <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span> 1);
x++) {<br />
            <br />
            <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
do the scoring ...</span><br />
            iScore <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;<br />
            <br />
            <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
check room/room overlapping</span><br />
            rectTmp.x <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> x;<br />
            rectTmp.y <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> y;<br />
            <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">for</span> (i <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;
i &lt; <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>._aRoom.length;
i++) {<br />
                <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> ((<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>._aRoom[i] <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">as</span> Room).rectBound.intersects(rectTmp))
{<br />
                    iScore
+= OVERLAP_ROOM;<br />
                }<br />
            }<br />
            <br />
            <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
check room/dungeon overlapping</span><br />
            <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">for</span> (yy <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;
yy &lt; myRoom.iHeight; yy++) {<br />
                <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">for</span> (xx <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;
xx &lt; myRoom.iWidth; xx++) {<br />
                    pOffset.x <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> (x <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span> xx);<br />
                    pOffset.y <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> (y <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span> yy);<br />
                    <br />
                    cellDungeon <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.cell(pOffset);<br />
                    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (cellDungeon.iType
== RoomType.CORRIDOR) iScore += OVERLAP_CORRIDOR;<br />
                    <br />
                    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (yy
== 0) {<br />
                        iScore
+= <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.getCellScore(<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.cell(<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.getNextPos(pOffset,
Dir.NORTH)), Dir.NORTH);<br />
                    }<br />
                    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (xx
== (myRoom.iWidth <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">-</span> 1))
{<br />
                        iScore
+= <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.getCellScore(<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.cell(<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.getNextPos(pOffset,
Dir.EAST)), Dir.EAST);<br />
                    }<br />
                    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (yy
== (myRoom.iHeight <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">-</span> 1))
{<br />
                        iScore
+= <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.getCellScore(<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.cell(<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.getNextPos(pOffset,
Dir.SOUTH)), Dir.SOUTH);<br />
                    }<br />
                    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (xx
== 0) {<br />
                        iScore
+= <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.getCellScore(<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.cell(<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">this</span>.getNextPos(pOffset,
Dir.WEST)), Dir.WEST);<br />
                    }<br />
                }<br />
            }<br />
            <br />
            <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (iScore
&lt; iBestScore) {<br />
                iBestScore <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> iScore;<br />
                pBestPos <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">new</span> Point(x,
y);<br />
            }<br />
            <br />
        }<br />
    }<br />
    <br />
    <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
add to dungeon if it doesn't overlap any other rooms</span><br />
    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (iBestScore
&lt; OVERLAP_ROOM) {<br />
        myRoom.pOffset <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">new</span> Point(pBestPos.x,
pBestPos.y);            <br />
        bAddRoom <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">true</span>;<br />
    }<br />
    <br />
    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">return</span> bAddRoom;<br />
    <br />
}<br /><br /><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">private</span> function
getCellScore (cellNext:Cell, iDir:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">int</span>):<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">int</span> {<br />
    <br />
    var iScore:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;<br />
    <br />
    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (cellNext.iType
== RoomType.CORRIDOR) {<br />
        <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (cellNext.isDeadEnd)
{<span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"></span><br />
            iScore +=
TOUCH_DEADEND;<br />
        } <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">else</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (cellNext.hasWall(Dir.getOppositeDir(iDir)))
{<br />
            iScore +=
TOUCH_WALL;<br />
        } <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">else</span> {<br />
            iScore +=
TOUCH_EMPTY;<br />
        }<br />
    } <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">else</span> {<br />
        <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (cellNext.iType
== RoomType.ROOM) {<br />
            <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (cellNext.hasWall(Dir.getOppositeDir(iDir)))
{<br />
                iScore
+= TOUCH_WALL;<br />
            } <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">else</span> {<br />
                iScore
+= TOUCH_EMPTY;<br />
            }<br />
        } <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">else</span> {<br />
            iScore +=
TOUCH_EMPTY;    <br />
        }<br />
    }<br />
    <br />
    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">return</span> iScore;<br />
    <br />
}</span></p>
That's ugly and not very fast, but it works.<br /><br />
Some additional info about adding the room to the dungeon: whenever we place a room
cell in the dungeon map it's a good idea to check if it overwrites a corridor and
if it's a cell on the outer bounds of the room add a new wall to the touching cell
(if it's not empty) ...<br /><br />
So far so good, we have rooms in the map, but they cannot yet be reached because we're
missing doors ...<br /><br /><h3>Part 3 - part 2 - adding doors and cleaning up
</h3>
You might ask why I haven't added the doors as soon as I've added the room to the
dungeon (and I might just reply that I just didn't mention it), but nope, I didn't
add doors - that's the next step.<br /><br />
The reason is quite simple, though. I don't want doors cluttered all over the space
and because of that I added another (optional) thing to the room data: hasDoorInDirection
... this way we make sure that there is only one door per wall / room when we add
doors ...<br /><br />
Yet again we loop over all rooms and over their outer bounding cells, if we touch
another cell, store the current position as possible door location. Then pick a random
one per direction and check if it touches another room and if this room might already
have a door ...<br />
I guess that's easier to explain with some more code:<br /><br /><p><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">private</span> function
createDoors (myDungeon:Dungeon, bOneDoorPerRoom:Boolean <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">true</span>):<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">void</span> {<br />
    <br />
    var rnd:MersenneTwister <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> MersenneTwister.getInstance();<br />
    <br />
    var i:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">uint</span>;<br />
    var j:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">uint</span>;<br />
    <br />
    var x:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">uint</span>;<br />
    var y:<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">uint</span>;<br /><br />
    var cellTouch:Cell;<br />
    var myRoom:Room;<br />
    <br />
    var aDoor:Array;<br />
    var pDoor:Point;<br />
    var pNext:Point;<br />
    <br />
    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">for</span> (i <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;
i &lt; myDungeon.aRoom.length; i++) {<br />
        <br />
        myRoom <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> (myDungeon.aRoom[i] <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">as</span> Room);<br />
        <br />
        aDoor <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> [[],
[], [], []];<br /><br />
        <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
collect possible door locations ...</span><br />
        <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">for</span> (y <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;
y &lt; myRoom.iHeight; y++) {<br />
            <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">for</span> (x <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;
x &lt; myRoom.iWidth; x++) {<br />
                <br />
                pDoor <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">new</span> Point(myRoom.pOffset.x <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span> x,
myRoom.pOffset.y <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">+</span> y);<br />
                <br />
                <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (y
== 0 &amp;&amp; pDoor.y &gt; 0) {<br />
                    pNext <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> myDungeon.getNextPos(pDoor,
Dir.NORTH);<br />
                    cellTouch <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> myDungeon.cell(pNext);<br />
                    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (!cellTouch.isUnused
|| cellTouch.iType == RoomType.CORRIDOR) {    <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
the check for a cooridor is needed because they might be just one cell long ...</span><br />
                        aDoor[Dir.NORTH].push(pDoor);<br />
                        <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (cellTouch.isDeadEnd)
aDoor[Dir.NORTH].push(pDoor); <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
double chances for dead ends ...</span><br />
                    }<br />
                }<br />
                <br />
                <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (x
== (myRoom.iWidth <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">-</span> 1)
&amp;&amp; pDoor.x &lt; (myDungeon.iWidth <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">-</span> 1))
{<br />
                    pNext <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> myDungeon.getNextPos(pDoor,
Dir.EAST);<br />
                    cellTouch <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> myDungeon.cell(pNext);<br />
                    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (!cellTouch.isUnused
|| cellTouch.iType == RoomType.CORRIDOR) {<br />
                        aDoor[Dir.EAST].push(pDoor);<br />
                        <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (cellTouch.isDeadEnd)
aDoor[Dir.EAST].push(pDoor); <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
double chances for dead ends ...</span><br />
                    }<br />
                }<br />
                <br />
                <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (y
== (myRoom.iHeight <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">-</span> 1)
&amp;&amp; pDoor.y &lt; (myDungeon.iHeight <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">-</span> 1))
{<br />
                    pNext <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> myDungeon.getNextPos(pDoor,
Dir.SOUTH);<br />
                    cellTouch <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> myDungeon.cell(pNext);<br />
                    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (!cellTouch.isUnused
|| cellTouch.iType == RoomType.CORRIDOR) {<br />
                        aDoor[Dir.SOUTH].push(pDoor);<br />
                        <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (cellTouch.isDeadEnd)
aDoor[Dir.SOUTH].push(pDoor); <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
double chances for dead ends ...</span><br />
                    }<br />
                }<br />
                <br />
                <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (x
== 0 &amp;&amp; pDoor.x &gt; 0) {<br />
                    pNext <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> myDungeon.getNextPos(pDoor,
Dir.WEST);<br />
                    cellTouch <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> myDungeon.cell(pNext);<br />
                    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (!cellTouch.isUnused
|| cellTouch.iType == RoomType.CORRIDOR) {<br />
                        aDoor[Dir.WEST].push(pDoor);<br />
                        <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (cellTouch.isDeadEnd)
aDoor[Dir.WEST].push(pDoor); <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
double chances for dead ends ...</span><br />
                    }<br />
                }<br />
            }<br />
        }<br />
        <br />
        <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//
now just pick one door per side ...</span><br />
        <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">for</span> (j <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> 0;
j &lt; Dir.NUM_BASEDIR; j++) {<br />
            <br />
            <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (aDoor[j].length
&gt; 0) {<br />
                <br />
                pDoor <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> aDoor[j][rnd.Range(0,
(aDoor[j].length <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">-</span> 1))];<br />
                pNext <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> myDungeon.getNextPos(pDoor,
j);<br />
                <br />
                <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (!myRoom.hasDoor(j))
{<br />
                    myRoom.setDoor(j,
pDoor);<br />
                    <br />
                    <span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">if</span> (bOneDoorPerRoom
&amp;&amp; myDungeon.cell(pNext).iType == RoomType.ROOM) {<br />
                        myDungeon.getRoom(myDungeon.cell(pNext).iValue).setDoor(Dir.getOppositeDir(j),
pNext);<br />
                    }<br />
                    <br />
                    myDungeon.cell(pDoor).setWall(j,
WallType.DOOR);<br />
                    myDungeon.cell(pNext).setWall(Dir.getOppositeDir(j),
WallType.DOOR);<br />
                }<br />
            }<br />
        }<br />
    }<br />
}<br /></span></p>
Viola done ... but wait one more thing, cleaning up ...<br /><br />
The last step might not be needed, but imho it makes some nice dungeons: after we've
added all the rooms and doors, we remove all remeaning dead ends. This way there will
be no corridors just ending somewhere and the map looks nicer.<br /><br />
So we just run the removeDeadEnds method again, this time with 100% ... now:done.<br /><br />
As with the last parts, the link to a working demo of the whole mess is <a href="http://www.gywgames.com/_blog/dungeon/">here</a> or <a href="http://blog.gamingyourway.com/content/binary/dungeon/">here</a>.<br /><br />
nGFX<br /><p></p><img width="0" height="0" src="http://blog.gamingyourway.com/aggbug.ashx?id=794a7731-c193-4c75-9ad6-07d66f6a5654" /></body>
      <title>Random Dynamic Levels - Part 3</title>
      <guid isPermaLink="false">http://blog.gamingyourway.com/PermaLink,guid,794a7731-c193-4c75-9ad6-07d66f6a5654.aspx</guid>
      <link>http://blog.gamingyourway.com/2009/07/14/RandomDynamicLevelsPart3.aspx</link>
      <pubDate>Tue, 14 Jul 2009 11:56:39 GMT</pubDate>
      <description>In the last two articles&amp;nbsp; we made a &lt;a href="http://blog.gamingyourway.com/PermaLink,guid,238c0cda-9177-4b8d-89b4-2d1f9615a24d.aspx"&gt;maze&lt;/a&gt; and
then destroyed it by adding a lot of &lt;a href="http://blog.gamingyourway.com/PermaLink,guid,3f48b9a0-4873-4710-95c0-c0233881d030.aspx"&gt;free
space&lt;/a&gt;. In part 3 of this articles I'm going to add some rooms to the empty space
and add some doors ...&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;Part 3 - part 1 - why seperate things and make rooms?
&lt;/h3&gt;
At a first glance it might not be necessary to seperate data into dungeon, room and
cell, but thinking ahead a bit it should make sense ...&lt;br&gt;
My idea is that you can have the dungeon which holds the complete map (with the basic
room data rendered into it) and the rooms so you access them easier and most important
do some magic with them later. One of the neat things is that you could use a different
tiling for rooms making them more detailed or use the additional map data for skinning
(when rendering the dungeon into a tile based map).&lt;br&gt;
&lt;br&gt;
The main difference between a room and a dungeon is that the room consists of empty
cells and has walls along it's boundaries. So the first additional method we'd add
to the Room class will be the init method, which simply sets all cells so they form
a rectangular room.&lt;br&gt;
&lt;p&gt;
&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
initCells ():&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;void&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var x:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;uint&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var y:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;uint&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var cellTmp:Cell;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;for&lt;/span&gt; (x &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;
x &amp;lt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.iWidth;
x++) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;for&lt;/span&gt; (y &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;
y &amp;lt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.iHeight;
y++) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cellTmp &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.cell2(x,
y);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cellTmp.setWalls(WallType.OPEN);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (x
== 0) cellTmp.setWall(Dir.WEST, WallType.WALL);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (x
== (&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.iWidth &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;-&lt;/span&gt; 1))
cellTmp.setWall(Dir.EAST, WallType.WALL);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (y
== 0) cellTmp.setWall(Dir.NORTH, WallType.WALL);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (y
== (&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.iHeight &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;-&lt;/span&gt; 1))
cellTmp.setWall(Dir.SOUTH, WallType.WALL);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
We could later add methods to create different rooms (ie. two overlapping rectangles,
circular rooms), but for now that will do ...&lt;br&gt;
&lt;br&gt;
I also added a getter setter for Offset to the room, so we can modify the x and y
pos of the bounding rect that we stored in the map class (you'll see later what's
that for).&lt;br&gt;
&lt;br&gt;
So we now have a room, but how do we get that sucker into the map, or (as just putting
it into the map isn't really an issue) where can we place it *best*.&lt;br&gt;
&lt;br&gt;
There are a few things that I want to watch when placing the rooms ...&lt;br&gt;
- a room should not overlap any existing room, we rather don't at it&lt;br&gt;
- placing a room at a place where it doesn't touch anything, is something we don't
want, too&lt;br&gt;
- rooms overlapping corridors should be avoided&lt;br&gt;
- rooms touching dead ends is something we want (what's nice than finding a room after
a long winded corridor?)&lt;br&gt;
- rooms touching any sort of wall is OK, too&lt;br&gt;
&lt;br&gt;
Yet again we (as humans) could just look at the map and say "here, there and there"
and done, but that stupic piece of plastic cannot... we need to apply some sort of
scoring to the whole placement mess.&lt;br&gt;
&lt;br&gt;
Here's a bit of pseudo code ...&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
start with a VERY high best score, lets say 999999999999 and set current score to
0 ...&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;
Loop over every cell in the dungeon&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
at any given position check if the new room overlaps any rooms already in there&lt;br&gt;
if so, we add 5000 to our current score, otherwise we add nothing&lt;/li&gt;
&lt;li&gt;
now loop over every cell in the room and compare it with the current dungeon cell
(offsetting the room to the current position)&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
if the current room cell touches an empty cell (in the dungeon), add 10&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
if we touch a wall, add 3&lt;/li&gt;
&lt;li&gt;
if we touch a dead end, add 1&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
if the final current score is lower than the best score, sreplace the best score and
store the current position as the best possible location&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
if the score is higher than the "room overlaps room" score, assume that it only can
be placed overlapping a room and drop it, otherwise add it to the dungeon&lt;/li&gt;
&lt;/ul&gt;
Here is the scoring code:&lt;br&gt;
&lt;p&gt;
&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;const&lt;/span&gt; TOUCH_DEADEND:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 1;&lt;br&gt;
&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;const&lt;/span&gt; TOUCH_WALL:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 3;&lt;br&gt;
&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;const&lt;/span&gt; TOUCH_EMPTY:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 10;&lt;br&gt;
&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;const&lt;/span&gt; OVERLAP_ROOM:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 5000;&lt;br&gt;
&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;const&lt;/span&gt; OVERLAP_CORRIDOR:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 100;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
fitMazeRoom (myRoom:Room):Boolean {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var iBestScore:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 999999999;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var iScore:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var pBestPos:Point &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; Point(0,
0);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var pOffset:Point &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; Point(0,
0);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var cellDungeon:Cell;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var cellNext:Cell;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var rectTmp:Rectangle &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myRoom.rectBound.clone();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var i:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;uint&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var x:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var y:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var xx:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var yy:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var iRoomID:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;uint&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var bAddRoom:Boolean &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;false&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
loop over map (- roomsize)&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;for&lt;/span&gt; (y &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;
y &amp;lt; (&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.iHeight &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;-&lt;/span&gt; myRoom.iHeight &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; 1);
y++) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;for&lt;/span&gt; (x &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;
x &amp;lt; (&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.iWidth &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;-&lt;/span&gt; myRoom.iWidth &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; 1);
x++) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
do the scoring ...&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iScore &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
check room/room overlapping&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rectTmp.x &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; x;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rectTmp.y &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; y;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;for&lt;/span&gt; (i &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;
i &amp;lt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._aRoom.length;
i++) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; ((&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._aRoom[i] &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;as&lt;/span&gt; Room).rectBound.intersects(rectTmp))
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iScore
+= OVERLAP_ROOM;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
check room/dungeon overlapping&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;for&lt;/span&gt; (yy &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;
yy &amp;lt; myRoom.iHeight; yy++) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;for&lt;/span&gt; (xx &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;
xx &amp;lt; myRoom.iWidth; xx++) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pOffset.x &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; (x &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; xx);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pOffset.y &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; (y &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; yy);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cellDungeon &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.cell(pOffset);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (cellDungeon.iType
== RoomType.CORRIDOR) iScore += OVERLAP_CORRIDOR;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (yy
== 0) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iScore
+= &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.getCellScore(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.cell(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.getNextPos(pOffset,
Dir.NORTH)), Dir.NORTH);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (xx
== (myRoom.iWidth &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;-&lt;/span&gt; 1))
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iScore
+= &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.getCellScore(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.cell(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.getNextPos(pOffset,
Dir.EAST)), Dir.EAST);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (yy
== (myRoom.iHeight &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;-&lt;/span&gt; 1))
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iScore
+= &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.getCellScore(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.cell(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.getNextPos(pOffset,
Dir.SOUTH)), Dir.SOUTH);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (xx
== 0) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iScore
+= &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.getCellScore(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.cell(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.getNextPos(pOffset,
Dir.WEST)), Dir.WEST);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (iScore
&amp;lt; iBestScore) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iBestScore &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; iScore;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pBestPos &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; Point(x,
y);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
add to dungeon if it doesn't overlap any other rooms&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (iBestScore
&amp;lt; OVERLAP_ROOM) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myRoom.pOffset &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; Point(pBestPos.x,
pBestPos.y);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bAddRoom &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;true&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; bAddRoom;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; function
getCellScore (cellNext:Cell, iDir:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;):&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var iScore:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (cellNext.iType
== RoomType.CORRIDOR) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (cellNext.isDeadEnd)
{&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iScore +=
TOUCH_DEADEND;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;else&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (cellNext.hasWall(Dir.getOppositeDir(iDir)))
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iScore +=
TOUCH_WALL;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;else&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iScore +=
TOUCH_EMPTY;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;else&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (cellNext.iType
== RoomType.ROOM) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (cellNext.hasWall(Dir.getOppositeDir(iDir)))
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iScore
+= TOUCH_WALL;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;else&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iScore
+= TOUCH_EMPTY;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;else&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iScore +=
TOUCH_EMPTY;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; iScore;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
That's ugly and not very fast, but it works.&lt;br&gt;
&lt;br&gt;
Some additional info about adding the room to the dungeon: whenever we place a room
cell in the dungeon map it's a good idea to check if it overwrites a corridor and
if it's a cell on the outer bounds of the room add a new wall to the touching cell
(if it's not empty) ...&lt;br&gt;
&lt;br&gt;
So far so good, we have rooms in the map, but they cannot yet be reached because we're
missing doors ...&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;Part 3 - part 2 - adding doors and cleaning up
&lt;/h3&gt;
You might ask why I haven't added the doors as soon as I've added the room to the
dungeon (and I might just reply that I just didn't mention it), but nope, I didn't
add doors - that's the next step.&lt;br&gt;
&lt;br&gt;
The reason is quite simple, though. I don't want doors cluttered all over the space
and because of that I added another (optional) thing to the room data: hasDoorInDirection
... this way we make sure that there is only one door per wall / room when we add
doors ...&lt;br&gt;
&lt;br&gt;
Yet again we loop over all rooms and over their outer bounding cells, if we touch
another cell, store the current position as possible door location. Then pick a random
one per direction and check if it touches another room and if this room might already
have a door ...&lt;br&gt;
I guess that's easier to explain with some more code:&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; function
createDoors (myDungeon:Dungeon, bOneDoorPerRoom:Boolean &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;true&lt;/span&gt;):&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;void&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var rnd:MersenneTwister &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; MersenneTwister.getInstance();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var i:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;uint&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var j:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;uint&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var x:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;uint&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var y:&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;uint&lt;/span&gt;;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var cellTouch:Cell;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var myRoom:Room;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var aDoor:Array;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var pDoor:Point;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var pNext:Point;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;for&lt;/span&gt; (i &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;
i &amp;lt; myDungeon.aRoom.length; i++) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myRoom &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; (myDungeon.aRoom[i] &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;as&lt;/span&gt; Room);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aDoor &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; [[],
[], [], []];&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
collect possible door locations ...&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;for&lt;/span&gt; (y &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;
y &amp;lt; myRoom.iHeight; y++) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;for&lt;/span&gt; (x &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;
x &amp;lt; myRoom.iWidth; x++) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pDoor &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; Point(myRoom.pOffset.x &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; x,
myRoom.pOffset.y &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;+&lt;/span&gt; y);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (y
== 0 &amp;amp;&amp;amp; pDoor.y &amp;gt; 0) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pNext &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myDungeon.getNextPos(pDoor,
Dir.NORTH);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cellTouch &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myDungeon.cell(pNext);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (!cellTouch.isUnused
|| cellTouch.iType == RoomType.CORRIDOR) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
the check for a cooridor is needed because they might be just one cell long ...&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aDoor[Dir.NORTH].push(pDoor);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (cellTouch.isDeadEnd)
aDoor[Dir.NORTH].push(pDoor); &lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
double chances for dead ends ...&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (x
== (myRoom.iWidth &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;-&lt;/span&gt; 1)
&amp;amp;&amp;amp; pDoor.x &amp;lt; (myDungeon.iWidth &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;-&lt;/span&gt; 1))
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pNext &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myDungeon.getNextPos(pDoor,
Dir.EAST);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cellTouch &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myDungeon.cell(pNext);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (!cellTouch.isUnused
|| cellTouch.iType == RoomType.CORRIDOR) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aDoor[Dir.EAST].push(pDoor);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (cellTouch.isDeadEnd)
aDoor[Dir.EAST].push(pDoor); &lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
double chances for dead ends ...&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (y
== (myRoom.iHeight &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;-&lt;/span&gt; 1)
&amp;amp;&amp;amp; pDoor.y &amp;lt; (myDungeon.iHeight &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;-&lt;/span&gt; 1))
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pNext &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myDungeon.getNextPos(pDoor,
Dir.SOUTH);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cellTouch &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myDungeon.cell(pNext);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (!cellTouch.isUnused
|| cellTouch.iType == RoomType.CORRIDOR) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aDoor[Dir.SOUTH].push(pDoor);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (cellTouch.isDeadEnd)
aDoor[Dir.SOUTH].push(pDoor); &lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
double chances for dead ends ...&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (x
== 0 &amp;amp;&amp;amp; pDoor.x &amp;gt; 0) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pNext &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myDungeon.getNextPos(pDoor,
Dir.WEST);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cellTouch &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myDungeon.cell(pNext);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (!cellTouch.isUnused
|| cellTouch.iType == RoomType.CORRIDOR) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aDoor[Dir.WEST].push(pDoor);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (cellTouch.isDeadEnd)
aDoor[Dir.WEST].push(pDoor); &lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
double chances for dead ends ...&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//
now just pick one door per side ...&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;for&lt;/span&gt; (j &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;
j &amp;lt; Dir.NUM_BASEDIR; j++) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (aDoor[j].length
&amp;gt; 0) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pDoor &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; aDoor[j][rnd.Range(0,
(aDoor[j].length &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;-&lt;/span&gt; 1))];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pNext &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myDungeon.getNextPos(pDoor,
j);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (!myRoom.hasDoor(j))
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myRoom.setDoor(j,
pDoor);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (bOneDoorPerRoom
&amp;amp;&amp;amp; myDungeon.cell(pNext).iType == RoomType.ROOM) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myDungeon.getRoom(myDungeon.cell(pNext).iValue).setDoor(Dir.getOppositeDir(j),
pNext);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myDungeon.cell(pDoor).setWall(j,
WallType.DOOR);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myDungeon.cell(pNext).setWall(Dir.getOppositeDir(j),
WallType.DOOR);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
Viola done ... but wait one more thing, cleaning up ...&lt;br&gt;
&lt;br&gt;
The last step might not be needed, but imho it makes some nice dungeons: after we've
added all the rooms and doors, we remove all remeaning dead ends. This way there will
be no corridors just ending somewhere and the map looks nicer.&lt;br&gt;
&lt;br&gt;
So we just run the removeDeadEnds method again, this time with 100% ... now:done.&lt;br&gt;
&lt;br&gt;
As with the last parts, the link to a working demo of the whole mess is &lt;a href="http://www.gywgames.com/_blog/dungeon/"&gt;here&lt;/a&gt; or &lt;a href="http://blog.gamingyourway.com/content/binary/dungeon/"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
nGFX&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.gamingyourway.com/aggbug.ashx?id=794a7731-c193-4c75-9ad6-07d66f6a5654" /&gt;</description>
      <comments>http://blog.gamingyourway.com/CommentView,guid,794a7731-c193-4c75-9ad6-07d66f6a5654.aspx</comments>
      <category>coding ideas</category>
      <category>Dungeon Creation</category>
      <category>experiments</category>
      <category>game development</category>
      <category>tutorial</category>
    </item>
    <item>
      <trackback:ping>http://blog.gamingyourway.com/Trackback.aspx?guid=3f48b9a0-4873-4710-95c0-c0233881d030</trackback:ping>
      <pingback:server>http://blog.gamingyourway.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.gamingyourway.com/PermaLink,guid,3f48b9a0-4873-4710-95c0-c0233881d030.aspx</pingback:target>
      <dc:creator>nGFX</dc:creator>
      <wfw:comment>http://blog.gamingyourway.com/CommentView,guid,3f48b9a0-4873-4710-95c0-c0233881d030.aspx</wfw:comment>
      <wfw:commentRss>http://blog.gamingyourway.com/SyndicationService.asmx/GetEntryCommentsRss?guid=3f48b9a0-4873-4710-95c0-c0233881d030</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">This is part 2 of my collection of articles
that'll deal with the theory (and the actual creation) of random dynamic levels for
a (space)game. In <a href="http://blog.gamingyourway.com/PermaLink,guid,238c0cda-9177-4b8d-89b4-2d1f9615a24d.aspx">part
one</a> we created a damn pretty maze and in part two we're going to modify it a good
deal.<br /><br />
If you take a look at part one's output you'll notice that the code generates a pretty
random maze. And there we got out first drawback: it's pretty darn random, way to
random to assemble a man made structure and not quite what we would expect a spacestation
/ space ship to look like.<br /><br />
So the first modification I'm going to add will be a method that can reduce the randomness
of the maze.<br /><br /><h3>Part 2 - part 1 - making something not that random
</h3>
My idea is to qualify the randomness by a percentage value, so a random factor of
0 will give you long straight passages that only change direction if the need to (random
at that), while using a value of 100 the method will never (as far as it possible)
return the same direction twice.<br /><br />
Of course that tiny little addition causes a lot of fuzz and requieres to rewrite
a part of the core maze generator function. In part 1 I used a method to get all surrounding
cells of a given point, but in order to use the direction modifier we need to use
directions instead.<br /><br /><p><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">         
//... skipped 
<br /></span></span></p><p><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">         
while</span> (iCellCount &lt; iTotalCells) {<br />
                <br />
                <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
get neighbor cells ...</span><br />
                aCellDirections <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> myDungeon.getPossibleDirections(pCurrentCell);<br />
                <br />
                <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
set the cell</span><br />
                <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (aCellDirections.length
!<span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0)
{<br />
                    <br />
                    <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">/*
old way no direction modification used<br />
                    iRndCell
= rnd.Range(0, (aCellNeighbors.length - 1));<br />
                    iRndDir
= Dir.getDirFromPoint(pCurrentCell, aCellNeighbors[iRndCell]);<br />
                    */</span><br />
                    iRndDir <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>.getFactoredRandomDir(iLastDir,
aCellDirections, iDirChange);<br />
                    pNextCell <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> myDungeon.getNextPos(pCurrentCell,
iRndDir); 
<br />
                    iLastDir <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> iRndDir;<br />
                    <br />
                    <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
remove walls</span><br />
                    myDungeon.cell(pCurrentCell).setWall
(iRndDir, WallType.OPEN);<br />
                    <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
old way: myDungeon.cell(aCellNeighbors[iRndCell]).setWall(Dir.getOppositeDir(iRndDir),
WallType.OPEN);</span><br />
                    myDungeon.cell(pNextCell).setWall(Dir.getOppositeDir(iRndDir),
WallType.OPEN);<br />
                    <br />
                    <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
store for later use ...</span><br />
                    aCellStack.push(<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> Point(pCurrentCell.x,
pCurrentCell.y));<br />
                    <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
old way: pCurrentCell = new Point(aCellNeighbors[iRndCell].x, aCellNeighbors[iRndCell].y);</span><br />
                    pCurrentCell <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> Point(pNextCell.x,
pNextCell.y);<br />
                    <br />
                    iCellCount++;<br />
                } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">else</span> {<br />
                    pPopCell <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> aCellStack.pop();<br />
                    pCurrentCell <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> Point(pPopCell.x,
pPopCell.y);<br />
                }<br />
                <br />
            } <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
while</span></span></p>
Some new variables in there: iLastDir (so we can keep track of the last direction
used), pNextCell (a point that stores the next cell, basically just a temp. variable),
iRndCell has been removed and aCellNeighbours has been renamed to aCellDirections
...<br /><br />
There are two new methdods: getPossibleDirections and getFactoredRandomDir. The first
one returns an array that just contains directions that can be used (ie. cells that
have not been visited yet), directions are simply stored as 0=North, 1=East and so
one (I've encapsulated them into a Dir class to make it easier to read). The second
method is a neat example how to make things overly complicated ...<br /><br /><p><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;">        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span> function
getFactoredRandomDir (iLastDir:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span>,
aListDir:Array, iFactor:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 50):<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> {<br />
            <br />
            var rnd:MersenneTwister <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> MersenneTwister.getInstance();<br />
            var bChangeDir:Boolean <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> (rnd.Range(0,
99) &lt; iFactor);<br />
            <br />
            var iReturn:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> iLastDir;<br />
            <br />
            <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
the last used dir is not in the list of possible new directions, so we need to pick
a random one ...</span><br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (aListDir.toString().lastIndexOf(iLastDir.toString())
== -1) {<br />
                iReturn <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> aListDir[rnd.Range(0,
(aListDir.length -1))];<br />
            } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">else</span> {<br />
                <br />
                <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
we must change direction AND have at least 2 choices</span><br />
                <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (aListDir.length
&gt; 1) {<br />
                    <br />
                    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (bChangeDir)
{<br />
                        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">while</span> (iReturn
== iLastDir) {<br />
                            iReturn <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> aListDir[rnd.Range(0,
(aListDir.length -1))];<br />
                        }<br />
                    }<br />
                    <br />
                } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">else</span> {<br />
                    <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
just pick what's left ...</span><br />
                    iReturn <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> aListDir[0];<br />
                }<br />
                <br />
            }<br />
            <br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span> iReturn;<br />
            <br />
            <br />
        }</span></p><br />
AS3 arrays (in CS3) don't have the nice method I know from c#: contains which would
have been oh so easy to use here. I toyed for a fraction of a second with the idea
to use a loop to check if a given value would be in an array, but then decided to
go ... quick and dirty and use toString and lastIndexOf instead.<br /><br />
The code above is quite easy, so I only do a quick run through it...<br />
- decide if we need to apply a direction change<br />
- if we need to, check if the last dir is in the list of possible dirs, if not just
pic a random new (this applies to both states: need to change and keep direction)<br />
- otherwise just pick a random dir until it's not equal the last dir used<br /><br />
That's it.<br /><br />
Running the test app with different values seems to produce the desired results:<br />
0% produces the most possible straight halls,<br />
50% produces somewhat random halls<br />
100% produces a maze with no straight hall at all.<br /><br /><h3>Part 2 - part 2 - still way to much filled space ...
</h3>
Looking at the maze reveals that there are no free spaces in it, of course we could
just paint rooms over it, but I doubt it'll look like what I have in mind.<br />
Randomly removing cells from the map is no option (even if we do check if we would
just block a passage), but what about removing cells that just end the passage (ie:
dead ends).<br />
Looking at the maze again, it seems that we have (depending on the randomness of direction
changes) a lot of them, so our next task would be to find those dead ends and remove
them. The first "problem" that comes to me is that each time we remove dead ends,
we'd create new ones. In order to clean up the map we only run the "removDeadEnds"
methods a couple of times and we're done - right?<br /><br />
Not quite.<br /><br />
If we choose some unlucky values, it might happen that we kill the whole maze and
that's something we don't want at all.<br /><br />
I decided to use a percentage of TotalCells that I want to be removed, so if we use
50%, the method should remove half of all available cells.<br /><br /><p><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;">        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
removeDeadEnds (myDungeon:Dungeon, iRemoveDeadEnd:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 20):Dungeon
{<br />
            <br />
            var rnd:MersenneTwister <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> MersenneTwister.getInstance();<br />
            <br />
            var i:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span>;<br />
            var j:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">uint</span>;<br />
            var iDir:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span>;<br />
            var iRndCell:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span>;<br />
            <br />
            var iDeadEndsToRemove:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> Math.ceil((myDungeon.iWidth <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">*</span> myDungeon.iHeight) <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">*</span> iRemoveDeadEnd <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">/</span> 100);<br />
            var iDeadEndCount:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0;<br />
            <br />
            var bExit:Boolean <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">false</span>;<br />
            <br />
            var aTmp:Array;<br />
            <br />
            <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
the worst case may only return one dead end per run, so </span><br />
            <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
to be sure we run it as many times as we may max need</span><br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">for</span> (i <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0;
i &lt; iDeadEndsToRemove; i++) {<br />
                <br />
                aTmp <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> myDungeon.getDeadEnds();<br />
                <br />
                <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (aTmp.length
&gt; 0 &amp;&amp; !bExit) {<br /><br />
                    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">while</span> (aTmp.length
&gt; 0) {<br />
                    <br />
                        <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
this is to make sure that the cells are somewhat even</span><br />
                        <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
distributed if we do not use the whole lot</span><br />
                        iRndCell <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> rnd.Range(0,
(aTmp.length <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">-</span> 1));<br />
                        iDir <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> myDungeon.cell(aTmp[iRndCell]).getDeadEndDir();<br />
                        <br />
                        myDungeon.cell(myDungeon.getNextPos(aTmp[iRndCell],
iDir)).setWall(Dir.getOppositeDir(iDir), WallType.WALL);<br />
                        myDungeon.cell(aTmp[iRndCell]).setWalls();<br />
                        <br />
                        aTmp.splice(iRndCell,
1);<br />
                        <br />
                        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (++iDeadEndCount
&gt;= iDeadEndsToRemove) {<br />
                            bExit <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">true</span>;<br />
                            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">break</span>;<br />
                        }<br />
                        <br />
                    }<br />
                } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">else</span> {<br />
                    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">break</span>;<br />
                }<br />
                <br />
            }<br />
            <br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span> myDungeon;<br />
            <br />
        }</span></p><br />
The comments should explain quite well what's going on in there. Only thing to mention
is that I pic random dead ends if there are more available dead ends than cells to
remove.<br /><br />
Compile and test ... and viola well done for today. :)<br /><br />
(I must admid it took longer to type all that than to code, so I had a bit of spare
time left and coded something alse ;) )<br /><br />
I think that is enough for today, you can see the result (and from the upcoming articles,
too) <a href="http://www.gywgames.com/_blog/dungeon/">Random Dynamic Level Creation
Test page</a> (or <a href="http://blog.gamingyourway.com/content/binary/dungeon/">here</a> if
the server is down).<br /><br />
nGFX<br /><br /><p></p><img width="0" height="0" src="http://blog.gamingyourway.com/aggbug.ashx?id=3f48b9a0-4873-4710-95c0-c0233881d030" /></body>
      <title>Random Dynamic Levels - Part 2</title>
      <guid isPermaLink="false">http://blog.gamingyourway.com/PermaLink,guid,3f48b9a0-4873-4710-95c0-c0233881d030.aspx</guid>
      <link>http://blog.gamingyourway.com/2009/06/29/RandomDynamicLevelsPart2.aspx</link>
      <pubDate>Mon, 29 Jun 2009 14:34:28 GMT</pubDate>
      <description>This is part 2 of my collection of articles that'll deal with the theory (and the actual creation) of random dynamic levels for a (space)game. In &lt;a href="http://blog.gamingyourway.com/PermaLink,guid,238c0cda-9177-4b8d-89b4-2d1f9615a24d.aspx"&gt;part
one&lt;/a&gt; we created a damn pretty maze and in part two we're going to modify it a good
deal.&lt;br&gt;
&lt;br&gt;
If you take a look at part one's output you'll notice that the code generates a pretty
random maze. And there we got out first drawback: it's pretty darn random, way to
random to assemble a man made structure and not quite what we would expect a spacestation
/ space ship to look like.&lt;br&gt;
&lt;br&gt;
So the first modification I'm going to add will be a method that can reduce the randomness
of the maze.&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;Part 2 - part 1 - making something not that random
&lt;/h3&gt;
My idea is to qualify the randomness by a percentage value, so a random factor of
0 will give you long straight passages that only change direction if the need to (random
at that), while using a value of 100 the method will never (as far as it possible)
return the same direction twice.&lt;br&gt;
&lt;br&gt;
Of course that tiny little addition causes a lot of fuzz and requieres to rewrite
a part of the core maze generator function. In part 1 I used a method to get all surrounding
cells of a given point, but in order to use the direction modifier we need to use
directions instead.&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
//... skipped 
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
while&lt;/span&gt; (iCellCount &amp;lt; iTotalCells) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
get neighbor cells ...&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCellDirections &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myDungeon.getPossibleDirections(pCurrentCell);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
set the cell&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (aCellDirections.length
!&lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0)
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;/*
old way no direction modification used&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iRndCell
= rnd.Range(0, (aCellNeighbors.length - 1));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iRndDir
= Dir.getDirFromPoint(pCurrentCell, aCellNeighbors[iRndCell]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iRndDir &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.getFactoredRandomDir(iLastDir,
aCellDirections, iDirChange);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pNextCell &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myDungeon.getNextPos(pCurrentCell,
iRndDir); 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iLastDir &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; iRndDir;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
remove walls&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myDungeon.cell(pCurrentCell).setWall
(iRndDir, WallType.OPEN);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
old way: myDungeon.cell(aCellNeighbors[iRndCell]).setWall(Dir.getOppositeDir(iRndDir),
WallType.OPEN);&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myDungeon.cell(pNextCell).setWall(Dir.getOppositeDir(iRndDir),
WallType.OPEN);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
store for later use ...&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCellStack.push(&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; Point(pCurrentCell.x,
pCurrentCell.y));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
old way: pCurrentCell = new Point(aCellNeighbors[iRndCell].x, aCellNeighbors[iRndCell].y);&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pCurrentCell &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; Point(pNextCell.x,
pNextCell.y);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iCellCount++;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;else&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pPopCell &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; aCellStack.pop();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pCurrentCell &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; Point(pPopCell.x,
pPopCell.y);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
while&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
Some new variables in there: iLastDir (so we can keep track of the last direction
used), pNextCell (a point that stores the next cell, basically just a temp. variable),
iRndCell has been removed and aCellNeighbours has been renamed to aCellDirections
...&lt;br&gt;
&lt;br&gt;
There are two new methdods: getPossibleDirections and getFactoredRandomDir. The first
one returns an array that just contains directions that can be used (ie. cells that
have not been visited yet), directions are simply stored as 0=North, 1=East and so
one (I've encapsulated them into a Dir class to make it easier to read). The second
method is a neat example how to make things overly complicated ...&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; function
getFactoredRandomDir (iLastDir:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;,
aListDir:Array, iFactor:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 50):&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var rnd:MersenneTwister &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; MersenneTwister.getInstance();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var bChangeDir:Boolean &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; (rnd.Range(0,
99) &amp;lt; iFactor);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var iReturn:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; iLastDir;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
the last used dir is not in the list of possible new directions, so we need to pick
a random one ...&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (aListDir.toString().lastIndexOf(iLastDir.toString())
== -1) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iReturn &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; aListDir[rnd.Range(0,
(aListDir.length -1))];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;else&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
we must change direction AND have at least 2 choices&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (aListDir.length
&amp;gt; 1) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (bChangeDir)
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;while&lt;/span&gt; (iReturn
== iLastDir) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iReturn &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; aListDir[rnd.Range(0,
(aListDir.length -1))];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;else&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
just pick what's left ...&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iReturn &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; aListDir[0];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; iReturn;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;
&lt;/p&gt;
&lt;br&gt;
AS3 arrays (in CS3) don't have the nice method I know from c#: contains which would
have been oh so easy to use here. I toyed for a fraction of a second with the idea
to use a loop to check if a given value would be in an array, but then decided to
go ... quick and dirty and use toString and lastIndexOf instead.&lt;br&gt;
&lt;br&gt;
The code above is quite easy, so I only do a quick run through it...&lt;br&gt;
- decide if we need to apply a direction change&lt;br&gt;
- if we need to, check if the last dir is in the list of possible dirs, if not just
pic a random new (this applies to both states: need to change and keep direction)&lt;br&gt;
- otherwise just pick a random dir until it's not equal the last dir used&lt;br&gt;
&lt;br&gt;
That's it.&lt;br&gt;
&lt;br&gt;
Running the test app with different values seems to produce the desired results:&lt;br&gt;
0% produces the most possible straight halls,&lt;br&gt;
50% produces somewhat random halls&lt;br&gt;
100% produces a maze with no straight hall at all.&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;Part 2 - part 2 - still way to much filled space ...
&lt;/h3&gt;
Looking at the maze reveals that there are no free spaces in it, of course we could
just paint rooms over it, but I doubt it'll look like what I have in mind.&lt;br&gt;
Randomly removing cells from the map is no option (even if we do check if we would
just block a passage), but what about removing cells that just end the passage (ie:
dead ends).&lt;br&gt;
Looking at the maze again, it seems that we have (depending on the randomness of direction
changes) a lot of them, so our next task would be to find those dead ends and remove
them. The first "problem" that comes to me is that each time we remove dead ends,
we'd create new ones. In order to clean up the map we only run the "removDeadEnds"
methods a couple of times and we're done - right?&lt;br&gt;
&lt;br&gt;
Not quite.&lt;br&gt;
&lt;br&gt;
If we choose some unlucky values, it might happen that we kill the whole maze and
that's something we don't want at all.&lt;br&gt;
&lt;br&gt;
I decided to use a percentage of TotalCells that I want to be removed, so if we use
50%, the method should remove half of all available cells.&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
removeDeadEnds (myDungeon:Dungeon, iRemoveDeadEnd:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 20):Dungeon
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var rnd:MersenneTwister &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; MersenneTwister.getInstance();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var i:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var j:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;uint&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var iDir:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var iRndCell:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var iDeadEndsToRemove:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; Math.ceil((myDungeon.iWidth &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;*&lt;/span&gt; myDungeon.iHeight) &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;*&lt;/span&gt; iRemoveDeadEnd &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;/&lt;/span&gt; 100);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var iDeadEndCount:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var bExit:Boolean &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;false&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var aTmp:Array;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
the worst case may only return one dead end per run, so &lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
to be sure we run it as many times as we may max need&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;for&lt;/span&gt; (i &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;
i &amp;lt; iDeadEndsToRemove; i++) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aTmp &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myDungeon.getDeadEnds();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (aTmp.length
&amp;gt; 0 &amp;amp;&amp;amp; !bExit) {&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;while&lt;/span&gt; (aTmp.length
&amp;gt; 0) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
this is to make sure that the cells are somewhat even&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
distributed if we do not use the whole lot&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iRndCell &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; rnd.Range(0,
(aTmp.length &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;-&lt;/span&gt; 1));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iDir &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; myDungeon.cell(aTmp[iRndCell]).getDeadEndDir();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myDungeon.cell(myDungeon.getNextPos(aTmp[iRndCell],
iDir)).setWall(Dir.getOppositeDir(iDir), WallType.WALL);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myDungeon.cell(aTmp[iRndCell]).setWalls();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aTmp.splice(iRndCell,
1);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (++iDeadEndCount
&amp;gt;= iDeadEndsToRemove) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bExit &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;true&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;break&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;else&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;break&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; myDungeon;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;
&lt;/p&gt;
&lt;br&gt;
The comments should explain quite well what's going on in there. Only thing to mention
is that I pic random dead ends if there are more available dead ends than cells to
remove.&lt;br&gt;
&lt;br&gt;
Compile and test ... and viola well done for today. :)&lt;br&gt;
&lt;br&gt;
(I must admid it took longer to type all that than to code, so I had a bit of spare
time left and coded something alse ;) )&lt;br&gt;
&lt;br&gt;
I think that is enough for today, you can see the result (and from the upcoming articles,
too) &lt;a href="http://www.gywgames.com/_blog/dungeon/"&gt;Random Dynamic Level Creation
Test page&lt;/a&gt; (or &lt;a href="http://blog.gamingyourway.com/content/binary/dungeon/"&gt;here&lt;/a&gt; if
the server is down).&lt;br&gt;
&lt;br&gt;
nGFX&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.gamingyourway.com/aggbug.ashx?id=3f48b9a0-4873-4710-95c0-c0233881d030" /&gt;</description>
      <comments>http://blog.gamingyourway.com/CommentView,guid,3f48b9a0-4873-4710-95c0-c0233881d030.aspx</comments>
      <category>coding ideas</category>
      <category>Dungeon Creation</category>
      <category>experiments</category>
      <category>game development</category>
      <category>tutorial</category>
    </item>
    <item>
      <trackback:ping>http://blog.gamingyourway.com/Trackback.aspx?guid=238c0cda-9177-4b8d-89b4-2d1f9615a24d</trackback:ping>
      <pingback:server>http://blog.gamingyourway.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.gamingyourway.com/PermaLink,guid,238c0cda-9177-4b8d-89b4-2d1f9615a24d.aspx</pingback:target>
      <dc:creator>nGFX</dc:creator>
      <wfw:comment>http://blog.gamingyourway.com/CommentView,guid,238c0cda-9177-4b8d-89b4-2d1f9615a24d.aspx</wfw:comment>
      <wfw:commentRss>http://blog.gamingyourway.com/SyndicationService.asmx/GetEntryCommentsRss?guid=238c0cda-9177-4b8d-89b4-2d1f9615a24d</wfw:commentRss>
      <slash:comments>7</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">After a good while of non-techy pimpings
I decided to go the x++ route and describe the process of diving into a new game ...<br /><br />
(CE is again on hold due to some gameplay issues I found during testplays - oh well)<br /><br />
There is no name to the game yet, but I can say as much as it will feature random
dynamic level creation (as used in Diablo 1 for example), sci-fi themed, using RPG
elements and use Unity (though the levels created will look quite different to Diablo,
but the idea is the same).<br />
I want to have random levels because that would add to the replay value of the game.
I want a single game to last between 15 and 45 minutes. You should be able to start
playing and kill the end-boss in that time. After that you should be able just play
again, but with different set of maps ...<br /><br />
But to get things rolling a lot quicker I wanted to rapid prototype my ideas using
flash/AS3 and then port it to c#.<br />
The reason for this is quite simple: output. In order to "see" what the level will
look like without having to worry about how to display them (ie. place 3d walls, create
the assets). With using flash i can just grab the data from the generator classes
and use the drawing api to quickly throw out a few lines to show the generated data.<br /><br />
Let's dive straight in.<br /><br /><h3>Part 1 - part 1: To cell or to tile ... and is there anything we need before that?
</h3>
Before I started I thought that it would be nice to move between maps (in case you
thought you forgot something), to do so there needs to be a way to store the maps
... I thought of 2 methods:<br />
a) store all visited maps<br />
b) make them reproduceable<br /><br />
I prefer the later one.<br /><br />
So instead of using some built in random number generator I decided to use my "own"
that takes a seed and the produces the same set of random numbers when using that
seed - perfect.<br />
I found some old AS1 source of some older rnd gen that I could have ported but a quick
search showed that there are some more powerfull ones. After bit of research I decided
to go with the <a href="http://en.wikipedia.org/wiki/Mersenne_Twister">Mersenne Twister</a> algorithm.
As I was too lazy to see if there was an AS3 port, I wrote my own implementation,
though you could use any rnd method you want.<br /><br />
The next one was a bit tricky: cell based or tile based?<br />
Tiles are easy to use and to handle, but they are limited to a single spot and mostly
do only have a single "state", ie. you can walk on them or not. This might be ok in
most cases but for what I have in mind they are too limited.<br /><br />
A cell in my case is a tile with 4 walls (north, east, south and west), if all 4 walls
are set, the cell is "closed" ie. a solid rock in a clasical dungeon. The cell also
stors a single integer value (so based on it's useage I could store an index in it.<br />
Here is the code for the cell:<br /><p><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;">package
com.gamingyourway.Dungeon {<br />
    <br />
    <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">/**<br />
     * Cell datatype<br />
     * @version 2009 06 24<br />
     * @author nGFX<br />
     */</span><br />
    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">class</span> Cell
{<br />
        <br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">static</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">const</span> WALL:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0;<br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">static</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">const</span> OPEN:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 1;<br />
                <br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span> var
_aWall:Array;    <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
array of values ... 0=empty ...</span><br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span> var
_iValue:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span>;    <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
stores a single value, ie. room num</span><br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span> var
_bVisited:Boolean;    <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
has cell been visited</span><br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span> var
_bCorridor:Boolean;    <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
is cell a corridor</span><br />
        <br />
        <br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
get aWall ():Array { <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._aWall;
}<br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
set aWall (value:Array):<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> { <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._aWall <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> value;
}<br />
        <br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
get iValue ():<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> { <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._iValue;
}<br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
set iValue (value:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span>):<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> { <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._iValue <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> value;
}<br />
        <br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
get bVisited ():Boolean { <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._bVisited;
}<br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
set bVisited (value:Boolean):<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> { <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._bVisited <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> value;
}<br />
        <br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
get bCorridor ():Boolean { <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._bCorridor;
}<br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
set bCorridor (value:Boolean):<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> { <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._bCorridor <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> value;
}<br />
        <br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
get wallCount ():<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> {<br />
            <br />
            var i:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">uint</span>;<br />
            var iCount:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0;<br />
            <br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">for</span> (i <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0;
i &lt; <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._aWall.length;
i++) {<br />
                <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._aWall[i]
== 0) iCount++;<br />
            }<br />
            <br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span> iCount;<br />
            <br />
        }<br />
        <br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
get isDeadEnd ():Boolean { <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span> (<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>.wallCount
== 3); }<br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
get isUnused ():Boolean { <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span> (<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>.wallCount
== 4); }<br />
        <br />
        <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">/**<br />
         * Creates a new empty (ie. all walls
set) cells<br />
         * @param    iValue    used
to stor a single bit of info, ie. room num<br />
         */</span><br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
Cell (iValue:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0)
{<br />
        <br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._aWall <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> [0,
0, 0, 0];<br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._iValue <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> iValue;<br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._bVisited <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">false</span>;<br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._bCorridor <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">false</span>;<br />
            <br />
        }<br />
        <br />
        <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">/**<br />
         * sets a single wall<br />
         * @param    iDir    Direction
of the wall<br />
         * @param    iWall    value
of the wall, 0 is a solid wall, any other value makes it "open"<br />
         */</span><br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
setWall (iDir:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span>,
iWall:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0):<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> {<br />
            <br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._aWall[iDir] <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> iWall;<br />
            <br />
        }<br />
        <br />
        <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">/**<br />
         * return the value if the wall in
iDIr<br />
         * @param    iDir    direction
of the wall to get<br />
         * @return    value
of the wall<br />
         */</span><br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
getWall (iDir:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span>):<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">uint</span> {<br />
            <br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._aWall[iDir];<br />
            <br />
        }<br />
        <br />
        <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">/**<br />
         * shortcut for testing if there is
a closed wall in iDir<br />
         * @param    iDir    direction
to test<br />
         * @return    true
if there is a wall<br />
         */</span><br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
hasWall (iDir:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span>):Boolean
{<br />
            <br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span> (<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._aWall[iDir]
== 0);<br />
            <br />
        }<br />
        <br />
        <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">/**<br />
         * if the cell is a dead end, return
the direction of the opening<br />
         * @return    the
direction of the opening<br />
         */</span><br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
getDeadEndDir ():<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> {<br />
            <br />
            var iReturn:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> -1; <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
not a dead end</span><br />
            <br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (isDeadEnd)
{<br />
                <br />
                <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._aWall[Dir.NORTH]
!<span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0)
iReturn <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> Dir.NORTH;<br />
                <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._aWall[Dir.EAST]
!<span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0)
iReturn <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> Dir.EAST;<br />
                <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._aWall[Dir.SOUTH]
!<span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0)
iReturn <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> Dir.SOUTH;<br />
                <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._aWall[Dir.WEST]
!<span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0)
iReturn <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> Dir.WEST;<br />
                <br />
            }<br />
            <br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span> iReturn;<br />
            <br />
        }<br />
        <br />
        <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">/**<br />
         * returns a string representation
of the cell<br />
         * @return    a
string for the falls of this cell<br />
         */</span><br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
toString ():String {<br />
            <br />
            var i:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">uint</span>;<br />
            var strReturn:String <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">""</span>;<br />
            <br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">for</span> (i <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0;
i &lt; <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._aWall.length;
i++) {<br />
                strReturn
+= <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._aWall[i].toString();<br />
            }<br />
            <br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span> strReturn;<br />
            <br />
        }<br />
        <br />
        <br />
    }<br />
    <br />
}</span></p><br /><h3>Part 1 - part 2 - Storage and creation
</h3>
To store the maps generated I wrote a simple Mapa datatype, it'll store a 2d array
of cells along with some very basic methods to deal with the data.<br />
The map type also stores width and height in an rectangle, to have an easy way to
check if a point lies within the boundaries of the map.<br />
Aditional methods so far:<br /><p><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;">hasCellInDir
(pPos:Point, iDir:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">uint</span>):Boolean<br />
getNextPos (pPos:Point, iDir:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">uint</span>):Point<br />
getSurroundingCells (pPos:Point, bUsed:Boolean <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">false</span>):Array</span></p><br />
To create a map (let's call it dungeon for the sake of easiness) I didn't include
the methods need to create a dungeon in the map class, instead I wrote a DungeonGenerator
class, that returns a filled map class. This way I can mess around with the creation
process without messing with the map class.<br /><br /><h3>Part 1 - part 3 - Let's start with a simple maze ...
</h3>
The most simple representation of a dungeon I can think of is a maze. Mazes are incredibly
easy to create and they work oh so well with cells.<br /><br />
The walkthrough to create a maze:<br /><font face="Courier New">1. create a map of "solid" cells<br />
2. pick a random solid cell as starting point<br />
3. get surrounding solid cells and pick a random one<br />
4. knock the walls between these cells, store the "old" cell in a stack for later
use<br />
5. use the cell picked in 3 as new starting point and start over<br />
6. if the current cell has no solid neighbours, pop one from the stack<br />
7. repeat until there are no more solid cells</font><br /><br />
Easy, eh?<br /><br /><p><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;">package
com.gamingyourway.Dungeon {<br />
    import de.drygoods.Random.MersenneTwister;<br />
    import flash.geom.Point;<br />
    <br />
    <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">/**<br />
     * Dungeon generator<br /></span></span><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">    
* @version 2009 06 24<br /></span></span><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">    
* @author nGFX</span></span><br /><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">    
*/</span><br />
    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">class</span> DungeonGenerator
{<br />
        <br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span> var
_Dungeon:Dungeon;<br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span> var
_rnd:MersenneTwister;<br />
        <br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
DungeonGenerator(iWidth:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span>,
iHeight:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span>)
{<br />
            <br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._Dungeon <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> Dungeon(iWidth,
iHeight);<br />
            <br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._rnd <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> MersenneTwister.getInstance();<br />
            <br />
        }<br />
        <br />
        <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> function
createMaze (iDirChange:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 100):Dungeon
{<br />
            <br />
            var aCellStack:Array <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> Array();<br />
            var aCellNeighbors:Array;<br />
            <br />
            var iTotalCells:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._Dungeon.iWidth <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">*</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._Dungeon.iHeight;<br />
            var iCellCount:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 1;<br />
            var iRndCell:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span>;<br />
            var iRndDir:<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span>;<br />
            <br />
            var pCurrentCell:Point <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> Point(<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._rnd.Range(0, <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._Dungeon.iWidth
-1), <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._rnd.Range(0, <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._Dungeon.iHeight
-1));<br />
            var pPopCell:Point;<br />
            <br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">while</span> (iCellCount
&lt; iTotalCells) {<br />
                <br />
                <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
get neighbor cells ...</span><br />
                aCellNeighbors <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._Dungeon.getSurroundingCells(pCurrentCell);<br />
                <br />
                <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
set the cell</span><br />
                <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (aCellNeighbors.length
!<span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0)
{<br />
                    <br />
                    iRndCell <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._rnd.Range(0,
(aCellNeighbors.length <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">-</span> 1));<br />
                    iRndDir <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> Dir.getDirFromPoint(pCurrentCell,
aCellNeighbors[iRndCell]);<br />
                    <br />
                    <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
remove walls</span><br />
                    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._Dungeon.cell(pCurrentCell).setWall
(iRndDir, 1);<br />
                    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._Dungeon.cell(aCellNeighbors[iRndCell]).setWall(Dir.getOppositeDir(iRndDir),
1);<br />
                    <br />
                    <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
store for later use ...</span><br />
                    aCellStack.push(<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> Point(pCurrentCell.x,
pCurrentCell.y));<br />
                    pCurrentCell <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> Point(aCellNeighbors[iRndCell].x,
aCellNeighbors[iRndCell].y);<br />
                    <br />
                    iCellCount++;<br />
                } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">else</span> {<br />
                    pPopCell <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> aCellStack.pop();<br />
                    pCurrentCell <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> Point(pPopCell.x,
pPopCell.y);<br />
                }<br />
                <br />
            } <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//
while</span><br />
            <br />
            <br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">this</span>._Dungeon;<br />
            <br />
        }<br />
        <br />
    }<br />
    <br />
}</span></p><br />
The code of the dungeon generator ... for now only with the maze creation in it.<br />
Note that the variable iDirChange is currently not used, but I'll go over it in the
2nd part of this article.<br /><br />
I think that is enough for today, you can see the result (and from the upcoming articles,
too) <a href="http://www.gywgames.com/_blog/dungeon/">Random Dynamic Level Creation
Test page</a> (or <a href="http://blog.gamingyourway.com/content/binary/dungeon/">here</a>).<br /><br />
See you next time when I add some direction modifications and take care of dead ends
...<br /><br />
nGFX<br /><br /><br /><p></p><img width="0" height="0" src="http://blog.gamingyourway.com/aggbug.ashx?id=238c0cda-9177-4b8d-89b4-2d1f9615a24d" /></body>
      <title>Random Dynamic Levels - Part 1</title>
      <guid isPermaLink="false">http://blog.gamingyourway.com/PermaLink,guid,238c0cda-9177-4b8d-89b4-2d1f9615a24d.aspx</guid>
      <link>http://blog.gamingyourway.com/2009/06/24/RandomDynamicLevelsPart1.aspx</link>
      <pubDate>Wed, 24 Jun 2009 15:02:34 GMT</pubDate>
      <description>After a good while of non-techy pimpings I decided to go the x++ route and describe the process of diving into a new game ...&lt;br&gt;
&lt;br&gt;
(CE is again on hold due to some gameplay issues I found during testplays - oh well)&lt;br&gt;
&lt;br&gt;
There is no name to the game yet, but I can say as much as it will feature random
dynamic level creation (as used in Diablo 1 for example), sci-fi themed, using RPG
elements and use Unity (though the levels created will look quite different to Diablo,
but the idea is the same).&lt;br&gt;
I want to have random levels because that would add to the replay value of the game.
I want a single game to last between 15 and 45 minutes. You should be able to start
playing and kill the end-boss in that time. After that you should be able just play
again, but with different set of maps ...&lt;br&gt;
&lt;br&gt;
But to get things rolling a lot quicker I wanted to rapid prototype my ideas using
flash/AS3 and then port it to c#.&lt;br&gt;
The reason for this is quite simple: output. In order to "see" what the level will
look like without having to worry about how to display them (ie. place 3d walls, create
the assets). With using flash i can just grab the data from the generator classes
and use the drawing api to quickly throw out a few lines to show the generated data.&lt;br&gt;
&lt;br&gt;
Let's dive straight in.&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;Part 1 - part 1: To cell or to tile ... and is there anything we need before that?
&lt;/h3&gt;
Before I started I thought that it would be nice to move between maps (in case you
thought you forgot something), to do so there needs to be a way to store the maps
... I thought of 2 methods:&lt;br&gt;
a) store all visited maps&lt;br&gt;
b) make them reproduceable&lt;br&gt;
&lt;br&gt;
I prefer the later one.&lt;br&gt;
&lt;br&gt;
So instead of using some built in random number generator I decided to use my "own"
that takes a seed and the produces the same set of random numbers when using that
seed - perfect.&lt;br&gt;
I found some old AS1 source of some older rnd gen that I could have ported but a quick
search showed that there are some more powerfull ones. After bit of research I decided
to go with the &lt;a href="http://en.wikipedia.org/wiki/Mersenne_Twister"&gt;Mersenne Twister&lt;/a&gt; algorithm.
As I was too lazy to see if there was an AS3 port, I wrote my own implementation,
though you could use any rnd method you want.&lt;br&gt;
&lt;br&gt;
The next one was a bit tricky: cell based or tile based?&lt;br&gt;
Tiles are easy to use and to handle, but they are limited to a single spot and mostly
do only have a single "state", ie. you can walk on them or not. This might be ok in
most cases but for what I have in mind they are too limited.&lt;br&gt;
&lt;br&gt;
A cell in my case is a tile with 4 walls (north, east, south and west), if all 4 walls
are set, the cell is "closed" ie. a solid rock in a clasical dungeon. The cell also
stors a single integer value (so based on it's useage I could store an index in it.&lt;br&gt;
Here is the code for the cell:&lt;br&gt;
&lt;p&gt;
&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;package
com.gamingyourway.Dungeon {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;/**&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Cell datatype&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @version 2009 06 24&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @author nGFX&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;class&lt;/span&gt; Cell
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;const&lt;/span&gt; WALL:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;const&lt;/span&gt; OPEN:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; var
_aWall:Array;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
array of values ... 0=empty ...&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; var
_iValue:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
stores a single value, ie. room num&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; var
_bVisited:Boolean;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
has cell been visited&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; var
_bCorridor:Boolean;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
is cell a corridor&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
get aWall ():Array { &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._aWall;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
set aWall (value:Array):&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;void&lt;/span&gt; { &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._aWall &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; value;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
get iValue ():&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; { &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._iValue;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
set iValue (value:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;):&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;void&lt;/span&gt; { &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._iValue &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; value;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
get bVisited ():Boolean { &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._bVisited;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
set bVisited (value:Boolean):&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;void&lt;/span&gt; { &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._bVisited &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; value;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
get bCorridor ():Boolean { &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._bCorridor;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
set bCorridor (value:Boolean):&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;void&lt;/span&gt; { &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._bCorridor &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; value;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
get wallCount ():&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var i:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;uint&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var iCount:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;for&lt;/span&gt; (i &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;
i &amp;lt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._aWall.length;
i++) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._aWall[i]
== 0) iCount++;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; iCount;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
get isDeadEnd ():Boolean { &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; (&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.wallCount
== 3); }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
get isUnused ():Boolean { &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; (&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;.wallCount
== 4); }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;/**&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Creates a new empty (ie. all walls
set) cells&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iValue&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;used
to stor a single bit of info, ie. room num&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
Cell (iValue:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0)
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._aWall &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; [0,
0, 0, 0];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._iValue &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; iValue;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._bVisited &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;false&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._bCorridor &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;false&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;/**&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * sets a single wall&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iDir&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Direction
of the wall&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iWall&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value
of the wall, 0 is a solid wall, any other value makes it "open"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
setWall (iDir:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;,
iWall:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0):&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;void&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._aWall[iDir] &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; iWall;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;/**&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * return the value if the wall in
iDIr&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iDir&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;direction
of the wall to get&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value
of the wall&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
getWall (iDir:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;):&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;uint&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._aWall[iDir];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;/**&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * shortcut for testing if there is
a closed wall in iDir&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iDir&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;direction
to test&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;true
if there is a wall&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
hasWall (iDir:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;):Boolean
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; (&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._aWall[iDir]
== 0);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;/**&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * if the cell is a dead end, return
the direction of the opening&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;the
direction of the opening&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
getDeadEndDir ():&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var iReturn:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; -1; &lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
not a dead end&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (isDeadEnd)
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._aWall[Dir.NORTH]
!&lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0)
iReturn &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; Dir.NORTH;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._aWall[Dir.EAST]
!&lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0)
iReturn &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; Dir.EAST;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._aWall[Dir.SOUTH]
!&lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0)
iReturn &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; Dir.SOUTH;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._aWall[Dir.WEST]
!&lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0)
iReturn &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; Dir.WEST;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; iReturn;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;/**&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * returns a string representation
of the cell&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @return&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a
string for the falls of this cell&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
toString ():String {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var i:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;uint&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var strReturn:String &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;"&gt;""&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;for&lt;/span&gt; (i &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;
i &amp;lt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._aWall.length;
i++) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strReturn
+= &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._aWall[i].toString();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; strReturn;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;br&gt;
&lt;h3&gt;Part 1 - part 2 - Storage and creation
&lt;/h3&gt;
To store the maps generated I wrote a simple Mapa datatype, it'll store a 2d array
of cells along with some very basic methods to deal with the data.&lt;br&gt;
The map type also stores width and height in an rectangle, to have an easy way to
check if a point lies within the boundaries of the map.&lt;br&gt;
Aditional methods so far:&lt;br&gt;
&lt;p&gt;
&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;hasCellInDir
(pPos:Point, iDir:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;uint&lt;/span&gt;):Boolean&lt;br&gt;
getNextPos (pPos:Point, iDir:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;uint&lt;/span&gt;):Point&lt;br&gt;
getSurroundingCells (pPos:Point, bUsed:Boolean &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;false&lt;/span&gt;):Array&lt;/span&gt;
&lt;/p&gt;
&lt;br&gt;
To create a map (let's call it dungeon for the sake of easiness) I didn't include
the methods need to create a dungeon in the map class, instead I wrote a DungeonGenerator
class, that returns a filled map class. This way I can mess around with the creation
process without messing with the map class.&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;Part 1 - part 3 - Let's start with a simple maze ...
&lt;/h3&gt;
The most simple representation of a dungeon I can think of is a maze. Mazes are incredibly
easy to create and they work oh so well with cells.&lt;br&gt;
&lt;br&gt;
The walkthrough to create a maze:&lt;br&gt;
&lt;font face="Courier New"&gt;1. create a map of "solid" cells&lt;br&gt;
2. pick a random solid cell as starting point&lt;br&gt;
3. get surrounding solid cells and pick a random one&lt;br&gt;
4. knock the walls between these cells, store the "old" cell in a stack for later
use&lt;br&gt;
5. use the cell picked in 3 as new starting point and start over&lt;br&gt;
6. if the current cell has no solid neighbours, pop one from the stack&lt;br&gt;
7. repeat until there are no more solid cells&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
Easy, eh?&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;package
com.gamingyourway.Dungeon {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;import de.drygoods.Random.MersenneTwister;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;import flash.geom.Point;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;/**&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Dungeon generator&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
* @version 2009 06 24&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
* @author nGFX&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
*/&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;class&lt;/span&gt; DungeonGenerator
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; var
_Dungeon:Dungeon;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; var
_rnd:MersenneTwister;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
DungeonGenerator(iWidth:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;,
iHeight:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;)
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._Dungeon &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; Dungeon(iWidth,
iHeight);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._rnd &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; MersenneTwister.getInstance();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; function
createMaze (iDirChange:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 100):Dungeon
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var aCellStack:Array &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; Array();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var aCellNeighbors:Array;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var iTotalCells:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._Dungeon.iWidth &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;*&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._Dungeon.iHeight;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var iCellCount:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var iRndCell:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var iRndDir:&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var pCurrentCell:Point &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; Point(&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._rnd.Range(0, &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._Dungeon.iWidth
-1), &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._rnd.Range(0, &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._Dungeon.iHeight
-1));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var pPopCell:Point;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;while&lt;/span&gt; (iCellCount
&amp;lt; iTotalCells) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
get neighbor cells ...&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCellNeighbors &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._Dungeon.getSurroundingCells(pCurrentCell);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
set the cell&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;if&lt;/span&gt; (aCellNeighbors.length
!&lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0)
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iRndCell &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._rnd.Range(0,
(aCellNeighbors.length &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;-&lt;/span&gt; 1));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iRndDir &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; Dir.getDirFromPoint(pCurrentCell,
aCellNeighbors[iRndCell]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
remove walls&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._Dungeon.cell(pCurrentCell).setWall
(iRndDir, 1);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._Dungeon.cell(aCellNeighbors[iRndCell]).setWall(Dir.getOppositeDir(iRndDir),
1);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
store for later use ...&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aCellStack.push(&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; Point(pCurrentCell.x,
pCurrentCell.y));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pCurrentCell &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; Point(aCellNeighbors[iRndCell].x,
aCellNeighbors[iRndCell].y);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iCellCount++;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;else&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pPopCell &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; aCellStack.pop();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pCurrentCell &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; Point(pPopCell.x,
pPopCell.y);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;//
while&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;return&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;this&lt;/span&gt;._Dungeon;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;br&gt;
The code of the dungeon generator ... for now only with the maze creation in it.&lt;br&gt;
Note that the variable iDirChange is currently not used, but I'll go over it in the
2nd part of this article.&lt;br&gt;
&lt;br&gt;
I think that is enough for today, you can see the result (and from the upcoming articles,
too) &lt;a href="http://www.gywgames.com/_blog/dungeon/"&gt;Random Dynamic Level Creation
Test page&lt;/a&gt; (or &lt;a href="http://blog.gamingyourway.com/content/binary/dungeon/"&gt;here&lt;/a&gt;).&lt;br&gt;
&lt;br&gt;
See you next time when I add some direction modifications and take care of dead ends
...&lt;br&gt;
&lt;br&gt;
nGFX&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.gamingyourway.com/aggbug.ashx?id=238c0cda-9177-4b8d-89b4-2d1f9615a24d" /&gt;</description>
      <comments>http://blog.gamingyourway.com/CommentView,guid,238c0cda-9177-4b8d-89b4-2d1f9615a24d.aspx</comments>
      <category>coding ideas</category>
      <category>Dungeon Creation</category>
      <category>experiments</category>
      <category>game development</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>