Jump to content

Dragon's Descent - Roguelite/Action game


Recommended Posts

Direct your dragon through a sprawling labyrinth, hunting for treasure, power, and danger!  
Dragon's Descent is currently part of the Holiday Homebrew High Score Competition - here is a ROM you can use for the contest: DragonsDescent_Holiday_2019.bin
Instructions on how to play below...
-Thousands of possible maps to explore, either randomly selected or predetermined
-Eight different types of enemies
-One mid boss, one final boss, one hidden boss
-Powerups to increase firepower or health as you delve deeper into the labyrinth
...and an easter egg or two, of course!
Here's a video of the first three levels, up to the midboss. The default mode has four more levels ending with the final boss, and other modes allow potentially thousands of different levels!
This game is, among other things, an experiment in procedural maze generation for the Atari 2600 - There are a few secrets to find, so I won't reveal everything here, but I will give a basic outline of the controls and mechanics.


I posted little write up of how I generated the mazes, and programmed the game in general. Many thanks to those on this board who have posted an incredible amount of useful information, as well as those who have authored the kernels and other components on which this game has been programmed.





Legends speak of a labyrinth created by the mind of a dreaming elder dragon. This maze is filled with the promise of wealth, power and danger-an endless length of corridors, with spectres and monsters appearing out of thin air, and strange happenings occurring the deeper one travels and survives. You are a young dragon yourself, perhaps trapped here, perhaps tempted by the wealth and power that drives your kind. Regardless, you have little choice but to find your way through the corridors and chambers of the labyrinth, finding glory, or perhaps escape...





Joystick - Move the dragon around the labyrinth.
Button - The dragon will breathe fire in the direction it is facing.

Left Difficulty A - Game will continue indefinitely, only ending with a game over.
Left Difficulty B - Game will end after you complete level 7
Right Difficulty A - You will start in a randomized maze.
Right Difficulty B - Maze will be the same layout each playthrough.
Game Select (Make sure right difficulty is also set to "B") - Will allow you to set the random "seed" when starting the maze. Move the joystick left/right to select the left or right seed, each can be set to a value between 1 and 255.

The title screen will reflect what options the game is set to - an infinity symbol for an unending maze, and an alternating maze pattern for random mazes.



Depending on your game settings, you may find an end to the maze on the 7th level, or the maze can continue until you are defeated, trying to attain the highest score!

A - The Player
B - Dragonfire
C - Monster
D - Firepower Meter
E - Score
F - Health Meter
G - Room exit

Each level of the maze is made up of several rooms - you can leave through any exit on the boundaries of the screen you find.

To make progress in the maze, find the key on each level, and then the level's exit. The exit, resembling a door with a key imprint, will only activate if you touch it while you have the key found on the same level. Upon each new level you will face more dangers but also potentially increased power and scoring!







Avoid touching walls and enemies - doing so will deplete your hit points, and eventually terminate your game!

Scoring comes from collecting gems and defeating monsters. You get more points for defeating monsters in deeper levels, and a slightly higher score for each shot you use with higher fire breath power.

In addition to a key and exit, each level of the labyrinth has a treasure room:




This room allows you to pick one of three power ups, just wait until you see the one you want:



Gem - increases your score.



Heart - increases your total hit points, while completely replenishing your health.


Lamp - increases the strength of your fire breath, while refilling its supply.

Don't stay too long on a single level, or you may find things getting much more difficult! The deeper you explore, the more monsters, dangers, and higher scores you find...

Your hit points are indicated by meter on the right, as well as the color of the dragon.

The strength of your fire breath is indicated by the color of your score, as well as the size the fire itself. If your firepower ever increased, you only have a limited amount you must replenish somehow - this amount is indicated by the meter on the left. If it ever runs out, you will go back your initial, weakened fire breath.

You can find non-flashing hearts and lamps from fallen enemies, which will replenish a small part of your hit points or fire breath, respectively.

If you survive long enough, you may reach a maximum amount of hit points or firepower, in which case your health meters or score will be flashing.




Defeating Enemies:


Fiery Eye - 5 points
Medusae - 10 points
Dragon Head Sentry - 10 points
Teleporting Masque - 20 points
Janus Guardian - 25 points
Ghost - 20 points
Dragon - 25 points

Shadow - just 1 point base, if you can even manage it. Getting rid of it might be reward enough, though...


Revenant Dragon (Midboss) - 500 points
Elder Dragon (Boss) - 1000 points
Jeweled Dragon (a hidden beast) - 2000 points


