Thursday, April 24, 2014

Gumball Fall - Keep 'em Coming Back

Version 0.10.7 Released:

GumBall Fall v0.10.7: Web Player | AndroidGoogle Play BETA | Google+ | Twitter

Major Changes in v0.10.6 (April 25, 2014):
  • [Fix] Changing name should now properly save
  • Rework of the guts of the Game Active state to make it a bit more robust
  • Any remaining Bomb Balls at the end of the round will detonate. Any gumball caught in the Bomb Ball’s radius will be added to the player’s score
  • Leaderboards now show player’s rank for Daily/Weekly/Alltime
  • Introducing Daily Challenge Boards:
  • Each day, a new, predetermined board will be presented to the player
  • The player can see the ‘normal’ leaderboard for today’s challenge
  • The player can see his/her Rank for today’s and yesterday’s games from the main menu
Major Changes in v0.10.7 (Mar 26, 2014):
  • Tutorial rework. They now more closely represent actual game play
  • Graphical Updates

Sooooo, you have a game, but, after a few plays, what motivates the player to keep playing? That's a loaded question with an infinite number of answers, but, player retension is certainly a key metric to consider when developing your game.

First and foremost, you need an enjoyable game. But, even with that, the player will eventually get bored. She wants a challenge and at some point your game just isn't going to cut it.


Effective, but, too time consuming to create

For Gumball Fall, I opted to NOT introduce the concept of game levels. Perhaps that's an ill-advised choice, but, introducing levels into a game inevitably requires one to actually develop unique/fun/interesting/engaging levels. When done right, the results can be fantastic. Extending your game's lifespan can be as easy as releasing new levels for fans to play. But, alas, level design can be a huge time-sink... Even if you come up with a way to proceduraly generate GOOD levels. When you're creating a game with a round-completion time of under a minute, you're not developing 1 or 10 or even 20 levels; you're talking about developing 100 or 200 or 300 levels as well as a back-end framework to support them.


Will Daily Competitions generate repeat players?

In lieu of game level progress, I opted to roll the dice with the allure of competition being my main form of player motivation. Several releases ago, weekly and daily leaderboards made their way into the game. For each of the four game variations, the player could now see a more localized score target to gun for. But, I was looking for more...

The first 'more' has been introduced in v0.10.6, Daily Challenge Boards. The concept is simply: For 24 hours, a unique competition board is made available. The board will generate gumballs in a predetermined order giving all participants the same set of gumballs to play with; giving them a level playing field, if you will.

The hope is, given a time-limited goal, the player will be enticed to complete it. Once complete, she'll have motivation to relaunch the game the next day to find out her results. Aaaaand... since she's already loaded the game, she'll hopefully feel compelled to compete in the new Daily Challenge. Wash. Rinse. Repeat.

What's currently implemented, is far from ideal. Short of seeing their rank, the player receives no other positive reinforcement. There's no celebration music for being in the Top 10. No medals to reward a high rank. No confetti exploding. No tracking of historical data (i.e. how many times has the player been ranked #1, Top 5, Top 10, etc.). Nothing. That'll come... eventually.


Even if Daily Challenges catch on, that's still only tapping one segment of the population: The Competition Crowd. How can I up my odds of retaining the folks that could care less about competition? Right now, my thoughts are leaning toward appealing to the Collection Crowd (i.e the Completionists).

Players LOVE achievements

Achievements for the Xbox caught on for a reason: People love to see that 1000/1000. There's something compelling about 'completely finishing' a game. And, companies took notice. Sony introduced trophies in the Playstation platform. Valve introduced achievements into Steam. Apple, Google and Amazon introduced similar accomplishment tracking. The list goes on. I'm currently in the early planning stages of integrating Achievements into Gumball Fall. Along with implementing a more traditional set of achievements (most likely tied to Google+ and/or Amazon) I'm also considering offering Daily Challenges/Achievements as well. Think Subway Surfers and similar games. Each day, the player must complete a (usually) simple challenge to collect a reward. Completing challenges across multiple days equates to even larger rewards. Bottom line: The player (hopefully) keeps coming back for more

So, what do you think of my plans? Good? Bad? Ugly? What other 'hooks' might be out there just waiting to be tapped? Drop me a message if you have some ideas!

Thursday, March 27, 2014

Gumball Fall - Shake, Shake, Shake... Shake That Booty!

Version 0.10.5 Released:

GumBall Fall v0.10.5: Web Player | AndroidGoogle Play BETA | Google+ | Twitter

Major Changes in v0.10.4 (Mar 25, 2014):
  • Color scheme updates including one with patterns
  • Tutorials re-integrated into the system
  • Highscore screen now can show Daily/Weekly/All Time scores
  • [Chaos] Shake your device and watch the gumballs shift!
  • Music volume tweaks
  • Leaderboards and local data reset (Platform ID 1004)

Major Changes in v0.10.5 (Mar 26, 2014):
  • [FIX] Gumballs in Order modes should no longer frequently become lost when chains containing gumballs from the extreme left and right columns are created. NOTE: They might still infrequently become lost
  • Reduced force imparted on gumballs when you shake your device
  • Experimenting with adding a bit more ‘bling’ when you complete a chain of 6+ or blow up a bomb. This will likely continue to change with future releases
  • While still likely not 100% accurate, Weekly and Daily scores should now report more consistently between global and local leaderboards

It’s been a few weeks now since I’ve had an opportunity to sit down to add an entry to this development blog. I would love to report all sorts of fancy new features since the last update. But, sadly, development of Gumball Fall has slowed down these last few weeks.

Why The Slowdown:

Part of the slowdown can be blamed on illness. I was useless for roughly a week. But, mostly, life has just popped up various activities that have been consuming my time in lieu of pursuing further game development activities.  But, enough excuses... onto the noteworthy updates!

Color Schemes - Round 2:

Basing any aspect of your game solely on one sense (sight, hearing, etc.) should be avoided if at all possible. Such a decision has the potential to alienate part of your potential player base. As noted in an early post, I basically ignored that advice for Gumball Fall... Gumballs are round and brightly colored! Only color will be used to distinguish gumball differences! To attempt to address my decision, I introduced a few different color schemes specifically designed to be distinguishable by various types of color blindness.

Despite my efforts, colors alone will never cover all color blindness scenarios. To better address this scheme deficiency, I decided to introduce patterns into one of my schemes. The gumballs can still be perfectly round and more folks will be able to see them! That’s a win-win. After trying a few different tactics, I settled on a combination of sports-based gumballs along with a few other random items to round out the 6 gumball types. The way I see it, while not as popular as solid colors, I’ve seen my share of ‘sports’ gumballs in machines. Little kids like losing $0.25 to chomp down on a gum-based ‘baseball.’ Why not have them in my game?

Pattern-based gumball sprites and their highlights

Thanks to a buddy, the patterns have passed their initial ‘color blind evaluation.’ We’ll see if they hold up when released to a wider audience!

Shake, Shake, Shake… Shake That Booty:

Or, more accurately, shake that mobile device… but, that doesn’t flow off the tongue nearly as well ;-)

