Timey Wimey Stuff – Apotheosis Post Mortem

Posted by (twitter: @bytegrove)
September 7th, 2013 3:41 pm

player_1

 

sad

Reaction to the theme

When I woke up on day 1, the theme I most feared would win had won. “10 seconds”?! Too specific. .. Urgh. On the other hand, that’s how I always react, I remembered.

This post mortem was written a little late, and pretty hastily. I filled it with as many pictures as I could, so that you’ll have something to look at while enduring the ramblings.

Based on my previous entries, I was determined on a couple of things (do not regard this as general advice or anything):

  • Keep the scope clean and simple, center around one core game mechanic.
    I do not consider myself a good game designer. I’ve been programming for longer than I’ve been “properly” designing and evaluating gameplay. Thus, the lure of writing “cool code” is always there and gets in the way of making a fun game.
  • Make it 2D.
    All of my previous entries were in 3D. I love programming 3D game logic. But 3D does add complexity in every stage of development. And I always spend too much time in Blender, modeling, animating and UV-mapping(I also wasn’t really keen on pursuing the minimalism angle again).
  • Make use of the freshest gamedev knowledge in your brain.
    During the summer I’ve been working on a 3D platformer, so all the platformer specific stuff was right there in my brain, unboxed and ready to be picked. I only needed to remove one dimension(and a boatload of quaternion math). Simplify, simplify!
  • Make the game longer than 10 seconds.
apotheosis gameplay

Rewind, Replay

Brainstorming

I regret waiting this long for writing a post mortem. I’ve forgotten a lot of my brainstormed ideas. There was something with duels and seconds, but I never could center a fun gameplay mechanic around it. Later on I’ve seen several games using this interpretation, which is awesome!

There were also some clock ideas, with collecting the second marks of a clock as well as some idea of just making some arbitrary collectibles and refer to them as seconds(ugh).

 

Screenshot of the finished game

 

Braid+Mario Bros

After some thinking I wondered if I could do something cool with a rewinding ability. There are of course a lot of games already with this kind of functionality(Blinx, Braid, Ratchet & Clank, Super Time Force, to mention a few). I also wanted to keep the scope simple and by adding time rewinding (and possibly splitting timelines and paradoxes and gigawatts and what have you) I could risk ending up with something very bloated,unpolished and confusing.

So I thought about the very first Mario Bros and its single screen layout, and decided to make something similar to that.

Classic

Classic

 

What I ended up with in the end is a game in which you have to defend a fragile artifact from invading monsters as well as guide said artifact to a vortex in the sky. To elevate the artifact you have to rewind time (let’s call it a time defying magical artifact, mmkay?). Rewinding time also let’s you try that rewinded section of time again while your “old self” replays itself. Easy peasy.

 

I later realized, to my horror, during a debug session, that this was very much like the – what I thought at the time – super confusing shadow levels in Braid. I think I should go back and replay them, maybe I’ve learnt something.

Oh, and also, you can rewind a maximum of 10 seconds into the past and you have to wait the rewinded amount of seconds for the rewind functionality to reload. Which is a little too similar to what ended up being the premise of the very last episode of Futurama. Cool. Creepy.

Oh, and lasers.

Lasers.

Lasers.

Step one, global timer + rewind

My choice of working environment was my classic Unity setup. So the very first thing I set out to do was to make a rewindable replacement for the Unity engine’s time stuff.

It was easy but fun, and I wasted a couple of minutes just watching the seconds ping-pong back and forth. The simple pleasures.

 

Step two, transform buffer

The second step was to make some kind of buffer system for Unity’s transform component. With a 10 second restriction I could skip a lot of general stuff and make it explicitly for only 10 seconds. This buffer is read from while rewinding and replaying, and written to while playing. It was pretty cool the first time I saw it in motion. Ping-pong, ping-pong! xD

 

Step three, thumbnailing of level

Another thing I didn’t want to do this time around was to shove all of the art creation onto the last day. I wanted some pretty stuff in the game asap! As I didn’t really know what I wanted, I began by sketching out some rough thumbnails.

 

Thumbnail painting of level layout

Thumbnail painting of level layout

songs

My main source of inspiration for the art was the book cover of the awesome novel by Arthur C. Clarke: “The songs of distant earth”. Which is also the inspiration for the awesome album by Mike Oldfield going by the same name.

Another source of inspiration was the beautiful grass-, wood- and dirt art in Rayman Origins. Such a pretty game. Also, I wanted to add some red hues in all that green.

Rigidbody-based Player controller

After having drawn for a while I got the urge to program some more. I began implementing the player controller. The already existing rigidbody system in Unity is pretty neat, and you can get some really nice results when using it for player controllers instead of the built-in “character controller”-body. And you don’t have to worry about collision bugs and explicit collision events later on. The workings of this was also fresh in my memory from just having implemented similar stuff in 3D, so its implementation went pretty smooth.

After I had it working I hooked the player object up to the time buffer component from before and added some state handling to switch off input and so on during replay.

 

Level

I then went back to working on the level. I began by blocking out all the platforms(based on the layout in the thumbnail), and then I began working on the final art for the platforms. I made several separate chunks with grass and rock formations which I could build up the level of.

 

