I figured it could be cool to switch things up and start writing about my game development process – my accomplishments, technical learning and the overall process. My first post is about the history and my progress thus far.
Work on what would become Original Studios began early August 2018. I was working as a Software Engineer at Uber in San Francisco and had just reached my 4 years at the company. I started thinking about my next steps in my career as 4 years just seemed like an overly long time at one company in the tech industry. Initially I thought about quitting and going all-in on my own project, but a 3 month sabbatical was offered to me and I took it. I figured it would be the best of both worlds; being able to keep my job, but also trying out a side-project full-time and seeing if it was actually something I wanted to do or not. The sabbatical was to start early September, so I had about a month of regular life left. I needed to get started on something.
The survival game genre is one of my favourites and I knew I needed to build something in that space. In these games there’s always something more to do, more complex things to construct, rarer resources to find, more difficult challenges to overcome, tougher enemies, etc. It’s kind of addicting, and I wanted to create something to replicate that feeling. There’s also an immense amount of creative freedom in this genre, being able to continuously build onto it, add new features and content long after the game releases sounded super exciting to me too.
I got straight to work. Don’t have a name or anything yet, only a working title for the git repo name: “survival”. I would work week nights after my full-time job and most weekends. I knew I needed to use an existing game engine as making one from scratch would be too time consuming (although super fun in an ideal world). I chose Unity for no other reason other than hearing good things about it from friends.
I quickly learned the ins and outs of Unity thanks to the endless YouTube videos, tutorials, and guides out there. Most of these resources seem to be geared towards newer programmers, so inferring real-world best practices, performance considerations and similar concepts took some effort. As I learned and coded away, things unfortunately became messier and more tightly coupled. I realized I needed a framework to structure the whole codebase in a decoupled and modular way before I got too deep. I did a bit of research and landed on StrangeIoC.
Inversion of control wasn’t a principle I had run into much in my career but the benefits seemed what I was looking for. I was however concerned about the performance implications of reflection in critical codepaths. Given that my game was in the super early stages, I tabled that concern until the game got bigger and performance losses became non-trivial. Spoiler alert: they did, and I ended up restructuring and optimizing the critical paths later. I’ll write about the game’s current architecture, performance testing, my learnings and further considerations and questions in a separate post.
It is now early September 2018 – month of part-time game work went by and I was liking it, but it was time to embark on my 3 month adventure. The whole trip deserves its own post or even multiple posts, so I won’t go into too much detail here. The main things to note were:
- It was a solo trip. I started by visiting friends in the US and Canada for about 2 weeks, then booked a one-way flight to Thailand and figured the rest out from there
- I tried to split my time equally between working on the game, sightseeing/photography, and meeting fellow travelers at the hostels I stayed at
- In 3 months I visited Bangkok, Phuket, Chiang Mai, Kuala Lumpur, Moscow, Nice, Venice, Dolomite Mountains, Zurich, Geneva, Lisbon and Barcelona
- It was an eye-opening experience and I’d recommend a trip like this to anyone. Never did a solo trip before so I was a bit hesitant at first, but in the end I had the most fun I’ve had in a long time 👍
This was the first time I had close to “full-time” availability to work on the game, depending on the day and what I was doing. On days I dedicated to work, I aimed to find good coffee shops with wifi and abundant power outlets in the cities I was in. One site that really helped was Workfrom. Found a lot of great places to work and even contributed ones I found myself as well.
I was happy with the progress made during the trip. As seen in the above gif, I was getting a bunch of regular survival game features done, with various status bars for thirst, hunger and health, being able to pick up objects, being able to have mineable resource drops, and a whole grid-based inventory system with equippable slots.
Next added some tree assets, changed up the terrain textures to make the scene look a bit nicer, a chopping interaction for the trees, droppable logs and a feature seen in probably every survival game out there: crafting.
Back home, back to work
It’s November 2018 – The sabbatical was over and life returned to normal. I decided to stay at Uber for the time being, as I still had my apartment lease until May the next year to worry about and having a good income was nice. I continued to work on the game outside of my regular job.
2019 arrived, and my apartment lease expiring in early May seemed to suddenly become a more pressing concern.
Should I extend my lease another year or more? If so, should I stay at Uber past 5 years or maybe go to another tech company?
Or have I had enough of working for someone else and that the time is now to finally go all-in on my lifelong dream?
You may have probably guessed that I chose the second option, and you would be right. Given that I’m Canadian and only had a work visa in the US, I’d of course need to head back to Canada after quitting my job. I talked to my manager about my decision, and we started working through the logistics of my departure. Eventually we worked a plan where I could move back to Canada in May, but continue working for Uber at the Toronto office for up to 90 days. Every extra bit of income is always nice when you’re about to drop everything to do a side-project full-time.
Demotivation, an IPO and a big move
At this point my progress on the game unfortunately slowed down. I think I lost motivation somewhere along the way. I just didn’t have it in me to sit and continue working on the game after work. Not sure what changed, the 3 month trip made it clear that I enjoyed working on the game. I just focused on my regular job.
There were rumors about Uber getting ready for their initial public offering (IPO). This was something a lot of us earlier employees were looking forward to for a long time, so it was definitely exciting. I started to sell/give away all my furniture and put everything else I had into 6 big boxes and shipped it all to my parents in Canada. Uber went public on May 10, 2019, and 3 days later I boarded a plane to Toronto and left San Francisco for good.
The full-time leap of faith
I landed in Toronto and began my new life. I’m continuing to work full-time for the remaining time I had at Uber and I’m still not working on the game. I didn’t want to start work on it again until I could dedicate all my time to it, not just time after my normal job. Feels like quite the leap of faith, quitting my job and moving countries to start work on something that I didn’t fully know if I’d be passionate about.
Fast forward to August 2019, the time has come. I leave Uber after working there just over 5 years. It’s also one year after I originally started working on the game. I found a co-working space in Toronto and got to work.
Turns out I gained all my motivation and passion once I could actually do my game work full-time! What a relief. So I continued to work, at a much faster pace than ever before. I worked on whatever I felt like doing for about a month to see how much work I could get done.
My good friend and gamedev veteran Alex visited me in Toronto for a few days in September and sat down with me to help me out with the game. He built out the initial version of the world generation and game object occlusion systems, just because that kind of thing sounded really interesting to him. What an awesome dude!
While working on whatever I wanted was nice and I had a lot of freedom, it didn’t feel like I was getting close to any goals. I realized that I needed a more concrete plan of what I wanted to do, a more structured approach. So in late September 2019 I started my first official game design doc and brainstorming/planning session. First I wrote down everything I got done in the first month:
Accomplished in the first full-time month
Week 1 – first full week
- Multiple interactions/progress bars showing up in the UI at the same time
- Make construction building, progress amounts, usage after being built, etc perfect
- Better looking progress bars/text
- Add growables (bush), growable phases, gathering
- Huge performance gain – switch all views to use unity’s update system rather than using events
- Add all required assets to version control (for Alex)
- Add concept of condition to item stacks with averaging conditions when merging stacks
- Decay condition of decayable items
- Add editor prefab images as item images in inventories, build menu, crafting UI
- Show item condition in inventory UI
- Refactor all pickupables to contain a 1×1 inventory holder to consolidate decay functionality into one spot
- Tools condition affected by usage
- Consuming is now an interaction with progress bars and whatnot
- Item stack splitting by half and by one using ctrl/shift when dragging in inventory
- Create storables (chest), craftable via planks, shows inventory similar to cooking menu
- Double click (item shortcut action) now can consume consumables
- A lot of work to redo UIs to use content size fitter for fully dynamically sized UI
- Fix placables being placed on the same frame of clicking it in the build menu
- Create environment manager to consolidate all spawn resource pool allocation
- [Alex] Initial world gen, perlin noise tree placement, starting zone
- Refactor all UI views and UI system to use an interface instead of concrete classes
- Performance gain – use unity’s Update() rather than having mediators call custom update() function
- Add world model, refactor existing code to use world manager for things like terrain collision for placing constructions, tree instance backup, etc
- Add concept of fuel for cookables (campfire), particle/lighting effects when ignited
- Tons of UI work on the cooking menu to allow for fueling via combustables
- Refactor inventory section system and add input fuel/ingredients sections for cookables
- Refactor inventory system to be an interface with two types of inventories (grid/simple)
- Undo inventory sections as inventories, make them have more synergy with their parent inventories instead
- Item tag system to generalize where certain items can go (equippable, combustible, cookable, etc)
- Beginnings of showing/hiding sections in the cooking menu depending on state of the cookable (ignited, cooking, output ready)
I wrote 8 pages of existential questions about what the game was even supposed to be, what the core tenants of the game were, and planned out a ton of features that I wanted for my first official milestone. Given that I had a decent baseline of the amount of work I could do in a month, I was able to more accurately estimate how long it would take me. I even created a Gantt chart to see how accurately I could stick to my estimates. Project management was never something I truly enjoyed in my software engineering career, but here I was doing it on my own volition.
I don’t think there’s ever been a time where the estimation process in software engineering goes completely smoothly and everything is completed exactly according to plan. I made sure to give myself a lot of leeway in my estimates. Given all of this, my target date was mid to late February 2020.
Some of the Milestone 1 work:
In early January 2020 I decide that it’s finally time to incorporate and make this whole endeavor feel a lot more serious, as well as give me a better way to split up personal vs business expenses. With that, Original Studios Inc. was officially created on January 7, 2020!
Finishing up Milestone 1
The last few things I needed to do were more nebulous to me, with a lot of trial and error, and as a result hard to effectively estimate. These were:
- Persistence – saving and loading the state of the whole world
- Procedural world generation
Persistence ended up being the most time consuming thing in the whole project so far. It was such a larger undertaking than I had initially thought. I originally planned for about 2 weeks, but it ended up taking me closer to 5. The persistence system is huge, heavily ingrained in every entity of the game, since literally everything has to be saved. A future post about how this whole system works will come later. No flashy gifs to show here, and JSON is not very exciting to look at.
World generation was a large undertaking but not as daunting as persistence ended up being. Took quite a bit of research and learning to get started, but there are of course a ton of good guides on how this process generally works using layers of Perlin noise. Here are some progress shots/gifs:
There are a ton of things I learned about procedural terrain generation, being able to optimize generation-time performance, run-time performance of huge worlds, being able to load and persist the chunks properly, etc. A post about all of this will come later.
Milestone 2 and the future
I ended up finishing Milestone 1 in early March, slightly behind schedule, but that’s ok. I’m really happy with how things have gone, and how far the game has come. I went through a planning process again for my next milestone, and there is an even crazier amount of things planned. So far I did a huge performance pass, tons of usability improvements, graphical enhancements, a ton of new animations and most recently an overhaul of how combat and movement works:
Current estimated completion is slated to be around October 2020. If all goes according to plan, I will have a beta version ready to release to the public by then. Stay tuned.
Thanks for reading