An overview, with examples, of actual game development I’ve been doing with very few silly jokes.
Daniel has suggested that the fine readers of our humble development blog would not be so interested in the finer points of small business accounting even though it is utterly essential to our ongoing operations. Nor, he contended, would something so removed as a personal “Clockwork Empires Reading List” actually be relevant to the nitty-gritty of development as-such. Indeed, it is not always easy coming up with something to write here as many, many needs must be somehow balanced and the same goes for this.
I suspect, somehow, that a changelog direct from out SVN would not be helpful, though it contains gems (each an individual SVN commit entry) such as:
5836 – work*
5798 – fixing stew**
5796 -Making laudanum and sulphur tonic should theoretically work (when modules are fixed)***
* It was a vague day, one supposes.
** It works now. Before, stew was a valid ingredient for itself. This is in fact Realistic but also Not Useful for the purposes of game logic.
*** This is a valid sentence, as “should theoretically work” refers to both “making laudanum” and “sulphur tonic”. The description is incorrect however, in that just the making of these things should work; the Sulphur Tonic does not actually work.****
**** It was observed in a design discussion that the Sulphur Tonic should not actually work, just that it should cause people to think that it worked. This is a valid game mechanic in Clockwork Empires. I recall also Daniel wrestling with the problem of making people not go mad when they consume human flesh if they don’t know it’s human flesh when they eat it.
See the things we have to deal with?
Anyway, let’s dive into the what I did to the game recently. This is a real development blog, with Real Development!
So: personally I’ve been pushing forward with
two three? more? broad themes, aside from managing a bunch of employees and contractors and the secondary projects related to releasing and promoting a game. I am not touching deep core systems that are mixed with compiled C++ code, just the Lua scripting. The crazy C++ stuff is for Nicholas, who is slogging through a UI overhaul and various complex job system iterations as well as any random mysteries anyone digs up, and Micah who just redid the entire pathfinding system in a way I’m not qualified to comment on. Meanwhile I do my bit to “help” by filing a deluge of bug and feature tickets for them.
Theme 1: Quality of Life, Polish
The mission: to improve content which is currently implemented, or implement content with completed assets that need just a touch of scripting. Everything should work, every job to make a commodity should in fact make a commodity and not cause a character to wander around putting down then picking up stew over and over, and they should all have pretty little icons for each situation. Anything that can be pretty and make sounds should look pretty and make sounds. Any errors should be fixed if I can, or if not, forwarded to Nicholas to fix. Any placeholder or missing assets should be noted then tasks given to the art team to sort them out.
An example of improving the player’s quality of life was a bug in viral job propagation: when assigned a job, a natural object like a tree or ore node will ‘ping’ its neighbours and add them to the same job. Problem was, when a tree sent a ping, the ore node would tag itself as having taken a job even though the “Chop Tree” job was invalid for an ore node (that part worked). So you’d have an ore node sitting there that wouldn’t accept jobs for no reason – super frustrating. Problem was, the “hasJob” boolean got assigned before the check for if it was a valid job, and this was leftover from when the only harvestable resource was trees so it didn’t matter that a check wasn’t being done. (And that’s how mistakes are made!)
Though not quite a bug, a bit of awkwardness in harvesting berries came out in that a berry bush could be spawned in the middle of nowhere, alone. So you’ve got one berry bush, you assign a forage job to it, an overseer walks over and begins overseeing, then a single worker comes over to do the work. Seems like a waste of time. If we let a worker just do the job without an overseer, then we make the game less about how the player assigns work crews which would dilute player attention and the game theme. So instead I had our biome generator spawn a new game object type, an “objectCluster” which spawns a number of things in close proximity to one another based on numbers defined in an external file. Now berry bushes always spawn in clusters of 3-5 and now it makes sense for an overseer and workcrew to collect berries (and it’s not a frustrating waste of time to the player!). Meanwhile, Joseph made a new collection of differently sized berry bushes and Chris made new foraging animations (and hooked them up via FSM bollocksry).
Status? This whole category of work is ongoing and probably always will be, but most of the recent easy tickets have been knocked off the list. I’d like to cluster more objects, ore nodes and Creepy Stuff in particular, but I’d like to get some assets from the artists first for various sizes of ore nodes. Already have the Creepy Stuff, just want to get some more Creepy Things implemented…
Theme 2: Characters
This involves making characters more expressive via sound, animation, and icons. They should be more reactive to more stimuli and better express their internal state of mind to the player.
Part of this involved doing an iteration over character expressions: previously, characters would express one of five primary emotions: happiness, sadness, fear, madness, anger based on Daniel’s memory system that compiles the emotional sum of a character’s recent memories – and yes, it has been observed that these are largely negative. What can I say, Life on the Frontier is rough.
I’ve expanded the scope of this a bit by making a hierarchy of expression roughly analogous to Maslow’s Hierarchy of Needs. A character will first express threats to their life: being on fire, being grievously injured, fleeing from danger. If none of these are pressing concerns, a character will express unmet physical conditions and needs such as hunger, lack of sleep, injury, and sickness. If none of these are particularly concerning, then a character will express happiness, sadness, anger, madness, fear, or shock if any of these emotions are especially strong. If not feeling any strong emotions, a character will query their own personal traits and ponder their own interests, eg. Communism, Love Of The Outdoors, Obsequious Bootlicking, etc.
To refer back to Theme 1, it’s also important that characters don’t spam the screen with emotion icons, so characters all have an emote timer which counts down between emotes. The timer can be violated for exceptionally important expressions and it is longer for lower class character because what with this being a classist Victorian society we don’t care as much about the emotions of the lower class.
Status? Pretty good for now. Fleshed out a lot of new stuff, still need to do icons for some of the character traits and need to hook up specific afflictions from the affliction database rather than using a generic placeholder concept of afflictions. As for the memory system, it’s a bit weird and I don’t know it as well as Daniel but people do need to form some more memories – especially positive memories for simple events like “constructing a building” and “completing a task”. This should allow a stable, industrious colony to have stable, industrious people (until it all goes wrong, of course).
There are also a bunch of expressive animations from Chris like “walking while sad” or “idling while angry” which need to be hooked up.
Theme 3: Danger
I have a JIRA ticket Daniel threw at me that is essentially “make the world dangerous for the public release of CE”. To sum up: we’re throwing the player’s twenty colonists into the dark unknown of the frontier. It’s fairly idyllic right now, a few hostile fishpeople aside, but the world needs to push back on the player and do so in a number of different ways that require different solutions and … well, there’s a lot to get into there with the details but if I told you then it wouldn’t be as dangerous, would it? Lots of possibilities here and we had a good time coming up with different ways of trolling the player.
I’ll spill the beans on one danger of the frontier because we’ve talked so much about it: Fishpeople invasions are an obvious danger and there are now ways to provoke Fishpeople and the amount of this provocation is tracked. We have combat working, fishpeople will fight landpeople, though it should have some more sophisticated high-level messaging. (As in, a way to encapsulate the idea of “a fishperson attack” as opposed to “a fishperson punched me”. The former happens once in a while, the latter could happen a large number of times in a short period. It’s not especially trivial to detect the former from the latter except be, perhaps, specifying an arbitrary radius and timer possibly connected to the identity of individual fishpeople (who do have names now, by the way) … well, I think I know how to approach a first iteration of this problem, anyway, it’s just a matter of hooking everything up.)
Where was I … oh yes, we have fortifications, but they don’t block people. (But should now with the recent pathing rewrite from Micah.) We have events, but it’s not clear if they actually work outside of the immigration debug case which I kept insisting was hardcoded somewhere I couldn’t access (as soon as Nicholas reads this he’s going to rush over and say they do work, see!).
Once we’ve got an example of firing events in script accessible from Lua it becomes dead easy to spawn a bunch of fishpeople in a location, though that needs to be in areas of the map marked “water” (which is something that just got checked off with the aforementioned pathing rewrite) and they need to want to approach areas of the map marked “civilization” (which exists at the starting location and, presumably, where the player builds structures). At this point we just need a few bits of the crazy C++ compiled stuff to hook the spawning of fishpeople together with the task to “menace human civilization” or something. I did set up a task to “admire lovely eggs”, which is a thing that Fishpeople do; of course, that just needs a touch of code from Nicholas. These code things are Features and these all get happy little JIRA tickets which I then throw on top of Nicholas’ huge TODO list.
So that’s probably next, along with some other unutterable Dangers.
Where this is going
We’re going to end up with something for this early access business that is not, by definition, the full scope of game content that we consider a gold launch. This is known, it is early access after all. What we can do, however, is offer the core parts of a game with mechanics and content to hold together a coherent and entertaining experience that stands as a proposal and promise of what the game will become.
And now, a screaming head.