PyWeek - Last Train to Nowhere

You are an outlaw on the run - and you need to get the hell out of town.

There's only one problem: the train has already left. Ok, two problems: it is also packed with law men.

Only one thing to do: load your six-shooter, saddle up, and chase that train down!

Source code on Bitbucket


arnav mauve

Last Train to Nowhere

Awards


Vector animation extravaganza
Presented by Cosmologicon

Give this entry an award

Ratings (show detail)

Overall: 3.7
Fun: 3.5
Production: 4.3
Innovation: 3.2

16% respondents marked the game as not working.
Respondents: 15
Files: Uploader Date
traintonowhere.zipfinal 3.70 Mbytes mauve 2012/09/16 00:45
1.0.0
day7-1.pngfinal 151.11 Kbytes mauve 2012/09/16 00:17
Last Train to Nowhere
day7-3.png 138.96 Kbytes mauve 2012/09/16 00:17
Gold rush
day6-1.png 52.62 Kbytes mauve 2012/09/15 00:31
A horse with no name
day6-2.png 87.40 Kbytes mauve 2012/09/15 00:21
Stand off
day5-4.png 99.62 Kbytes mauve 2012/09/14 00:07
Shootout
day4-1.png 85.65 Kbytes mauve 2012/09/12 23:46
Bang
day3-2.png 61.84 Kbytes mauve 2012/09/11 23:42
It's been "crate" knowing you
day3-1.png 56.28 Kbytes mauve 2012/09/11 23:27
Collision volumes
day2-1.png 90.01 Kbytes mauve 2012/09/10 22:37
Locomotive
lasttrain.png 144.25 Kbytes mauve 2012/09/10 06:41
Mockup

Sunday 16 September, 2012

[ mauve @ 00:32 ] Last Train To Nowhere: Day 7

Saturday is always the highlight of Pyweek. You've spent 6 days laying a foundation and on the seventh day you write an awesome game. It's like the opposite of what God would do.

Many features went in today, including much more sophisticated AI written by Arnav, much more scenery, sound, music, intro screens...



The combat got much better, so hopefully people will find the game is fun to play. Also we added a side challenge - collect the gold. This is very useful actually, as it forces the player to explore the whole train:


Saturday 15 September, 2012

[ mauve @ 00:34 ] Last Train To Nowhere: Day 6

Today I spent a very long time tracing and tuning the animation of a horse from Muybridge's originals. I think on balance it was worth it, as chasing up to the train before the level starts is pretty epic:



There were also a few minor tweaks, such as these gold bars and health crates:



All in all, I think we're in pretty good shape. We still have a lot to land in tomorrow's final push, but I'm always amazed at how much difference a Pyweek Saturday can make.

Friday 14 September, 2012

[ mauve @ 00:17 ] Last Train To Nowhere: Day 5

At last the game seems to be more or less fully playable. Not all the stuff in the original concept is implemented yet, but you can have a fight, and die (frequently). It's not that enjoyable yet, because the AI is very punishing.

I think something like reloading is needed too, so that you can spot your moment to attack. Possibly it also needs hand-to-hand combat so you have the option to charge in when you spot the moment. And some grenades would be a nice addition too.



Hopefully we'll have enough time to iron all these issues out.

Wednesday 12 September, 2012

[ mauve @ 23:59 ] Last Train To Nowhere: Day 4

After a slow start redrawing the trains to add more headroom for jumping around etc, I added bullet physics -  and a law man to use them on:



The only really challenging feature left to tackle is AI; then we just have the simple matters of:

  • Ladders
  • Death, respawns, victory conditions etc
  • Tons more art - backgrounds, scenery, train cars and more
  • Levels
  • Decoupling train cars
  • Menu screen
  • Sound

Tuesday 11 September, 2012

[ mauve @ 23:47 ] Last Train To Nowhere: Day 3

Two features dropped today.

The first and greater is a pure-python physics engine built on geometry code from retrogamelib and Super Effective's vector. So for once I don't have to worry about people not being able to compile PyBox2D or Pymunk - I just have to worry about it being chuffing slow. It doesn't have a broad phase yet, but it does have a rough and ready collision solver. So what you're seeing here is the dude standing on a box that he can also push around (hence they are both highlighted green).



The other thing I landed was a basic character animation system, which as promised keeps most of the animation state in the scenegraph, loaded from JSON. A trick for entering up animation data was to set up a quick optparse-based script which modifies a JSON document. So I can add a new animation to pc.json by running:

python anim_add.py -f pc.json -n running -f 0.3 -a 69,14 pc-walk{1..8}.png

It doesn't modify anything you don't specify on the commandline, so I can add more animations or tweak one property of an animation quite easily. Effectively I can get structured data into the game without writing an complicated editor, writing a complicated parser, editing ugly data files by hand or running the risk of making syntax errors.

Here's a random shot of our chappy pushing a crate out of the back of the train just because he can:

Monday 10 September, 2012

[ mauve @ 23:13 ] Last Train To Nowhere: Day 2

The main thrust of my effort today was in adding more detailed objects to the scenegraph. The scenegraph mainly allows me to group sprites and animations together as compound objects, but I have scenegraph nodes to do depth effects and some that implement animation though custom draw() methods. So the scenegraph consists of animated 2.5D objects, like this locomotive with animated piston linkage:



I'm also going to write the character animation system as a scenegraph node, so I can keep logic and presentation separate. This has been a problem in some of my previous projects - classes that represent, say, a player character, and deal both with its control and presentation, are quick to get up and running, but soon become very complicated. Having a clear interface for the logic to control the presentation should help manage that complexity.

Sunday 09 September, 2012

[ mauve @ 23:17 ] Last Train To Nowhere: Day 1

Day 1 kicked off with a brief brainstorming, as we hadn't come to any fixed conclusions about what game to make.

We've decided on a straightforward platformer set on a train:



Arnav has worked on physics (from retrogamelib) while I got stuck into the artwork. I have 29 frames of character animation, three train cars and the start of a steam locomotive.

I've also put together some OpenGL code to handle perspective on the tracks:



The sleepers look a bit flat, but it's harder to see that when they are whizzing past at speed.

Thursday 06 September, 2012

[ mauve @ 21:10 ] Warm up game: Archipylago

We started early this year, with a warm up game to try out Pyglet under Python 3 and to introduce my teammate Arnav, who I work with, to games programming.

This is a clone of an Android game called Archipelago in which islands exchange squadrons of aircraft to take over their neighbours. Our version looks like this:



Clone it from the Bitbucket repo if you'd like to play (requires Pyglet 1.2a and Python 3). Player is blue, AI is red. To play: click on one of your islands to select an origin island. Then click to select a destination to send a plane to - this costs half of the island's resources. Ctrl-Click selects multiple origin islands. You win if you eliminate the red team.