Jonk, Inc Release

Well, it finally happened. It’s out.

Jonk, Inc was in open beta for a 2 week period. In the 2 weeks I fixed many bugs and made several key enhancements to make a cohesive product. I ended up just doing the final testing on the release candidate on my own as the fixes were tactical and I used a high speed integration test to simulate the game running for several hours.

Performance

I spent a lot of time on performance. I am using Unity’s new Universal Render Pipeline for Jonk. It’s mostly all stock but I stripped as many shaders as I could. I setup 3 quality tiers (potato, low and medium). The game starts up in Potato, but steps up quality up to medium when FPS averages 60. This is the easiest way to implement something that can run on almost any device produced in the last 5 years (more on that later).

Rendering all the car’s ended up being the heaviest lift BY FAR. I was worried pathfinding or ai would be the bottleneck. All the game code ended up being a tiny blip in comparison to the heavy task of pushing all the cars onto the display and making them look nice. By “Nice” I mean just stock environment and specular lighting from a single light. Any sort of shadows also cause a big impact on performance. There’s upwards of 100 vehicles rendered on the screen at once in the 2nd Stage. Reducing number of parts and transparent materials was the biggest contributor to performance. I got the biggest gain after welding all the customer cars up as one solid mesh. The junk cars were the opposite. Breaking up the junk cars into more objects actually helped as more parts are removed the rendering speeds up. An average player won’t ever have an entire yard full of cars with all visible parts so this ended up cutting down rendering a lot.

I used a 10” Lenovo M10 Plus running Android 9.0 as the control as it ran the game like absolute shit (5-10fps) in the Open Beta version. After halving the triangle counts on the cars and consolidating the materials I got it running 30fps in Potato mode in worst case and 40-50 fps in typical scenarios.

A little rant…during this time was when I woke up and realized just how literal TRASH all android devices are compared to apple devices when it comes to mobile gaming. My iPad ran the Open Beta version 60fps without a hitch. My iPhone 6s was the same story. A 6 year old iPhone still runs circles around most Android devices made in the last 2-3 years. I put a lot of time in to get Jonk PLAYABLE on a min spec Android. I wanted to do this anyways because I think it helps greatly with battery life, but still. Really? Yes.

Customers

I spent some time improving the customers. I’ve been using one customer model for a while because of performance reasons. Customers needed some variety after I fixed the shader performance issues on the customer models.

Introducing “the kid”, “the steve jobs unit” and “gamer girl”.

Introducing “the kid”, “the steve jobs unit” and “gamer girl”.

Outlines

Selected objects were becoming an obvious problem. There was no indication as to what was selected and not having anything to catch a players eye as to where they were was a glaring issue. I experimented with several outline shaders. I didn’t even realize just how in depth this effect can get. Highlight Plus by Kronnect is the best one by far at least when using URP. Don’t even waste your time with anything else.

2021-07-09 00_21_21-Jonk - stage2 - Android - Unity 2020.3.10f1 _DX11_.png

Release

I finally ran out of stuff that was “needed” for a release. I had the Release Candidate finally. It took literally 30 minutes to get it on the store with Google Play. Wow, that was easy.

Apple tho? Naaaah. Figures. I forgot to add the iOS 14.5 tracking request permission prompt. This was literally just rolling out and being enforced as I was preparing for Open Beta and was oblivious to almost everything happening in the world in general. I spent in total another week getting rejected several times. After being carded and full cavity search…Tim Cook finally allowed me to enter the utopia they call the “Apple App Store”. Thank you Tim Cook, you’re a beautiful man. I am here to serve and bow at your feet.

Marketing

I always knew this was coming. I am literally a nobody dev in a shed makin Jonk. Although I am Hurricane Outbreak famous; it’s still a fly on an elephant in terms of having any sort of influence. I don’t really have an audience from a crack pipe hurricane game.

Luckily I am not completely poor (yet). I have enough to do some marketing with ads. I spent a day making my first video ad and literally just last night I created the biggest ad campaign I was ever even remotely involved in, lol. I am using Facebook ads to start. The ad is working pretty well so far. I have had a bunch of IAP sales and the ad revenue is looking good. I am looking at other options as well. This week is kind of a true test to see if I can swim with the sharks. I am one person. We’ll see.

