With correct icons!

Avidus: Those Left Behind

The Nemesis is coming and will destroy all in its path. Nothing can stop it. Only through the sacrifice of your loyal followers can you hope to make it to safety. A top-down, crawl-and-gun, tower defense adventure.


Give this entry an award


Ratings (show detail)

Overall: 3.3
Fun: 3.1
Production: 3.1
Innovation: 3.7

23% respondents marked the game as not working.
Respondents: 10


File Uploader Date
With correct icons!
flyingfox 2013/04/20 23:03
avidus_0.70 final.zipfinal
Avidus 0.70 Final
flyingfox 2013/04/20 22:55
Avidus 0.68 Final
flyingfox 2013/04/20 21:56
Avidus 0.65 Final 1
flyingfox 2013/04/20 13:56
New Icons and the Endgame
flyingfox 2013/04/20 06:33
Now with obstructions.
flyingfox 2013/04/18 08:58
Now with UI
flyingfox 2013/04/17 23:01
Running from the grey goo!
flyingfox 2013/04/17 08:04

Diary Entries

Rolling Now

I started a few days late but am on my way now.  You play as a group of survivors frantically fleeing the Nemesis, an all consuming goo.  You can't out run it, but through the sacrifice of your friends you can delay it long enough to escape.  Imagine a top-down scroller with tower defense elements.

The goo spreads through 2D convolution (signal processing FTW).  To make it run fast enough, I start a convolution server (multiprocessing) to process frames in the background.  For added speed, I've decimated the goo mask by half for processing and the resize it back up again for display.  The terrain will scroll under the player (right now, a yellow circle) and is generated procedurally.  Because I can't draw.

Next up adding obstructions, stats and power-ups.  Then on to the tower aspects.

Exciting Grass: The grass scrolls!

Terrain Test

Terrible Goo: The goo grows! 

Progress To Date: Putting it all together.
What passes for a game.


Code Revamp and New UI

Took some time to reorganize the code a bit.  It grew organically from the merger of the __name__ == '__main__' from three different modules and was super unwieldy. I cleaned up the game interface into a few simple objects and reduced the spaghetti code by 23%.

There's now a simple UI, too.  The banner across the top (five minutes in Inkscape) tracks you followers and distance to goal.  The button box on the right holds n buttons (n=4 for now) that will be used to invoke powers to knock back the advancing goo.  Right now you just click the good to shoot a hole in it (at the cost of one follower).  You can technically win (outrun the goo) and loose (run out of followers) but that's about it.

Next up: Add some obstacles and collision detection (with obstacles and goo).  Then maybe powerups and floating notifications.

Add a comment

Day 3.. I think.

Long, long day.  I'm quite happy with my progress though.  I've changed the player to a sprite and added obstructions to your paniced run from the goo.  The initial testing looked good:

Then I went and added a bunch of 'realistic' looking sprites.  Doesn't look too bad right now:
'Realistic' obstructions
I think I need to back off on the obstructions a bit :)

I spent the better part of three hours trying to get:
  1. The player (yellow circle for now) to collide correctly with object.  The collision detection by bounding rect works but the fine gained per pixel collide_mask() doesn't seem to work for me no matter what I do.  This is a problem when there are irregularly shaped obstructions.
  2. A way to dynamically build the obstruction sprite classes.  I had a great plan to use __metaclass__s  but that didn't seem to work the way I wanted.  Then I tried class closures but it failed too because... 1:30 AM.  Finally, I decided that I only have a handful of obstructions, I'll just build each of them.  
Next up:
  • Detect collisions with the goo.
  • Add weapons/abilities.
  • Title/End screens.
  • Add more (varied) obstructions.
  • Add a goal sprite.
  • Sleep

Add a comment

Now with sleep.

The things that plagued me last night (simple collision detection, button cool down) I solved during my lunch break.  I love how my sleep addled brain was working, "Too tired make sprite collision detection work... hmmm, maybe time to start playing around with a __metaclass__ for my obstructions!"

Anyway, you now have powers (that are paid for by followers).  I've settled on a goo repeller (cost: 5), turbo sprint (cost:2), ghosting through obstacles (cost: 3) and poison bombing (cost: 1).  All but the poison bombing are implemented but I may revisit the repel mechanism.

To do tonight:
  • Make the poison bomber work.
  • Add random pickups.
  • Add the Goal.
