Skip to main content

On Sale: GamesAssetsToolsTabletopComics
Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

GB/X - Old School–ish Dungeon Crawling for the Game Boy

A topic by Trystan Goetze created Jul 06, 2022 Views: 479 Replies: 15
Viewing posts 1 to 12
Submitted (1 edit) (+3)

What I'm trying to do: My main goal is a proof-of-concept or minimum viable product. I'm trying to make a dungeon crawling game with mechanics loosely based on the Basic/Expert edition of D&D from 1981. There won't be any AI scripting; all monsters and non-player characters will react solely based on how the player chooses to interact with them and randomizers tied to the player character's attributes. I'm gonna try to implement four character classes for this jam (fighter, thief, cleric, and wizard), with a way to roll ability scores and to choose your character's gender, but I'll be satisfied with just one character class. There won't be an experience/levelling system in this iteration but I'll aim to implement that in the future. The dungeon for this proof-of-concept is going to be pretty linear and short, just to get the main features set up: monsters/NPCs, ability checks, traps, and treasure. Everything is going to be made in GB Studio, a game engine designed for creating games that are compatible with the original Game Boy and Game Boy Color, but the jam version will be published as an in-browser game. [Edit to add: I'm also using Tiled to lay out the screens, and Affinity Photo to edit sprites.]

Where I'm starting: I'm starting this jam with some ideas on how to implement the mechanics and a collection of pixel art assets that are either set up for the Game Boy Color's constraints (three colours + transparent colour for sprites, four colours for backgrounds). Most of these I've found here on Itch; I just found this lovely trove of public domain sprites from an old roguelike project—they have to be edited to fit the colour limitations, but they're all really cool. I have some knowledge of how GB Studio works from noodling around on some unfinished projects and Robert Doman's tutorials.

Here's the first room of the dungeon, featuring the she/her fighter, a quirky merchant, and some ominous foreshadowing.

GBX Room 1

A screenshot from a game in development in GB Studio. The window title is "GBX". Four-colour pixel graphics depict a square dungeon room with checkered tiles for a floor and stone brick walls. At the bottom of the image, a female fighter with a horned helmet stands near the entrance to the room, which is a gap between two pillars; light shines in from outside. Flanking the entrance are four statues of warriors in armour with swords and shields. In the top right is a cordoned-off area with a bed, a treasure chest, and a sword and shield hanging on the wall. In front of this area is a woman. In the top left there are six gravestones rising from broken tiles; a shovel is in the ground nearby. At the top, directly opposite the entrance to the room, is a door; banners with skulls on them are hanging on the wall to either side of the door.
Submitted(+2)

Update: Today I produced a title screen and finalized how the ability score generation will work. Character classes and genders can be chosen. Most of the player character sprites I got from here, but I had to make some edits to include a nonbinary sprite for each class. I've also got a first pass at the core mechanic: When the player is prompted to choose an action, the game generates a number between 1 and 20 and compares it to the ability score or skill score used. If the result is lower than the score, they succeed; either way, the game will tell them what happens to their character. These prompts only occur at a few pre-scripted events (interacting with a monster, being offered the option to jump across a chasm, etc.).