Collecting a gemstone in a treasure room will get you 500 points.

Your strength of your firepower is also added to your score whenever you hit an enemy with your fire breath, so you can gain 1-6 points for every hit even if an enemy is not defeated.

Defeating enemies on lower levels adds further bonuses:

Level 2 - 1 point
Level 3 - 2 points
Level 4 - 3 points
Level 5 - 4 points
Level 6 - 5 points
Level 7 - 10 points
Level 8+ - 15 points



-Find a balance between increasing your hit points and increasing your firepower - each level gives you the opportunity to do one or the other.
-Gems give you large amounts of points, but your forgo an increase of power for that level - they're for those brave or foolish enough to think they can survive regardless.
-The beginner mode always gives you the same maze, be sure you become familiar with the game before tackling the random mazes offered by the advanced mode.
-Each enemy has a specific type of behavior, learn all of them-and learn how to counter them!
-Time can be your enemy, but remember that you don't have to fight everything - pick your battles!
-Despite the enticement to hurry, be patient and careful! Most situations can be escaped with a little bit of caution and forethought, and impatience has ended more games than the cruellest monster.



There are many secrets to discover within the labyrinth, so I won't tell you everything here!



Older builds:
Another change to the door graphic - the door should be flashing with a key symbol.
This older build has a changed the graphic for the exit.  I even squeezed a few more bytes out so that it has "closed" and "open" graphics, depending on whether you have a key.  I'm hoping this is close to the final version, so any feedback on how it plays is appreciated!
I've added four separate high scores, one for each "mode" - they should show up when you have the appropriate switches/settings applied on the title screen. I think it works properly (with caveats, for instance you can fool it by using the switches mid-game) but I would appreciate feedback! I also added an easter egg bug fix:
DragonsDescent_3_22_2019_Beta8.bin 3-22-2019 Another update - found a semi-exploit (really just method of scoring late game that results in boring gameplay) and adjusted things to discourage the behavior.
DragonsDescent_3_19_2019_Beta7.bin 3-20-2019 Another update - no better method to find a bug or quirk in a project than to claim it's finished! The method to reach the hidden boss, while functional, had some odd loopholes and inconsistencies that I wanted to close. Fixed a thematic inconsistency involved with getting to the hidden bonus boss.
DragonsDescent_3_5_2019_Beta6.bin - Font change and a few other tiny adjustments.
DragonsDescent_1_10_2019_Beta5.bin - Retry random maze option (press up or down on the Game Over screen to see the "Retry Maze" screen, press button to start again), starting rooms have no enemies, score placement adjusted.
DragonsDescent_12_16_2018_Beta4.bin - Maze generation fix, random seed shown when picking random level, other small fixes
I might go into more details about what I did to fix the maze generation later - the short answer is that every seed -seems- to work now, without the hacky checker I had in earlier versions. I also added a -little- more time solve a given level before various "complications" arise. It can still be a little mean.
I'm keeping an informal version history even as I remove the older versions - I can repost them if folks clamor for the older versions, but hopefully the bugs present in them have been addressed.
3-5-2019 - Changed to a custom font. Semi-final build.
12-16-2018 - Current public version. All attempted maps seem to be solvable, certain UI color cycling adjusted.

12-15-2018 - Tentative "fixed" beta for random mazes

This version has a band-aid for the random mode bug - I'm keeping it here for the moment in case the above version has some unforseen bug or error.

12-14-2018 - Old version, only play the default mode (Left/Right switches set to "B") on this one.

I've tentatively tested it on my ol' sixer as well as the Flashback Portable, and the game seems to run ok, although I would welcome any bugs/issues found if anyone else plays. I'm curious to see what people find!



-You can now retry a randomly generated maze by pressing up or down on the Game Over screen - when you see words "Retry Maze," press the button to restart the game at your old starting point.

-Starting rooms on a level no longer generate enemies, giving you some time to breathe or get used to the controls.

-Hopefully the level generation bug is fixed - any random seed should generate a solvable level. When choosing a random level, you will be shown the seed in case you want to try the level again.

-I also fixed a flashing problem to a more pleasant "pulsing" effect for max health/fire breath.



Edited by Revontuli
  • Like 22
Link to comment
Share on other sites

Looks awesome Revontuli! We'll be playing Dragon's Descent LIVE on the ZeroPage Homebrew Twitch stream on December 28 at 12PM PT/3PM ET. Hope you can make it to watch us play it on the show, if not it'll be posted to our YouTube archive the next day.


