A few bits and pieces of things done last night on Iodine and Propane Injector: the first really important thing is that my geometry class now builds an AABB out of vertex buffers that you can use to check against the camera's frustum (as well as basic collision).
That's pretty cool.
Other stuff I took care of last night:
Fixed billboards finally, I'm using GL_ARB_point_sprite now with no fallback path.
Fixed a crash bug related to selecting a dying actor
Cleaned up a collision bug
Not really that much, but it's progress nonetheless.
Hey -- only a few more days until my "post every day in September" project is finished. I hope you enjoyed it, but for a lot of days (like today) I had nothing to say except "I made incremental improvements, I can't show you them because they aren't visual, here is a picture of a cat."
Well, that's not so bad. I'm glad you people seem to like the Glow postmortem. I've been working on the stupid misdrawn explosions still. Thinking of moving the billboards out to a shader, like jpetrie said.
Also, I got Halo 3. Why don't any of my guns cause damage anymore?
I got a fairly large component done and dusted at work. Things are looking up.
After my little depressive episode yesterday I went and worked a bit more on the Glow postmortem. That's finished and I've shopped it out to a few people (and will be shopping it out to a few more) for criticism and rewrite, then I'll shove it up on the site.
Superpig apparently wants me to toss it at the site as an article as well, so you might even see my writing up and around on GDNet. Now that would be supremely self-indulgent.
So a few things here and there. Novarunner is still up on blocks right now since there are some very obscene rendering errors with my explosion functionality.
I worked on the Glow postmortem instead; I was surprised at how much I had to write. Right now it's up to five pages and I think I could reasonably wring another three or four pages out of it without much more effort.
It's strange how, looking back on the lessons of Glow, how few of them I've actually learned for Novarunner. I feel bad about implementing "tools" and "managers" in Novarunner, only to discover they're deficient in one or many categories, and end up removing them and hacking around instead of refactoring them. It also doesn't help that I've taken a decidedly non-conservative view of this game, doing something "new" in almost every category.
It's very stressful and mentally taxing to be developing a game from near-scratch with almost no specific prior experience to build upon (I suppose this is the reason Novarunner's original name was Complex). I should've built more prototypes.
I've taken almost a year (and almost 70 000 lines of code) to produce little in the way of actual gameplay functionality. That's disappointing and discouraging.
Here's hoping that Afterglow's development will be less rough. I think I'm turning a corner on Novarunner now that gameplay systems are actually being implemented.
Some of the things I'm going to change in the future:
Adopting a "vocabulary" of problem solving. Identifying common patterns (object caches, message adaptors, complex references) in my game code and abstracting them into a solid base which can be re-used to solve problems without much stress.
Improving my coding standards, so things are logically and consistently named and organized, and also so the code I produce is more readable.
Writing a re-usable and powerful 3D rendering base so I stop having to worry about all this math and writing rendering code in the middle of making entities' game functions work.
Improving the documentation of "unfinished" components of the game so that they can be quickly summed up at runtime and the problem areas identified. Right now, there are a lot of "unfinished" components in the game that I started work on early and haven't even marked with a TODO, let alone entered into my bug-tracking system. This worked for Glow when large unfinished components were more obvious, but there are subtle missing components to Novarunner that don't work, and it's hard to find out why. It makes it hard to schedule and "check off", too!
Now I'm probably going to figure out some system of "tagging" portions of the game code as TODO and writing an external tool, which will be run at build time, and which will identify "unfinished" or "glitchy" regions of the code by generating a to-do list for me.
Separating engine and game code to a greater extent.
Clearly defining responsibility. Novarunner has a bunch of multi-object entities whose responsibilities are often ambiguous (such as the Actor -> ShipStats -> Chassis linkage) and difficult to resolve.
Prototype. It makes it easier to find defective gameplay and find out where "fun" fits in.
My coding practices have never been the best, but I feel especially disappointed in the Novarunner code to date, and don't have the time to start over like I have already on this project.
It's looking pretty unlikely I'll have a Windows version tonight; there's a bunch of busted code flying around right now and I've got to tackle it all.
This bug seems to have forced me to implement an entire subsystem, which is giving me the predictable shits.
The moral of the story is to understand why your code sucks.
So I got Novarunner all built in VS2005 this morning.
Apparently GCC in non-pedantic mode doesn't consider if(booleanValue < 1) an error. So I'm somewhat glad that VS2005 was there to catch my search-and-replace error, and I switched Xcode over to pedantic mode.
The consequence of that, of course, is that now my code is broken because that flag was branching to a piece of code I didn't finish implementing and needs a large refactor to work properly.
Windows pre-alpha up tonight, maybe? It'll even have the bug fixed, so you Windows guys can feel superior to Mac OS X users.
I've been working on a generic library for handling HTTP stuff on my end. It's more or less a little C++ wrapper around libcurl.
Why? Because I got an idea of how I can use Twitter to bypass the "secure online high scores" problem: anyone in the world can fake a high score using Twitter, so there's no inherent trust like there would be if the game were uploading high scores to my website.
Another neat benefit is that I can get free advertising.
If I get HTTP stuff up and running, I can also do simple net integration -- downloadable content packs, news updates inside the game, stuff like that. I am sort of worried about how I'm going to deal with Windows Firewall and the like, since even Valve doesn't seem to be able to tell when Windows Firewall is going to pop up and interrupt the focus to the game.
I did a bit of work on Novarunner in order to finish off the pre-alpha and complete my Chassis delegation refactoring.
Again, if you've got a Mac, time to kill, and a couple megs of bandwidth I can give you the pre-alpha to test (PM me for the link). It's even got a readme to go along with it. Once I launch a proper wiki, I'll move the tester support stuff over there.
Thanks to Promit for letting me rip off this image from his webspace.
I didn't get anything done last night because I took a Nyquil and zonked out right as I got home. Sorry.
Tonight there will be more stuff:
A start on a build process for Propane Injector; I'm finding a lot of regression problems because I've modified one siloed module but not others, so I want to write a proper build process up so I can do, if not continuous integration, at least some kind of integration.
Collision stuff for Iodine; the Geometry class is mature enough now that I should be able to rig up an AABB for trivial frustum culling. That will be exciting.
Fixing up dockable loading; there's a whole pile of new stuff that has to be added since I initially built dockables, so it definitely has to be done.
Actually make docking work; right now docking is just hacked together on the "beta key" (B). Now, docking will actually take what we're docking with and interact with it significantly.
I hope to give you guys a screenshot showing at least something new.
P.S. those of you with a Mac (Intel or PPC), I can provide you with a build on demand. Reply in the comments with what kind of machine you have and I'll send along a link to download what I have so far so you can performance test it.
Yesterday I did little more than work out more development plans for Novarunner and fix up a few bugs inside Propane Injector.
On the plus side, I did play a hell of a lot of Team Fortress 2. I still haven't seen most of the maps yet, but I don't think I've ever had this much fun in a multiplayer game since the original TF.
The scout's double-jump triggers other people on the game to go "WTF" as I ninja my way up stairwells in a flash. It's great.
Tonight I might do a bit more work on the chassis stuff; I have to get them loading properly again, and then it's off to go refactor the system-loading stuff so that the actor definitions inside the systems are loaded properly.
I finished a bunch of stuff on Novarunner last night while waiting for TF2 to unlock.
Of course, Valve didn't unlock the Monday release of the TF2 beta until 1:30 AM Tuesday. This makes sense.
In any event, here's what happened on Novarunner last night:
ShipStats finished up; it now delegates to the chassis in the appropriate spots. I don't think it serializes the Chassis object yet, so I'm filing that bug right now.
Minor tweaks inside the code for serialization.
Not a whole lot, huh?
Yeah, I'm sorry. This cold is doing me in. I still think I can release in November, though. Once all of the chassis stuff is implemented, I can build the shipyard. Then I can finish off the rest of the space stations, bolt in the AI and spend the rest of the time tuning and building the game world.
One thing I am worried about is that Novarunner is intentionally "plot-free"; after Glow this seems rather strange, but you get out of Novarunner what you put in.
The problem is that there is essentially no background motivation other than to get the best equipment and stuff in the game; there is also no ending and no main plot thread. This is deeply unsatisfying to me and I'd feel gypped if I played a game like this. So I've gone back and started thinking about how to fix this situation.
One idea is to have a procedurally-defined ending: when one side controls the vast majority (80%+) of the universe, they win. But this would require me to define systems' factions and implement a whole war subgame (with many opportunities for the player to shift the course of the battle added), and that would boost up the development time.
Another idea is just to have a "main quest chain" like Oblivion and the like, and end the game after the final quest is accomplished. This might be what I'll do, but the quest system is still up in the air.
I think Novarunner will end up being a "quirky prototype" rather than a "great game," but I still think you'll really like the gameplay.
Do you guys really care that there isn't an ending? It seems to me that it would be fun just to explore for awhile, but without any kind of completeness indicator you can't be sure you've seen it all.