In the quest to learn OpenGL and attempt to break into games programming, I decided to attempt something I've wanted to do for years: a reinterpretation of the 16-bit classic Carrier Command.
Imaginatively titled 'Carrier 2', here's the biz so far:
Dev blog now lives in my GameDev journal
Quickie while I'm here....
Been integrating loading of Collada models to support the new model data required for physics etc, and to allow user data.
Piccy is of a new manta design I've been playing with in Blender, which I've become accustomed to really quickly and now like much more than the restrictive 3d studio, not to mention Maya :P
Made a start on adding a scripting language which should speed up the remaining work no end. Choosing between lua and squirrel, though leaning towards lua as I'm familiar with it already.
Another quick announcement: there's a movie available showing the latest build in action.
Meanwhile work continues on new Blender models, getting the game part balanced and playable, tweaking the damage systems and further shader work.
Quick update to show the preliminary progress on the shader work... the picture says a thousand words.
...and a nice beach scene... looks nicer with the water animating :)
Now I've finally made the jump to shader speed, the fixed pipeline seems horribly stifling in comparison - no looking back for this games programmer! :P I thoroughly recommend anyone starting out to jump straight to shaders if possible.
4 years. 4 whole years. Don't know whether to be amazed or depressed. Best not to think about it probably ;) Anyway, despite what amounts to a month off over Christmas, I've got an amazing amount done on C2 - It's actually starting to look like a game rather than a 'tech demo'. Here's the beef...
The scout drone lives... again. Yes - my first model has had the cobwebs blown off and been reinstated! I've got island defense drones in and working very nicely indeed, and until I have something better, I've used the old scout drone model.
Been searching for a new model format that caters for my new enhanced needs and helps speed up the work of getting the new data into the game. So took a look at Blender, which hereby wins my coveted award for easiest way of losing hours of work at the drop of a hat. Leading to major keyboard headbutt wounds. What a bitch of a program it is to use. Erm, but it's free.
Having made the ray-cast functionality, I now had the task of trying not to call it too often a frame. Much fun is being had trying to find a good scheduling and/or caching system for this so things don't grind to a halt but the AI can react in a reasonable timeframe.
Quite a lot more work has gone into the heuristics of target detection too. It's been surprisingly hard to get intelligent target selection working. It's boiled down to the individual offensive structures calculating 'local target fitness' which is then combined with an island-evaluated threat level in various ways. Throw into the mix distance, visibility, weightings and weapon suitability and we have quite a complex recipe.
Added *loads* more debug visualisation data. This stuff is invaluable when it comes to writing AI stuff, especially when using rays.
Dusted off the old OpenGL shader book and started looking more closely at that stuff again... it may finally be approaching time for the 'fun graphics bit' at last, having left it more towards the latter part of development, hard though that has been. :)
Last but not least, I've had fun making some nice explosions from the various particle types, and added splash damage calculations to round em off. Shooting down those annoying attack drones with missiles is a satisfying experience.
I'm finally beginning to concentrate on some more interesting stuff in detail - mainly the Island defense 'A.I.' I started looking at earlier. This has prompted a whole raft of new geometry intersections/test code I never knew I needed, and thanks to the excellent book 'Realtime Collision Detection', has been a lot less work than it looked like!
Anyway, the contents of my Subversion changelist this period, in now familiar bullet-pointy style:
Well that's most of the interesting stuff anyway... hopefully more soon :D
Hmm this page is getting rather large and unwieldy... maybe time for splittage.
Doesn't time fly...
Not really had time for an update recently - too busy with the evil RL again. That and going on holiday a few times :D
So... what C2 hackage have I been up to? Well rather a lot actually - it's just hard to summarise when it comes to timesheet day.
Also I finally decided to ditch the buoyancy functionality that comes with Newton physics. Despite looking promising to start with, the system requires various ‘hacks’ involving fudge factors and additional physics geometry. It works ok for floating cube physics demos, but seemingly not for more complex applications.
Anyway, a bit of tinkering with the fluid sample system used for the Manta flight model has given me what I've been looking for all along, except without the numerous hacks :) See the pic for juicy buoyancy forces in action! It's a testament to the fluid sample flexibility that adding the buoyancy effects only took a few hours hackage, and now universally handles flow forces and buoyancy together.
Update time this way comes...
Managed to sneak in some C2 hackage despite having a very full timetable :-/
Anyway, I'm just overcoming a bad case of analysis paralysis (aka 'programmers block') The end result of which is a totally revamped subsystem err system. I had the child object hierarchy and the subsystems muddled up totally. Seems I just had to step back and re-examine the design in a few places to see the light. Halleluja! Much happier now - better than soldiering on with a crap design.
Also moved over to using Subversion for source control - a good move and long overdue. It seems to be the best SCC system I've used so far, and I've used quite a few (SourceSafe, Perforce, ClearCase, Continuus.) Also helps me see what I've actually accomplished over the last few months...
More work on the Manta flight model (fluid samples) finally (almost) flyable and acting properly in VToL and normal flight. See the piccy for an example.
Added more debug rendering facilities so I can see stuff like physics forces being applied - essential when messing with matrices and world/local transforms/cross products yadder yadder. See the pic again. Short description:
Thought I better update me olde blogge thingy once in a while! Quick pointy list:
Designed the threat prioritizer to be a centralised threat evaluation system so that hopefully it will act in a more intelligent way than just simply attacking the closest enemy.
Yes... work has begun on the AI at last!! Started looking at island defences, so hopefully there will be something playable soon, rather than just a carrier command world to be moved around by the player. I'm hoping to make sure recon, stealth and terrain all affect your approach and success to taking over islands, as the detector structures will work 'properly' as you'd expect them to.
Fleeting update time yet again...
Had a few problems with the physics integration. I actually thought it'd be quite easy to do, but as usual it's harder than expected. You actually need to know quite a bit about physics yourself (which my research into RBD has equipped me with thankfully.) Problems have been encountered in various places:
As a result of physics incorporation I also had to move the engine over to using orientation matrices instead of hdg/pitch/roll. Seems like a better solution anyway. Especially for avoiding gimbal lock.
Physics integration is definitely a good move though, despite the problems being encountered. Seeing a Walrus navigate a steep beach landing, or rock from the recoil of its heavy cannon is definitely worth seeing :D
OK, by request... a new update!
Rigid Body Dynamics. The (semi)final(ish) frontier. Carrier2 being a learning exercise for me, I think I know *what* & *how* to implement it (hope to summarise this in another webpage, as others may benefit), so I will now code one up. Erm, except to code/test/tweak one of these beasts will require a rather long time to put it mildly.
So in the continuing spirit of learning things, I learned to salve my conscience in this manner, and integrate 3rd party again. I'm currently evaluating Newton, having rejected certain others for various reasons.
Adding RBD is one of the two remaining 'BIG ONES' - obstacles standing in the way of Carrier2 completeness (A.I. being the other big 'un) So with RBD in and working, we can maybe expect a 'playable' game (discounting any opposition;)
Screenie shown is the Walrus physics geometry navigating an uneven hill.
Quick update before I go on hols (yes, still going, just about ;) Things covered in May/June:
Finally sorting out the vehicle subsystems issues has been a rather tough programming challenge. Had to handle requirements I never designed for, and had to refactor a lot of things to splice it in. Finally in there though, and just as I wanted: vehicle subsystems can be physically hit, damaged and repaired.
Upgrading the physics models for the vehicles allowed me to add basic collision response. This is the meat of the rigid body simulation, and it's going to be hard to get it right. Thought about adding ODE or similar 3rd party dynamics engine, but there are some issues with my large world size.
And testing the Manta's hover mode is slowing down progress as it's so much fun ;)
Might as well task-dump at this point; been adding various things despite some real-life stuff getting in the way.
Island placement. At first I thought this would be nice and easy. Then I realised perhaps not. Constraining the placement so that the game is actually playable is a somewhat harder task than it first seems. Then I discovered Diffusion-Limited Aggregation, and there was much rejoicing. For this nice fractal process lends itself almost perfectly to island placement, so in the end it's been quite an easy task after all (see piccy for a nice 128-island mother-of-a-map). Just had to tweak the diffusion steps so they tended towards the origin, guaranteeing a more timely aggregation, and steer the release perimeter a bit... It's also quite easy to allow the user some control over the formation.
Now I can state that carrier2 is using state-of-the-art fractal technology in the feature list ;)
Now, making the resource network links appear natural is something completely different...
Onwards and errr upwards? Monthly update this way comes...
Moved over from Visual C++ 6 to .NET. Mixed bag really - compiler seems better, and it found a horrible stack corruption problem straight away, but the improved so-called 'intellisense' is somewhat less intelligent than it purports; my ASSERT macro rendering it unusable in following code (which was unfortunate really, as probably half of my functions start with asserts)
Also been reading up on the OpenGL Shading Language. Very nice indeed - I can see why shaders are taking over. Now, if you'd all be kind enough to upgrade your graphics cards to full shader support... ;)
And yes, I do keep going like the duracell bunny (nice forum post ;) No I don't know when a beta will be out either :P
On a side note, rather than bore you with the inanities of my latest bug fixing session, I'm only going to update this page when there's something worth writing from now on...
Feels like I've taken a step sideways this month. Lots of work again but not much to show. LOTS of bugs fixed and tweaks made. Have to be careful I don't get stuck in a tweak cycle though. I've realised I need to keep a 'don't look too far ahead' mentality with this project, otherwise I'd run away screaming with the sheer amount of stuff still left to do!
Test test test. Deary me, you think I'd have learned by now eh? Seems there's been a bug in a piece of well-used code since the 'early days' and I've only just found it. Uncovered a few other corkers in there too :o
The upshot of which is that I wrote up a 32-page test doc this month (about 500 tests to date) and will add to it as I code stuff up. I'll have to run through it every now and again to check I haven't broke anything, and also before any beta releases ;) Some basic tests are run automatically every time the game is run, but I must find a way to automate more of them, or go mad... Anyone still volunteering for beta testing? ;)
Messed about with different integrators in the Walrus physics code - Euler, midpoint, Runge-Kutta, Verlet. Still messing.
Robustified the resource network code, and had to rewrite some of it as I'd assumed that a base island and a stockpile would always exist. How myopic. Also some *very* sneaky bugs were present whereby objects were silently changing ownership; bummer to find that one!
Looked at another method of island creation (well it *is* one of my pet areas of interest.) Tried out the rather nice LibNoise - basically a programatical version of WorldMachine if anyone's familiar with it. Gives quite a bit more flexibility than my previous methods. Lack of screenies due to islands currently being a mess :P
Finally got round to implementing a non-floating point world position class, so now we can have worlds up to 5.9x10^13 km in size. Certainly beats the ~200km we had before! Should really have done this before worldPosition was used all over the place, but ah well.
Collision detection came in for another bashing as well - due to the WorldPosition changes I needed to rewrite the coldet stuff using only 'well-conditioned' (i.e. near to the origin) floats from relative object positions. Also, having sub-objects (e.g. turrets) adds an order of complexity to the proceedings. But I wants meh turrets, so we is gonna have 'em. And it's so much fun taking out aircraft with the carrier's AA turret :)
Well, it's the bi-anniversary already - two years of hackage and nothing released yet! Tell the truth, if I'd known how much work was involved in Carrier Command I probably would have chosen to write a nice easy FPS or something...
This month's selected highlights:
Rewrote particle memory allocation stuff & made particles more flexible (yet again).
Implemented more detailed damage modelling, using a system of:
Looks like it'll take quite some testing to balance out.
Managed many small bug fixes & tweaks.
OK, so I rewrote the sub-system/sub-object/collision/damage thingy I was moaning about last month. I wasn't happy with the code. I was shoehorning a recursive object hierarchy into a place where it didn't fit (and wasn't really appropriate either), resulting in something too complex, with redundancy, special cases for the carrier, and other bad smells. And it was giving me nightmares (and I mean literally, such is my mindset). It's amazing how complex these things can get -- Sometimes I just needed to take a step back from it all and apply some common sense ;)
I know I've been advocating getting in the base cc1 gameplay in there first, but the subsystem and damage modelling are integral parts of my vision for CC2, so, errr... :P As an 'indie' programmer I can spend time on these interesting areas I feel make a game more complete. I think it's details like this that make games like the rather amazing IL-Sturmovik an order of magnitude better than most. Whatever 'better' means.
Certain areas of the game-programming web have been alight recently with comments on the working conditions at a certain well-known software house that should know better...
Perhaps a little caution is required when aiming on entering the gaming industry? I certainly wouldn't want to be going for interviews at the once-great EA ;) Unfortunately, I bought an EA game quite recently...
Late update, but then I've only just sobered up after Christmas...
Quite a lot of work has been accomplished over Christmas, but I couldn't really name any major changes -- tweaked the projectiles and particles, more carrier subsystems work -- the overall code is better and there are less bugs.
I've been wrestling with a few design decisions I made some time ago wrt my game objects and their subsystems. I now have to take what I've got and try to get by, or rewrite certain parts to handle what I now need. Not very pretty, but 'refactoring means never having to say you're sorry' ;) As you may expect though, it's a lot harder to make large changes at this stage in the game - a test of how well my interfaces are separated. Or not. As usual, I can see better ways of writing the code in hindsight, and the main problem is deciding when to leave something alone, and when I need to forge ahead and rewrite it. I do actually want to finish this thing at some point.
Status: about 5 major things on the 'Game Mechanics' todo list (and a lot of minor ones)
Now (in the spirit of Umbrarg) to take care of that leftover Christmas beer... :)
Straight into the breach:
Island name generation. After the banality of the save game stint I had to tease my brain back into action somehow. Experimented using simple Markov chain analysis to create some random names from a file containing example words. It actually gives out some quite authentic *sounding* names, and when given an ancient greek example file came up with these gems: Halmeliophili, Crete(!), Pharassaea, Moria & Didysseus.
Been trying to find a good implementation of a Delaunay Triangulation algorithm too - all the ones I could find were either written in horrible machine-dependent ways or just plain didn't work. Anyone know of one I could use? :)
'Investigating' Half-life 2 has taken some time up this month too. It's a good game, with some great set pieces, but didn't really grab me as much as the original did all those years ago. The gravity gun spices things up quite a bit, though the setting has changed a lot and it doesn't really feel like the half life we grew up with any more. The rather lengthy periods of 'zoom around in an vehicle between enemy outposts' comes off worse when compared to the excellent story of the first game. Don't get me started on how poorly the Steam thing was executed... quite ironic how the game depicts a totalitarian state :(
Did anyone ever tell you that game development is hard? ;)
Another lesson I've had to swallow recently: Don't just throw in a feature quickly - do a proper job from the start. You may start to 'bake in' use of the hack in later code and then when you realise you need to properly implement the feature, your work is now multiplied handling the propagating changes. Kind of backs up the OO idea - keep your implementations behind a complete yet minimal interface. That's the difference between demo writers and game creators - we have to tie up the loose ends afterwards :P
On a more positive note, I only have about 7 items on my 'Game Mechanics Complete' todo list now, so fear not - I am progressing! Sort of.
Seems like I was overdue another important lesson in game programming, and it is this: include save/load game code RIGHT FROM THE START!!!!
Yes, this month has been an extended bout of just getting my head down and slogging it out - a horribly 'character building' exercise. Two weeks and around 4000 lines of code later, it's only just nearing completion.
I based the code on a hybrid memento design pattern and a virtual interface approach. Each non-trivial object is asked to save its internal state to a memento which acts as an intermediary between the object and an archive; the object knows how to save & retrieve its state and the memento knows how to read & write archives. Two passes are required for loading: one to re-create the game objects and another to reinstate pointers, observers etc. This approach also adds a clean way to initialise game state, for example setting up scenario's etc.
I did find that in general the pieces of data that were hard to externalise (e.g. cached pointers) were hiding opportunities for nasty bugs to occur or at least a hard test case, forcing me to rethink and change that code for the better.
Apart from that major chore, I added a game front-end menu/gui of sorts, complete with spinny carrier model, restructured the game settings system, and put world initialisation in a separate thread (random island creation can take a while and I hate unresponsive apps!!).
Nothing new to capture any screenshots for this month really...
 Added some gratuitous screenies for deanfrz ;)