Twitch Livestream Channel: https://twitch.tv/zeropagehomebrew


EDIT: Updated to video of episode




Direct your dragon through a sprawling labyrinth, hunting for treasure, power, and danger!


Edited by cimmerian
  • Like 3
Link to comment
Share on other sites

Post with a small update and responses...


Looks awesome Revontuli! We'll be playing Dragon's Descent LIVE on the ZeroPage Homebrew Twitch stream on December 28 at 6PM PT/9PM ET.


Awesome, thank you! I'll try and be catch the stream! Let me know if you have any questions, this game is brand new so I'm still seeing how it plays.


You might want to have the game check where the player is so an enemy won't spawn too close to the player.


This is partially by design :evil: but I'll see how players handle it - you have a bit of warning to get out of the way, and if you're bold you can run through them before they're done materializing - I've dashed through quite a few rooms like this! Enemies only spawn near the walls in the 4 cardinal directions, so there is some strategy to get into the room quickly and anticipate where the enemy might appear, or maneuver and attack quickly if you're about to be ambushed.


I'll also admit I'm very nearly out of ROM in the banks I'm devoting to the game loop and graphics, and adding in a few more checks for enemy positioning would be harder than it sounds, but part of the design is to keep the player moving. Enemy spawning ends up being just one of the ways to keep the player on their toes and encouraging them to find the exit quickly - there are others as well.


As for the maze generation bug, the quick fix I made still seems to be the best one. I thought I found two or three causes for the problem, and..."fixing" them made the problem worse. Part of the issue is that I use bit-shifting as part of the maze generation process, and that's a little tricky to use in Basic. If anyone stumbles on a crash, or a maze that they're absolutely certain they can't solve (i.e. no key or exit to find) please let me know. I'm working on a more detailed explanation of my process in a future post, but in theory the mazes should all be solvable (I place and connect the rooms explicitly). That said, I literally found my first "broken" maze minutes after posting, after playing dozens of levels over the last few weeks.

Edited by Revontuli
  • Like 2
Link to comment
Share on other sites

You've got a pretty good writeup of the game in the top post but if there's anything additional you'd like me to mention about the game during the stream, just let me know! :-)


We love trying out new games in progress and give feedback to the developer on how it plays! :-)


Awesome, thank you! I'll try and be catch the stream! Let me know if you have any questions, this game is brand new so I'm still seeing how it plays.


Link to comment
Share on other sites

This is a pretty cool game! I like the movement, and how there is some momentum so that it really does feel like you are flying instead of walking.


The flashing score is very annoying and distracting, though. I'm sure RT will be along with a related link before too long, but it will be distracting for some, and make it completely unplayable for others.

Link to comment
Share on other sites

On 12/17/2018 at 8:26 AM, Karl G said:

The flashing score is very annoying and distracting, though. I'm sure RT will be along with a related link before too long, but it will be distracting for some, and make it completely unplayable for others.


Hm...one problem with testing the late game on an emulator (and an iffy monitor) - I thought I only shifted the color a little bit. It's also one of the last features I put in. I'll tone it down/take it out in the next version.


[EDIT] OK, that was an overlooked typo/bug - the flashing score is changed to a hopefully more pleasant "pulsing" when you max out on fire breath or health, which was the plan in the first place. Let me know if it's still an issue, but it's not the nasty strobe that I had earlier.


I also uploaded the latest version - The random maze generation should be more stable now, with any level being solvable. I also show the player the random seed when they choose a random level, so they can find it again using the Select mode. I also added a few other adjustments to the post Level-7 experience that I swore were in there earlier but somehow weren't added to my latest source code.


Thanks to everyone for their feedback so far, let me know how this latest version works!


[2ND EDIT] A hastily made screenshot map of level 001-001, the maze you play if you start with the default settings:




Edited by Revontuli
Link to comment
Share on other sites

  • 2 weeks later...
  • 2 weeks later...

We had a ton of fun playing Dragon's Descent on ZeroPage Homebrew yesterday, thank so much for making it Revontuli!


It was great to see people playing it! I'm doing a few adjustments based on what I saw and comments made - the next build of the game I post will include a fast way to quickly restart a randomly generated maze, from the Game Over screen.


