A Game of Pirates Post Mortem

posted 07 Jan 2013

First off, Happy New Year!

Well, Ludum Dare 25 happened on the weekend of December 16th and I took part, again. The main reason I wanted to make a game was to finally learn Ruby properly. I managed that, at least.

The theme was: “You Are the Villain”, which is quite an interesting game and it’s not really a type of game that’s exploited enough. Sadly I didn’t really come up with something really interesting, just a pirate game.

Don’t get me wrong, I love pirates and a pirate sailing game is something I’ve always wanted to make. Of course, there’s Sid Meier’s Pirates, but I’ve not tried that, so I can’t compare, nor could I rip it off.

Basically all I wanted was for the player to sail around islands and pillage some randomly generated villages. I decided it would be better to take hostages, but I hit a few major bumps while coding that I’ll get into in a minute. The game I came out with was very limited and really unfinished. You could move a ship around randomly generated islands, but the enemy AI and scoring mechanics were really not good enough.

Now, the actual development: I used the Chingu library, which is made by Ippa, the same guy that made Jaws, which I used for A Game of Towns in LD 24. The library was quite good, but I learned quickly that I could not distribute it on Linux as the dependencies were just messed up on anything but Arch Linux. I also fell into the major trap of a jam: “Know your library beforehand”. Really bad idea to try and learn a library and make a game in 48 hours. My main problem was that I tried to re-invent the wheel and build a vector class. Let’s just say that took 8 hours and it was a 2 line method call in Chingu, so that wasted most of my time.

My second mistake was getting trapped in an “I can fix this” loop. Spent a good chunk of time trying to get viewport following, but I just couldn’t get the map to follow. Because of this all the other mechanics really really suffered.

Now those aren’t really horrible mistakes, and I’m fairly happy that I actually managed to make a game, that is, somewhat, playable (here).

Really the main thing I learned was Ruby. It’s really a beautiful language, and it just reads so well. A major downside is that it’s not quick and it certainly isn’t easy to distribute. Although I did find that other people were using orca and it worked perfectly on Windows, without any issues at all. I had meant to find out what dependencies I needed to install Chingu on Ubuntu, but I never got round to that, and it probably wouldn’t have encouraged any more people to play anyway.

If you want to learn Ruby, the best resource for me was Why’s Poignant Guide to Ruby, which you can read for free there. It’s filled with lovely, memorable examples and really teaches you, quite quickly how the hell Ruby works. Also, do test things out in irb (The Interactive Ruby Shell), it just makes prototyping ideas and syntax easier than running the sometimes slow compiler.

Feel free to browse/fork the code, even take the images, I don’t mind: Github: A Game of Pirates

Anyway, I hope this was useful to someone, and I’ll hopefully have more to say once I get through this section of my Uni group project.

Ludum Dare 24 Post Mortem

posted 04 Sep 2012

2 Weekends ago I took part in Ludum Dare 24. I managed to get a game made in time which was my main goal. The game isn’t quite finished and I’ve spent the last two weeks continuing to work on the game and improve it.

First off, A Game of Towns isn’t a proper game. It’s more of a simulator, but that’s all I managed to do in 48 hours.

I am quite happy that I managed to make passable art and something of a decent simulation in the time given and I am happy enough to continue with the game.

