CIGA Game Jam 2017 during 17-18 June 2017 is the first major game jam I participated in China.
That is being said to create a game within 48 hours. The theme announced at the event taking place at Huaqiaodong Dream Space, a cafe shop with space for hosting a small or medium size event.
Organizers posted the theme for participants to think about via image.
Image courtesy of people.com
So in this post, I will go through my development process. How I organized and split the chunk of time to do each task, and be able to come up with a game that has essential features I aimed for from start.
But before we go through all of those detail, the following is what the game looks like.
Click on image for full resolution
Schedule the Time
I knew myself I will face a hard time trying to implement certain feature if it requires some effort, or spend time too much on certain thing without bound, thus I need to mark the silo of time from beginning.
From above, I categorize only main tasks into
|Task||Alloted Time (hours)||Schedule||Percentage|
|Ideation||2.3||17 June, 18:00 - 20:00||5%|
|Development||36.8||17 June, 20:00 - 18 June, 10:00||80%|
|Polish (Sfx, Music, Bugs fix)||4.6||18 June, 10:00 - 13:30||10%|
|Misc||2.3||18 June, 13:30 - 16:00||5%|
|Total||46.0||17 June, 18:00 - 18 June, 16:00||100%|
Notice that it's not entirely 48 hours, as that 2 hours was spent as presentation.
During the entire time, I try to stick to the plan as best as I can to minimize the risk of not enough time that usually happens at the end of overall development cycle; yup, to not miss any particular stuff i.e. sfx, important bug fix of the game.
Coming up with Idea
Look at the theme image, I ever tried to rotate the image to see it from different angle. What it came up to me is the "root".
So the idea develops into "planting", "maintenance", and "collecting". So why not creating a game that allows two players to compete each other. That involves planting tree, taking care of them by watering, and collecting their benefits (fruit, and seeds). With these, we can repeat the whole process until match's timeout. Who gets more fruits wins!
Actually both players win as we help to plant tree for the better.
Initial rough sketch that shows the idea about tree's planting, and maintenance. Further with divided areas for each player to compete in taking (latter is discarded in iteration).
Initial rough sketch that shows available areas for taking for advantages.
The big picture of idea is there, but during having done with iteration of each feature implementation, I found out that few features are rather difficult and has enough time to develop, or too much involved with graphical assets. So I cut a few ideas out.
Attacking opponent with a bow
This requires a cursor locking system to be implemented. Use another analog stick to aim, and player's animation needs to be in synced. This idea or see below I saved as reference inspired me to implement this feature.
Anyway I found this might be too much for the game, thus it's better to remove it. Then while play-testing latter version of the game, by chance I found that attacking can be interchanged with stealing mechanics. As player can pick up bucket, seed, and fruit, and also can place them down on the ground if they want. Thus player can throw it to another player to suddenly make opponent carry that stuff (if such player has empty hand). This is to annoy, and introduce time delay to focus on collecting fruits which are the main score of the game.
Anyway, from public play-testing by other developers in the event, some suggested that it'd be good to be able to attack another player in some ways. They want to do it in the game.
Large area of water tiles
Water tileset is one of variety in tileset I initially aimed for to have from the beginning of design. During mid phase of development, I found out that it would take more time to have a realistic look of water tileset after play-testing it. So I changed this to have only a single tile to represent water allowing player to fill water into a bucket.
This idea or you can see below, and also shallow water you see above inspired me and thus I saved them as reference to pursue this vision although cut them out and changed to single tile at the end.
Factory to Generate Seeds & Fruits
Z is old DOS game that comes to my mind. That game has entire map divided into areas. Each area might have a factory to produce something useful for player to use it as advantage to compete with oppononent.
Latter in the development cycle, it requires careful judement on balancing, and art creation. Thus I cut it out, and let the tree which players grow to produce such seeds and fruits for endless score until match's time is up.
The tools I use are as follows
- libgdx with kotlin as programming language
- Android Studio 2.3.3
- Aseprite - for pixel art and animation
- tiled - for tile-based map editor
- Bfxr - for sound effect (background music, and some of sfx I downloaded them from Internet)
As you can see, I prefer to use only open source tools.
Requirement to Run the Game
- Java Runtime at least version 1.6+
- Xbox360 controllers for two players (due to the game doesn't offer button mapping as configuration so if you use different brand of controller, button might be changed. But all in all, you can use other controller but keep in mind it's not tested).
- *Keyboard to control player is not support yet.
The following is a working desk I've occupied to work on the game. It's nearly perfect suitable for standing desk.
Right after ideation, I quickly started the development process in which I knew deep down in my mind that I'm not a fast coder who can implement something very quickly compared to others as I have noticed this from past experience.
So I stick to the plan, and start coding early. I noticed that I've started coding way earlier than most other participants. While I'm coding, other teams still discussing about the idea; even the next day in the morning, discussion was still going strong but that time I went through already down in development.
I'm not saying working as a team is wrong. But just my taste and this particular of time that I prefer working alone.
Don't get me wrong, I work with others as a team before, many times. Either student, game jam, or commercial projects.
Thing is working in a team, time will be spent in politics which is cost in communication of discussion. You cannot go fast in short term. But if things settle down, things will be faster in long term. Compare that to single or solo developer, you can go in any direction you want, I mean right away. No discussion or approvement, short term is very good, but long term beware of burning out due to you need time to sleep. That gap of time "a team" can still operate.
This game jam is a challenge for me to produce art resource by myself. I'm not artist by nature, thus artistic vision is not yet there. So in order to fasten the process, I did much of the research and tried to find lots of artistic reference out there before deciding especially which color palletes and style to go before drawing.
Initial player sprite
Mostly for animation for certain action, I aim for 3-4 frames no more than that.
Player 1 is carrying fruit while Player 2 is idle. Trees are grew into final state.
I counted my hours spent and below is what I found
- 38 hours of development
- 6 hours of sleep
- 2 hours of relaxing i.e. watching random Youtube videos, chill, etc
The first ~24 hours is non-stop working. I've stayed overnight at the cafe then get back home in the evening of next day to sleep and relax before continue the work at home overnight until coming back at the venue for presentation.
There's no strict rule that you need to be at the venue all the time.
What Went Right & Wrong
Things Went Right
Cut out Time-consuming Features During Iteration
Focus on Pixel Art Style
Yes, I'm not an arist by nature thus by focusing on pixel art style which is the possible way that I can achieve with my ability.
Start Actual Coding as Early as Possible (according to scheduled time)
So with this I have more time to breathe and fix important bugs especially z-order sorting, tile's line bleeding, and camera bounding.
Things Went Wrong
Not Immediately Start with Actual Game Session in 5 Minutes Presentation
That said, 5 minutes is too short. I instead started with introduction talking in which that time should be well spent else where. The game is more suitable to be presented right away with live demo. Also for solo developer that has worked long hour, speak less to minize risk of doing something wrong and just show the end product is better. So my presentation is not good. This is an important lesson learned.
Gifs in Action
Giving Thing to Opponent
Player can give a stuff which can be bucket, seed, or fruit to other player.
Giving thing to opponent
Growth of Tree
Tree has 3 step to grow. Only the final step in which it can generate seed and fruit.
Left: Tree grows into step 2
Right: Tree grows into step 3
Generation of Fruit and Seed
Fruit will be treated as a score whenever player takes it back to stockpile tiles. Seed can be used to further grow another tree as well.
Fruit and seed generated from a tree
Collect the Fruit for Score!
Fruit is a main target for player to collect for score.
Collect a fruit back to stockpile for a score
Fill Water in a Bucket
Bucket can be either empty or full. In order to water the tree, player needs to fill a bucket first. Find a nearby water tile to fill it.
Fill a bucket with water from a nearby water tile
Watering the Plant
Take bucket with water filled to water the tree to accelerate its growth.
Water a tree to accelerate its grow
This is one of major thing I'm fortunate enough to have time to fix it. It can go horribly wrong if this thing didn't get fixed before showing the game to public.
As not every object has the same size as tile dimension, take for example a tree which has very long height compared to player's dimension. If not sort in drawing order properly, then player might be drew in front of the tree at the situation that player should be drew behind. It's good that the game fixed this.
It turns out that the fix is easy. Use the height of object, then subtract it with desire size of object i.e. player. Use y position as z position in 2D game, then sort all object according to that value, draw object with bigger value of y first. Do this every frame.
I feel satisfied with producitivity and result I can produce at the end. All essential features I aim for from beginning get implemented, and it's a good feeling that when you play the game with another player, it's fun.
The game got covered as seen in Chinese media here.
Although the game didn't manage to be in top 3 popular vote, but that's totally fine as it's not my objective. Other fellow developers seem to be very interested and had fun when they play the game. That's a mission accomplished.
Great thing is to see people smile and laugh while playing your game.
Thanks to Kim from 手游龙虎豹 gaming media in China for photo
Didn't remember the source, please contact me if you took it
Thanks to KoooN from DJI for taking this photo
At last, I open sourced the project too if you're interested to know more (note the license of the project).
Head to raceplant.
All in all, feel free to let me know what you think about the game below in comment section.
Happy making game folks!
- Phoebe - for organizing and facilitate presentation as I need to play the game at the same time of presenting
- Kim - help translate rules and announcement from stage from the start, also misc stuff
- KoooN - introduce me to Phobe and this event, and also professional photo. Without you, I might not have a chance to create this game.
- Fellow developers - for very friendly, warm welcome, and support throughout the time of event even after. You guys make game development scene here very warm welcoming! Also not to mention about all advice, and suggestion. Thanks for communicate with me!
- Xiuyi - thanks for coming by hn, take photo, do social sharing to spread the word, help me communicate in Chinese and demo the game in front of other developers. I'm a single handed thus this helps a lot.
This writing piece is a cross-post from Wasin.io blog.