Still to do:
  • Menu / Title Screen
  • End Screens
  • Floaty Text objects.

Add a comment

So close to a real game

Getting there.  I would like to have been able to get the text flavours added tonight, but that's not going to happen.  Floaty text and end goal are the first things up tomorrow.  Maybe in the morning if I get up early.

I changed the way the the goo repulsion was implemented.  Instead of magically bumping back the goo, you now leave a poison bomb (and some followers) to poison the gunk.  It alters the colour and prevents it from growing for a few seconds.  The turbo power didn't change, but I've added a sandy pattern to the Ghost (walk through walls) power.  Also, you can't be harmed by the goo or pickup items in ghost form.  Finally, I beefed up the explosion.  The previous one wasn't as awesome (or useful) as I wanted, so I kicked it up a notch.  BOOOOM!

Also, I've been testing it at a lower frame rate (20 FPS).  On older machines this is about all you get.  If you've got something like a mid-range i5 or better, it will only get better.  I'm a bit concerned about how the goo speed tracks machine performance.  That's one downside of decoupling the 2D convolution from the game loop.  It doesn't slow down the game, but the goo can perform better on higher end machines.

  • End goal sprite
  • Flavour text
  • Sound and music.
  • Start menu
  • End game screen
  • More levels?





Audio Upgrade!

Added the few extra bits to have an actual game.  There's a starry field at the end (where I learned that different systems will default to different alpha settings) and floaty flavour text for power use.  The biggest update has been the sound.

There's an awesome theme behind your march now and all of the powers have sound effects.  The bombs are soooo much cooler when they have a base oomph from the explosion sound.  It took several hours of trolling for sound/music and annotating the license (Creative Commons of one sort or another) so that I can give attribution when I release.

Ah, the release.  Well, I still have eighteen and a half hours.  I need to wrangle my code into some state that I can add a starting menu and a endgame results screen.  Also, I need to do some art for the power buttons.  As much fun as having them labeled 0, 1, 2, and 3 which you activate by pressing 1, 2, 3, and 4 is, I think some simple graphics would work better.  Look out Inkscape, here I come.

Then I need to figure out how to distribute it.  As the least, I'll have something like a github page.  If I have time, I'll try my hand at py2exe for windows users.  Not looking forward to that though.  I've fought with py2exe before (and sometimes I've won.)

To Do:
  • Graphics for power buttons
  • Start Screen
  • Endgame summary
  • Distribution

1 comment

Avidus: Final Version Online

Well, look at that, the sun's come up again.

I think I'm done.  It's playable, kinda fun a bit atmospheric and far, far better than yesterday's version.  Instead of just running for the finish line and declaring victory, now there's actual levels... That get harder.  Then there's the menu screens.  They might not look like much, but I had to bash around the code base to work with them and it's much better off for it.

There are probably about 20 "just one more thing"s I could do.  The bombs really want to me an animated sprite (with swanky tiles I actually have sitting on my hard drive) and the distribution is a 7 MB zip file (really would be nice to attack it with py2exe).  The readme file is a little terse but I blame that on sleep deprivation.  

The most interesting gotcha you are likely to hit is the requirement for both numpy and scipy.  There are links in the readme file and they are easy to install... unless you are on 64-bit Windows.

Feedback is always welcome, but I'm going to go sleep now.

Add a comment

The Final is the final Final... Honest.

So I woke up this morning (afternoon) and realized that the end game wasn't quite right.  If you finished all 10 levels (difficult) the game would just crash (no level distance set for level 11).  I couldn't see how I'd have time to add a You Win screen in the few hours remaining, so I punted.  There are now 1000 levels.  Good luck with that.  It's very retro.  There's no You Win screen on Pac Man.  It just gets harder and then you die.  So that's version 0.68 Final.

Then I tested it on a smoking fast machine (new i7) and found that the goo speed doesn't scale well at all.  The game is very, very difficult even on level 1.  With only one hour left, I don't have any easy ways to auto correct (or even characterize) this effect so I added a player speed option to the main menu.  If you are running a new-ish machine the base speed is good.  On slower machines you can turn down the speed a bit (you were getting away with murder) and on fast machines bumping it up about 10-15 points seems fair.  That's version 0.70 Final.

There are no more Final versions.  And this time I mean it!

Add a comment


Turns out that the released version has a pretty good bug in it.  If you click the icons, the game will crash.  I didn't find this, because I have never clicked on one of the icons since I added keyboard shortcuts.  Long story short, use 1, 2, 3, and 4 to activate your powers.  It's not like you have a lot of time to play around with the mouse anyway. :)