Timelapse of painting level parts

Timelapse of painting level parts

Then I got determined on making a sprite shader with lightmaps and other stuff. Big mistake. I got completely stuck with some of Unity’s weird sorting behaviours and spent too much time reading confused forum entries and lackluster documentation. I abandoned the idea after a couple of hours, and went for a simpler and built-in shader. By then my mood was at rock-bottom, but luckily this was the only real bump in the road this time around.

 

More work on the player

I then shifted my focus back to the player character. Based on the time I had left and not really determined on the art direction I wanted for the characters, I decided to make the player low-res and in black and white.

Timelapse of drawing player sprite

Timelapse of drawing player sprite

I figured the most importart part was to have the silhouettes there and if I got time to spare I could colour the characters. As I never got that time however, I’ve gotten some critique of the kind of mish-mashed art style I ended up with. And I understand that critique. One could counter with that the mixture of monochrome characters and coloured landscapes are “cool”. However, as it wasn’t my intention to make it that way, the result does not feel intentional, uniform or polished.

 

Implemented duplication of player on rewind completion

Another fun challenge was implementing the “duplication” effect after the player has performed a rewind. In the first iterations I got some hilarious recursion bugs filling the screen with player objects and crashing the game in milliseconds. 😀

When I had all that sorted out, the game looked like this:

Progress after day one

Progress after day one

 

Music

After I felt that the player controller and rewind-stuff was solid enough and the roadmap of permuting objects and components into the remaining game elements felt clear enough, I began working on the music.

Apotheosis music (Soundcloud)

Figure music creation app

Figure music creation app

Prior to the compo I had discovered a pretty neat music app for iOS with simple controls(perfect for a tone deaf audio noob like myself) but with enough depth to make relatively unique samples.

It’s called “Figure” and I really recommend it if you want to make some simple loops or just play around. I used Bfxr to make sound effects, I had planned to record some as well, but by the time I got around to start making sound effects I didn’t feel like I had enough time to spend on recording and editing. Maybe next time I’ll do it as (based on the critique I’ve received on my entries so far) bleep-bloop effects aren’t too well received in non-pixely games. And I can see why they might feel a little out of place.

 

Finale

The last ten hours went by in a blur as usual and this time they involved GUI, particles, sprite animation, a rewindable animation system, enemies with their own animation, some super quick copypaste-magic for enemy AI as well as end-game conditions.

This is a video of the resulting gameplay:

 

And a timelapse video based on the stream data:

 

Feedback and post-compo

I was stunned by all the great feedback I received this time around! Thank you all once again!

I got a lot of response of the gameplay itself, which spurred me to add some more depth to it. And I found out that when you understood the core concept of the game, the powers of the player didn’t make much sense anymore and the game could be beaten with a one second hi-score without any effort. 😛

So in the current post compo version I’ve changed some of the enemy spawning behaviour, added extra difficulty levels and added a rewind punishment when touching enemies(instead of being invulnerable). I’ve also made some changes to the weapon, making it less effective when rewinding far, and more effective the longer you do not rewind(adding some more depth and ways to strategize).

I’m still open for more feedback though, so you’re welcome to try the post compo version if you’ve rated the original!

player_0

Good

  • Prepared.
    I had bought all the food and snacks and made all the errands and downloaded all the tools beforehand. Development went smooth.
  • Location.
    Went to a friend that was also participating and worked there. A lot more fun when you’re more than one. Also, it was a bigger apartment with more shade, haha.
  • Scope.
    Kept it simple. One core mechanic, and a pair of sub gameplay mechanics. Kept the code and art modular, but didn’t overdo it. Ugly code? Yes. Who cares.
  • Bugs.
    Very few of them. One nasty shader ordeal, threw it away.

 

Bad

  • Game logic depth.
    Some of the gameplay aspects confused me, so I didn’t catch some pretty large flaws. Fixed some for post compo. I want to allocate more time for game testing next time around.
  • Stream.
    First time I streamed, I got some positive feedback on the music I played. But other than that I guess my showmanship is pretty lacking, as I had a maximum of five visitors at a time. Maybe I should post more links to the stream next time? I don’t really know.
  • Controls.
    I think almost everyone was confused by the control scheme and the aiming system. I’ve reworked it in the post compo version, but I’m pretty sure what many wanted was soldat-like aiming, which I’ll never add. 😛
  • Mixed art styles.
    I would have liked to allocate more time for creating prettier character sprites more in tune with the environment.

 

Another screenshot

 

Conclusion

All in all, I had a blast making this game and it has better gameplay than my previous entries in my opinion. However, the core gameplay turned out to be yet another cool-code trap sorta. I did not pour hours upon hours on getting it to work though. Making some neat art during day 1 instead of postponing created a great morale boost. Making a 2D game made it easier to create polished art in the style that I’m most fond of, and I got more content done in the 48 hour timeframe.

K.I.S.S. F.F.S. !

player_1Entry pageplayer_1

 

Tags: , , , , , ,


Leave a Reply

You must be logged in to post a comment.

[cache: storing page]