Folks were wondering about the starting difficulty being a little too tough - I might modify the difficulty, but for the moment I'm keeping the player starting at 2 hit points. If you play the basic mode, the first power up is only two screens away, and you can boost yourself to 3 hit points (or increase your firepower) there. The random maze selection is a more advanced mode, when a player has mastered the basics and is ready for whatever the game might throw at them. "Roguelike" can mean a whole lot of different things, but in this context I tend to think of their difficulty requiring an 80's music montage - each time you play you get a little better, you learn a little more, and you finally get past obstacles that once seemed unfair or impossible. Upbeat pop music track optional but recommended. The ZeroPage stream got to the midboss after a few tries, which seemed like a good pace. I wanted to make this game potentially last more than an afternoon, with a few possible ways/strategies to play.

From the comments above it seems at least a few people have gotten pretty far - I'm curious if anyone has found some of the hidden stuff, or if they recognize it as "hidden" (some secrets can be easy to find by accident!) Anyone get to/past level 7? What kind of scores are people getting?

I also posted some of how the maze generation system works on my developer blog.

  • Like 3
Link to comment
Share on other sites

I posted an updated build to the original post (1_10_2019 is the date on the binary).


The latest build has a few little interface fixes, taking into account observations/feedback I've had of people playing:

-You can now restart a randomly chosen maze by pressing up or down from the Game Over screen, and then pressing the button when you see the "Retry Maze" screen. This saves a lot of time over have to re-input the seed number in the title screen.
-The starting room on each level does not spawn enemies, giving you a little bit of a breather, and makes the very beginning a little less intense.
-Health meter moved slightly to the right, making the meters and score a little more centered.
-Shifted the colors on the title screen/score to have a little more consistency.

As usual, let me know if you find any bugs/issues, I'm at the point in the project where it can be hard to add/fix something without breaking something else! That's also why I'm keeping the older build posted a bit longer, if one doesn't work the other hopefully should.


I'm playing with the idea of getting this onto a physical cartridge, after some more testing to make sure everything works. Quick fixes can be dangerous at this point, so I like to make sure a build can survive in the wild before doing further adjustments.

  • Like 3
Link to comment
Share on other sites

  • 1 month later...

I posted a new build (see original post) - the main change being a new font. I mean this to be a semi-final build, with no new features, but still a little bug-testing to do. The best was to find bugs is to declare a game "finished," after all. It's also hard to patch a cartridge.


It was great for Dragon's Descent to be nominated for the 2018 Atari Awards! It was also a little humbling to see the other nominations - but inspiring to see what can be done with clever coding and design. Thanks to everyone who tried the game!

  • Like 2
Link to comment
Share on other sites

  • 2 weeks later...

Another update - see original post! The method to reach the hidden boss, while functional, had some odd loopholes and inconsistencies that I wanted to close. I'm curious if anyone has found the hidden boss (aka the "Jeweled Dragon") so far...


I've also been drafting a more complete instruction manual as well, which I might post - it should clarify things like scoring and even give some strategy hints.


There's no better method to find a bug or quirk in a project than to claim it's finished!

Link to comment
Share on other sites

Another quick update - I'm possibly looking to do a high score competition, and with that in mind I did a few minor adjustments to scoring in anticipation of late-game strategies and behavior. I realized that "Shadow farming" could become a thing, which I kinda want to discourage in favor of further exploration and level descent. To that end, I reduced the score for destroying the Shadow from very high to not much at all. That said, figuring out the method and being able to destroy the Shadow at all might be reward enough, especially if you're in a darkened maze and still trying to find the exit.

  • Like 1
Link to comment
Share on other sites

High Score Contest!


I posted an informal high score contest in the HSC forum:



I'm curious to see what kinds of scores folks might get, as well as see if any exploits or odd strategies arise. This is also informing how I'll do things like refine the written instructions, and other adjustments I'd need to make.


The build to use is here:



No real deadline, although I'll plan on integrating anything I learn after a few weeks. I'd kind of like a final build ready for the summer.

Edited by Revontuli
  • Like 1
Link to comment
Share on other sites

  • 2 months later...

I added support for 4 high scores - one for each "mode" (default/infinite/random/infinitely random) that should appear on the title screen depending on what difficulty switches you're currently using. Barring any bugs folks might find, consider this a "final beta." I had a tiny bit of ROM space left, as well some of the SuperChip "special" write/read RAM. Even so, I probably would not have thought to include this feature, but I was inspired from me looking at how to keep track of high scores in the 7800 version I'm working on.


