Game Jam 33: Finale

And as suddenly as the curtains to this weekend’s Game Jam opened, so, too, did they close just a few short days ago. With that said, I am happy to announce that I managed to release a functional game with a title that came to me at the last possible moment: Ghost Light!

Now with 100% more doctored screenshots!

It’s exciting to have a real game out there that other people can play, even if it’s still glitchy and missing some key features, such as explaining how to play the game in the first place.

Participating in the Game Jam proved to be both a great motivator as well as a steep learning curve. If you ever have the opportunity to take part in one, I’d definitely recommend it, just for the experience. In that vein, let’s look back and talk about some things I learned trying to make a game under a deadline:

Basics First

When it comes to designing a game, don’t worry about things like sprites or music until you have the basic coding already laid out. A moving, synthesized orchestral piece playing to a jittering mess of beautiful sprite-work isn’t going to be a fun game compared to a well-coded game about a white box bouncing around some black boxes. If you can make the game fun even if it looks terrible, better assets will be the icing on the cake. It turns out there’s a reason prototypes and beta rooms look the way they do in games: They made the game first and then worried about the looks later.

Break It Down

Making a game is hard work. You need to code it, it needs artwork, and it needs music. And, of course, each of those steps can be broken down further. Your rogue-like driving simulator needs a working player character (car?) as well as every possible interactive object in the game, from the ground, to the panning background, to the item shop, to the items in the shop, to the enemies, to the obstacles, to the loot system,to the main menu, and so much more. Your chances of success are better when you break down every big step to their smallest sub-steps, giving you a better grasp of just how much needs to be done. Then you can use your time wisely. Speaking of time…

Make Time

Holy moly, seriously. If there’s only one thing you take away from this, make it this one. Every single time you think to yourself “Oh, I have enough time to get this or that aspect done, I won’t worry about it,” remember that you most definitely do not. Animating the sprites sounded easy. Just a few more basic sprites and a few short lines of code? All of a sudden my character is teleporting around the screen and I need to figure out both why and how to fix it. Adding in a scoring system involved adding in some new objects and variables that wouldn’t directly mess with anything already coded into the game. Turns out the scoring system would cause the game to crash every time the player finished a stage. Even uploading the game took more than 3 times longer than expected. I needed to make an eye-catching screenshot, make an account on Itch.io, and post enough times on the YoYoGames forum to let me include the link to my game in my submission post.

I’m so happy I got to take part in this and that I stuck with it to the end. Ghost Light isn’t the prettiest, best coded, or most fun game out there, but it’s my game, and that means a lot to me. I have a better appreciation for game development and the processes involved in it. I get how glitches manage to stay in the game after release, the inclusion of day-one patches, and the loss of cut content. In such a short amount of time I’ve gotten to experience all of the above and learn from it.

The file size made it all worth it

So what’s next for me? I’ve made some bug fixes to Ghost Light, added the scoring feature back into the game, as well as a few quality of life upgrades, so I’ll probably release that updated version in the near future. As for the subtitle for this blog, I’ll probably moving on to something else to talk about.

Eventually, I’d like to get to work on my Gameboy Color Megaman X clone I’ve been daydreaming about since June of last year, but that’s a pretty big project to undertake so suddenly. I think that one’s going to be stuck in my head until I’ve given myself some more experience with the system.

Game Jam 33: Part 3

So it turns out procedural generation is hard.

After some more poking around, I’ve found a compromise I’m willing to settle with for now. Especially considering I only have just a little over a day left to complete the game.

Presenting Zack Banack’s ASCII level generator!

Ooh?

This script is a little overkill for what the project needs, but it’s working quite efficiently. Basically, it works by drawing out stages in a .txt document using specific characters to represent different objects. For example, the X’s above are walls and floors, while the P is the player. A few scripts in Game Maker are then used to tell the engine to read the document and copy all the objects into an empty room. After some working, I’ve gotten it to where it will load in a random level at the start of the game and, if the player dies, it will restart with a different level.

Unfortunately, this means I’ll have to build every level by hand, although I still plan to incorporate the level chunk idea my brother helped me out with. Tomorrow, I’ll be designing somewhere between 10-20 level chunks and building 5-10 levels out of them. Hopefully the game will still feel procedurally generated and relatively random despite the fact that it’s all hand made.

Some more bad news is that, due to the fact that the stages are pre-made, they’ll all have ends rather than being an infinite runner. To that end, the purpose of the game has gone from surviving as long as possible to reaching the goal without dying. I’ve seen quite a few scripts available that would allow the room to loop horizontally, but I ain’t got time for that.

But there’s some good news! We have a functioning platformer!

Run for cover, don’t stop to look around!

We’ve got player movement, jumping, screen-scrolling, dying, and restarting. All that needs doing is getting the door to react to the player, coding the spooky ghost to follow the player, and light switch functionality. After that, given time, I might like to spruce up the sprites and I think an opening cutscene giving the game some kind of basic story would be really cool.

All I can say is I probably won’t be sleeping tomorrow night.

Game Jam 33: Part 2

This episode is about learning new things.

First and foremost: Working out what you need to do and actually getting it done are two completely different feats. Keep this in mind if you ever start working on a project.

Running In The Dark (Name Pending) is a game I’d liken to the area in Spark Mandrill’s stage (Megaman X1) where you’re expected to platform while the lights flick on and off mixed with Flash Man’s ability from Megaman 2 mixed with an infinite runner.

Like this, but less turtles and you can’t see