Also, make sure you have numpy (http://sourceforge.net/projects/numpy/files/NumPy/1.7.1/) and scipy (http://sourceforge.net/projects/scipy/files/scipy/0.12.0/) installed.

We now return you to your regularly scheduled judging.

PS. Wow, there are some nice games this year.  Put's mine to shame.

Add a comment

Post-Game, Pre-Judgment Postmortem.

So it's been a few weeks now and judging ends in about 5 hours so I figure it's about time to write up a postmortem.  This will (a) let me get this down now after some time has passed but still remember what went down during the week and (b) make the most recent post regarding my game not about how buggy it is.

So Sunday rolls around and I figure I should at least look at the themes to see if there was anything I liked.  I had a great idea for "Bat Cave" and a pretty good idea for "Secret Identity".  I had nothing for "Nemesis" but I liked the sound of the word: Nemesis.  I think I rated it third.  So it won. Yay! Then I found I had no idea what sort of Nemesis themed game to make.  None.  I annoyed people for the next day or so by randomly shouting "Nemesis" in disgust.

Then on Monday night, I had an idea.  The nemesis is Grey Goo and it's coming to eat everything.  I wanted it to be unstoppable.  The only way to survive was to leave behind turrets (which would be devoured too).  Like a free form turret defense game.  I wanted you to feel a little bad about leaving people behind so you didn't just power through the levels.

The core of the game is the goo spreading.  I started off with an overly complicated CFD system that was waaaay to slow for the game loop.  Beautiful, but slow.  I backed off that idea and went to simple 2D convolution for goo growth.  This was good, but still a little slow.  So finally, I moved the goo growth to its own process (go-go multiprocessing) and sent a scaled down version of the map to it via a Queue.  when it was done with the computation, it would send back the results.  That worked well but had two problems.  
  1. If you set off a bomb in the goo while a growth calculation was underway, the explosion would get overwritten in the next cycle.  I solved this by tagging each computation with a transaction number and invalidating all previous results when a bomb goes off.
  2. If you are on a very fast machine, the computations will run very fast and you will be murdered.  A lot.  I didn't notice this until the very end and didn't have time to fix it correctly.  Instead, I just exposed a player speed option on the menu.  If you are on a newer machine (Intel i7 grade) you will want to turn up your speed or you will die.
About three days were spent just getting the mechanics down.  By Thursday, I had obstructions and most of the powers working correctly.  However, I was running low of sleep.  By the wee hours of the morning I was trying more and more esoteric code to do dimple things... and failing.  The next day I solved all of the previous night problems in about an hour.  Sleep helps.

On Friday, I basically had the game down but with nothing else.  You ran from the goo and made it to the end or got eaten.  Then you were dumped back to the console with some debugging information.  I jabbed in an endgame (the terrain turns to stars) and started bludgeoning the massive pile of spaghetti code into something I could wrap.  Then menus and instructions came together quickly.  Doing this, however, introduced a bug into the final product that I didn't catch until after the competition had ended.

Instead of having all of the game constants jabbed at the top of the main game module, I moved them off to another module (config.py) so that the menu and instruction screens could access them.  I missed one place in the game loop where it it calls:
hud.followers -= POWERS[action].cost
instead of:
hud.followers -= config.POWERS[action].cost

Classy.  Also, I forgot to upload my logging version of the code, so I couldn't really help anyone who had a problem running the game.

Next Time:
  • Get some help chasing down game assets.  I'm no artist or composer so I trolled around looking for publicly released (CC licensed) sound and tiles.  This took a long time that could have been better spent working on the game.  Next time I'm roping someone else into the team to help with this.
  • Have some idea what the finished product is going to look like before jumping in.  It was hours of work untwisting my existing code so that I could add something as simple as a menu.  Once done, the code looked much better (not great, but better) and was easier to use.  Should have started here but I didn't want to end up with a great start menu and no game.
  • After playing through all of the games that finished I was blown away by the sound in few games.  I loved the voice acting in The Sea of Good and Bad and the effects in M√∂bius Freak.  Next year I'm tracking down my friends with a sound recorder. :) 

I hope everyone enjoys (or at least, can run) my game.  The competition was awesome this year and I'm looking forward to digging through the source code of a few of my favourite games.

Add a comment