From the moment Gumball Fall was pushed to mobile devices, there’s been one constant that everyone, without fail, as tried to do: Shake that last pesky gumball into place to create that long chain. For just as long of time, I’ve had plans to integrate a shake feature into the game. To integrate a mobile device’s accelerometer in a meaningful way, I had a few design decisions to make.

Does tilting affect gravity? Ultimately, no. I don’t want tilting/shaking affecting gravity. Once you wish to control ‘gravity,’ you have to be concerned with the device’s orientation so you can correctly determine where ‘down’ is. Is the player holding it vertically vs. horizontally vs upside down vs on some random angle? What happens if the player wants to adjust his playing angle from when he first started? What happens if (s)he pauses the game and resumes later with the device in a different orientation? etc. etc. There are multiple ways to address these questions. But, I have no desire to open up that can-o-worms. Instead, I’m just going to ignore the whole gravity control issue.

In lieu of messing with gravity, shaking will just jostle the gumballs… kinda like smacking the side of a snack machine to loose that stubborn candy bar from the metallic grasp of the machine. Now comes the question, how ought I smack that snack machine?

The accelerometer aspect of the equation was fairly straightforward: Simply look for ‘quick’ differences in accelerometer values. The basic algorithm is nothing more than:

  • Get current accelerometer value
  • Compare to previous frame’s accelerometer value
  • If current is ‘sufficiently different’ from previous → player shook the device
The one consideration to keep in mind is that the accelerometer values (at least as reported in Unity 3D) constantly fluctuate similar to what you’d see in a true analog device. To account for this, I’m averaging my accelerometer values over a few frames

With the definition of ‘shake’ completed, what ought I do when a ‘shake’ actually happens? I tried a few different ideas:

  • Approach 1: Simply apply a directed force to every gumball in the game. While this, indeed, moves the gumballs, the result looks awfully uniform. I was seeing the whole group of gumballs simply move as one big blob. It didn’t really look realistic
  • Approach 2: Directly Apply a force to the walls and/or floor and allow those things to bump the gumballs as appropriate. By adding rigid bodies to the walls and floor and clamping them to not move, I was able to apply any amount of force to them, the force would transfer to the gumballs and, the walls/floor would remain unmoved. This gave the the gumballs a more natural looking behavior, but, still felt stiff
  • Approach 3: Create a spring-loaded basket to cradle the gumballs. If I’m making a physics based game, why not take full advantage of the physics engine? Why artificially clamp the boundaries? This idea lead to the creation of a simple U-shaped ‘basket’ suspended by 3 springs, one each at the top, left and right sides. When a ‘shake’ occurs, a force is applied to the basket. As a result, the basket bounces causing the gumballs to jostle. Thanks to the spring forces, the basket quickly resets itself and is ready for its next ‘shake’

Ultimately, I like Approach 3 the best. It looks the most natural and, as a result, (I feel) it gives the most ‘accurate’ results. Ultimately, the players will decide if I’m correct. As I gather feedback, the springs will be tweaked as needed. Additionally, similar to pinball, a Tilt system may be introduced. Shake that thing too much? Find yourself S.O.L. And, if it's a complete flop... back to the drawing board!

When it's all said and done, KC and his Sunshine Band had it right. You gotta shake that thing!

Alrighty, that’s a large enough wall-o-text for this update. Thanks for reading!

Thursday, March 6, 2014

Gumball Fall - Stop & Squish The Bugs

Version 0.10.3 Released:

GumBall Fall v0.10.3: Web Player | AndroidGoogle Play BETA | Google+

There's that age old saying: Sometimes you have to stop and smell the roses. Well, what do you do if you find out those rose bushes are overrun with pesky insects?

