Over the past 96 hours, 4 of my friends and I competed in this year’s game maker’s tool kit (GMTK) game jam.
You can try it out here: The Mutiny Of Willy Killem
In this post, I’d like to discuss the process behind making the game, a little bit of the technical trickery we used plus the challenges we ran into.
But first, a little context:
GMTK is a Youtube channel that talks about game design and every year hosts a game development competition (jam) where thousands of people make thousands of games. This year over 10,700 games were made! Each year we are given a theme that we have to make a game around. This year’s theme was “Count Down”.
A few weeks ago, I posted about making my first 3D game in Defold - ( Making My First 3D Game In Defold ). I wanted to challenge myself and do another 3D project for the GMTK Jam.
The idea:
The idea we came up with was a pirate game where your crew is constantly growing restless and is ready to mutiny against you if they remain unhappy for too long. On top of that we added in a 21-day timer until “The Event” to give the game a proper ending.
This way the player has to balance resources such as food and rum while also trying to build a crew capable enough to take on “The Event”.
Starting development:
I started by once again forking an existing 3D project I’ve been working on. Within this project I’ve been utilizing a number of projects from the defold asset portal including:
- Druid - Druid - Component GUI Framework
- Used this for all menus, utilized a wrapper I wrote to also integrate controller support with it
- Scene 3D - Scene3D
- Studied and used a very similar first-person camera set up and mouse capture logic
- Lights and Shadows - Light and Shadows example
- Used for the lighting effects
- Stylized Water Shader - Stylized Water Shader
- Used for the water effects throughout the game
The combination of all these assets has led to a pretty interesting render script, especially since I left in the ability to convert back to 2d graphics when I need to (is utilized later in this project).
3D Modeling:
I gave myself the task of 3D modeling the assets within the game while my 2d artist (Preston) focused on the sprites and eventual texture work.
My main focus for this first day was the pirate ship:
I approached this with a “less is more” philosophy where I wanted to re-use the same 3D models as much as possible. This let to a highly module pirate ship with several interior rooms:
Within Defold, I gave each room it’s own game object, model, and parent ID. The parent ID works as a controller for what is and is not visible at any given time. In previous attempts at 3D games, I’ve tried to manually give each object an ID but this was time consuming and error prone.
Using “get parent and go.exists” I was able to have each GO check to see if it’s parent has a script with a unique ID in it. That allowed me to keep a tree hierarchy where I just needed all objects to have the “get parent ID” script and to be under the correct parent game object.
While I am sure there is somehow a better way of doing this, this worked perfectly for my project and allowed me to fade out entire rooms with one function call.
The final result (with Preston’s art) was stunning:
The main gameplay of this ship consists of running around and interacting with crewmembers to keep their spirits high. to do this I leveraged anonymous functions in lua. I was able to store the next function in line from the function I used to call the script. When the dialog menu is closed the game checks then runs the anonymous function.
-- this function is called to open the dialog menu and
-- have the speaker (marked by Primary ID) say something
local function openCrewMemberDialogMenu(self, text, nextFunction)
if self.menu == nil then
self.menu = factory.create("#normalFactory")
local message = {}
message.primaryKey = self.primaryKey
message.text = text
msg.post(self.menu, hash("gift_info"), message)
self.fireOnDialogExitFunction = nextFunction
end
end
-- later
if message_id == hash("close_normal_dialog") then
closeMenu(self)
if self.fireOnDialogExitFunction then
self.fireOnDialogExitFunction( self, message.id )
else
msg.post(self.sender, hash("interaction_over"))
end
end
This system was surprisingly versatile for a project of this scale. I have previously played around with loading dialog trees from a JSON file but that has seemed excessive given the size of project I have been working with.
I was unfortunately not able to get all of the dialog in from our writer (Julie) and will work to get that completed after the voting period for the jam has been completed.
Apart from the main ship, there are a number of side areas you can sail to including:
- Save Harbor (allows you to purchase more materials)
- Island Raid (allows you to collect loot from an island)
- Ship Combat (allows you to fight other ships to take their loot)
The “Island Raid” ended up being a 2d level due to the time constraints of the challenge. While it doesn’t graphically mesh with everything else perfectly it does get the job done:
If you’d like me to go into more detail around any of the technical aspects of the project. Please let me know!
Challenges
The main challenges we ran into were:
- Not getting screen scaling correct
- I think there might be some code missing or wrong with my render script that’s causing this not to work correctly. with me mixing the 2d and 3d render code, I very easily could have missed something.
- Some players having performance issues
- Still trying to determine what the cause of this might be. Out of all my defold projects, this is the only time I have ever encountered someone with performance issues. If I had to guess it would likely be the water shader.
- Moving objects at small scale (I work at 1 unit = 1 meter) is hard. I wish there was a mode / setting that let me move objects at units smaller then 1.
In Conclusion:
Overall, we had a blast working on the project! There is a lot I wish I could do with this game, and I might update it in the future at some point with some of these additional ideas.
Defold over the past few years has become increasingly viable for 3D game development and I love it! I am excited to see what additional features are coming to continue making development easier.
If you’d like to try the game, here is the link: The Mutiny Of Willy Killem by IanGoGo









