The Seeds of Friendship

The Seeds of Friendship was developed for the 2017 Global Game Jam. The theme for this year's Jam was "Waves." We came up with a few different ideas, but ended up settling on a beat-em-up style of game where you don't beat anyone up. Our interpretation of the theme was the idea of waving at others. The pitch started as Fists of Friendship where you play as a warrior waving hello, patting backs and giving presents to ward off enemies. Somewhere in the mix, we decided to switch to cute animals as the art would be easier to make. From there, we started making puns like Orange-utan and StrawBearry and The Seeds of Friendship was born.

Design and Scope

In our game, you play as an orange-utan just trying to have a good time. The goal of the game is to cheer all the inhabitants of the land up, even the grumpy old Octonana living in his watermelon cavern. Using your citrusy powers, you wave at enemies to send your lemon and lime friends over to them to cheer them up. The lime wave acts as a stand in for common melee attacks and cheered inhabitants a lot within a short distance. The lemon acts as a ranged attack doing less damage but spreading good vibes out a little farther. The game is 2 dimensional but offers some wiggle room to move from foreground to background. The mechanics are fairly simple, but the team believed these simple mechanics and the cute and bright art style something we could make look really good in a 48 hour timeframe. We started the jam at 5:30pm on Friday night and finished a fully functional version of the game at 3:30pm Sunday.

We wanted to make a vertical slice of the kind of play this game would contain if we were to extend it into a lengthy project. Our slice contains two levels, one fruitcake level containing waves of Tomatogators and Strawbearries attacking the player in waves and a boss level inside a watermelon cave at the end. By our 3:30 submission, we met those goals and had a playable build running through both levels. In the haste of completing the game however, there were a fair amount of bugs. This version of the game had a lot of issues, and needed some serious debugging code to get around, but was playable.

The player (Orange-utan)

The movement, health, and combat system was fairly simple to develop​. The player moves by driving a unity rigidbody2D around the map. We made it to he could move in all different directions, but was blocked from moving vertically by colliders and blocked horizontally by having two colliders parented to the camera that would be just outside of the camera's frustum. The camera simply moves horizontally to find the player's rigidbody and center it using linear interpolation to make the transition smooth. We bound the left and right extents of the camera by making it so that at any point in time, the camera will not follow the player if they are standing to the left or right of threshold values. This allowed us to limit the space that an encounter occurred in, while still giving the player some room for each encounter to move left and right and have those encounter spaces be larger than what the camera could cover. This is more evident in game than in the demonstration GIF's This system is by no means perfect, and I actually would still like to make further improvements and is on a checklist of future fixes

The health system is very simple and simply uses integers to track health and then represents the health bar with a linear interpolation for color and fill amount. We went with blue for low health instead of red to show that the player is becoming glum rather then being hurt. In hindsight we might change the color of the blue as it nearly blends with the sky behind it. The melee attack is a collider that turns on and grows in the same motion as the lime using mecanim, unity's in-engine animation system. With that I was able to scale the hit box with the lime in real time to make it feel more blade-like. I also attempted to include a knock-back system but it didn't communicate well with the AI. I left that as it was to stay on schedule, but it is on the possible fix list. The ranged attack is a bit more simple, I simply spawn a new lemon gameObject and set its forward velocity. If I had more time I think I would make the lemons fall as they traveled and hit the ground and disappear as they reach a certain distance and lose momentum. I would also love some interesting particle effects for when either of these attacks land, but there simply wasn't time for it.

The Enemies (Strawbearry, Tomatogator and Octonana boss)

​Every year for the global game jam, I try to attempt something new to challenge myself, two years ago, when I worked on audio for a game, I tried layering audio tracks based on conditions for the first time, last year for perihelion, I tried coding in story states depending on how a game has been completed. For this years jam I for some reason decided to tackle enemy AI for the first time, and it took all of Saturday for me to be happy with the way that it turned out. I started by making the AI for the Strawbearry and testing everything for him since I figured the Tomatogator would be the same with a few minor tweaks. In hindsight, the behaviors I wanted the two to have were nearly identical and could have been one script with more adjustable fields. The AI included an entry state for the enemy to enter on screen and once it had reached a certain point, wander around. I did this by having it generate a random normalized vector2 and setting the enemy to travel in that direction for a random time within a range and limiting it further to make sure enemies always stayed in the playing area. When the player would enter a search radius I wanted to make it follow the player but not have a direct kiting effect. I did this by keeping the ranged amount of walk time before the enemy would stop moving and attack. Attacks were done in the same way as player attacks, by animating a hitbox. When a player would get far enough away from an enemy they would escape a large trigger collider and the enemies continue wandering around randomly. I would love to revisit these scripts to fix any leaks in the state machines for the enemies, make the actions more precise and important, to consolidate the two AI's into one script (or to both inherit from one) and to just make the enemies feel more fun to play against.

The most fun thing for me to work on in this game was also one of the most simple things. Making the Octonana boss that lived in the watermelon cavern was a blast. The character relies entirely on a state machine of idle-charging-attack- repeat. It operates in a looping coroutine that waits a moment to be idle and let the player attack then telegraphs its attack with a few charge seconds. In these seconds I just change the face and linearly interpolate color based on the time spent charging. When it is ready the Octonana has a two-thirds chance of aiming its spinning attack directly at the player, with the alternative being a random shot to give the player some breathing room and mix playstyles. The tentacles of the Octonana have a ridigbody2D on them and I "animate" them by simply setting their rotational velocity equal to their directional velocity. Bosses health is communicated by the amount of tentacles it has. It starts out bruised and with 8 mean tentacles but the more its cheered up, the less tentacles it uses to fight and the less bruised it gets. This is my first time making a boss fight and while the boss is easy to develop and to fight, I love the way it came out and would only change it by adding some wind up to the tentacles before the attack.

Post-Global Game Jam Weekend

By this point, our goal for the game was complete and we were out of time in our weekend. We were able to make our way through waves of enemies in one level, then fight against a boss in the next and the experience felt whole. However, when we finished this version on Sunday, it still had a fair amount of bugs and issues along with it due to a hasty development cycle. I wanted to share the game on this site right away but the experience just wouldn't be the same with the issues. Wanting to release something better, I gave myself 8 hours over the next week to fix the issues, make a main menu, and give my fellow developers a proper end credits screen. I finished fixes on Friday with roughly 8 hours of work since I didn't have any menu system to start with at the end of the jam. I believe I have squashed most, if not all of the major bugs that were there at the end of the jam and feel like it's a much better experience because of that.

​If I were to revisit this there would be plenty to fix and improve upon, and I know a lot of the artists on the team would like to make some small tweaks and adjustments. As of now, I won't be doing any more because I feel like doing anything more that adding in the menu system, credits and fixing major bugs is all that can be done without really continuing development past the 48 hour mark, since those things I listed are really just polishing and framing the game we already developed. If there is enough interest from the team or people playing the game I may continue development and if there is enough hype I would continue adding more levels, bosses and try to drop it on steam for free, but I have a lot of other projects on my plate at the time I'm writing this and will be shelving the project for now.

Where to get the game/see the code

The game is now in a form I would call complete for the game jam. I had a lot of fun with this game, but I'm glad this chapter of development was able to be opened in closed in a week so I can start on new projects. Updates may come, but for now,