Next steps: Creating a menu system in GB Studio is a headache, as I've learned from building the character creation screens. I have to make a few more of these for the pause menus, where the player can view their skills, equipment, and treasure collected. You can see an early version of the skills menu in the video; still some bugs to fix. After that, I have a small dungeon to map out and stock with monsters and traps. I'm also thinking about how I might contrive the "heal" theme into the game, beyond the cleric class (which likely won't even be fully implemented by the end of the jam).

Submitted(+2)

This is looking really good! I haven't played many games in the retro kinda style, but this looks really interesting and I'll be waiting for the finished product :D (No pressure though)

Host(+2)

This is awesome--really love too that you shared where you got your resources and what you did with them to make them work for the project. Feels very "steal like an artist"--and it's so resourceful and creative for a game jam! Excited to see more!

Submitted (1 edit) (+2)

Update

Being on vacation is good for making progress. I've mapped out a very simple dungeon, with these tilesets:

Here are some GIFs of the character options, made with MacOS's Screenshot app and gifify:

Fighter

Thief


Cleric


Wizard


These are all edits of these sprites, which are themselves derived from these. (And I'm just noticing that the he/him wizard's hairline changes length in one frame—something to fix when I'm done here.)

It's a bit tricky to implement a character choice like this in GB Studio, because there isn't a way to change the default player sprite after the game is compiled. (Unless there's a function in the engine code, but I'm not touching that, for now.) So every scene has a script that runs on initialization to pick the right sprite sheet. Works fine so long as I remember to copy-paste the script into every scene.

Next Steps

I have some ideas for monsters to include. I'm converting these neat public domain sprites from an old roguelike project. I likely won't be able to add too many for the jam project, since it's a lot of scripting: I want the player to be able to choose between fighting, sneaking, and using social skills (frighten, befriend, and trick) to successfully complete encounters with monsters. It's so much easier, technically speaking, to make a violence simulator—which makes me think about how the affordances of the computing systems we use are value-laden, but that's a story for another time.

Submitted (1 edit) (+2)

D&D fan here, I really love the concept. Looking forward to the final result! Question, are you going to show the check results on screen when the player attacks or interacts with something?

Submitted(+2)

I definitely could! It would probably only add a line to each post-interaction dialog box. Something like this:

> A goblin jumps out of the vase and sneers at you!
> What do you do?
   Attack {Strength}
   Frighten {Charisma}
   Befriend {Charisma}
   Trick {Charisma}
   Escape {Dexterity}
> Befriend
> You offer the goblin a small snack from your satchel. They cautiously accept and begin nibbling.
> {Roll: 12 vs. 16 -- Success!}
> The goblin yips with joy and tugs your arm towards the vase.
   Inside, you see a cache of gemstones worth 50 G.
   When you turn to thank the goblin, they are gone.

The results would be a little odd-looking to people familiar with 3e and later editions, though, since I'm using the roll-under-ability-score mechanic from Basic/Expert D&D, instead of the roll-over-difficulty-class mechanic from modern D&D.

Submitted(+2)

nice, looks great! yeah probably could lead to some confusion the roll-under the skill. But if you put it clearly at the beginning it shouldn't be a problem I think. Can´t wait to play your game!

Submitted(+1)

This slaps like a goblin with a drumset.  I'm keenly interested in seeing where this goes.

Submitted(+1)

You're so right about the ease of making a violence simulator (I'm guilty of that in this jam haha) and this project reminds me of the games of yore. I immensely look forward to checking this one out. 

Submitted

Update

I'm starting to reach the point where the visual programming interface of GB Studio is becoming a hindrance. Scripting interactions with monsters involves some complex conditionals, which I find hard to read when they aren't in text.

A screenshot from GB Studio. The portion of the screen shown is in the scripting sidebar, which shows a snippet of a script that is five layers deep into a nested conditional. Statements that are visible include calling a script called "RollUnder", which rolls a d20 and checks to see if the result is less than a target number, a statement decrementing the character's hit points, and a dialog box displaying speech from a goblin.

So I decided to step back and write out the first of these in pseudocode, which helped a lot with planning the control flow:

ON Trigger.ENTER {
If GOBLIN_COMPLETE is False {
    If GoblinActive is False {
        Display "The goblin is asleep… Try to sneak past? {Stealth}"
        Display.Choice Set Temp0 {
            True : "Yes"
            False : "No"
        }
        If Temp0 is True {
            Call RollUnder(Temp0, PC_Stealth, Temp1)
            If Temp1 is True {
                Display "{Stealth: $Temp0} Success!"
                Scene.change(D1_R2, 16, 9)
                Stop
            }
            Else {
                Display "{Stealth: $Temp0} Failure!"
                Goblin.StopOnUpdate
                Goblin.Emote(Shock)
                Display(avatar=Goblin) "Zzz--wha? Whozzat?"
                Goblin.Move(5,9)
                Display "The goblin approaches!"
                GoblinActive = True
            }
    }
    Loop {
        If Goblin_HP <= 0 {
            Stop
        }
        Else If GoblinComplete is True {
            Stop
        }
        Else If PC_HP <= 0 {
            Display "You collapse from exhaustion and injury!"
            Call PCdead
            Stop
        }
        Else {
            Display "What do you do?"
            Display.Menu Set GoblinWhatDo {
                Attack:1,
                Scare:2,
                Friend:3, 
                Trick:4,                 Escape:0             }         }         If GoblinWhatDo == 1 { \\Attack             Call RollUnder(Temp0, PC_Attack, Temp1)             If Temp1 is True {                 Display "{Attack: $Temp0} Success!"                 Goblin_HP = Goblin_HP - PC_Damage - Equip_Damage                 Display "You strike at the goblin with your weapon!"                 Display(avatar=Goblin) "Arrgh!"             }             Else {                 Display "Attack $Temp1 Failure!"                 Call RollUnder(Temp0, PC_Armour, Temp1)                 Display "The goblin counterattacks!"                 If Temp1 is True {                     Display "You evade damage!"                 }                 Else {                     PC_hp -= 1                     Display "The goblin hits! (1 Damage)"                 }             }         }         Else If GoblinWhatdo == 2 { \\Scare             If GoblinScared == 2 {                 Display "The goblin isn't afraid of you."             }             Else {                 Call RollUnder(Temp0, PC_Scare, Temp1)                 If Temp1 is True {                     Display "{Scare: $Temp0} Success!"                     Display "You frighten the goblin, suggesting that
                         they might be cut to shreds or blasted into                          goo if they attack."                     Display(avatar=Goblin) "Okay, okay! I don't want                                 no trouble!"                     Goblin.move(15, 6)                     GoblinComplete = True                     GoblinScared = 1                     Stop                 }                 Else {                     Display "{Scare: $Temp1} Failure"                     Display "You try to scare the goblin with threats and                          promises, but they aren't impressed."                     Display(avatar=Goblin) "Heh, you think that's scary?                                 Say hello to my little, uh, my
                                knife!"                     Display "The goblin brings the knife a little too                              close to you and grins menacingly. But they                          don't attack yet."                     GoblinScared = 2                                  }         }
        Else If GoblinWhatDo == 3 { \\Friend [...]
Now that I have that mapped out, I can actually implement it in the engine.

Here's the goblin in question, for fun. It's an edit of a sprite from the roguelike repository linked earlier.

An animated GIF of a goblin pixel art sprite doing an idle animation. The goblin is dark green skinned, wearing gold-toned armour, and carrying a gold knife. The idle animation has the goblin tap their foot and wiggle their arms.

Deleted post
Submitted(+1)

GB Studio forces you to work with the limitations of the Game Boy Color (8x8 pixel tiles in a 20x18 tile grid, four-colour backgrounds and three-colour sprites, hard limits on the number of unique tiles on screen, etc.), which I find both a fun challenge and a way to force me not to overscope 😁 It also makes it possible for someone with no artistic training to do a little customization of the assets.

Deleted post
Submitted(+1)

Update

I've implemented the first monster interaction, which occurs when you try to move past a sleeping goblin. Here's a quick demo, which also shows off a couple more rooms of the dungeon:

Next Steps

I have some more monster interactions to script, some treasure chests to fill, and a couple more rooms to lay out. After that I think I will call this done.

Planning the monster interactions in the text editor, then implementing them in the engine helped a lot, so I'm going to keep doing that.

Submitted(+1)

The prototype is finished and available here: https://errantcanadian.itch.io/gbx

I didn't quite get to implement the Cleric and Wizard classes, but figuring out how spells would work in this sort of game is a bit difficult. Other things didn't quite make it, either, like items from the merchant, levelling up, and music/SFX.

I'm not sure how satisfied I am with the menu-based system for interacting with NPCs. But it would be so much more difficult to do it any other way. Maybe I'll look at Advance Wars or Fire Emblem or something for inspiration for another iteration, so it feels more like a turn-based tabletop game.

This was fun! I'll probably keep noodling with what I've put together so far.