In other news, I've also just released a 7800 version of Dragon's Descent! Check it out here: http://atariage.com/forums/topic/291525-dragons-descent-actionroguelike-for-the-7800-ported-from-the-2600/



  • Like 1
Link to comment
Share on other sites

New build here: DragonsDescent_2019_June_16a.bin


I freed enough bytes to check for enemy spawning/player overlap, so that should be a little more fair.  The Masque still does it (that's kind of its thing) but that's a later game encounter.


I'll try and post any updates to the original post once the post-forum transition settles down - for now folks will need to look at the most recent posts.

  • Like 3
Link to comment
Share on other sites

9 hours ago, Philsan said:

Very nice!

Did you think about batariBasic DPC+ kernel? You could have enhanced graphics.

Regarding highscore saving, you could use AtariVox+ (for 7800 version of your game too).


Thank you! 


While the DPC+ is really cool, this game doesn't really play to its strengths (and vice versa) - I use a lot of RAM/ROM space to do calculations on the playfield and maze layout that the DPC+ uses for extra colors, sprites, and other graphical stuff, and I imagine I'd be hitting the cycle limit much sooner with the way it's structured.


I am aiming to have Savekey/AtariVox support for the 7800 version (I don't have either at the moment, but some others have testing it and it seems to be working so far...) - In the case of the 7800Basic it's directly supported, and pretty straightforward to integrate.  I'm not sure about adding it to the 2600 (although I'm taking a look at what would be involved), as I'm very close to the cycle, ROM and RAM limits already, and structurally the game is already fairly optimized and mature (i.e. hard to add stuff to).

  • Like 3
Link to comment
Share on other sites

  • 4 weeks later...
  • 5 weeks later...
On 8/12/2019 at 7:10 PM, Karl G said:

I thought I'd try my hand at an 8x8 keyhole.  I suppose mine looks more like a chess pawn, though.  ? 

I had some chess pawns mixed in with my tombstones and bread as well :) 


Warning, a minor design digression incoming, I've had some feedback/criticism from a few different places, and this has strangely been one of my few graphical stumbling blocks in the project.  Since this involves how the game communicates a core mechanic, and since I love low-res pixel art, I'll go through my thought process in more detail than you might think a door/key dynamic would need at this level...


The sprite can't even really be just a keyhole.  It's even harder since it really needs to be a door PLUS a keyhole-probably a 4x4-6x6 keyhole with a box around it.  It needs be be iconic, in the sense that it's 1) recognizable as a lock/door and 2) can't be easily mistaken for something else.  7x7 pixels might actually be easier in terms of design, since you have a proper central pixel and axes, but that also makes the whole thing a little off center and thin-looking compared to most of the other graphics.  


Really, here are the priorities, in order:


1. Needs to read as "door/exit/thing to grab with the right conditions"

2. Communicate "I'm locked/I need a key" vs. "You have a key, I'm open now"

3. Maybe look nice?  At this graphical resolution being understood often better than being admired.  I'm mean, it's best to be both, but...the more detailed/unique it gets, the more likely it looks like something else.


This also needs to take into account that it has to be a monochromatic 8x8 sprite.  Due to reasons of sprite layering/missile colors, the door also needs to be the same color as the player.


Here are a few other variants I'm trying, including a change on the original "inverted key door" ( gallery_64916_2201_15383.png )which -might- be interpreted as a missing slot for the existing key sprite gallery_64916_2201_2400.png



The reason I wanted to change the graphic in the first place was to avoid confusion, but I want people to "read" the sprites as doorways/exits, or at least something to grab.  The "bread" door is a little dull, but is least likely to be misinterpreted.  One reason I didn't go with it originally is that it's missing a "key goes here!" communication in the design, and I'm only considering it now because I made room for an "open door" sprite.


I'd welcome feedback in terms of how people read the graphics above.  Do the other sprites read as doorways with stairs or passages behind them?  Any preferences?



Edited by Revontuli
Link to comment
Share on other sites

I actually had a bit of trouble creating a locked door sprite for Deepstone Catacomb as well. I ended up going with just a white block with a pawn chess piece.


Sometime after finishing the game, I started playing this game on my C64 that I use to play as a kid, called Wizard (Attatched Screenshot). C64 has 8x8 limit as well. I noticed that the locked door sprite was the exact sprite I made for my game. So I feel like we both have stumbled upon an age old problem.


that being said, out of what you came up with, I think the most recognizable one as a locked door is the forth one.



  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Create New...