The community for Ludum Dare is very strong and I had a lot of fun hanging out on the IRC channel (#ludumdare at irc.afternet.org) during and after the compo. There are still a few weeks left for voting so I still hop on every so often.

I just quickly wanted to describe the tools and languages that I used for the competition:

  • Jaws HTML5 Gaming Library Jaws covered the main brunt of the keyboard and mouse controls, and the display
  • CoffeeScript was used for the Java script as it is far easier to write and is similar to Python or Ruby, where standard JS is a little nasty to write.
  • Vim was my main text editor and all the coding was done within vim, with several plugins to make life a little easier:
  • Vim CoffeeScript This plugin allows vim to compile to JS on write, which is a much simpler workflow.
  • CoffeeTags with Tagbar was used to show all the methods and classes in the project.
  • Sprites were created in Aseprite, although my tablet stopped working so it was much more difficult than normal
  • Chrome was my main method of debugging my JavaScript. The stack traces and breakpoints work much better than they do in Firefox.

Those were all the tools I used and they are all Open Source, as is A Game of Towns. I will be continuing to develop A Game of Towns for the next few weeks, I have a few ideas I’d like to run with to make it more of an RTS than a simulator.

You can view my Ludum Dare competition entry here.

The next Ludum Dare Compo is in December, and I really recommend trying it. The community is great and it can forces you into releasing software very quickly. I’ve had a lot of fun these two times I’ve participated.

Have Fun.

Ludum Dare Warm Up

posted 22 Aug 2012

Ludum Dare 24 is this week, Saturday morning to be exact. I really enjoyed doing the last one so I thought I’d give the 48 hour version of the competition a try.

I knew from the get-go that I didn’t want to use a heavy C++ library as it would take the better part of the 48 hours to get the engine going so I decided to try out HTML5 development. There are dozens of different libraries to choose from, but after trying Gamvas, which wasn’t suited to me, I settled with Jaws.

Jaws so far has been very easy to use and fulfilled almost all my needs for my little warm up game which you can play right now.

I don’t have a very strong background with Javascript so the HTML5 game has that challenge for me. Although I’m using CoffeeScript which makes JS much, much easier to play with.

It only took me about 24 hours to make that little warm up game so I’m hopeful I can get a game completed for Ludum Dare if I concentrate on the theme and keep my scope fairly tight, as that has been my problem on the other game competitions I’ve done. for a few hours at a time.

I also have been using several of these plugins: Vim as Your IDE, which have sped up my development by quite a bit. I am also using vim-coffeescript which provides a few more tools for working with CoffeeScript in Vim.

Well that’s all I really have to say before Ludum Dare, hopefully I’ll have something to show by next week when I do a post-mortem/wrap-up.


posted 19 Jun 2012

Last week was 7DFPS, a week long competition (or jam) to make a First Person Shooter (FPS). I and two of my friends participated in the contest and I thought I’d talk about our game: OxyFPS.

The idea, which I and a few friends at University came up with was to have a shooter on a planet without any oxygen. This provides a twist to the normal format as you can’t have weapons that rely on combustion, and the player will always have that fear of running out of oxygen in the middle of a fight.

We had chosen jMonkey as our development library but none of us actually sat down and tried it until the jam started. This was a bad idea, as jMonkey has a habit of doing some weird and wonderful things that wouldn’t be the way I would do it. This made development more of a case of finding the part of jMonkey would create what we want, and how to manipulate the strange outputs you get out.

Don’t get me wrong, jMonkey has a lot of benefits, given more time we could probably have made a beautiful game. jMonkey has plenty of really nice highly detailed things that you would expect from a premium engine such as the UDK, but at the price of Open Source.

OxyFPS was definitely not finished by the end of the competition, but it’s on its way to being a nice base for adding some of the more time consuming features we couldn’t implement during the 7 days. Namely modelling and making the game run on slightly slower hardware.

You can find the source for OxyFPS on Bitbucket and can download the 7DFPS release and possibly future releases on the projects 7DFPS page.

In the future I may try and add a dedicated page to OxyFPS somewhere and link to it from the projects page on this site.

7DFPS was quite fun and I would probably do it again as the community is very friendly and it was fun trying a 3D game for the first time.

OSS Photography Talk

posted 05 Jun 2012

Today I presented my Open Source Photography Workflow talk. I feel that it went fairly well. I made all my points, but I did it at a ridiculously fast pace, but I’m still not great at talking to groups of people. There was a fair amount of time spent of questions and demos which probably made a lot of the things make a little more sense.

You can read the talk in the above link as it’s all written using a HTML5 slideshow system called Deck.js which was really nice to work with and I might try and work on my Jekyll system for Deck.js after 7dfps, which starts next week.

My current Jekyll system for Deck.js is very “hack-ish”. The inidividual markdown files are ordered by dates rather than a number system, which makes things rather difficult to edit. I’ll either try and write a Jekyll Generator or probably just write my own Jekyll-like system from scratch in Ruby.

Also, here’s the source for my slides: OSS Photography Talk @ Github

One last note: I managed to delete all my partition tables when installing Arch Linux on my main PC. Debian was getting on my nerves so yesterday I just decided I’d had enough and installed Arch.

Everything was going well until grub started being finnicky and not installing properly, which led me to try and wipe the MBR. In doing so I must have also deleted the Partition tables, which you don’t really want to do.

The Partition Tables, basically are a list of where your hard drive is split up. Because the hard drive is split up, there are tools to try and find those gaps. I used TestDisk as I’ve used it before and it did a fairly good job.

After a few hours of scanning I managed to recover all three hard drive partitions. (I still don’t know why I wiped the other two drives) I did lose my Arch Install, but that was no great loss as I hadn’t done anything with it.

After all that I still can’t get grub to work. sigh.

Beginning Of Summer

posted 23 May 2012

Well my Summer started a few days ago and now I need to find some projects to keep me occupied for the next 4 months. I will probably look for a job, as that will fill the most time, but at the same time I’m going to try and code a few games and other projects I’ve been looking for some time to get on with.

Project 1

Right now this is a game very much in it’s infancy and I’m not really sure what direction to take with it. Looking at a turn based game on a hexagonal grid as my main inspiration and I have a few ideas around this. Right now I’m just working on the game engine in SDL and OpenGL, which is taking some time but I’m enjoying playing with graphics at a lower level and also giving me more familiarity with C++.

Project 2

Another game, but this one is taking place during the 7dfps will hopefully take up a week and maybe the week’s after as I have a lot of ideas for the game that I’ll probably make in the time, and the team I’m working with have quite a lot of ideas as well. Over the next few weeks we’ll probably just be coming up with ideas and getting some of the base ideas fleshed out to get on with coding for the 7 days.

Project 3

This is more of a general project, but I feel it will be beneficial in the long term. My Raspberry Pi is arriving in the next week so I have ideas for setting up a VPN, backup, web server and a few other things on that. I will try to write down the steps I’ve taken to do things, as these seems like something I should really be doing (I always forget how I setup systems).

Project 4

Working on finally building my Ganeti cluster and the Puppet and PXE setups that go with that as well. Can probably work all of that out in a week or less.

I will probably accomplish none of these, but I’d be very disappointed if I can’t complete any of them. Currently the 7dfps and Project 1 are getting my most enthusiasm, but I might have some fun with my Raspberry Pi when it arrives.

Side note: today I stuck Magic Lantern on my camera and had a brief look around the features. My favourites so far are:

  • Capture during record
  • Follow focus using the auto focus of the camera
  • Timelapse functionality (on camera)
  • Audio level meters while recording video

Will play with these a little more if I go out and do some proper photography as I’ve been avoiding going out the house these past few days.

Well, that’s it for the next few weeks. Will probably write an update on what if any of my projects I’ve finished or gotten to a share able point.

Have fun.

P.S Turns out I don’t have any styles for lists or headers in posts. I’ll fix that along with my responsive design I’ve been meaning to roll out.

Ludum Dare Post-Mortem

posted 24 Apr 2012

So last weekend was the 10th Anniversary Ludum Dare and I actually took part in this one. The theme this time round was Tiny World which was one of the themes I was most looking forward to.

Ludum Dare was good fun and I learned quite a lot about game development and would do a few things differently if I ever submit an entry for another Ludum Dare. The community was very active and was interesting to just sit on the Ludum Dare IRC channel throughout the event.

My partner for the Jam was Dan Bell and he managed to come up with the base idea for the game within 20 minutes after the theme announcement on Friday. We quickly started bandying about ideas for an Osmosis like game but more based around planets.

Starting as a small comet you must collect other comets and avoid asteroids to build up your mass to gain planet status. Then you can work on collecting an atmosphere for your planet, while avoiding boiling off all your water by going too close to suns. Third stage you have to ensure that your inhabitants aren’t crushed by comets and asteroids and aren’t frozen or burned to death, so you need to stay in Goldilocks Zones.

This was our intention but we didn’t manage to fully finish the first stage. We were plagued by strange bugs that were connected to some badly written code by me and quirks to the game library we were using, PlayN. We also used JBox2D to handle the physics for the game. (This is packaged in PlayN)

After all these I spent a day trying to work out how to package the projects as something other people can play, which neither Dan or I had ever actually attempted. After hours of messing around with Maven I found a plugin for Eclipse called: Fat Jar which built the project into a nice executable jar.

It would have been nice to release a HTML version, as that’s the whole reason PlayN exists, but we just couldn’t figure it out so there’s just a jar you use to play.

My only condolence is that we actually released something, which wasn’t fully fleshed out or working properly at all, but it can be “played”, which is enough for me.

Ludum Dare Entry Page: here

Just run it in Java, and it should work, there’s a LONG list of problems though.

If you’re interested in game development, I recommend Ludum Dare, it’s just a good goal to get something finished. I think this is one of the only projects I’ve ever gotten to a state where I can publish it.

Here’s a graph of how long I used programs over the weekend.

Selfspy Program Graph

And here’s the data:

Prog. Name Time Spent
Lxterminal 1 days, 4h 49m 28s
Eclipse 1 days, 3h 5m 50s
Firefox 14h 10m 43s
Pidgin 6h 30m 15s
Gnome-mplayer 1h 34m 49s
Meld 47m 5s
Android SDK Manager 46m 6s
Inkscape 25m 30s
Viewnior 21m 40s
Hotot-qt 17m 39s
Deluge 13m 29s
Wine 9m 16s
Thunar 8m 38s
Gimp 6m 27s
Shutter 3m 2s

I forget to turn on Selfspy for 12 hours at one point so it’s not 100% accurate. t also doesn’t show what I used in the terminal, like vim for editing git commits.

Ludum Dare 23

posted 18 Apr 2012

This weekend is Ludum Dare 23, the 10th anniversary of one of the best known “build a game in 48 hours” competition.

I’ve always meant to give it a try, and this seemed like the perfect time to give it a go. I’m not completely confident in my game development skills so I’m doing the much more lax Ludum Jam.

The jam is the same basic competition and has the same theme as the proper Ludum Dare, but it’s a little more open. Firstly, you can do it in a team. Which suits me as I’m doing the jam with a friend from University who has a little more experience with game development than myself. This is the main benefit, but the extra day and being allowed to use other code and libraries are just little things that make the Jam more open to everyone.

It’s going to be a long weekend but it should be fun and should get a decent game out of it.

Over the week I’ve been playing with PlayN and jBox2D, which are the two tools we’re using over the weekend they seem very straight forward to use and I’m familiar enough to not be staring at documentation for the entire 72 hours.

I will probably be blogging during the jam, but I’m not yet sure where. I’ll probably link to it here and on Twitter, so do check those on Saturday morning.

Have fun.

A Brief Update

posted 02 Mar 2012

Well I’ve fallen out of updating this every week/month, but I should really get back into the habit of writing a blog as it reminds me that I actually do things and that I need things to talk about.

So lately I don’t have that much to talk about. University has kept me busy lately with coursework, but I’ll admit I’ve spent the majority of my time just playing Dwarf Fortress again, as there was the first update in a whole year. These are reasons I’ve not been productive for the past 2 weeks, not really sure what I’ve been doing between January and now though.

Oh, yeah, I was trying to set up a Ganeti cluster but I had terrible problems trying to bridge my wireless network into my room, as I’m not allowed to run cable in my house. After about 6 hours of trying to debug that I realised that I could just move the machines to the room with the internet connection and router, as I really only need an Internet connection to update some software and download the necessary things to get Ganeti working.

My plan for setting p Ganeti will also force me to learn Puppet and PXE booting , which I should probably have set up sooner as they seem very useful in the administration world and will make setting up my two machines for Ganeti clustering a breeze.

So after my disaster with bridging I gave up on Ganeti for a bit as I’m trying to find the right time to just install three computers in the computer room of my house without my parents getting on at me.

But I did manage to complete something I’ve been meaning to do for a while. I finally converted my netbook to use LVM (Linux Volume Manager) . I was thinking it would be a daunting task as my Arch Linux install was across 9 partitions (really, don’t ever do that) but it ended up not being very painful at all and I managed to keep all my data. Huzzah!

The process was simply this:

  1. Backup whole Linux install to an external HDD (I used rsync for this)

  2. Create a new partition on the disk and set it to LVM in fdisk. I had a spare media partition which was very useful

  3. Create the LVM on the disk.

  4. Create a volume group for the disk

  5. Create 3 new logical volumes in LVM (root, home, swap) Swap is a little tricky you need to make sure it’s a continuous block

  6. Use mkfs on my new logical volumes. I just used ext4 as it seemed the most suitable

  7. Mount the volumes and transfer my Linux install across

  8. Recompile the kernel to have LVM flags set (important!)

  9. Re-configure grub to find my new LVM

    • I had to install Grub2 at this stage as Arch Uses Grub1 for some reason.
    • This meant that I completely broke grub, but fixed with Live CD’s.
  10. Good to go

One thing I didn’t mention is the necessity to have a separate /boot partition. I don’t mention that above because I already have a separate /boot so had no problems with that. If you don’t have a /boot grub won’t be able to load from it, so you’ll be stuck.

I think I was just lucky that the whole thing worked with only one hitch, but that’s because I don’t like Grub1 and had never gotten round to changing it before now.

So now I’m very happy as I can live-resize my disks with ease and can easily play about with partitions without having to muck around in fdisk, which has caused me many problems before.

So that’s pretty much everything I’ve done. I haven’t touched MazeOtaur nor anything else programming related except University stuff so I’ll really need to get back on track with that.

Anyway, have fun.

Winter Development

posted 06 Jan 2012

Over my 3 weeks Winter holiday from University I’ve managed to get a fair amount of development done for my game, MazeOtaur. It’s still quite a way off from being published or even in a playable state, but it’s getting to a playable point and I should be able to put it up for testing in the next month or so.

A few of the things I’ve been working on are rooms, braided mazes and torches. These are some of the important defining characterists of my game, to make it somewhat unique.

Rooms weren’t too much trouble to implement. I simply generated a few sqaures on the map, then let the maze algorithm connect them together. I made this hard for myself because I wanted a limited number of entrances to a room. Eventually I gave up on this, but my braided maze code saved the day for getting this to work.

Braided Maze with Rooms

Braided mazes are mazes which have no dead-ends. This means there are plenty of loops throughout the maze, which makes the stealth aspect of my game more interesting, as before there was only one path. My braid implementation isn’t perfect, there are still a few dead-ends, but it does look and play much better as there are multiple paths. My braided maze algorithm works by simply giving a weight to every, that states how many corridor tiles are adjacent to it. Using this and Primm’s algorithm I can check the weight of each tile, and if it’s small enough I can connect to it and possibly make a loop.

That method was the simplest to implement but other methods like finding dead ends and just knocking out a wall would also work, and would give you a fully braided maze, unlike my partially braided maze.

The last thing I’ve implemented over the past few weeks is torches. These have been the main element I wanted to play with since I came up with the idea for the game. I basically wanted the player to only see parts of the maze, making the maze much more difficult and more interesting. As without torches the game simply becomes Pac Man without the Cherries.

Initially I thought lighting would be a difficult thing to implement, but the approach I took was very simple and worked quite well. I simply gave every cell a lightLevel value of 0, and when there were torches, I would simply increment that level. To get a nice spread of light I used a limited depth first search to find all the cells adjacent to the first, torch node. This worked quite well as you can see from the main picture on this post.

Breadcrumbs are a small feature I added to try and make the maze easier. A friend suggested this, but he also suggested making the Minotaurs eat the breadcrumbs as they walked along their patrols. Which is an interesting idea, but would be horrible. Perhaps if I have a hard mode I can introduce this. Breadcrumbs took 10 minutes to implement so I’m not going to talk about them.

You’ll probably notice from the images that not all my features are in all the pictures. This is because I’m trying to learn how to use git properly, by branching all my implemented features, then merging them into a development branch. After some bug fixes in development, I can then merge into master.

This idea was working well, until I started putting bug fixes in random branches, rather than making a seperate branch with the fix then merging it to all my development branches. This was fairly annoying as one of my bug fixes was to ensure the display actually displayed things, as sometimes it set it’s height to 0, which was very annoying.

Another thing I was playing with was Sonar which is a static code analyser. It’s been very useful, but was horrible to set up.

Next time I’ll probably talk about Sonar or my git setup, but I’m sure my git setup is horrible and could do with improving.