Major Changes since v0.10.0:
  • Bug Fixes:
    • Fixed menu transition animation in Settings menu when users exit the menu via hitting the Android ‘Back’ button
    • Chains starting with Rainbow Balls will select proper color to pop when chains of 6+ are created
    • Score for selected chain now correctly displays above your finger/mouse
    • Suggested moves should work more reliably now
    • Board resets when no moves are present should work more reliably now
    • Gumballs should no longer fall when game board is clearing during Game Over
  • Ease-of-Use Enhancements:
    • Game Mode help screens can now be closed in 3 ways:
      • Tap anywhere on the screen (initially implemented way)
      • Press the newly created “close” button
      • Press the Android ‘Back’ button (i.e. escape key on keyboard). Users were constantly pressing this button and watching the game exit… which is what they didn’t want
    • Canceling moves is now more obvious: Drag your selection over the trash can button
  • Audio Updates:
    • Reworked volume settings UI in Setting menu to address audio bugs and to replace volume sliders with toggles
    • Reworked play music logic to ensure music is played at the correct times/locations
  • Graphical Updates:
    • Updated font used to render score from selected chain
    • Frank now informs you of the type of bonus you received (Rainbow, Bomb, Clear)
    • Most 3D models swapped for 2D sprites
    • Revamped gumball animation system allowing for more fluidly gumball animations
  • Various Performance improvements

Squash Those Pesky Bugs:

Over the last several weeks, implementation of featrues in Gumball Fall has been in a holding pattern. As much as I'd like to continue adding new (and, hopefully, fun!) features, sometimes you need to reflect and correct what you've done.

I've had a known set of bugs that I've continued to ignore for a while. I've dedicated the majority of my time this period to squashing them... or at least attempting to.

The majority of my (known) bugs do not cripple the core gameplay. They merely inconvenience and/or confuse the player:
  • Invalid suggested moves
  • Board reset when no moves present... Okay, this one CAN break core gameplay
  • Gumballs continue to spawn when the game is over
Without going into the nitty-gritty details, these bugs can be pretty much summed up by pointing the finger at less-than-ideal Coroutine design/usage. The logical underpinning behind each of features was solid. However, in an attempt to get these features quickly integrated, they were fired off in continuously running coroutines and left to fend for themselves. The longer a game round lasted, the more likely the coroutines' timings would drift from the actual game which increased the likelihood of these oddities showing up.

The reimplementation still uses coroutines but they now use a more event-driven one-time shot approach. For example, when the board is deemed to be in a 'stable' state, an event is fired off to make suggestions, etc. This eliminates any sort of looping time skew and ensures that the game will only perform these events at very controlled times. Thus far, the reimplementation appears to be working as intended.

Using Unity More Gooder!

‘More Gooder’ being a technical term, of course. I've mentioned in the past that, as a solo developer, I have neither the time or skill to recreate the wheel. If a suitable solution exists, I should consider using it to accomplish my goals. Well, as far as gumball animations for suggesting/selecting goes, I wasn't fully living up to my own words. Knowing full well that Unity provided a 'modernized' version of its animation system, I continued to stubbornly use their legacy system. Not embracing the new system amounted to me wasting time attempting to control many aspects of the gumball animations that I shouldn’t have had to concern myself with. Needless to say, using this legacy system forced me to introduce less-than-ideal logic into my game code that, ultimately, lead to various animation bugs.

Taking the handful of hours to migrate over to the 'modern' animation system immediately corrected these bugs. Additionally, transitions/blends between non-selected, suggested and selected gumballs look far more natural than they ever did using the old system.

All Hail Our 2D Overlords!

Gumball Fall plays out in a 2D universe, but, has historically used complete 3D models to represent said gumballs, bombs, etc. This release sees the removal of these models. They've been replaced with another new-ish feature of Unity: Sprites. The main rationale for the change came down to performance. When targeting mobile, every draw call counts. Ever extra vertex or polygon counts. I noted in a previous post that I had to make visual fidelity sacrifices in my 3D models to achieve some magic vertex count numbers to take advantage of draw call batching in Unity. While attempting to make the game more visually appealing (aka, adding more 'juciness'), the draw call numbers started to creep back up.

Sprites were the answer to my situation. The beauty of the sprite rendering system is that, with few (no?) exceptions, Unity handles sprite drawing as a single draw call. Shifting to sprites from 3D models instantly reduced my draw calls by a factor of 6. Additionally, the number of triangles getting drawn dropped from thousands upon thousands to around 800.

Overall, I'm happy with my move to sprites but, it did come with some drawbacks. Most notably, the automatic 3D shading I was getting with cube mapping my 3D gumballs is no more. My initial rendition of the new 2D gumballs were literally nothing more than solid colored circles. I could bake a shadow and specular highlight into the sprite, itself. But, if the sprite ever rotated, the shadow and highlight would rotate with the sprite... needless to say, not 'realistic.' While there are 3rd party shader options that claim to '3D shade' 2D sprites, I've come up with a 'hack' of a solution that, for now, is getting the job done. I've created a shadow/highlight sprite that simply gets independently superimposed over the solid colored circles. The circles can rotate all they want while the super-imposed shadow/highlight sprite's rotation remains forever constant. No extra draw call is needed for the shadow/highlight. Maybe not the most elegant solution, but, it works, looks decent, and has minimal performance hit on the game.

Before (left) and After (right)

It is worth noting that this solution probably will become annoying to maintain if I expand beyond just having simple gumballs. Creating/swapping/etc. the shadow/highlight entities for various shapes incorrectly could introduce some interesting visual bugs.

That’s all for this update. Give the latest build a spin and let me know what you think!

Thursday, February 27, 2014

Gumball Fall Needs a Facelift... STAT!

Version 0.10.0 Released:

