Posts Tagged Design
One of the things I have always said about Species (as of now) is that I am programming the environment, not the evolution. So the creatures in Species have no goals or aims: they’ll eat, and they’ll breed, and that’s it. Anything that comes out of that, like behavioral or physical adaptations or developing sentience and migrating onto the internet as beings of pure code from whence they will engineer the downfall of humanity, is not something I put in there. It’s emergent.
But I, and humans in general, are goal-orientated creatures. If something is aimless or pointless we automatically consider that to be a flaw, without even stopping to consider whether that thing should have a point. We’re weird like that, so this is something I have to work around. A pointless game is realistic, sure, but it’s not all that interesting and it’s certainly not fun, and I’d like Species to be both.
Thankfully, there is something else I can use on. We humans have this amazing ability to overlay our own goals on things that are inherently goal-less. If you’ve ever played Minecraft, or Kerbal Space Program, you know what I mean. So I don’t actually have to write big, obvious goals into the game: I can sit back and let the players make their own. But that doesn’t mean I’m completely absolved of responsibility: I still have to facilitate the players ability to make goals.
Before anyone gets worried: I am not, under any circumstances ever, going to sacrifice an accurate simulation to make the game more “fun”. I’ve seen where that leads, *coughsporecough*. The ancient abyss calls to me, luring me into it’s grim tentacled embrace with soft clicks and chirps from it’s many beaks and teeth, promising love and fans if I’ll only tone down the science, even just a little… but I will not give in! D’you hear me?! I will never give in!!!
Anyways, because of aforementioned facets of
your our species psychology, it shouldn’t be too hard for players to be lured and manipulated into imposing their own goals onto the simulation. And the way to to this is easier than you’d think: give them ownership. Not over everything in the world… that’s too broad, unless you’re Minecraft. But if players are told at the start of the simulation that a single creature and all of it’s descendants are “their species”, or better yet are allowed to apply a modicum of control and personalise their species, even just a little, then they will immediately apply their own goals to them. Maybe they’ll want their species to out-compete everything else on the map, or to develop flight or sentience, or to be able to best everything else on the map in mano-a-mano combat, or just to share their personal overwhelming hatred of pink things.
It will be this emergence of goals that will make Species more than just an interesting simulation. They will make it a game.
Plus I might as well add: there are plans for another, more conventional storyline and goal-set in there, making more tools, more stats and more control available to the user over time as the simulation advances and their species evolves. That will be more like an achievement-and-reward system, though, and will run in parallel with the players own goals. It won’t be in the alpha release though: the alpha will be a pure sandbox.
“He’s still a little bitter about Spore…”
I fail at blogging. It’s Tuesday night and I still haven’t put anything up here. Who wants to administer the mandatory kick in the pants?
So, moving on again…
With the leg-and-torso system in place I was up and running, adding more possibilities and developing the creature AI and visualisation. Colours! Necks and tails! FSM’s!
… yes, FSM’s. No, not Flying Spaghetti Monsters: That’s what I thought when I first came across the acronym too, but here I’m talking about “Finite State Machines.” If that sounds like a doomsday device to you, awesome. Keep believing that, because a doomsday device would be so much cooler than an actual Finite State Machine.
Long story short, a finite state machine is a term in AI programming that refers to a list of simple, mutually exclusive states that an entity (an enemy, an NPC, a creature, etc) can be in, along with a set of rules as to which states can go to which other states. A typical example for an FPS enemy would be as follows:
As you can see in the above example, an enemy has to be startled before they’ll start attacking. This might give you a chance to play a ‘jump’ animation (for example, the grunts in Halo), or to get them to shout for help, before they target the player.
Be separating the code into mutually exclusive segments like this, it becomes easier to debug, easier to change and actually has better performance: I don’t have to check for cover, see whether the enemy can shoot, or run any collision or movement AI for an enemy marked as “Idle”, since he would just stand around. It also makes the enemies easier to read and predict, which is an essential element for many games.
Back to Species: the FSM for Species is a lot less regimented, and a lot more complex because creatures can go from one state to almost any another pretty much at any point, with “moving” used as a hub. By using “moving” in this fashion, a creature has to turn and walk towards it’s target before it starts eating/attacking/mating with it, meaning that under most circumstances creatures will be facing the object they are interacting with as they interact with it.
Dead is the exception: if I tell a creature to die, it dies immediately, no matter what state it’s in.
*footnote: This is actually an idea I had while drawing this diagram. Currently, “playing” is an utterly useless behavior, and creatures jump between Moving and Mating freely, but if it serves as an entry point to mating then sexual selection becomes much easier to implement.
Now, at this stage in the chronological saga, I’ve implemented Idle and Moving, and am now adding Eating (which, because I considered this need when making my Vegetation System, isn’t too much of a problem), but I want to discuss the FSM as a whole and nobody can stop me, so I’m going to, temporal paradoxes be damned!
Something you’ll notice about this FSM is that a creature can’t actually decide what they’re going to do with an object until they reach it. If they see another creature but aren’t close enough to perform an action, they have to go to “moving” until they reach it. Even if they are close enough, they still have to pass through moving to get to the correct state. They can’t just go to “attack”, or to “mate”, because there’s no “moving” code in those states: they’d just stand there staring longingly at the creature they want to attack or mate with (or worse, they’d try to damage or impregnate the other creature from a distance, with no physical contact. Hmm… note to self: develop a device to do that in real life).
This directly affected the eventual structure of the behavioral system, which has undergone more iterations and revisions than Doctor Who canon: I couldn’t just give a creature a high aggression and expect it to attack. Predators need to combine a high curiosity level with a high aggression, so that they seek out other creatures and then choose to attack them.
Okay, now returning to chronology.
With the structure of an FSM set up, my randomly generated protoCreature wanders the world, going to each plant, eating it, and moving onto the next. Given a couple years, she might be able to eat the entire map (or those parts of it she can get to, anyway).
Oh heck… NON-SEQITOR SCREENSHOT LIST!
Because why not? (because I couldn’t come up with a friggin segue, that’s why not. Bah! Humbug)
Picking up where I left off…But for the other states in the finite state machine, I would need to implement a lot more than I had done. Attacking requires other creatures and a health system. Mating requires other creatures and a reproduction system, which in turn required a mutation system. Even eating was far from complete, being purely herbivorous and lacking an energy system entirely. And we’d need a system for dying when creatures ran out of health, and a system for tying physiological differences to survival traits like speed and stamina, and a per-creature-perception system, and a behavioral modification system, and a…
Wow. When you actually list them out like that, it sounds like a much larger endeavor than I thought it was at the time.
A common thread through all of these systems is that they are purely environmental: they control the universe in which the creatures live, not the survival of the creatures themselves. The creatures ability to reproduce, and thus any evolution stemming from natural selection, are emergent, not inbuilt.
Anyway, the next system on the agenda is preparing the ubervirus for release on an unsuspecting populace. If we can get a large enough infection rate in the first few days we can turn 90% of them into ravenous undead monsters by the end of- wait. Wrong agenda. Which agenda was I talking about? Oh, right, the one involving interior decoration and making everything look faaaabulous- no, not that one either?
Dammit, someone give me the secret agenda I’m supposed to be reading from! Geez!
Alright, it says here that the next system on the agenda is making large populations of randomly generated creatures, to pave the way for creature interactions.
for(int i = 0; i < 500; i++)
Well that was easy. No point doing a whole post about that. Tell you what, I’ll go move ahead and schedule something more interesting for next time.
Man I’m all over the place today! Is it possible to internally generate alchohol? Cause I think I’m doing it. God I suck so much at blogging.
Administering mandatory kick in the pants in 3… 2… 1…
All of the creatures in Species are bilaterally symmetrical, so their left side is a mirrored duplicate of their right. Interestingly, this didn’t actually need to be the case. I could have allowed the limbs and eyes, for example, to break symmetry without too much modification from the code I’m using currently: but I decided not to.
I chose to do this for several reasons:
1. Simplicity. Unlike real life, creatures in Species don’t consist of potentially infinite variables with a phase space of “everything that’s possible with organic chemestry”. A computer simply can’t run a real-time simulation of organic life. So the creatures in Species have to be simplified representations: I need to be able to condense them to as few variables as possible. Bilateralism allows me to condense two variables into one. In addition, I don’t have to program contingencies for lopsidedness: a better leg means a faster creature, not a lopsided one.
2a. It’s actually logical (No, really). In real life, bilateralism evolved fairly early: after plants and fungi split off, but before vertebrates evolved. As a result, all surviving animals on earth are bilateral. So it’s a fair enough assumption that the creatures in Species; are decendants of a bilaterally symmetrical species, so bilateral symmetry is built into their genetic code.
2b. It’s not just earth. Yes, other potential bodyplans exist: many Trees and plants, and even some early animals, use/used a fractal bodyplan, and animals like jellyfish and sea-anenomes exhibit radial symettry. But other body plans don’t easily allow for mobility or for versatility: jellyfish can only move in one axis, tree’s can’t move at all except by growth. It’s very plausible that life evolving elsewhere in our universe will also stumble upon bilateral symmetry.
3. Evolution rate. Non-symmetrical mutations are almost invariably harmful: to improve a leg for example you would have to mutate both of them, not just one. In real life, bilateralism gets around this on a genetic level: when a body is developing, it often uses the same genes to make both the left and right sides of the body, so a mutation to these genes will affect both sides in the same fashion. This allows for beneficial mutations to be taken advantage of immediately, rather than waiting for the other side to develop a coinciding mutation to fix the lopsidedness. The end result of all this is that symmetry speeds up the process of evolution. By replicating this in Species, natural selection will be faster and more apparent than if non-symmetrical creatures were allowed for.
4. Intuition. We expect our animals to be bilaterally symmetrical. Our mind instinctively objects to exceptions to this rule, like sponges and flounders and Yog Sothoth. We only accept trees and flowers because we’re used to them, and because they don’t move: this is at least partly why the idea of walking tree’s is creepy on a fundamental level. Also, because we all subconsiously realise that sooner or later tree’s will develop sentience and the ability to move, and when that happens we’re all going to die the moment they realise what paper’s made out of. Seriously, have you seen some of the weapons on vegetation? We’re totally screwed.
Now, whether all of these count as valid and sensible reasons to use bilateral symmetry, or whether they’re just the weak-willed excuses of someone too lazy to properly implement other types of body-plans, is up to you to decide. I’m not telling. I am laughing maniacally, but I spend a good quarter of my time doing that anyway. It’s kinda a thing with me.
Also, I successfully got a post up! Sure it’s like half a week late or something, but I’ll take it. My fragile self-esteem needs all the help it can get.
So, scene setting: I’ve just finished the skinning system. I can render animated and deformed meshes anywhere I want in my environment. I’ve also modeled a few simple animated legs and a torso object.
Now, to be fair, I might be taking a few liberties with the chronology of things here. A lot of the following was worked out in parallel with the skinning system, but I’m presenting it as sequential because it sounds more organised. So don’t mind my temporally-unhinged antics here. I assure you that unless the cooling pump fails on the paradox diffuser the space-time continuum is in absolutely no danger of instantly ceasing to exist. And the chances of that happening are, like, 1 in 10. Or is that 10 to 1? Never mind, nobody cares anyway.
Moving on: there are two possible approaches to take when it comes to laying out a foundation for a class as central to the game as the “Creature” class.
The first is to lay out everything at the start. Take it all from the design document, set up every data structure I need, and then go about tying them together. So, I’d prepare an leg class with some genetically-defined variables for size, width and type, then set aside some ‘combination variables’, such as strength and speed. Then I could use occult magiks to force demonic slaves to write Mathematical Equations to derive the latter from the former, as so: strength = (bicepWidth + tricepWidth * 0.6) * sizeModifier, etc. Or I could do them myself, that works too.
OR… the other option is to wing it. We start by making the creature move at a constant rate, and then we go and set-up the leg rendering and animation code, and then we plumb the size of the legs into speed and then we actually make the size of the legs variable, and then some other things we made up on the spot and then we realise we can make the subjects into ravenous undead flesh-eaters to unleash on an unsuspecting populous and make an absolute killing selling shotguns, and then… you get the idea. Basically making it all up as we go along.
Now, given that both of these approaches are mutually exclusive, in a stroke of certifiable genius I went and enacted both of them at the same time.
… wait, did I say genius? I meant the other thing. Word. Starts with I.
I had a fairly good idea as to how I was going to structure the creature body parts: A torso object, with legs, arms, neck and tail objects attached to that, and head, tailtip, hands and feet, attached to those. I also knew a large quantity of genetic variables I wanted, so I went ahead and put them in so I could tie them all together later. But I also wanted to see it in action as soon as possible, so long before things like “speed” were set up I threw in placeholder values and started on the AI, so that the creature would do more than just stand around looking awesome.
And it worked. Okay, true, I ended up making changes to or deleting the majority of the genetic values, but knowing the basic structure of the class and it’s sub-classes was a great help when it came to prioritising work, and being able to see the effects of the changes I was making kept me enthused.
So, in the fine tradition of starting with the most time consuming thing possible, the very first thing I prioritised was leg and torso visualisation. The creatures aren’t actually held up by their legs in species: instead, I derive a torso-height based on their leg size, and the legs sort of dangle at just the right height to make it look like they’re standing on the ground. Okay, all well and goo: that’ll work fine for horisontally-aligned bipeds, but what about quadrupeds with differently-sized limbs? What about creatures that stand upright like humans, or creatures that drag themselves along with a set of huge legs up the front? Clearly I’d need to do more than just move the torso up.
This was solved by the addition of another, half-derived half-genetic variable called “torsoRotation”. torsoRotation determines the pitch at which the creature’s torso is orientated, from 0 at horisontal to 90 when upright (okay, the value is actually in radians, but who in their right mind says “Pi on 2” when they mean 90 degrees?).
torsoRotation is a genetic variable: creatures can pass it on to their offspring. But if the creature is a quadruped, or if they are overly unbalanced (for example, small legs at the very rear), then torsoRotation will be overwritten with a value derived from a whole bunch of rules depending on their leg sizes and positions. This allows creatures to “stand up” without making it arbitrary or nonsensical: a creature who’s back legs increase in size will automatically pitch forward unless they usually stand upright enough to compensate for it.
Fittingly for a game like Species, this all affects survival in various ways. Any creatures whose body touches the ground suffers a ‘dragging’ energy-loss penalty whenever they move. Upright creatures move more slowly, but use less energy to get around. And so on.
This system of rules, once it was finished, resulted in a large variety of potential body plans, even with nothing more than legs and a torso. And, thanks to the time already spent on the skinning system, I could take randomly generated test renders of them straight away:
Don’t worry everyone, I swapped his paradox machine for a coffee maker and replaced his timecube collection with fluffy dice. The worst he can do now is make a terribly tacky espresso.
Design Documentation – 2009
Ah, nostalgia! Going through the design documentation from 2009 (mostly random idea’s I had jotted down and systems I had spent time developing in my head) I’m mildly surprised to find just how different they are in their particulars from the final game. I knew the game had evolved (does it make me a sad and immature individual that I even now find that amusing? “Yes. Yes it does.”), but I never quite realised by how much.
As an example, here’s a copy of a section in which I spontaneously decided to enumerate the “main stats” for my creatures. These are variables that directly influence how they behave, but are NOT set directly: instead, they are influenced up and down to varying degrees by other values and items in the creatures genetic makeup.
Items in Bold were changed; Items struck out were removed or replaced with something else entirely. There’s even one item (in Italics) that I’d completely forgotten about until reading this and am now considering actually implementing.
HP -- Hitpoints
Energy -- Current energy
StmchEnrg -- Stored food energy
Size -- Overall scale – affected by age.
Stamina -- Rate of energy loss per unit of distance
Speed -- Speed of motion
JawDmg -- Damage
LimbDmg -- (1 for each limb)
JawSpeed -- Strike speed, before and after
LimbSpeed -- (1 for each limb)
JawRange -- Attack distance
LimbRange -- (1 for each limb)
preferrdAtck -- Selects which weapon is affected by below
FavChance -- Affects chance of weapon being chosen
ArmrFront -- Lowers how much HP damage is taken
Counter -- Gives Minor damage to the attacker
MeatHarshness -- Makes creature harder to digest
Diet -- Veg/Meat
StmchAcid -- Optimal Food Harshness
Effciency -- Causes more food to spawn on tree when tree is ‘attacked.’
Thrshhold -- Pickiness
FavAttribute -- (One of these global stats)
Cold -- Defence against low temperatures
Heat -- Defence against high temperatures
There are at least a dozen new attributes as well, and that’s just off the top of my head!
Even more drastic are entire systems that were discarded or replaced, sometimes after trying to implement them and discovering their flaws, other times because I realised they were evil Cthulhu-spawned puppies from the start. A perfect example of this is the behavioral system. It’s design underwent several iterations, each of increasing detail, complexity and imagination, but it wasn’t until I actually tried to implement it that I realised it was an absolutely bloated useless flippard of a system. Here’s my old notes from the same document as above:
Each creature has a list of PerceptionObjects, corresponding to the objects in their sight range: split into unknown, creature and vegetation, and each one has a list of all the ‘visible features’ available for retrieval. Each creature also has a list of PerceptionCategories, which split other objects based on visible features: Health, Colour, Size, Headtype, Covering, etc. for creatures, Colour and Size for vegetation.
PerceptionCategories is a genetic list, but intelligent creatures can add other categories
upon encountering unknown objects.
PerceptionCategories are used in triggers, which are creature behaviours. Triggers can be genetic or learned, and consist of a PerceptionCategory and an interaction: flee, attack, eat, play or mate.
Triggers are activated when a creature interacts with an object (rather than rolling randomly). They should also be able to be activated from a distance… how this works I have not yet ascertained.
It was only when it came around to actually implementing a behavioral system that I realised “This is insane. WHAT THE HELL AM I THINKING?” And even then, I went and half-implemented it so as to try it out, just to prove to myself that it was unworkable.
For a start, instinctive behavioral reactions are hard enough to identify normally: adding an extra layer of complexity in the form of “PerceptionCategories” would have make the creatures thought processes so alien as to be indecipherable. In addition, the behaviors (Eat, Attack, Mate, Play, Ignore and Flee) are not transferable: allowing creatures to mate with trees might be hilarious, but it gets old when creatures arbitrarily decide to spend the rest of their very short lives doing so, driving them to starvation and extinction. (Oh my God. I think I just worked out why the dinosaurs went extinct) What I really needed was simplicity and predictability: “creature X does Y when they encounter Z.”
So instead I went for a more fluid behavior system combined with three predefined categories: Tree, Ally and Neutral. Tree’s are food sources: a creature will either eat or ignore trees depending on their preferred diet. Ally’s are genetically compatible (of the same species) creatures. Neutrals are all creatures from other species.
This allows for emergent behavior, such as creatures herding together but still knowning to flee from predators, while at the same time simplifying and making creature behavior easier to read. Which is probably for the best, but I will mourn greatly the loss of potential prey-prey interspecies symbiosis.
I wonder if that particular sentence has ever been said by anyone else in all of spacetime?
Little known fact: All dogs can ultimately trace their ancestry back to Cthulhu. Not cats though. They’re descended from Yog Sothoth.
aka. Requiem of a crappy blogger.
Geez, I really suck at this “blogging” thing don’t I? “You’re supposed to leave something here more than once a month, dumbass!”
Okay, rivival time. I’ll throw up another cheatpost-from-the-past for today and work on having something actually worth reading here for every weekend from now on with more links and maybe something else, at least until the world ends in 2012. No promises, though: I have it on good authority that the world might definately totally end in October, this time for realz, and if that happens I won’t be able to keep up the once-a-week schedule until the world ends in 2012. In fact, the schedule is already on thin ice, what with the world ending two months ago in May and what-not. But I’ll try to keep up with it anyway.
In the meantime, enjoy your cheatpost:
Written September 2008, prior to the billboard vegetation system
The next step will be vegetation. Trees in species will be edible to creatures with herbivorous and omnivorous mouths: how much energy they get out of it will depend on the type of tree and their (mutable) digestive system.
One of the major features of Species will be the mutability of the organisms, and the complex effects of natural selection that result. As an example, the tree-nutrition system (as currently envisaged) will work like this: Each tree type has an nutrient value, and a digestibility value, and each species has an acid value. High acid levels would allow the creature to digest the indigestible, like bark or cacti, but would mean fewer nutrients could be converted to energy. In comparison, low acid would make it only able to survive on easily digestible vegetation, like fruit or green grass, but the creature would be able to take full advantage of the nutrients.
[Present me says: Okay, this requires comment. This sort of complexity does not exist in the vegetation or digestion systems. It was planned, but like many similar features, it was removed from the design prior to being implemented. The primary reason for this is extremely simple: Species is about seeing evolution happen. Features like this are invisible. End of story]
This level of complexity applies to all the organisms traits, but I’m trying to make it intuitive and visible. For example, Shoulder muscle, Arm muscle, Arm length, Hand type and hand size would all affect that arms damage levels (which is complex), but in an intuitive manner: if you see a huge creature with massive, muscular arms and giant claws, you can instantly identify that it’s dangerous. In addition, since it will have formed by natural selection, you can make other conclusions: the species has to fight fairly often with its arms in order to reproduce. If this conclusion turns out to be right, I’ll know I’ll have set up the statistics system properly.
[Present me says: this is still mostly accurate, with one exception: combat is no longer limb-specific. It was getting too confusing and arbitrary to have creatures with 5 different damage values depending on what limb they used to attack (for example, a big muscley creature with spikes and claws and teeth could be killed by a far inferior opponent if it decided to attack said opponent with it’s tail), so this has been streamlined into a single value which takes modifiers from the limbs, head, tail and features]
It’s not only the physical traits that will be mutable – behaviour will also be dictated by natural selection. All creatures will have one or two fixed behaviours (eat and mate are the obvious ones), but other behaviour will be dictated by a special AI system. Of course, these behavioral traits will be genetic (instinct): I had considered making individuals capable of ‘learning’ behaviours, but I suspect that would be both rediculously complex and entirely useless: individual creatures don’t live very long, so learning wouldn’t do them much good. The species can learn, but not the individual. A larger brain size would allow more instinctual behaviours.
[Present me says: That wasn’t so bad. I was expecting a whole load of completely wrong detail on the behavioral system, but it’s vague enough to be fairly… well, vague. And eat and mate have been made mutable since then too!]
I could keep going on and on, but I won’t. You get the idea. I don’t really expect to appeal to a wide audience with this project, but it’s captured my imagination and I fully intend to follow it through. I’ll try to keep this blog up to date.
[Present me says: Hah! I said that back then too? I really wasn’t kidding when I said I suck at this blogging stuff, was I?]
… [/end cheatpost]
Please excuse me while I murder “Present Qu”s face until he gives me my job back. Thank you for you continuing patience.
PS: [Present me says: OW! AAARRRGH! NOT THE FACE, NOT THE FACE! OKAY OKAY NO MORE CHEATPOSTS, I PROMISE! PLEASE, FOR THE LOVE OF ALL THAT IS SHINY, STOP DOING THAT!]
Species was a lot of fun to design for several reasons. The most obvious is because it’s quite unlike most other genre’s of game: the level of freedom and creativity a “life simulator” offers is on a level tenfold above that offered by the more generic game genres I’ve worked on.
The second is because I started it as a very small, unambitious project. That made it open season for creative ideas, no matter how out-there or inane: I didn’t much care what people thought of it, I had no deadlines or stress, so I recorded anything that sounded fun to me. Kinda like this blog. It was only later, building the project and asking other people their opinions, that I started filtering and quality assuring my idea’s. Quite unlike this blog.
As already mentioned, I’d been designing Species long before I started with XNA: back when I was working in 2D with Adobe Flash. This didn’t make too much of a difference to the game design as a whole: it would have simply meant a top-down or isometric camera. But it did make a massive difference to the creature design: if implementation followed design exactly, creatures would have been a combination of a set of pre-built items, with a finite number of ways to be combined.
For example, each leg would have been a predefined object, providing the creature that owned it with a bunch of (again, predefined) stat modifers. During the move to 3d, this sort of thing became more ambitious: we still have predefined legs, but the width of the tricep and bicep and the size of the leg as a whole are all variable. This allows us to modify the speed and strength of the legs based on it’s morphology, making the creatures more interesting and creating an infinite number of slight variations of each leg type. And because of the nature of 3D animation over sprites or vector images, it’s possible to achieve these sorts of things easily. Well… fairly easily.
Well okay, so it took me a couple of months and a whole load of matrix mathematics (oh dear god the matrices. Matrices… EVERYWHERE! OH GOD WHY WON’T THEY LEAVE ME ALONE!?!) to implement fully, but the point is that it was possible, albeit terrifying. And with such possibilities now open came the potential for other, even more interesting changes to the design.
These sort of possibilities are the third reason Species was fun to design and build: an evolving project is so much more more entertaining than a static one, and if you find a change to the design that is easy to make, you are free to implement it.
If there’s anything to take away from this experience, it’s that: don’t ever stop designing a game, even as you build it. A project that comes out exactly as it appears in the design document is no fun at all.
Haunted by undead matrix operations,