Jonk, Inc Open Beta

It’s been a long 6 months of development. Jonk, Inc is finally available in open beta on Apple and Google.

The big picture metric for mobile is the 7 day retention. A game isn’t very marketable If you don’t have enough in the game for players to open the game and play for 7 days. I was originally going to release a much simpler version but quickly realized there wasn’t enough there for a complete product. There were additional elements required to get players to stay engaged for 7 days.

So I’ve been heads down pretty hard getting this MVP (minimal viable product) for the last 3 months since the last blog entry. I got the final artwork in and refined every system. I also added the 2nd stage which was the biggest challenge.

Stage 1 (Home Backyard) and Stage 2 (Big Junkyard) are actually 2 independent games in one.  Each stage owns its data.  They use the same code base but Stage 2 uses some features that don’t exist in Stage 1.  Some data does overlap across the entire game.  The Cards and Gems persist across the game.  The Save file was broken up into global and stage sections.

Stage 1 (Home Backyard) and Stage 2 (Big Junkyard) are actually 2 independent games in one. Each stage owns its data. They use the same code base but Stage 2 uses some features that don’t exist in Stage 1. Some data does overlap across the entire game. The Cards and Gems persist across the game. The Save file was broken up into global and stage sections.

Trello board leading up tp open beta release

Trello board leading up tp open beta release

Next step

Over the next week or so i’ll be making a few fixes based on feedback I received. I’d like to do a full release in the next week.

I already fixed most of the issues. The main issue being performance on lower end devices. I got about 10x performance gain already by just cleaning up some materials and optimizing models to reduce shader counts, draw calls & batches. Besides that there’s some minor balancing.

This fix was done before open beta.  Optimized the customer mesh from 25+ shaders running per customer down to 1.  The advanced people 2.0 asset I am using to generate random characters has horrible mobile performance.  Exporting the random character and doing some hand edits let me optimize for mobile.

This fix was done before open beta. Optimized the customer mesh from 25+ shaders running per customer down to 1. The advanced people 2.0 asset I am using to generate random characters has horrible mobile performance. Exporting the random character and doing some hand edits let me optimize for mobile.

Optimized all cars for mobile.

Optimized all cars for mobile.

Reduced batches from 100+ down to 18

Reduced batches from 100+ down to 18

Jonk, Inc

I wanted to announce my new game that is still under development, but with a disclaimer that I still have about 3 weeks of development left before it goes into an official beta. It may take longer depending on how quickly I can get all the new custom assets in the game which are still being created as I type this. Most of the art is placeholder still, but most of the features are completed right now. There’s just a lot of polishing work remaining. I will probably do a couple weeks of closed beta testing in the app stores before I decide it’s ready. It’s sort of looking like April right now in terms of going live.

Jonk, Inc is an idle game with the central idea around building a junk empire. You start with a modest junkyard you inherited and your job is to grow it into a mega junk empire. You find vehicles in a marketplace or through barn finds. You operate a fleet of utility vehicles to pickup and drop the vehicles into your yard. Get customers into your yard using different advertising strategies. Rent tools out to customers to help get the parts off the cars faster and easier. You can also pick parts out of cars yourself to sell them at a premium in your parts warehouse. Then send the exhausted cars into the crusher and sell the scrap. Expand by getting more service vehicles and everything is upgradeable. Then get to the next level by automating processes by unlocking special Jonk cards.

Below are some screenshots of the current state of the game. It’s now changing daily with new art and polishing being done constantly. It will probably look completely different in 3-5 weeks.

That’s just the first release I’ll be doing in the next month or so. It’s just the start. I built the entire game to be expanded and I have plans for a lot of amazing scenarios that have never been tried before in games. It will feature a lot of new idle game innovations. I plan on expanding the game throughout 2021.