GumBall Fall v0.10.0: Web Player | AndroidGoogle Play BETA | Google+

Functional is great. Pretty and functional is even better...

Major Changes since v0.9:

  • Complete visual overhaul (except for Tutorial Screens. They’ll be revamped in a future revision)
  • Player and Leaderboard stats reset
  • Scoring scheme tweaks:
    • 4 Chain = Omni Ball. Omni ball can be added to any chain
    • 5 Chain = Bomb Ball drop. Select a Bomb Ball to collect all gumballs around it
    • 6 Chain = All gumballs of selected color removed from board
  • Bomb Ball
    • Blast radius reduced
    • Model updated to actually look like a bomb (thanks Bryan!)
  • Number of gumballs in game reduced from 63 to 56

I've openly admitted on more than one occasion that art is not my calling. Whenever I set out on a new game creating adventure, one of the things that I know will always be lacking is the artwork in my game. With that said, I find joy in attempting to push my artistic boundaries to make the best art I'm capable of making. Part of the fun of development is to see what I'm capable of creating with the talents that I have.

The Facelift:

Phase One of my art upgrade happened several releases ago. My art moved from a stale all-black motif to a gumball-pink motif complete with Frank, the (lovable? annoying?) gumball-corralling bunny. If nothing else, the game took on a bit more personality and was a (small?) step in the right direction.

Needless to say, the art was far from perfect. The pink drew many comments along the lines of "that color hurts my eyes!" The font was deemed difficult to read, in part, due to the various font sizes I was using as well as the fact that some words were (accidentally) using the incorrect font face. And, the background (in all of its pink glory) was "too bland."  To make things worse, folks were still having difficulty navigating through the GUI.

As a result, I've gutted and revamped the entire GUI. While the jury is still out on a few aspects, early feedback is positive. The presentation is nicer. The font is consistent in both size and face across the game. And, most importantly, folks are having a much easier time navigating through the GUI.

They say a picture's worth a 1,000 words. So, here's 5000 words worth of before-and-after screenshots:
The Main Menu

The Summary Screen seen after you've wrapped up a round

The Scores and Stats screen where you can check out the leaderboards

The revamped Moves Chaos game in action

The revamped Timed Order game in action

Scoring (v0.4):

Release v0.9 introduced version v0.3 of my scoring system. Instead of a potentially difficult to understand rolling bonus, I introduced the idea of receiving Bonus Balls for creating long chains. After just a few days in the wild, and thanks to a great set of testers, I quickly discovered that the scoring system was woefully unbalanced. Under the correct set of conditions, folks were getting scores in the 200,000+ range while others were stuck in the 1,000 range. Needless to say, this situation couldn't stand. While it was great to see high-score strategies emerge, the system let to comments along the lines of "there's too much thinking involved now," and feelings of never being able to compete with the top players.

As Gumball Fall is geared toward being a casual game, "thinking too hard" isn't something I want to hear. With that said, I still like the concept of the more tangible Bonus Ball rewards vs the old rolling bonus system. As a result, the reward system has been tweaked in an attempt to add more 'casual fun' back into the game as well as reduce the unbalanced nature of the previous scoring system.  Only time will tell what more tweaks will need to be done to the system... or if the system will have to be scrapped and stated anew.

Shout Out:

After several hours of attempting to learn the basics of the 3D modeling program Blender, I had all but given up hope of ever being able to create even the most basic 3D models for my game. I barely succeeded in UV unwrapping a simple sphere and had several failed attempts at creating a simple 'cartoon bomb' to add to my game.

What took me hours of work to attempt, my friend Bryan was able to whip together in 10 minutes. Thanks to him, I now have a proper looking 'cartoon bomb' in my game. Maybe one day I'll master (or at least become competent in) using Blender. Until then, I'll just have to keep bugging Bryan for my simple 3D modeling needs.

Thursday, February 13, 2014

Bonus Scores (v3.0) and Usability

Version 0.9 Released:

GumBall Fall v0.9: Web Player | Android | PC | Mac | LinuxGoogle Play BETA | Google+

Here's an obvious statement: An unhappy player is a player that isn't going to stick around very long. My goal for this latest round of updates is to directly address some of that player unhappiness.

Major Changes since v0.8:
  • New scoring scheme:
    • 4 Chain = Omni Ball drop. Omni ball can be added to any chain
    • 5 Chain = 2x multiplier drop
    • 6 Chain = Bomb Ball drop. Select a Bomb Ball to collect all gumballs around it
    • 7 Chain = 3x multiplier drop and all balls of same color cleared
  • Cancel move implemented. If you start a chain then decide you no longer want it, simply drag above or below the play area and all will be forgiven
  • Initial Round End warnings - Audio cues now trigger with 10 seconds remaining. More to come
  • New screen layout during actual game play
  • High scores will attempt to re-upload if the server is down (until you exit the game… they they will be lost)
  • More gumballs added. The total now sits at 63 (up from 48). Subject to change!
  • After a move, your score for that move is now displayed

The last couple weeks of work can be broken down into two categories:


Much of the the feedback I've received lately has revolved around usability. Among all the feedback, some general themes stood out: (1) What!?! You have more than one game mode?, (2) I'll love to cancel a move I've started to make! and (3) Dang... I didn't even know my round was almost over!

Many players never realized they were only accessing 25% of my game. Three of the four game modes were left untouched simply because my UI to select these modes wasn't immediately obvious.

The picture on the left shows the 'old' UI, the one on the right, the 'new' UI.

'Old' Mode Select
'New' Mode Select

