I was hoping to post this on May 4th (...surely you know this reference if you're excited for LT!), sadly it didn't come to pass. But...May the 9th be with you??
This month was full of progress in, shall we say, a diverse set of areas. Nathan aka Talvieno (our Community Manager who writes these summaries; I believe some people were confused about that last month) put it like this in his email to me: "[The summary] took me a while to pare down because, honestly, you were EVERYWHERE this month." Heh. He's not wrong!
From the architecture of core systems underlying gameplay to ship generating algorithms to a teensy bit of graphics work to factions and their implementation...it would be rather hard to identify a central theme for the month other than "get this thing done." I'm OK with that!
You may remember the ECS (Entity Component System) I was working on at the end of last month. As a quick refresher, it’s the part of the engine that controls how the data that underpins objects like ships, stations, colonies, asteroids, etc. is defined, managed, and altered over time in response to gameplay. From the point of gameplay, it’s the most important part of the engine. For half of the month, I gave myself 'full permission to do nothing but ECS work.' And boy did I take that permission and run with it.
After MANY hours of banging my head against the problem, I made what I consider to be a very practical decision: I said 'screw it; I'll design for the rule, not the exception.' I'm sure someone has said that before, but now I'm saying it again. I banged out an ECS that covers the majority and gave myself permission to worry about the rest later. CPU-heavy information lives in C, and the components live in Lua, since I decided that these are, in the 90% of cases, lightweight enough to be handled by Lua without issue. And so it will be until something starts causing major issues. I'm more than ready to put this kind of infrastructure work to bed and build game.
The ECS work, despite being a pain, did bring about several big new advancements outside of just entities. One was the implementation of the 'RenderQueue,' an engine-level construct (that I've never had in previous versions of the LT engine) that allows me to encode graphics operations as objects that can later be submitted to the fast part of the engine to be executed at blistering speeds. The upshot is that we can define how to render certain objects, or even special effects, in Lua, but not have to pay the cost of actually executing them in Lua. This is exactly the best-of-both-worlds type situation for which I'm always hunting: being able to build and iterate quickly in Lua, while maintaining high performance by putting the C engine to work.
Another product of the ECS work was a mod loader along with a preliminary mod format. I'm actually using this for prototyping new gameplay systems. Writing gameplay as 'mods' means that I can easily plug and unplug them as needed while I develop. It also means that I'm breaking in the modding system, so it'll be well-worn before you guys get your hands on it! The current mod format is a lot like a 'data description,' which makes things clean and easy to reason about (without any sacrifice in flexibility). Lua is a beautiful language for describing data. Making LT modding easy and powerful has been a big goal of mine for a long time, and it's looking like I'll achieve that goal (and without the game-breaking performance penalty of the old Limit Theory Scripting Language).
After weeks of waging the ECS war, I needed a break, so I gave a few days to Graphics Josh. I implemented the 'blind-you-with-all-the-things' style of HDR bloom that seems so characteristic of high-end engines these days. It looks impressive, but if I use it in LT I'll be sure to turn it down...a lot :P I also ported some of the physically-based rendering code back from LTC++, including GGX environment map generation (with faster and more accurate math, which means that everything looks...just a bit better). I also brought back the per-system, procedurally-generated color grading. Nice boost in shininess; but I must reiterate for the sake of those who would be concerned: I was working on graphics purely as a break from more important things...as I've expressed before, I'm done putting a lot of time into the graphics, which are perfectly-suitable for release in my opinion!
Speaking of graphics, I did put together a small album of shots from this month for your ocular pleasure. Have at it!
Toward the end of the month, I gave another public LT demo at an LSU game industry event. Like the rest of the events I've attended, it gave me a fantastic excuse to get some fun things pumped out quickly! Annoyed by how similar all my ships look currently, I sketched out a basic 'fighter' generating algorithm. Although simple, it's an important step in the generating algorithms: it's the first to use sub-generators for coherence. As I move toward more coherent ship generation, I expect more and more of my generating will be factored out into 'component' sub-generators. Cargo bay generator. Engine generator. Cockpit generator. Solar panel array generator (station). This has always been the plan, it's just the first time I'm actually working on it (and the first time I've worked on ship algorithms in...a long time)!
If you checked the album above, you may have noticed beam weapons - something that's been missing from LT for a long time. Finally having a nice visual distinction between capital ships and fighters for the demo, I wanted capital ships to be more fearsome, so I banged out some beam weapon code and a new shader. It turned out nicely :) The initial balancing, though was…quite poor. It was NOT a fun time to be a fighter pilot, despite your fancy new fighter ship design...partly because I forgot to put a range cap on the beams. Whoops...
In addition to all this, I implemented factions so that I could start working on some more interesting gameplay in the new engine. Factions are first-class objects now and, thus far, have unique ship designs, their own credit accounts, a tech level and more. NPC AI now (more) intelligently selects enemy targets based on various factors. Combat AI was split up into several distinct sections and generally improved.
Finally, we've upgraded the website! This one was actually all Nathan, to whom I gave the task of 'modernizing' the LT homepage a bit, by replacing the pictures with more recent ones. He did that and much more. As usual, Nathan has gone above and beyond :) Check out our new homepage! (Force refresh with Ctrl-F5 or Shift-F5 if you don't see the changes. We're still working on caching issues.)
Another month, another step closer to release. Work is getting more and more oriented toward Limit Theory the game rather than Limit Theory the engine, a result of my painful journey toward pragmatism. For that reason, I'm keenly interested to see what May's development has in store for us!
As usual, thank you all for joining me on this journey toward the completion of a beautiful, living, procedural universe.
~Josh & Nathan