The idea originated with the idea of creating an idle grand theft auto type game about a year ago. I have a lot of experience with working on shitty cars so it seemed like something I could build with some real depth to it. That combined with my 15+ years of dev experience I started researching idle games and fleshing it out for several months before I really set out on the development. I worked with Unity for about 5 years now mostly in a hobby capacity, but I wanted to take on this project like I would in my professional capacity as a developer. I took some vacation time to start getting deep into the development of the game. After about 4 weeks I had a working proof of concept that isn’t too far from what I have today. After that point I knew I had something pretty special and was the Turing test to prove I was capable of doing such a big project.

I spent about 3 months total so far developing what I have right now in the game. It’s been a breakneck pace for this sort of game even for actual mobile studios with a team. I’m the solo developer contracting the artist (https://twitter.com/orhken) and composers (https://twitter.com/WillSavino and https://twitter.com/derriskharlan). I spent a lot of time designing a good architecture using a lot of coding techniques that many top shelf studios use like Niantic. Dependency injection, Reactive programming and Redux states are the core of it, but there’s also the use of the Blueprints, Data Factories, Mediator pattern, heavy separation of concerns via data contracting throughout. Every entity uses custom behavior trees for AI. There’s almost 22,000 lines of my own code spread across 398 C# files right now. It’s one of the nicest code bases I’ve written and it’s enable me to start going really really fast without technical debt at every corner. I can leave large pieces of the code in a refactoring migration pattern while working on other things and refactor as I go without breaking half the game. I also have light unit testing in place in certain critical areas and a full speed run Play Mode test that exercises all the features of the game in 3 minutes at a 10x time acceleration to verify nothing broke.

The architecture I created for the game. I have changed only one thing over the course of development and it’s the config.json file. I instead created blueprint factories. The entire game config is created in code and the entire config is abstracted using interfaces. There is an IOC container config for each stage which defines what blueprint versions to pull in. Eventually I will probably move towards a custom GUI editor using ODIN. The game config built at runtime using blueprint factories straight in c# code has been good enough to get me this far.

I never built an idle game or a 3D game, and this has turned into a project that really tested every aspect of my development abilities. I have grown substantially after powering through a lot of the technical aspects of developing such a large game and doing it solo. There’s a lot you don’t think about when it comes to idle games. I do believe it’s a severely underserved genre and I can see why now. These games are incredibly difficult to get right. There’s a lot of things to go wrong when building a self playing game. It’s a genre that is too difficult for most indie devs to tackle, and too small for big studios to take on. There’s a lot of room left in the middle for innovation and creativity. That’s just my thought.

The biggest challenge has probably been just how to manage the chaos. Everything in the game has a mind of its own. I use behavior trees to create the AI. There’s hundreds of behavior states to manage and they all have to work together seamlessly to convince the player it’s their own little world and it’s working like they expect it to, but most importantly…the player feels like they are orchestrating the madness somehow.

The pathfinding was also one of the more trickier things to solve. I ended up using a node graph to create the path networks. Creating smooth pathing was also tricky. The node network has has to have at least 4 points on each corner to generate good splines on the fly. That seemed to be the easiest path to really make pathfinding that has no limitations and performs excellent with a lot of entities. In the end I ended up with no canned paths or animations. That was the only way to really make the game scale and feel like it’s truly a bustling business.

There’s a network for each area. Road, Junkyard and the forklifts have have their own as well. Each blue line is a spline path generated from a found route in the network (yea I know it looks like I doodled the lines, but they actually are rendered in the game for debugging).

There are no predicted results. Everything works off queues with priorities to feed behaviors various tasks. Customers never take the same path twice. Customers can change their mind if something changes in the middle of an action because something else became more important and they can figure out how to get there from anywhere. On top of that everything also has to respond instantly to upgrades, buffs, etc. This is typically a giant disaster for developers to manage so many events. I can see why idle games are hard to get right or even at all.

NodeCanvas behavior tree for a customer. I still have no idea what I am really doing. This was a really early implementation of a BT.

As far as tools and libraries go. I recently went to Unity 2020.2 and i’m now using Rider 2020.2 IDE. I have transitioned to rider for all my C# development over the past year. The core libraries I lean on are Zenject, UniRx, UniTask and MediatR. I use LeanTween for animations. NodeCanvas for AI. Easy Save 3 for save game, but I may transition that to a MessagePack serializer instead. I split all the libraries into an assembly and reference it in my game code assembly to reduce build times.

Some might be interested in my dev environment. I am using twin 32” 1440p monitors, Kinesis Freestyle 2 keyboard, Evoluent VMDMW wireless mouse. Autonomous desk and chair. I only added the arm support recently because my wrist pain was coming back from working so much.

I built the pc about 3 years ago. I reused my old Thermaltake Suppressor case, but got the temper glass panel and PSU cover. It’s got an 8086K in a Z370 AORUS Gaming 7 motherboard. I delidded the CPU and it has a custom CNC machined copper heat spreader with liquid metal on both sides with an EK monoblock. The GPU is a Gigabyte WaterForce 1080 TI all plumed into a custom water loop cooled by a 3” thick Alpha Cool radiator. There is an EK water pump hidden under the PSU cover. I don’t run a reservoir because the radiator is soo massive. I cut a hole in the top of the case where the fill plug is for the giant radiator. I filled it 3 years ago with Koolance fluid and a bunch of alpha cool growth inhibitors and haven’t touched it since besides adding another 1TB NVME drive. Still runs @5ghz all cores and doesnt get above 55c. It’s ran like that for years and I have zero stability issues. Coolant appears to still be good. The monoblock has a nice clear window and I don’t see any build up on the fins even after 3 years so I’ll probably run it for another year. It’s been a skookum dev machine. I also have an old 2013 i7 iMac used to do ios builds.

That’s all I really have to say for now. I’ll post again when the game is ready for release.

Hurricane Outbreak in 2020

2020 Was a pretty crazy year to say the least. It’s been a long time since I wrote anything. I’ve been busy with my day job as a Developer. Anytime I have left over is really just burned on working on games. I thought I’d start the year with some posts on what’s happened over the last 2 years or so with Hurricane Outbreak. I have another post that deals with what’s going on right now and in the future in regards to a new game.

Around summer 2019 I did do a major overhaul of the game. The original felt like a demo so I added a quest line that allowed the game to have some form of progression. It was my crude attempt at making the game feel like you were upgrading your hurricane. For the most part I think it turned out good. Alot of people liked the new game and some hated it. I also added the 2nd scenario as most people know as Global Warming. Along with the content I did optimize the game significantly and expanded the play area by almost 2x.

Profiler before optimization.

Profiler after optimization. I split up the code into 4 threads.

1. HurricanePathFinder - This thread does a simulation by stepping the hurricane into the future n times to determine it’s future path. I tried several ways to do this but this was the only reliable way to really predict the path. The player can change the hurricane speed with abilities and the hurricane can speed up or slow down over land with abilities so it was basically impossible to do it any other way. The hurricane path data is used by AreaWorker and CityWarnWorker to reduce the dataset down.

2. AreaWorker - This thread uses the simulated hurricane path and determines which countries/provinces/states the path is overlapping and generates an active area list to be used by CityWarnWorker.

3. CityWarnWorker - This thread takes the active areas and a list of cities is generated that over lap the simulated path of the hurricane. This creates a new reduced list of cities used by ActiveAreaWorker.

4. ActiveAreaWorker - This thread takes all the processing the threads above have done and runs the entire damage simulation on the active cities. Warned cities do preparation simulations depending on a lot of factors like GDP and the strength of the hurricane that is inbound.

The expanded map with all the countries/provinces with a quad. In the original version of Hurricane Outbreak I used one separate thread to loop through all the cities on the map (12,000+) to do damage calculations. That thread was a total hog, but still ran smooth because it wasn’t on the main thread.

The generated hurricane path polygon that’s used for intersecting with area quads. Only cities intersecting within the quad and then within the hurricane path are marked to be simulated with damage. The simulation continues to run on cities as long as there is damage applied. The hurricane can leave the area and there’s still flood damage occurring.

Nothing really happened for almost a year after I released that update. I was actually halfway in the process of getting an iPhone version of the game out. I spent alot of time already fixing issues with the large 4k textures the map uses which the iPhone 6S didn’t like. I was also working through issues with the json serialization and save game encryption I was using. Then GrayStillPlays did a video of my game in February 2020 right before covid pandemic started breaking the news.

When the video hit I scrambled to finish the iPhone version and somehow got it live on the apple store within 3 days of the video getting released. The rest of 2020 was a wild ride. I survived a wave of layoffs and furloughs at the company I work for, but the game started making some money finally. I slaved on the game for about 6 months in total spread between October 2017 to April 2020 before I saw any real return on investment.

lifetime users of Hurricane Outbreak on Google Play a couple days after GayStillPlays video hit.

lifetime users of Hurricane Outbreak on Google Play a couple days after GayStillPlays video hit.

Total revenue a month later

The game made about 40k in total in 2020. I don’t really have any further plans with expanding Hurricane Outbreak. It’s been a real nightmare to work on the game. It seems like a simple concept but it ended up being a ton of work to make a hurricane game that felt convincing enough. I may eventually do another expansion on it at some point but it’s going to be some time. There’s a new game I am currently working on that’s now consumed me.

3 Month Update

Intro

It's been nearly 3 months since the release of Hurricane Outbreak and I finally got around to creating this site for my company so I thought it was a good opportunity to create a blog on the changes I've done since release and what is next for the game.

Reception

Google Play Stats for Hurricane Outbreak

Initially the release was pretty boring but all of a sudden the installs took off and have stayed there for the most part with the exception of a recent update that broke a few things that caused a dip.  Overall I am pleasantly surprised the game is getting almost 1000 installs everyday which is considered a very good number.  The feedback I've gotten on the game has been great.  Almost 500 reviews so far with a score hovering around 3 stars.  The only thing I'm not happy about is the 3 stars I've slowly chipped down into.  I contribute that to a lot of the issues I faced post release with this game and the changes I needed to make which broke a lot of stuff along the way.

Updates Since Launch

Since release I've had to battle a lot of issues with the game. It was not running very well on most devices and even when It did the performance poor and degraded over time.  Also some of the game mechanics were terrible and people complained about them.  Since then I've fixed a lot of stuff.  Here is a summary of all the changes I've made since launch.

1.1.9 - Fixed tons of issues after the refactor done in 1.1.8.  Also discovered I wasn't killing threads  that I use for much of the calculations being done in the background which probably attributed to degrading performance and crashes.  OOPS.

1.1.8 - Refactored entire skill tree UI, re-balanced all the skills and added more islands to the map.  Also did a lot of refactoring of the code base which ended up breaking tons of shit I didn't even realize.

1.1.4 through 1.1.7 - This was a pretty massive update on the map.  Since release I've used the original high def version map from the KRONNECT world map strategy kit.  The full size map eats up tons of memory and gpu memory.  I ended up using the low def version and having to add in most of the small islands back in by hand.  This along with a few other optimizations dropped the polygon render count from 1 million to 30k-40k.

1.1.1 through 1.1.3 - Added animating vapor clouds that indicate warm water areas on the map the hurricane can draw strength from and removed the turn limit mechanic everyone hated.

1.1.0 - This was a big post release update that focused on fixing crashes, reducing game size 30mb, optimization, simplified game mechanics, new menu system, casual and normal difficulties added with saving/loading of game progress.  This update definitely improved the initial bloated release and setup the game for further refinement.

Future Roadmap

1.2.0 - The next focus is the Apple Store release.  Will be cleaning up things I've been meaning to get to.  New features will consist of goals that need to be completed to unlock next difficulty/scenario and Global Warming scenario will be added to allow players build some wild hurricanes you could only imaging a big global warming event could trigger.

1.2.1 - Implement a new map for the Post Apocalyptic scenario I've wanted for some time now.

1.2.2 - Add new region for Australia which will allow players to unlock.

1.2.3 - Add paid scenario "Sharkane".  This is a twist on the Sharknado films.  You will be able to pick up sharks scattered across the ocean and dump them on land for some deadly fun.  I plan to make this a fun extra that will cost a small amount.

1.3.0 - Implement online leaderboards for all the scenarios.

I'm really going to strive to get to 1.3.0 by end of April.  I do have a day job so I'm pretty much using all my free-time to get all this done.  I think it will be worth it once It's done.