Devlog Entry 1
April 17, 2022
Image taken from https://unity.com/learn/swordsandshovels
My Game Dev Journey
About 23 years ago, I asked my dad for a C++ book for my 13th birthday because I read that it was the best language for creating video games. After literally falling asleep at my keyboard with my book beside me during my entire summer break, I started the next school year armed with confidence in knowing what I wanted to do as an adult…I wanted to become a video game developer.
Well life rarely goes as planned. After turning 20 and getting my first programming job as a web developer, college became a rocky road, and I eventually called it quits. That’s still a bit of a pain point for me to this day, but being mostly self taught hasn’t been a terrible experience. The problem with having a lack in formal education would confront me face on around the age of 25 or so when I began looking for a new job. I still remember having zero clue what my interviewer meant when he asked me to describe the Big-O complexity of an algorithm.
Over the years though I’ve worked at several companies, from small startups to multi-billion dollar, international giants and have met many amazingly smart and skilled engineers who challenged and helped me grow into what I feel safe to say at this point in my career, a software engineer. The problem I kept facing time and time again however, was this deep desire to “do my own thing”. I had tried my hand at various “startups” over the years, many of which failed before the first prototype was finished, one of which actually did see it’s first bit of revenue from an actual paying customer, but I’ll digress.
I realized eventually however that maybe the reason why I’d get excited at first and quickly get bored with pretty much every idea I had, was because..I never really had my heart in it to begin with. At the end of the day, the only personal projects I would find myself returning to over and over, were the various video games I would tinker with. It wasn’t until I was about to turn 35, a time when I was feeling depressed with this existential dread that I would never do anything more than to work for someone else all of my life. Now, that’s a totally fine way to go about life, but for me, it was a constant source of depression. That day, I thought to myself “why haven’t I ever really cracked down and focused on developing video games?". I had created tons of small prototypes and multiple classic arcade clones, but never really anything grand as I had dreamt of as a child.
The conclusion that I arrived at was that I was always focusing on money. What would do well and let me start my own business up? The issue there was that, money was never a huge driver of motivation for me. A recent chat with a friend of mine made me further realize this: At my core, I am a creative person. I deeply desire a creative outlet. I desire to build worlds and tell stories. The issue was that, all of my efforts had been around ideas that I thought “could make money” but never made me think “Damn, this is freaking cool”. Nothing ever really did outside of video games. Sure, I’d come up with some interesting idea for how to abstract data sources from business logic, or some app that would have elements of fun, but for me, none of these things allowed for the creative freedom I was so desiring and didn’t even realize.
What I Had Coming Back Into Game Development
Over the last 15 years or so, I had worked on dozens of projects, wearing many hats, studying a huge range of topics and solved countless problems. I was forced to accept that I was shit at algorithms and data structures, so I studied relentlessly for many years. Overall however, I would have to the key skills I acquired that are necessary for any type of software development are:
- Communication. It’s critical to understand how to talk to not only your fellow programmers, but to non-programmers alike. Actually, it may even be more important because at least programmers can read your code.
- Keep it simple, stupid. Yeah, that may seem like a worn out phrase, but honestly the way I approach work these days is dramatically different from my former over zealous self who’d have 30 packages and 60 class stubs created at day 1 of a new project.
- Code is a document for humans that computers just happen to understand. You can write dog shit code that will run on a computer…hell, it may even run ultra fast. You may even be able to rank in the top 10 at Hacker Rank, but that doesn’t mean other programmers won’t want to murder you when they inevitably have to work with your code. Always write code with the mindset that someone else will have to be able to understand it and work with it.
- Efficient code is great, but don’t pre-optimize. I use to spend countless hours designing data structures and algorithms without really considering the use case. Does it exist at a mission critical part of the app? Will there be so much data that without highly efficient code, the server will burst into flames?
- Communication. Not a mistake adding this a second time. Comment your code. Manage your Jira tasks. Tell others where you are, what you are thinking, what issues you’ve ran into, and ASK for help when needed.
- Design first. While it’s amazingly tempting to jump into a project and start hacking away, going into every task you have with a plan will save you countless hours of waisted effort. Of course, this can get way into the weeds philosophically, but ensuring you understand the problem, understand what’s being asked of you and understanding what issues could arise down the road before writing a single line of code is not only a sign of maturity in a developer, but also just good engineering practice.
Ah yes. Math. My old love-hate relationship. I was terrible at math in school. I hated the way it was taught. I hated getting called on to do problems on the chalk board in front of the class…but mostly, I absolutely hated the fact that I knew I needed to understand it. Ok, I told a bit of a lie there. I actually always really loved math, but it never really clicked in my head until I was older…like 20’s older. The real issue was, I never wanted to learn theory. I wanted the practical uses. I wanted something more hands on. I couldn’t wrap my head around the abstraction they commonly taught in school. I wanted concrete examples and how I would apply it to what I cared about: game development.
Over the years, I had studied discrete math since it’s really the foundation of programming, and occasionally refreshed myself on linear algebra and trig. However about 4 months ago I realized that Unity’s default character controller just wasn’t cutting it. It was lacking features. There was no proper sliding for steep slopes built in, the stair climbing was just awful, and the source wasn’t even available because it was based on an Nvidia PhysX demo that was only exposed as C++ header files. I struggled for weeks trying to get it to work, reading articles, watching videos, yelling at the dog for breathing too loudly (he just sorta looked at my like “dude, you good, or..?").
I realized that I only had two options. Purchase a pre-made character controller, or role my own. Well, my goal isn’t to create just one video game, it’s to become a game developer, and so I set out to create my own, from scratch. After reading and watching a dozen videos on linear algebra and trig, and a dozen more articles on proper collision detection (kinematic rigid body) I was finally able to produce something that worked, and after a few weeks of tweaking, I’m pretty happy with where it’s at.
So where am I now? Good question. The game I’m working on is a third person rogue-lite. I have about 6 dozens tasks, many of which include “Learn x and y”. I’ve been really trying to avoid hackery even though sometimes it’s super tempting (and easy) to make something work with a few lines of code. However, it’s a balancing act like most things. While I need a good foundation, I also have very little free time to work on it. I have to constantly ask myself “Does this solve the problem at hand? Will I have to rewrite this the second something new comes up that I didn’t think about?". Really though, I don’t even care. I focus more on somethings, go back to other things, etc. It really depends on what I feel like working on any given time. If I find something to be lacking, I’ll often quickly do a refactor pass. Code isn’t set in stone and can always be changed. At least, for now. We’ll see how it changes when I actually have someone else working on it with me.
My current list of tasks are:
- Improving the level management system.
- Adding more animation states to the main character.
- Integrating the task / questing system I wrote into the new code base.
- Build additional editor tools.
- Figure out the art direction for the world design (e.g. Diablo 3 / Torchlight 2 style? Hades inspired?).
- Create working prototypes for in-game menus.
- Start prototyping melee combat.
- Start on abilities / skills system.
And the list goes on and on.
So long, and thanks for all the fish!
I didn’t intend for this post to be an 45 minute read. I definitely didn’t intend to spend 4 hours writing it… but if you got here, I love you. Eventually I’ll get the hang of writing these, and maybe even do something original like starting a Youtube channel. Outside of the programming tasks, the big concern for me currently is of course “How in the hell am I going to get assets and level designs and animations, and…". I think that’s probably what kills the vast majority of indie game developers. My current plan is to stretch my wallet thin and pay for art once it’s needed.
The other thing on the horizon is putting together the start of an actual team. My ultimate goal is to have a physical building somewhere, stuffed with a sea of monitors and keyboard and Horizon Zero Dawn figures. We’ll see.