More work towards the base game mechanics this month, plus a little bit of not so focused work.
I decided to add random island generation, and the RobotFrog terrain process seemed like a good idea so I incorporated the code to see how it looked -- pretty good in a volcanic kind of way I think... seemed to give better results than perlin or midpoint methods.
Managed to sneak in another quick holiday in Wales this month, and pay-the-bills work has ramped up a bit too :-/.
Enough snivelling excuses though...
I'm now focusing on getting all the base gameplay mechanics in there such that an actual game be played (albeit minus any A.I. or competition!). This will be my first proper milestone achievement at last :D
Also been reading through the 2nd edition of 'Code Complete' this month. A lot of things in there make sense and apply to my little project - a very good read if you're into programming for a living/obsession.
Got a Radeon 9800 Pro for, errr... development/testing purposes as well. Shame that it's a bit of a mess to develop for (annoying bugs with drivers I think), so put Mr. GeForce back in pronto :-/
Whoops didn't update me webby for a bit :P Just took some time out in a secluded spot in the middle of France drinking mucho nice wine and (not) relaxing with the wife & kid :)
Back in the real world though, some progress has actually been made over the last few months...
My input processing is now a bit of a mess due to the game loop changes, but if I've learnt one thing it's to sort out the code before moving on to the next bit, or else face an insurmountable pile of spaghetti bugginess.
Look! Over there! /me runs
Well it's been a back to basics month mostly...
I've completely redesigned the projectile management and behaviour; now I'm using proper physics in their motion, along with thrust, drag, gravity, mass etc. The original mickey mouse system was just not going to hold up in the realism stakes and with what I've got planned for projectiles.
Once it's all in there and working, I'll improve the vehicle behaviour (the poll on the site showed a quite even divide between a simple & bit more complex manta flight model). Still got my nose in the physics, mechanics and calculus books at the moment - jeez it's amazing how completely I've forgotten all that stuff :(.
Also got some turrets on the carrier in there, in another step closer to the model and sub-object implementation.
OK that's it, I give up! With my todo list that is. Every time I complete one item off it I add at least one in its place. Bah.
This month has been a bit scrappy doing lots of little things all over the place...
Also began adding sound. Boy did I underestimate this little peach of a job!!?
Wrote a wrapper for the OpenAL API, plus a sound system layer on top of that. The hard bit is still to be completed though; the allocation of sounds to the limited sources (sound channels) is one hell of a non-trivial task, especially when sound looping comes into play! I've actually had to forego hacking for a while to sit down and design this thing properly!
What's this? An early update?! Yes. Thought I was at a good point, so...
I've been concentrating hard on getting the base CC gameplay in there. I've narrowed it down to an 18 point bare-essentials-with-no-twiddly-bits 'must get done' todo list. And then hopefully I can release something for alpha test and feedback.
This month has seen me rewrite a few key parts of the code to make it all easier in the long run. It's amazing how much difference a few months makes - I can see ways I *should* have written things ;)
Finally fixed the rendering problems with floating point accuracy. Each Island is now used as a relative rendering 'locality' origin. The game world is partitioned with a Delaunay triangulation (faked for now, until I find/write a nice implementation). This should also make sound fx integration easier too, when I get round to it :)
This month I have mainly been niceifying the code. Bit of a cop-out, but it's true.
Apart from answering many posts on the forum, I've finally realised this job is too big for the one of me, and 'recruited' a rather good modeller. Yes, there are now two of us! So bob on over to the forums and take a look at the new models. Rather nice I think you'll agree :)
OK; quite a lot of people have mailed and asked for more details on what I'm doing, so as a bit of an anniversary celebration there's a bit more waffle than normal (Yes, it's been a year already!!)
This month has seen a few mad coding sessions resulting in:
- Changes & improvements to the class heirarchy and run-time robustness.
- Vehicle and structure location damage; if you damage something enough, smoke will pour from where the damage was inflicted :E
- Supply drone equipping and carrier docking.
- All important constants and strings now loaded from file - makes gameplay tweakage much easier, and enables language localisation.
- My world 'scene graph' is included in my design implicitly without actually having defined a scene graph as such. Related stuff I'm having to consider now is:
Todo list is still hovering about the 20 items point :-/
Now for something completely different: Along with the hefty quota of viágrá spam I receive, I get quite a few mails from people interested in Carrier2, so here's a little bit of 'audience participation' as it were:
I often have to ask myself questions about the original CC design, and wonder what other CC1 players views are on the matter. So if you want to help me out and be part of Carrier2, check out the *exclusive* 'Carrier2 question of the month' and send me any (reasoned!) views you have on the subject please!
Note: QotM has been transferred to polls on the forum page.
Hmm; slight Carrier2 drought this month -- my holidays are now filled with looking after my 1 year old son -- and not so much hacking.
Still, I got some non-coding stuff done, like sketching design ideas for the island structures and vehicles, creating new islands, creating new models, experimenting with textures/skins etc.
Having to think of new and cleaner ways to implement certain stuff like vehicle turrets, how the models are stored, and how this all ties in with collision detection and location-specific damage. All good stuff I'd not even considered before :o Cuh!
Meanwhile, completion of items on my todo list spawn 2 new ones in their place :-/ Must...concentrate...avoid...feature creep... ;)
Short and sweet this month I think :P
Work progressed mainly on the model and texture front this month. Got base meshes for the Walrus and several structures. In the quest for some nice textures I visited a few industrial/retail estates with my digital camera, taking pictures and generally looking dodgy. My Unreal mapping experience is proving useful in this area :)
As the pics show, the carrier is looking slightly more carrier like now :)
Also chipping away at a (currently) 40 point ToDo list of ...errr... little things to do.
Oh, and did I mention I'd added polygon-accurate collision detection? Oh yes :)) Took a few hours work to write a quick sphere-sphere first-pass test to get collision candidates, then another few hours to chicken out and integrate the rather nice 3rd party Coldet package.
'Early optimisation is the root of all evil', wrote a certain Mr Knuth.
I've been investigating a nasty crash that only happens on my faithful tester's machine, though unfortunately never on my development PC :( Have a feeling its related to my specialised particle memory management system designed to prevent memory fragmentation. Reviewing your own code really grates :-/
Ah well, this month I have mostly:
Rewritten part of the GUI so it acts in the correct manner with regards to mouse events and focus (so I could add scrollbars, basically!).
Finished off the resource network; mainly the allocation and shipping of manufactured objects.
Vehicle equipping dialog (piccy).
Skinning of vehicle models - defined the skinning process and made my first ever model skin, for the scout drone :E (see piccy).
Also done quite a bit of code 'refactoring'; the source code is getting rather large now, so I need it to be as nice as possible if I'm going to live with it.
This month it was the turn of the resource network for some attention. Hmm was I in for a surprise and a bit more work than I realised. Still, most of it is in place now, but using only the players manual for a specification document has required a bit of uneducated guesswork along the way :)
The resources are physically transported between islands by drones (the orange dots in the pic). I don't know if the original CC did this, but I want tangible feedback that player actions have an impact on the resource network when links are severed or structures damaged - something I felt the original lacked somewhat. This requires exposing some of the mysterious internals to the player, e.g. island stores details, production information, drone positions. I hate games that seem to cheat, so now's my chance to _ahem_ put my code where my mouth is ;)
And now for some bad news. Ever wondered why the original Carrier command seemed to pause when travelling between islands? I now know the reason, and it's probably going to cause a lot of rework due to floating point inaccuracies and the large world coordinate system I'm using :( Ah well, I wanted a learning experience, and that is exactly what I've got.
Anyone heard of the phrase "It'll be ready when it's ready"? :o
That nasty thing we know as 'Real Life' has encroached quite badly on the Carrier 2 hacking time this month. DIY and a lot of that nasty 'pay the bills' work, to name but some. Nevertheless, I've still managed to return to my unhealthy obsession now and again ;)
Totally rewrote the map and interface - a lot nicer to use than the original one if I say so meself.
Integrated vehicle orders/goto into the map.
Tinkered with the models, and started a new Scout Drone model (see pic).
Implemented control views for vehicle launch/docking.
Totally put off the collision detection once more :/
A lot of 'behind the scenes' work this month - integrated a modified version of S. Rabin's state machine language (from the book AI Game Programming Wisdom) for coordinating various game sequences i.e. landing a Manta on the carrier.
Had to re-work some of the vehicle class inheritance tree and vehicle storage data structure.
Now for the part I've been putting off and putting off... the collision detection :-o Currently investigating the best solution for my needs - looks like its time to dig out that maths book again %)
ASE Model loading added. OK they'll do for now! :p Need to brush up on my modelling skills ;)
Movable turrets for Walrus and Carrier.
Multiple weapon mounts for all vehicles.
Basic island chain in place.
Considering different approaches to AI :-o
Added ACCB deployment and deployment state machine framework.
Positioning of the structures is a rather 'different' problem to solve from the square flat islands of the original. Cuh!
Added a set of GUI dialogs and controls for changing game settings etc.
More vehicle HUD components added.
Projectiles more thoroughly implemented, including glow effects and exhaust flares.
Simple vehicle HUD's.
ARB Multi-texturing on the islands.
Added basic weapons (missiles).
Flexible particle 'engine' and basic structure integration.
Transparent sea, basic order system, text drawing and game event queue.
Whole texture-mapped islands.
Basic Walrus integration.
Just the basics: Carrier, Manta and some random landmass.
General game framework and class hierarchy design. Get this bit right and the rest will just fall into place ;).
Decide to finally get arse in gear and learn 3D graphics that I 'always wanted to learn'. Find that DirectX LPHURTSMYHEAD with SILLYUPPERCASEHORRIBLENESS, and decide to take the 'true and righteous' OpenGL path ;) Oh, and also decide on rather ambitious first project.