DoT, and Reach

Latest new thing to go into MT2:  Support for status effects.

In MT2, “status effects” are implemented as little blobs of code that can be attached to individual characters.  They get run periodically, and can affect just about anything on a character.

For example, right now I’m using them to implement Damage over Time (“DoT”) and Heal over Time (“HoT”) effects.  In the future, I’m planning to use them for movement speed adjusters (for roots/stuns, mounts, travel powers, etc.)  Eventually, you’ll be able to set whether or not they should be allowed to “stack” (although that’s not yet been implemented).

By adding the concept of status effects on characters, I’ve managed to drastically simplify the combat ability code;  there are now only two types of combat abilities (down from four);  there are “instant” abilities, which do their thing immediately when you click on the button, and there are “toggle” abilities, which do their thing periodically for as long as they’re left turned on, and can have yet more effects when they’re turned off again.

Now, there are plenty of combat abilities which don’t fit into this model.  Games like WoW have “channelled” ability types, which are a “toggle” ability with a maximum duration (and a requirement that you not move while using the ability).  Champions Online has a “charged” ability type, which is an “instant” ability that triggers when you release the button, instead of when you press it, and the length of time you spend pressing the button before releasing it determines the strength and cost of the ability.  But I think that for now, just “instant” and “toggle” will do me;  those capture the most important ability types, especially now that I’ve got support for DoT and HoT abilities using “instant”.

I’ve got a couple of housekeeping engine things that I need to get done eventually.  Folks who’ve looked at the VectorStorm library code will likely have noticed that I have a “vsLinkedList” class, which is similar to std::list.  I also now have a “vsArray” class, which is similar to std::vector.  I also have a “vsLinkedListStore”, which will only hold pointers, and automatically deallocates all of the items inside of it, when they’re removed from the list (or the list is destroyed).  I need to implement a “vsArrayStore”, which will do the same thing;  store pointers to its contents in an array, but delete those contents if they’re removed from the array.  I have a  hacked-together implementation of this layered around a vsArray, but it’s not done properly;  there are just too many ways to leak memory if you’re not being careful.  So I need to make a proper “vsArrayStore”.  Will do that tomorrow.  After that, I need to really buckle down and start writing the AI to create combat strategies.

Side-topic:  Toward the end of last week, a few friends and I (finally!) finished Halo: Reach.  It took us three play sessions, probably about 6-7 hours in total.  I keep being surprised at the number of distinct game styles and modes in the Halo campaigns.  Vehicles and situations which appear only once in the game (often for very short periods of time), and then are gone again.  And yet they have their own tutorial sequences to teach you to use them.  I haven’t really decided whether this is a case of expertly using a gameplay element for only precisely as long as it feels “fresh”, or whether it’s just unfocused kitchen-sink game design.  I have trouble believing that there’d be that garden variety “kitchen-sink” design going on in Halo, though, just based on how much groundbreaking, still-never-been-matched design work has been done in the series (I’ll write about this someday, I promise), but sometimes I wonder..

I’ll also confess that for me, the Halo: Reach storyline remained as impenetrable as ever.  It wasn’t until the final moments before the end credits that I even realised that we were in a prequel.  I don’t know;  for a game series as cinematic as Halo, I think I’d appreciate it if its storyline was a little more coherent.  On the other hand, difficult-to-decipher plots have been a staple of Halo since it was Marathon, so it’s obviously been working for them.

As I mentioned in an earlier post, I think that for me, Reach worked because it was something to do with friends.  This puts playing it in the same category with going to a movie or out to a pub.  Or, for that matter, playing Mario Party.  They can all be great fun in a group of friends, but not (for me) on their own.  Certainly Halo ODST (which I had a short stab at solo, earlier today) isn’t feeling fun to me by myself.  By comparison, I can have a lot of fun playing Team Fortress 2 without bringing friends into it.

What do you guys reckon?  Does the Halo campaign work as a solo game, for you?