I actually pulled off a game for Ludum Dare #30.
The theme was Connected Worlds, and as usual, I set out to make a platformer with the usual art and music styles.
Boy did I end up making something completely different…
I present to you…
Shattered HorizonGive it a play if you haven't yet! I'd appreciate it!
Or, you know, read the post-mortem if you have played it. I'll be going over what I remember of my thought processes during the comp.
I streamed (And saved to YT) a few ridiculously long videos of the development process. Two 5 hour vids and a 1 hour vid, I think. Take a look here if you're bored and have no drying paint to watch instead:
Part 1-1Part 1-2Part 1-3Part 2Part 3-1Part 3-2I'm not talking over these videos. I was too focused to bother :P
I did, however, start capturing my desktop sound once I started adding sounds and music to the game. So if you want to hear that, take a look at Part 3-2.
Post Mortem
Before the comp started, I had brashly decided to create my game in C++.
Because I'm a masochist, apparently.
Then things happened: I had to work on Saturday for most of the day, and ended up losing around 20 hours (Because of other things, family related).
So I started out at around… I have no idea when… on Saturday evening.
For some reason, I blanked out and started making my game in C++ from scratch. About three hours (And a working patial framework later), I remembered that I had uploaded an engine or two to Github…
I switched to my newer engine, IndieBoy.
It's important to note that I still had no idea for my game, other than "Platformer =DDDD" and not much else.
After another… four or five hours of screwing around with that, I realized that I was spending way too much time implementing new engine features and far too little on actually making a game. So I decided to drop my original plans and go with GM.
At this point, I actually started to think about game design.
Interestingly, Blackhole had hosted a copy-competition, 64Dare, that had a very similar theme to this Ludum Dare; my game for that, Alterality, got 'best overall'.
I decided to draw some elements from that game (The world swapping from a "light world" to a "dark world").
I also took a few ideas from a couple of story ideas I had a few months ago. The gist of these ideas being a planet that has a sun that periodically bombards the planet with "dark energy", a useful McGuffin that has created a dark side to the planet, inhabited by different people/creatures, but retaining the same physical objects for the most part.
And then I decided that making a platformer with these ideas would be a
pain in the ass.
So I took a dip in the history pool and pulled out
Gauntlet.
I've always wanted to make a game in this style, and decided to take a shot at it.
Some of the first things I did was establish a few basic core concepts:
> The game would be low-resolution to help with rapid art production
> The game would use a widescreen aspect ratio
> Gameplay is centered around the two worlds, Normal and Dark
> The Dark world is significantly more dangerous than the Normal world.
> There would be some basic 'survival' elements (Food and "Dark").
> Combat would be centered around guns.
> The Dark World would be entered after a specific time had passed.
> Food and Medicine would spawn at points on the map, and resupply after
a given time
> Enemies would continually spawn at the edges of the screen at specified ticks.
> Death is permanent
After a bit of fiddling around, I established a
very low base resolution of 200x112, and eventually on a playing area of 112x112, with 88 pixels being reserved for the HUD. It made the screen a bit more 'cramped', in a sense, but also allowed me to get a decent HUD into the game without requiring a pause menu or other mechanism.
Around this time, I jumped on TeamSpeak with SpectreNectar, Pirate-Rob and Acid…
We were focusing so hard that we forgot that we were using TS, and it was deadly silent for the most part.
At this point, I started to work on basic gameplay. I had a simple prototype player sprite from the platformer idea that I was using as an HUD decoration, and used a simple circle in place of the player while I figured the basics out.
Then I decided to bite the bullet and face the task I looked forward to the least: Drawing the player sprite.
I'm not very good with top-down perspectives. I always want to add some more detail, the 'front' of the character… but I think I managed to pull off a character with a decent bit of depth, even though very little of it is shown at any given time.
The walking animation was both the easiest and hardest part of the player to figure out. When you basically have three squat circles next to each other, how do you make them appear to be attached to some legs that are hidden from view, and walking?
A couple of revisions later and I had a decent character, a simple map to walk around, and a basic movement engine.
I decided to go with GM's rotation in this case. It worked well enough for my purpose, though I usually avoid it. Then I made it 'smooth', so instead of snapping to a direction, you turn towards it at a fixed rate.
For a while I had a bug where, from certain starting positions, instead of turning in the direction the player wanted via the shortest route, the character would do a little reverse 'spin'. Made it look like he was dancing :P
Around this time, I decided that I needed a simple 6x6 bitmap font so I could print some info on the HUD. Just the characters A-Z would do for now… but I kinda forgot to keep it to that and drew a nearly fully-formed font-set, sans lowercase glyphs, in about 10 minutes. Worked better for me later, because I wanted to print the score too, and use some of the punctuation marks as bars/separators.
Now, my experience with short competitions… with any competitions, really… is that I leave my enemies and level design 'til last. I decided to break tradition with this one and swallow the bitter pill first.
I mapped out the entire game map in one sitting, and started drawing up enemies. In the end, I basically had two: Creatively named "Thing" and "Soldier". I made stronger re-coloured variants for the Dark World… Called "Dark Thing" and "Dark Soldier". Because that's as far as my mind was thinking at the time.
I toyed with the idea of quickly adding an A* pathfinder to the enemy AI (All base AI was handled by the parent object), but I decided against it, and instead implement a
Fast Bogo Intelligence and focus on adding more features.
So now I had enemies that tracked and followed the player. I added in a spawner for them that would place them just beyond the edge of the screen if there was an opening, and moved onto the next 'big thing' that I usually left 'til last in my games:
The game over screen.
Not much to be said about that, but about an hour later I had managed to hammer out a Game Over screen, Title screen and intro cards.
Now, in a fit of reverse logic… I implemented the enemy's shots first, damage to the player (And death) after that… and only got around to adding a way for the player to fight back quite a bit later. :P
That's a bit of a turnaround from my common practice of forgetting to add a way for the player to lose the game in some of my games.
After I had that done, I added the switch to the Dark World. Actually, I had 'added' the Dark World a while back, but there were no triggers to enter it (I had a debug key to enter it. Which I forgot to remove from the game. Find it :P)
In Alterality, the world was 'switched' by switching rooms. That process was a pain in the neck, involving duplicating the first room I made, painting over the duplication with the 'alternate' tileset, and adding in extra hazards.
This time, I did something simple on game start:
> Create a temporary surface
> Draw tileset A to surface
> Save surface as background A
> Draw tileset B to surface
> Save surface to background B
> Assign backgrounds A or B to background C (The one defined in the GM editor and used in the room editor) during gameplay.
> Instant tileset switch.
And for world specific hazards/objects, I just made the player deactivate anything that was a descendant of 'obj_darkworld' if the world.mode variable was set to "WORLD_NORMAL".
After this, the only major things I added were the pickups and drops. There are three levels of each pickup: Small, Medium and Large.
Small food/med items drop with a small chance from enemies when you kill them, and restore a few points of food/hp.
Medium and Large items spawn in the world at predefined points, and respawn after a specified time (Somewhat buggy, I forgot to take a few things into account… but it works.)
Otherwise, most of the work from this point on was balancing: At first the food bar ran down too slowly. This was by design, since I originally envisioned a much slower paced game. A survival/roguelike/action hybrid of sorts, in which you would gather supplies and materials, etc, etc.
Obviously ditched most of those ideas very quickly. It was a Ludum Dare, after all :P
So I spent around an hour tweaking the Stamina, Hunger and Dark ticks. Made them a bit faster, tweaked enemy speed/damage/hp, tweaked player hp and attack, food restoration, etc.
Making this game was a lot of fun; I'm still working on it, and plan to release a polished "2.0" version at some point next year. Hopefully, by then, I'll have added in the new features I want (And features other people want):
> Huge maps (With a map system, so you know where you are)
> Randomly generated wilderness and cities
> WASD controls, with the mouse being used for interaction
> Refined survival elements, including the ability to barricade yourself in a ruined building in order to survive.
> Higher native resolution, with a more polished interface.
> 3D or pseudo-3D (Think of the original GTA).
> Boss battles!
> More enemy types, AI types… and proper pathfinding.
> Weapons! Items! Loot!
> Local multiplayer. The idea of a co-op Roguelike style game is appealing to me. And depending on how I code the base system, it might be possible to make it playable over the net too :P
> Rebase to C++, like it was meant to be. I already have the groundwork done for this game in my C++ engine, and am busy working on this already.
Ambitious, perhaps. But I'm finding that being forced to spend more time away from my computer (At work) tends to motivate me to work on things a bit more. So we'll see what happens.
I also plan on releasing a simple "1.1" release that'll fix a few of the nastier bugs (one of them being that food can run negative, and be extremely hard to get back into the green again), and a few new weapons.
Well, that's that. I'm off to go do something completely unrelated to work, programming or game design in general. I can't even remember the last time I've relaxed and played through a game. :<
I like that we are using similar tools. C++, gl, and some basic pixel editing. Makes it more interesting to read, for me at least. Your game was good for the short amount of time spent on it, and one of the LD games I played for the longest. I would definitely play a fully developed version.
@Nopykon: Thanks :P
@Pirate-rob: I never really think of allowing for holding down the shoot button, unless I'm adding a charge attack :PGuess it's something to add though; no reason not to have it.@SpectreNectar:The corpse drops do replenish a bit of food or hp: 5 points for food, 10 points for hp if I recall correctly.Answered your questions on the game page too. Those are bugs, and thanks for spotting them!I used a global state for some things, and forgot to reset them in the Game Over screen.