The stage is completely dark, so you can only see your character. You can activate the lights to see where the platforms are, but this stops you from moving, forcing the player to memorize upcoming elements in order to get through them. All this would be done while the player is getting chased by an enemy. As a bonus, the stage would be procedurally generated by loading in new platforming sections as the player ran along. Theoretically, this should keep the game interesting, as it prevents any players gifted with an eidetic memory from memorizing the entire stage layout and losing that constant flow of discovery and puzzle solving.

As far as coding the game goes, this can be broken down to four basic elements: 1) The generated stage elements, 2) Player movement, 3) Enemy movement, and 4) The light functionality.

Today’s goal was to have a functioning demo of the stage generating function. But how do we go about this? To my surprise, it was significantly more involved than I expected.

If you build out a stage, there’s little to no randomization or change to it. The dungeons in Zelda 2 are static, while the dungeons in Spelunky change every time, for example. You can memorize the layout for Parapa Palace.

Memorize THIS!

Imagine a game like Megaman or Mario, where, rather than designing whole stages, the games features a selection of stage chunks which would then be put together like a puzzle in order to create different level layouts. You make a list of 20 or so stage chunks and a script to randomly cycle through them and load them in and you’re right as rain.

Same chunks, different hunks

There are quite a few different ways to go about this, and I won’t go into the myriad tutorials I looked at today, but suffice to say the intention is to minimize the amount of work I have to do while maximizing the fun output. Rather than draw out each stage segment, we could use strings to represent each segment, have Game Maker read those strings, and convert them into stage segments. Let’s use the chunk on the top left in the above screenshot.

Each example chunk is 5 blocks across and 10 blocks down. A simple binary string could represent 0s as blank spaces in the map while 1s would be the blocks. Used this way, the set of 0s and 1s below could be used to tell Game Maker to generate the top left chunk:

ASCII Platformer?

If we tell the script that each chunk is going to be 5×10 blocks, then we can just write each stage string like so:

“00000000000000000110001100011111111111111111111111”

Rather than having a folder full of seperate room segments, you get a list of strings neatly tucked into a script. It takes up less space, and it looks a little prettier, too!

Unfortunately, I have to admit that after hours of tackling this off and on from a few different angles, the working demo didn’t happen.

The takeaway today is: While I know what I want the game to do, I don’t yet know how to convey this in a way the software understands. I’ve been at this off and on all day today, and I’ll be tackling it again in the morning, but what I want to pass along to any game-making hopefuls out there is: If you want to do something you’ve never done before, something that might be a little outside of your expertise, don’t expect to skim a tutorial or two and be done with it. And don’t be afraid to reach out and ask questions.

Technology can be hard to predict, and if you’re planning on taking part in a future game jam, Be prepared for something to go awry or one piece or another to not work the way you expected it to. It could wind up throwing off that already tight schedule.

Hopefully, I’ll have a functional platformer tomorrow. If I can get the other basics out of the way, I can focus on the platform generation without worrying that I still have to make the rest of the game.

Game Jam 33: Part 1

Hello World!

I picked up Game Maker Studio 2 while on sale and figured, since I had some free time, that I should participate in Game Maker’s most recent Game Jam. I’ve toyed around with Game Maker for years, mostly making simple, short games or modifying existing ones, but I’ve never actually produced and published anything for the world to see.

Upon the suggestion of my older brother, I’ve decided to use this blog as a devlog for the Game Jam, where I’ll be discussing my daily trails and tribulations with the project. After that? Who can say where this will go? I’ll probably talk about ideas I have for board games or something like that.

But that doesn’t matter right now! Right now we’re talking about the Game Jam! And the theme for Game Jam 33 is…

“Turn It Off And On Again”

Huh.

Leaves a lot of options open to us, as long as the game involves turning something on and off as a mechanic. Allow me to walk you through some possible games I had considered along the way, bonus mock-up screenshots included!

VR Adventure… Thing!

It’s a video game about video games. Get it?

In this game, you play as a little guy with a VR headset he can don and doff as he sees fit. Without the headset on, you’re in a plain, modern-esque world, but turn it on and suddenly you’re dropped into a colorful, more dangerous version of the world. The game would feature you jumping back and forth in order to solve puzzles and progress.

Hue, But Not As Good!

Click click click

Another platformer where certain parts of the stage exist depending on the color of the level background. Turn the lights on and off with the flip of a switch in order to get through the stage.

Time Stop!

How do you convey time not moving in a screenshot?

In this top-down puzzle,your character is attempting to get through the stage unscathed. Turn time itself on and off to manipulate moving platforms, obstacles, and enemies in order to reach the goal.

Traffic Manager?

I forgot to make the stop lights…

Direct constantly building traffic across a simple road system by changing individual traffic lights! the cars are color-coded to show where they’re headed. Play for a high score by preventing collisions, and be careful not to let any of the streets overflow!

Creepypasta Waiting Game!

G-g-g-ghost!

You heard about some spooky ritual that summons a light-hating demon to hunt you down. Sit in a dark room and blow out your candle to let the hunt begin. Test your bravery and ability to guess enemy pathfinding by lighting the candle just before it reaches you!

And here we are with my official entry for Game Jam 33, a game which I will be thanking my older brother for the inspiration:

Red Light Green Light Chase! (Title Pending)

Don’t try this at home

In this game, you run along a track of procedurally generated platforms with another racer eternally chasing you along this infinite runner. Now what’s the catch? All the lights are off, so you can’t see anything but your character as you attempt to get away from your assailant. You could always turn the lights on, revealing the stage ahead of you, but this freezes both you and the enemy in place until the lights are off again.

I’ve been wanting to make an infinite platformer based quite heavily off of the (Mega/Rock)man X series for quite awhile now, but never got past the pen-and-paper stage, so I really look forward to getting to put something like that together finally.

Until tomorrow, dear readers!