Try out the game -- it's by far my favourite asteroids clone, especially when the sound distortion kicks off and you feel transported to another realm entirely. It does cause spontaneous vomiting in a small portion of the population, for some reason.
Improper viewing techniques may lead in some persons to dependancy, seizures, cranial fits, priapic conditions, maturations, subtle glandular mutations and in some territories... legal arrest. However, if the viewer follows instructions and trusts completely in Bob, this state can create an unsurpassible beatific experience that can last for hours, days, weeks, possibly even for centuries.
In case you wanted some sort of permanent proof for how completely worthless you have made your life, I added Twitter support to Propane Injector and celebrated the addition by then adding it to Novarunner.
As you can see from my twitter page, I am unlocking achievements left right and centre. Too bad it's too short to spam my URL!
Anyway, the Twitter configuration is set up in the user's configuration files; I guess I'll add it to the preferences menu when it comes time to implement that. One possible problem is the (miniscule) lag it takes to send a HTTP request to Twitter; players probably won't like that so I should ideally do it on a background thread.
So I started hacking on the AI for Novarunner, now that all the required parts are in there. This is both satisfying and frustrating; it's like watching your retarded child stumble out into the world, eat dog turds and puke on a fire hydrant.
So I hooked up AI to my test actor; unfortunately, I forgot to hook up a gun. The state machine for AI looks something like this:
if not pointing towards enemy:
point towards enemy
elseif within weapons range:
kill throttle
fire at enemy
else:
set throttle to 30 units per second per second acceleration
So, if you don't have a gun, the state goes something like this:
okay, I'm not pointing at rav.
point towards rav.
okay now i'm pointing towards rav, set throttle to maximum
okay i'm not within 0 units (since my gun is nonexistent) of rav
okay now i shot past rav, try to point towards rav with my throttle still at maximum
okay now i shot past rav again, keep going
So you end up with something like this:
Oh, Mord, Rav shot me!
Let's get over there!
Oops, let's go around.
Missed, I'm gonna go around again.
After changing the code so that it drops its throttle to 5 units/s^2 it seems to be a bit more controllable, but it still won't work quite properly at infinitely close range. A clear modification at this point is to rig it up so that they instantly try to flee if there is no weapon present.
Additionally, it turned up a bug in my homing weapons; since homing rounds are location-based instead of actor-based (for reasons of smart pointer garbage collection), when they hit their location and still have time to burn, they sit in place and oscillate violently. I'll have to rig it up so the rounds are destroyed when they reach their goal or something.
It also turns out that my actors' throttles get jammed when they get killed, so you can kill an actor at full speed and then they'll go flying past you shooting lightning bolts and smoke... which makes it slightly hard to steal their loot.
I'm not very productive, except that I did some work on Afterglow's map format last night. I think I've pretty much got it concreted at this point.
Stupid Eidos hasn't pushed Kane & Lynch to Steam yet, even though it's been out for the PC for two days and the consoles for over a week. I want to shoot people, dammit. I also want to agonize over their unfortunate deaths.
Am I supposed to be making posts here? Making progress on my game? I'm so confused. I'm afraid.
I haven't done much at all lately other than trying to get the "look at" functionality to actually turn the ship (slerping at a reasonable speed) instead of just slerping instantly over. Right now I think I might actually have to add some state to the player objects in order to support that, which is a real pain in my mind.
That said, Americans: looks like your government has finally found the real problem with America. It's Manhunt 2. I'm glad it wasn't neocons, HMOs, terrorists or a depressed world economy -- it was just computer scientists developing make-believe slaughter simulators.
I did a bit of work on Amaranth last night; mostly just getting it all working properly in OS X.
Tao broke when I moved to Leopard; turns out the AGL mechanisms are no longer existent and the rather fragile platform-discovery code shattered as a result. The Tao guys were quick to fix it and I'm running the latest SVN release.
The latest version of Mono actually fixes up the macpack tool to be able to recursively handle subdirectories; this is a major plus. When they actually get relocatable packaging working properly (which apparently is in the next release, thanks to my bug report) it should be trivial for me to deploy OS X Mono applications with impunity.
Two big things that doing this work and rooting through my old code turned up in Amaranth:
DevIL supports OS X pretty poorly. I'm gonna see about ditching the dependency Amaranth.Texture has on it.
Amaranth really needs a large-scale refactor to bring it up to spec with changes made in Iodine; in particular its scene graph is hilariously immature and the vertex buffer is poorly designed.
Since nobody seems to ever reply to my code entries, here's a comic for you:
I also did a ton of work on Novarunner this morning. Namely, all of the achievements are now hooked up, major components of the ship AI is implemented, and "roll assist" is now functional.
Scott, Richard and Josh helped me figure out what was wrong with my math stuff... turns out it was at least partially due to this little bit of genius, which Scott unearthed after adding visual debugging to everything he could get his hands on:
Vector<N,T>& operator-() {
for(size_t i = 0; i < N; i++) {
m_Data[i] *= -1;
}
return *this;
}
I was seriously on drugs when I wrote that one.
Anyway, now that the math is sorted out (which I probably should've had done, like, a year ago... that would've made development much faster) it should be easy to write the AI. Exciting!
There's still some fucked-up quaternion math inside the rendering layer, but it shouldn't matter too much.
Any people with some experience in MDX should probably check out my thread here in the DX forum.
I'm kind of irritated (and I bet people who actually use MDX are plenty pissed off too). Can't Microsoft afford the two or three guys who'll implement the spec?
Been busy with work, so not a lot of stuff is getting done.
I have, however, pared down the bug list -- near as I can see right now, there are only 19 tickets remaining open before I can declare the game code 'finished' and start on polish. I have 196 total tickets, which should probably tell you a lot about how much I like to make tickets. Mmmm, tickets.
Once I blow through these 19 tickets (which should be pretty quick, except some of them are large asspains, like "Implement AI"), it will be an actual game. Horrors!
Today was a day of bug fixes. First off, I got bounty hunting quests working properly, and then I went off to work on tracking down a strange bug I had been encountering.
In Novarunner, all models and sounds and other assets are loaded through the use of an AssetCache<T> object. This guy basically follows this pattern:
public:
T* obtain(string name):
if(name is not in the dictionary of stuff we have):
dictionary[name] = loadAsset
return dictionary[name]
protected:
virtual T* loadAsset(string name) = 0;
Now spot the problem with this code:
class ModelCache : public AssetCache<PropaneModel*> {
public:
virtual PropaneModel* loadAsset(string name) { ... }
};
// EntirelyUnrelatedCode.cppvoid letUsLoadSomeFreakingModelsAlready(ModelCache& models) {
// Hey, why the fuck can I invoke a protected method here?!?
PropaneModel* view = models.loadAsset(xmlnode.name);
}
Spotted it yet? It took me awhile to figure out, but apparently it's perfectly valid C++ to override a protected method with a public one in the derived class. Neither VS2005 nor GCC 4 managed to come up with a complaint against this usage.
Basically, what my idiocy when I derived ModelCache allowed me to do was directly invoke the loadAsset method, which bypassed keeping a record of the model being loaded previously, so the model would be loaded over and over again because I was never actually using the cache part of the ModelCache.
To make life worse, since I'm working with raw pointers and the consumers of the PropaneModel* expect it to be freed elsewhere (i.e. in ModelCache), the meshes were never actually freed when necessary and we ended up with a pretty juicy runaway memory leak, which I would've noticed earlier if I could get the new Leaks tool in Xcode3 to work properly.
The reason why the loadModel method is public when it should be protected? Because I pulled out the AssetCache abstract class originally from it! I should now, by law, invoke ApochPIQ's excellent post about frivolous and unnecessary refactoring.
I had assumed that one of the load methods would be protected and thus not allow me to invoke it from another piece of code (so I just picked the first load method that popped up in Code Sense), but since I had 'publicized' it, the 'dumb' load method was accepted instead.
Bork bork bork hoogen floogen
Link of the Day
Check out Ovine by Design and Smila's Exile remake. It's got gameplay thicker than War and Peace and you could spend a long time licking those graphics. Lick them, slave!
So I went to see the last VGL of 2007 yesterday afternoon. Tommy Tallarico looks taller on TV.
Also, about half of the crowd, since it was an afternoon show, was astoundingly young. The teenagers next to me kept pointing out how they had all the 16-bit and 8-bit games on emulation collections, and didn't recognize Elevator Action when it came up during the arcade medley.
Seems to me they need to do two VGL sets -- one for old people who grew up fiddling with an NES or ColecoVision (myself), and one for kids who grew up mashing Master Chief's fists into aliens.
That said, even the new stuff was done very well, though I'm sort of questioning why they had to mix the music of Medal of Honor in with WWII film footage: in my opinion WWII shooters never actually hit on any tough ethical issues of the war, or even show civilian suffering or the negative ramifications of the Allies. You're just a virtually invulnerable war hero mowing down millions of Nazis, not a little girl dying of radiation sickness trying to fold a thousand paper cranes.
The surrounding pre-show wasn't as good as I figured it would be; apparently Future Shop has a lot of unsold PS3s, because a lot of the furniture for their demo room was built out of the (full) boxes of 80GB PS3s. I did, however, get to drool over the nicely-equipped MAME cabs they had, prompting a discussion about where indeed I would place one of them. "Bedroom?"
"No, not enough room."
"Kitchen?"
"No?"
"Kitchen table?"
"Hey!"
I'll go again next year -- it was fun just being around so much concentrated nerd, even if it was young. I got a faux-faded Pitfall t-shirt, because I'm an old, cantankerous twentysomething nerd.
I'm not sure how many of you will find this interesting, but the batch of university ratings from Macleans came out this week. You should go pick it up off the bookshelves if you live in Canada and are interested in looking at a public university to attend. Waterloo is obviously the single best choice for computer science.
What I particularly found fascinating was this article claiming that Canadian high school students are significantly worse off in math than the majority of new Chinese undergraduates. It's not a surprising development; I myself had several months of rigid adjustment in first year undergrad trying to move from my high school's flippant trivialization of calculus and over-reliance on calculators in algebra to the level where I could even marginally approach students who even came from other provinces, let alone third world countries.
What is wrong with this country's priorities? Education is the priority -- Quebec nationalism doesn't matter, terrorism doesn't matter, even the economy and health care don't matter in comparison. Why don't politicians understand this? Why do we continue to sit back and let the likes of Ralph Klein slash the public education system early and often, instead of farm aid, corrupt opium-addicted police in Kabul, secret Syrian torture dungeons and corporate tax breaks?
This country -- indeed, this entire continent -- is going to hell -- and it took the Chinese shaking off their Mao-induced retardation for us to realize it.
I should perhaps start looking at books on learning Cantonese.
Now you can sell the items that are cluttering up your precious cargo hold.
Hopefully I'll be done the last of the screens tonight (Outfitter) and then I can actually work on the AI and the parts of the game people will appreciate. Tomorrow, Video Games Live!
Starting to get really tired of this game.
Despite the fact I took today off, I haven't been much more productive than normal -- slept in until late. Hopefully this will be resolved in a few minutes. I'm most productive around 4:00 - 5:00, which is ironically when I go home from work. *shrug*
PS, Canada Post: When I pay extra for 'express' shipping, that means I want you to put an armed agent on a plane to personally courier my package to me -- using whatever legal and illegal methods are necessary. It doesn't mean "please delay my package another two weeks because it's a national holiday on the weekend".
If there's a daycare in the way of you delivering my R4, I want you to either drive or shoot through it and camber over the wreckage. Mmkay?