Obviously, this blog is utterly dead. I, however, plan on changing that.
First things first: I have massive news! I got hired in the game industry! I'm a Junior-level Gameplay Programmer (with a capital P!). This has been a huge benefit to me because A) I've learnt so much already and B) I now have money! I'm going to opt out of telling you where I work for liability reasons (do some digging and you can find out easily enough).
The bad thing about working full time in the industry is that it is now quite difficult for me to find motivation to work on my games. After a good eight-hour day programming, I'm pretty coded-out.
Horizon (the game of my dreams) is still calling, like it has since November 2014, so I still yearn for it. To give you an idea of my development process, I generally just do nothing until I feel the urge strong enough, then do a significant amount of work. I find this to be the most maintainable for me because I don't have to pressure myself too much. This is NOT a good development process because I will never get anything done. Once I get used to working full-time, I will try to make myself more productive while not getting burnt out.
Horizon has had very sparse development since around the time I was graduating high school. I was focusing more on my short-term future (sending resumes, having existential crises, etc.). Additionally, I have realized that I did not design Horizon very well at all on the code front. I did not put enough thought into my Object design, which meant a very large amount of friction if I wanted to create new Objects (i.e. do anything useful). After getting some advice from my coworker on the subject, I have redesigned the Object system to be heavily Component-based. I am very confident that this is the proper choice and that it will speed up development times.
Realizing my Object system was poorly implemented revealed to me that many of my other systems were also shabby. For example, the World should not know anything about Objects, and Objects should not know anything about the World. In its current state, I have collision and movement code in Object!
Another large problem with the code is that the World is tied to rendering. I have thought about solving that problem, and think that the World should only store gameplay data about the World. Renderers (notice the plural, meaning possibly many!) will have the burden of deciding how to display the data. This decouples the two components in such a way that A) Components can do all sorts of things to world without needing to have spritesheet tile coordinates (the current system does this) and B) World can store data in the way that makes the most sense to it.
These problems require enough modifications to the entire structure of the game that I believe it is more efficient just to start over. I know what you're thinking - "Macoy, no! You've fallen into the classic trap of being a Perfectionist Programmer! You'll always want to rewrite all of the code!" In this case though, there is so much friction within the current codebase that I do not want to write any code at all. I have coded myself into a corner. I am going to start over, but this time, I am truly going to do it right. Mark my words though, I will not start over again!
A coworker pointed me to a very good 2015 PAX panel on procedural generation. The main thing I got from it is that I need to focus on releasing early. I should be making the minimum possible game I can, then slowly adding all of things I want (releasing along the way) until the game is
an incomprehensible steaming mess closer to what I dream of making. This will make the game seem a bit less absolutely insane in scope. It will also help keep my morale high.
Release - I like that word. A lot. I'd like to keep this blog up to date so I can stop wanting to tell my coworkers about my game (they're probably sick of me already). I want it to provide more motivation for me to keep going.
In my next post, I hope to be posting about fun stuff like a better build system (makefiles are awesome, but it creates too much resistance to adding new files) and the Object-Component system.