My hope is that the new UI will draw more attention to itself and hopefully the white vs black motif will aid in understanding what mode is selected and, more importantly, that different modes even exist. Time will tell if more drastic measures need to be taken

The other two themes, canceling moves and round end warnings are, in hindsight, pretty obvious issues that should have been addressed long ago. While I don't feel either is in its final state, they are both functional

There's actually a fourth theme that I've yet to touch on: How the hell did I get that score? That last theme leads me to...

Bonus Scores (v3.0):

Early on, I had a goal to reward players for creating long chains of gumballs. Iteration #1 had the player getting rewarded with a rolling bonus score that would be added to any future chain when they created chains of 4 or greater. Over time, this bonus would automatically decrease which required players to make moves quickly lest they lose out on the bonus. Iteration #2 was an evolution of that system. the rolling bonus grew based on long chains, but, it now only decreased when a player made a move of less than 4. The time pressure was removed from the system, but, the player could now be cheated out of bonus simply because the game board lacked any 4+ size chains.

In addition to the above problem, players simply didn't know what their bonus was at any given time. Sure, it was flashing for them to see at the top of the screen, but, looking at it meant they were losing precious time by not looking at the board. Moreover, players didn't quite understand how the bonus was calculated or why it was decreasing. This resulted in players feeling frustrated.

Introducing Bonus Score System v3.0! I don't know if this will be the final system, but, I think it has a lot of potential. In lieu of implementing any sort of rolling bonus score, I've introduced Bonus Balls into the mix. Creating a chain of 4, 5, 6, or 7+ will drop a unique gumball type associated with that chain length into the game. Additionally, each bonus ball does something different. One type, will let you match it with any other color, another type will multiply the score of the chain its connected with, and another type will simply blow up a bunch of gumballs around it. I'm hoping that this new system will (1) be easier for the player to understand and (2) will add depth to the gameplay as the player now has more choices to make. Like everything else, only time will tell how this change pans out.

My Artistic Abilities... or Lack Thereof:

This blog entry wouldn't be complete without at least a quick mention of the hours I've spent struggling with 3D models and Blender. As mentioned several posts ago, in attempt to take advantage of Batch Draw Calling, I had to abandon the built-in Unity 3D sphere mesh for a lower vertex count version I created in Blender. What I didn't realize at that time is that, by default, Blender doesn't export (or perhaps Unity 3D ignores?) UV map info. So, in Unity 3D, if you attempt to apply a texture to an exported model it won't texture correctly unless you manually unwrap the UV on your model in Blender.

To make a long (and boring) story short. 3D modeling and me are like oil and water, no mater how hard you try to combine the two, we'll never properly mix.

Thursday, January 30, 2014

Chaos Moves, Time Moves and Leaderboards... Oh My!

Version 0.8 Released:

GumBall Fall v0.8: Web Player | Android | PC | Mac | Google Play BETA | Google+

This past week has seen a whirlwind of development activity with the addition of not only two new game mode variations, but, also linking GumBall Fall to some global leaderboards. The player now has the option to ditch the frantic pace of Time mode and, instead, engage in the more leisurely paced strategic Moves mode where the player has 30 moves to rack up his/her high score.

Also, those scores aren't just local any more! Need some motivation to play? Check out how your scores match up with the rest of the world.

Major Changes in v0.7.1 (Jan 27, 2014):
  • [BUG FIX] (re)Corrected issue where the game might lock up when a round was finished (leaving gumballs uncleaned)
  • Introduced Game Mode Moves. Instead of 60 seconds, you now have 30 moves to rack up gumball chain
  • Revamped bonus scoring system. Instead of bonus points decaying with time, they now decay whenever the player fails to make a chain of size 4+ ( 1 point decay for each move under 4 )
  • Tweaked Score screen layout. The Top 10 list of your last play mode will now be listed first in the scroll view

Major Changes in v0.8 (Jan 29, 2014):
  • [BUG FIX] Fixed some problematic gumball animations
  • Introduced Global Leaderboards. The top ten players from around the world for each game mode are shown
    • NOTE: If you’re not online, your high scores will NOT be uploaded
  • Player Name can be set in the Setting menu (or during the initial tutorials)

The rapid development this week is the direct result of design decisions made early in development or, in the case of Leaderboards, decisions made during Bouncing Bombs! development.

Decoupled Modular Building Blocks:

I enjoy spaghetti... just not mixed in my code. As mentioned in a previous post, GumBall Fall makes liberal use of a messaging system that allows all of the various pieces and parts of the game to broadcast and subscribe to information they're interested in. This keeps my game objects decoupled from each other quite nicely. They don't care who (or how) the information is sent/received. They just care that they sent/received it.

Which now brings us to Time vs Move-based game play. If you think about it, 60 seconds is a heck of a lot like 30 moves. Something counts down and, when it reaches 0, the game's over. The only real difference is one countdown is dictated by nature and the other is dictated by the user.

The game object responsible for determining when a game is over listens for game 'tick' updates. When it receives a 'tick' it decrements its 'tick' counter by an appropriate amount and determines if that lowering is enough to end the game. Thanks to the messaging design decision, this GameOver game object doesn't care how the 'tick' was generated (or when it was generated); it just cares that it received one.

So, to switch the game from Time to Move-based, all one has to do is swap a countdown clock game object for a move count game object. Both broadcast their 'ticks' at appropriate times and the GameOver game object is none the wiser.

The result? An easy to implement game mode to diversify GumBall Fall's game play!

Generic Leaderboard Server Interface:

During Bouncing Bombs! development, I settled on using for my leaderboard backend. It provided a simple/stable/cross-platform RESTful interface to code to and has proven to be a reliable service.

By the time Bouncing Bombs! was released, I had developed a (mosty) generic leaderboard server interface. To interact with the system, a game object simply messaged a request to the leaderboard server game object and registered for a response. Porting this interface to GumBall Fall was a no-brainer.

You might have noticed 'mostly' from the last paragraph. Turns out, my 'generic' server I though I created wasn't quite as generic as I though it was. Small pieces of it were still directly tied to Bouncing Bombs! specific types. But, 98.4279% of the code was good-to-go. After about an hour of tinkering, the leaderboard server interface was transformed into a completely generic standalone piece of software. And, 15-20 minutes after that transformation, it was integrated with GumBall Fall.

As long as remains free and reliable, I'll definitely be reusing this lovely piece of generic code in all of my future game projects!

But, but, but... what about The Googles and Amazons?!? They offer various services to implement leaderboards and achievements and cloud saves!! While these services exist, they are (1) mutually exclusive (i.e. Google Play Games services don't run on Kindle devices and Amazon Game Circles services only run on Android devices IF they were downloaded via the Amazon App Store) and (2) require the player to actually commit to setting up (or activating) an account with those respective companies. To me, both of these points add a decent amount of friction to the user experience and, thus, were not my primary online targets.

With that said, moving forward, I still have plans to investigate integrating both the Google Play Games and Amazon Game Circles services into GumBall Fall (for use in their respective marketplaces). But, until that day, the generic approach provides me with a global leaderboard solution while requiring the user to provide nothing more than a simple nickname and it'll work across any platform GumBall Fall is running on (PC, Mac, Linux, Web, Android, Kindle). Even if I end up integrating the services, I still plan on keeping the solution around.

Thursday, January 23, 2014

Two For The Price Of One

Version 0.7 Released:

GumBall Fall v0.7: Web Player | Android | Google Play BETA | Google+

Two! Yes two, two, two build milestones in one (blog post). After releasing GumBall Fall v0.5 a few weeks ago, documenting my coding exploits took a bit of a downturn due to a variety of reasons. Since then, two pre-releases of GumBall Fall have been released into the wild.

With each release comes a more polished product. Release v0.6 saw the first push of the game into the Google Play Store BETA program. If you’re interested in joining the public BETA follow these directions and join the fun!

Major Changes in v0.6 (Jan 16, 2014):
  • Graphics:
    • New Desktop & Android Icon 
    • Selected gumballs now highlight their ‘closeness’ radius. If another gumball of the same color falls in this radius, it can be added to the chain 
  • Game Play and Internal Logic: 
    • Gameboard now resets if no valid chains are detected for the player to select 
    • After not finding a valid chain for ‘a bit’ the game will suggest a chain for the user 
  • Brand new Intro Tutorial. Still needs polishing, but, it’s a BIG improvement over what used to be there 
  • Various UI tweaks 
  • First build to be signed and pushed to the Google Play Store in BETA form

Major Changes in v0.7 (Jan 23, 2014):
  • [BUG FIX] Corrected regression in v0.6 where player data wouldn’t save properly when run in WebPlayer (C# Dictionaries don’t serialize in Unity)
  • Gumballs ‘reflection’ now (hopefully) look more realistic 
  • Revamped internal save data layout 
    • New game modes/types should be able to be added without the need to completely reset player stats 
  • Setting screen created 
    • Music and SFX volume control 
    • Gumball color scheme options ( aid in color blindness )

This Period's Highlights:

More than anything, these last two updates focused on providing the player with a better user experience. First and foremost, if you want to keep players, you have to have a fun game… hopefully, I do. And, hopefully, it’ll only get more fun as I continue to add more features.

But, it’s the little details that really make the game. First up…

Refining the Tutorial

If the user doesn’t know how to play your game, (s)he simply won’t play it! The old tutorial was nothing more than a single screen filled with a wall of text giving the user a vague idea of how the game works. Creating it, I knew it was destined to be replaced with something far more robust. Ideally, I’d create an interactive tutorial system that integrated directly into normal gameplay. That didn’t happen (though, perhaps it’ll make its way into a future build). What has happened is the creation of an interactive tutorial when the player first starts the game. The tutorial walks the player through the basic gameplay mechanics and requires the player to complete simply tasks before it’ll let him/her play the game proper.

Removing The Noise

Most people would say your game isn’t complete unless your game has sound. Ironically, though, for mobile apps, one of the first things people do is disable all audio. After all, a silent game can more easily be played in class or meetings.

Well, GumBall Fall has been pumping out music and sound effects for a few releases now. But, up until this point, the player had no way to disable this ‘noise.’ Well, audio control can now be knocked off my TODO list. The player can now independently control music and sound effects volume from the Settings screen

Aiding The (color) Blind

One of the general no-nos in UI design is to rely on color as the only indicator of an object’s purpose. Think of a traffic light: Green means GO, red means STOP, yellow means SPEED UP AND MAKE IT THROUGH THE LIGHT BEFORE IT TURNS RED. But, what happens if you’re color blind? Well, you then have to rely on light positions. Green is always going to be on the bottom or right, red on the top or left, and yellow always in the middle. You might not know what color is actually showing, but, you can still determine the proper action to take.

So, what did I do with GumBall Fall? Ignored all of those color rules and created a game with perfect spheres whose only discernible difference is color… BRILLIANT!

When conceptualizing the game, It’s a problem I knew I’d run into, but, I kept pushing it to the back burner. Ideally, I’d make different shaped gumballs or brand an unique symbol on each gumball type. But, that’ll be for future release considerations. For now, what we have are alternate gumball color schemes available in the Setting screen. Currently there are 3 schemes to choose from. The first scheme is basically what I’ve been using for the past several releases. The second and third schemes were created mostly based off of the website. With just a few drags and clicks of a mouse, you can explore all sorts of color schemes and, best of all, they have options you can enable to simulate what your schemes will look like to folks with various types of color blindness.

Ultimately, creating non-color dependent visual cues for each gumball type will be the ideal solution. But, for now, the alternate color schemes ought to give folks a higher probability to play GumBall Fall successfully.

Welcome to the BETA

Version v0.6 saw the light of day in the Google Play Store. While sideloading an app on an Android device is all well and good, it still requires some non-standard Android skills. Mostly, folks need to know how to enable Android to allow non-Google Play Store apps to be installed.

Pushing the app to the Play Store means that anyone who is interested in testing it out can simply download it just like any other app… well, almost. Since I don’t want to actually publish the game to the world, I’m placing the game in a public BETA. Anyone can download the game, but, first they need to become a tester. Follow these directions to become a BETA tester. What it boils down to is simply joining the GumBall Fall Google+ community and following a couple links.

Besides easy of download, being in the Play Store also eases the burden of asking folks to reinstall newer versions of the game. Now, new versions will simply get pushed to them just like any other app they’ve downloaded from the store.

Oh, and one more thing…

Pushing to the Play Store inspired me to actually create a more legitimate-looking app icon. I’m far from being an artist, but, this is what I came up with. Let me know what you think!

Thursday, January 9, 2014

Wrapping Up 2013

Version 0.5 Released:

GumBall Fall v0.5: Web Player | Android

With the various family and friends commitments of Christmas and New Years and, just for fun, a nasty flu bug knocking me out for almost a week, development continues to be a bit slow... Not that I'm complaining about the holiday gatherings; they were fantastic (not so much the flu bug).  Delays be damned, I feel that I've finally pieced enough together to warrant a new release and blog update.

Just comparing this release with the previous one, I'm amazed at what a difference a bit of polish can make. Here's hoping you guys agree!

Major Changes in v0.5:
  • Stat Tracking:
    • As promised last release, high scores will be reset with this release.  Expect further resets in future releases... don't become attached to them ;-)
  • In-Game Graphic Improvements:
    • New shader/material rendering to give the game more of a cartoony feel
    • When selected, gumballs now animate to identify their selection instead of going partly transparent
    • More 'juiceness' in the form of revamped gumball EXPLOSIONS, bonus announcements and background (say goodbye to the black background!)
  • User Interface Improvements:
    • Complete revamp of the UI look. Hopefully, the game has a bit more personality now!
    • Say hello to Frank, the rabbit. He needs your help picking up these gumballs! 
    •  Dedicated game summary screen created
    • Initial Help / Intro screens added to explain (probably poorly) to the player how to play
    • Further modularization of the interface to make updates even easier
  • Sound Effects:
    • Selection sounds now use a 'major scale' to make it sound a bit happier
    • Each color gumball has its own scale of tones
    • Music now accompanies you as you play the game
    • NOTE: There is currently no way to disable sounds. This will happen in a future release
  • Game Play and Internal Logic:
    • [BUG FIX] Any chain you're in the middle of making when the game ends will be added to your final score
    •  First iteration of rewarding the player for making long chains 
    • Added basic AI to identify valid gumball chains to add future capabilities:
      • Identify if/when no valid moves are possible
      • Suggest to the player valid moves if (s)he is slow in finding them
      • Allows for automated development demo/test debugging
    • Refactored how internal logic determines if gumballs match for more accuracy and efficiency

This Period's Highlights:

Early Feedback Continues to Focus Development:

As always, the latest player feedback continues to be quite useful. Reddit continues to be the most popular source for Feedback. Most feedback comes from posts in /r/unity, /r/unity3d, /r/indiecode or /r/gamedev's Feedback Friday and it's always enlightening.  This go round, most folks were asking for 'cooler effects and explosions.'  Well, it's time to turn gussy up this puppy... at least as much as this non-artist can ;-)

But first...

Getting Learned in C#:

In previous posts, I've mentioned that I'm rather new to C#. As a result, I'm learning about cool new (to me) features all the time. Today's feature: System.Linq.  If you've never heard of it, go do an Internet search for the MSDN entries for it. Then go read this (Unity3D related) blog article. If you can't see the potential awesomeness in the library, then go back and look again. I won't reiterate what can be read elsewhere, but, suffice to say, Linq is like having access to bit of SQL-query goodness in any of your C# collections (arrays, lists, dictionaries, etc.). Creating unions, differences, and many other random queries are rather trivial to code. The tradeoff is, so I've been lead to believe, that, it's not the most efficient of libraries... so, don't go Linq crazy in your update loops!

So, how am I using Linq? Well, there are various pieces of my codebase I'll likely revisit to refactor to take advantage of Linq, but, initially I'm using it in my new 'AI' logic. Ok, AI is probably waaaay overselling what I've done. One of the pieces of feedback I've received was from a person wishing that the game would highlight suggested moves if the player has been stuck for a while. Good idea. Now how to do it? I ultimately decided to take a snapshot of the positions of all the gumballs and reuse the same selection logic that the player uses to determine where every potential chain is. This ultimately amounts to picking a gumball, finding 'close' neighbors, identifying if the neighbors are the same type of gumball, then, if they are, adding them to a list... you then repeat the process with the newly added neighbors. In the end I ended up with several lists that needed to be joined together. A simple List1.Union(List2) logic is all that's needed to get the job done. Could I write my own logic to join arbitrary lists together? Sure. But, why do that? Better to reuse existing libraries, I say!

So, that's you're C# knowledge dump of the moment. I'm sure anyone who's familiar with C# could spout off all sorts of other great benefits of Linq (as well as other libraries I don't even know about). If you have something cool to share with a C# noob, drop me a line in the comments. I'd love to learn!

Bring on the Personality:

Games, as well as people, are typically perceived as 'better' if they have some personality. Ask yourself, what's more fun, a potato or a Mr. Potato Head? (if you answered 'potato,' go build be a potato-powered clock, smart guy!). Potato Head wins. He has a face and some arms and feet. He's a bit more personable than your standard spud.

I learned a bit from Mr. P. Head. GumBall Fall now has its very own personality in the form of Frank, the rabbit and a bit of a (lame) back story as to why the player is collecting gum balls.  Am I happy with what I have? Yes and no. I feel that by just adding the few things I did, the game is 100% more friendly for the player. But, there's definitely a heck of a lot more I can likely do to make great improvements. But, everyone has to start somewhere, right? I'm starting with a bunny named Frank!


Damn You, Draw Call Batching:

So, the majority of refinements I've made for this release aren't really worth writing in detail about. Graphics look prettier, there are a few new screens, etc. Nothing mind blowing. However, I want to take a minute and write about Draw Call Batching and it's relationship to Unity3D. Every object in my game needs to be drawn. The inefficient way to do this is to simply have a draw call for every item in the scene (assuming its on camera). Unity3D will attempt to dynamically batch draw calls. If you have a bunch of objects that share the same material (basically the texture/shader combo used to render the object), Unity3D will draw all those objects in one call as opposed to one call per item. Needless to say, that's much more efficient.

My game ought to be able to take full advantage of this batching. 99% of it is simply 6 different types of gumballs... and, each gumball uses the same material, I simply just change it's color.  So, 48 gumballs ought to be reduced from 48 calls to 1 call, right? Not so much.  When a gumball is created or re-pooled for later use, it was dynamically getting assigned a new color (i.e. a property in its material was being altered). Turns out, altering a material's property creates a unique instance of the material. Thus, when my game initially creates my 48 gumballs, they all are using the exact same material... and one draw call is used. But, the second I change a gumball's color, a new material is created. Thus, 48 changed gumball colors, 48 new materials. 48 draw calls.  Booooo!

I figured the solution was simple. Just create 6 unique materials: One for each gumball type. Each gumball type will now share a single material. 6 materials, 6 draw calls. Not quite the 1 draw call I figured I might be able to get, but certainly a lot less than the 48 calls I was actually making!

So, I made the change and re-ran the game looking for those 6 draw calls... I'm still getting 48!?!? #*&@##@&*$!!!!  Time for more Internet digging!  Turns out, materials are only part of the problem. The other part is that, due to efficiency considerations, Unity3D will only dynamically batch draw calls on objects that contain less than 900 vertices (or fewer depending on what UV, Normal, etc. mapping you're using in your material). The sphere meshes that come with Unity3D contain close to 500 vertexes and I'm using some UV info which, after doing some experimenting meant that my gumballs could only have around 300 vertices . Ugh!  This meant that I needed to create myself some new simple spheres and led me to boot up my copy of Blender (which I know VERY little about) to create a more basic sphere. After stumbling around in Blender for a bit, I finally created a sphere with around 270 vertices.

With the new material system and the new low-vertex spheres, I finally had some gumballs that would batch! My draw calls dropped from 48 to 6... BooYah!

So, who cares? 48 calls really doesn't seem like that many, right? Well, on the PC, no. I never noticed any performance issues. Even when testing on my Galaxy S3, I saw rock solid 60fps frame rates. However, running the game on my 2012 Nexus 7 showed that I was averaging 35fps. That's still  pretty decent. But, my game's really not all that complicated or graphically intensive. Why should I give up 25fps for no good reason? After successfully batching my draw calls, the frames per second on my Nexus 7 shot back up to a rock solid 60fps.

What's the moral of all of this? Keep an eye on those draw calls! In the mobile world, even a few extra can drastically affect your performance. Because, not only was my frame rate dropping, but, the CPU/GPU was working 8x harder per frame for no good reason... that's going to just drain a mobile device's battery faster than it ought to.

There's definitely more to Unity3D's draw call batching than I've discussed here (both dynamic batching and static batching that I didn't even touch on since it's only available in Unity3D Pro). Check out the  Official Documentation for more information.


Tool Shout Out:

Just wanted to take a moment to give some proper recognition to a free tool I've just recently started using. I've mentioned Unity3D and some of the major libraries I've been using, but, one needs pretty visuals and sounds to go with any game. Today's shout out goes to Inkscape.

Are you familiar with Adobe Illustrator? I knew of it in name only. Well, Inkscape is apparently a pretty dang similar free/open source competitor. So, what is it? It's a vector graphics art tool. Frank, the bunny in my game, was made using vector graphics. I can't take credit for his initial creation (that credit goes to some free-to-use vector character art) but, thanks to Inkscape, this non-artist was able to tweak him to look less sinister and more goofy.

Before and after shots of Frank:

That's all for this post. Thanks for reading and (late) HAPPY NEW YEAR!