One of the moments I enjoy most in a game is that just before a combat encounter happens. In these moments I plan my approach, my position, look at the lay of the land, look at how the enemy is forced to approach me, consider how I can take this moment and this position to gain the greatest possible advantage. In these moments I can see it all, I know everything that’s going to happen before it happens, my awareness is complete. The actual encounter is, if I’ve planned correctly, a mere formality.
This is the ultimate power fantasy: The fantasy that you know what the fuck is going on and what is going to happen next.
As I approach some increased awareness of the quirks of my perspective, my personality, my peculiar chemistry as described by spectrums and scales and initialisms, I notice this need for comprehensive premeditation. I just need a plan, right? I just need to know what’s going to happen when I do this, so I can have the correct response in mind. I need to know. I need to control the encounter. I need to cover the possibilities.
How sad that the possibilities are always so impossible. They await, many-manifold and burgeoning on infinity, a choking hazard. So I choke, and do nothing. Choosing not to play may seldom be a winning move, but even more rarely is it a losing move. Variations on this story are told every day.
Your life is shaped by the obstacles you swerve around, your routes are planned and your roots planted in the shadows of the sun you avoid. I fell into the artist’s life because creating art is the place where I am in control. Inversely, when one is of the audience, art is also a place where you can cede control to an artist, a moment of release from one’s own control. Art’s got me coming and going, as someone desperate for control, as someone desperate to avoid the pressure that seeking control brings. I’m trying to make my little worlds, but even here the possibilities are impossible. I have such an obligation to this diorama, an existence that hinges on my enthusiasm. How could I assign myself such a dire responsibility? If I imagine a man in my dream and forget him on awakening, is that murder?
The world is a haunted place, and the only home for ghosts is in portraiture.
Understanding, knowledge, control, these things are forms of unattainable perfection. Understanding is superficial, knowledge is abstract, control is impossible. To yield these illusions, though, to cease questing after understanding, knowledge, control… is impossible. Who can cede that much ground? Who can surrender their fate to, well, fate? Not me.
I keep seeking the Icarus high, the perfect moment suspended in time, when all is understood. I probably always will.
The way games treat failure has shifted significantly over the years. The earliest commercial games were coin-operated, so in this case the loss of the coins used to play the game in the first place provided a self-evident punishment for failure — and commensurate motive to improve at the game. This created a somewhat loaded context for subsequent game development: Home console games were still largely patterned after the ideas created for coin-operated arcade games, so for a decade or two afterwards games still had vestigial lives, credits, and scores, increasingly meaningless as the form shifted towards longer more narrative experiences.
There were other approaches. PC games in particular frequently allowed arbitrary saves and reloads of the game state, with failure at any point merely requiring a reload of the most recent save. This very permissive system allowed retrying of challenges with little to no delay, but meant the difference between a failure which sent you back moments and one which sent you back hours was just how aggressively and mindfully the player exploited the save system. This was also quite unsatisfying, making it optimal for players to approach challenges, not by understanding them and judiciously using the game’s systems to surmount them, but by saving and loading at increasingly high frequency to effectively simulate perfect luck, allowing them to serenely drift, Mr Magoo-like, through waves of gunfire and bloodthirsty beasts and emerge unscathed at the other end.
As storage became faster and cheaper, games started to split the difference between these methods using soft checkpoint systems. In these, failure only sent you back a short way, with more permanent saves used to keep progress between play sessions. Around this time a question started to emerge: What is failure for? Who is failure for? What role does it actually play in the game’s design? Is a failure of the player actually just a failure of the game designer to make a sufficiently accommodating gameplay experience? In the late 2000’s, there was a great deal of discussion around how to minimize or eliminate failure completely, to create systems to always maximize the “challenge” the player experienced while never allowing them to reach a true failure state. This discussion rubbed me the wrong way at the time and still does — what is a challenge that cannot be failed? One problem with this approach is that it only understands failure as negative, as a cessation of enjoyment, as a downer and a frustration — and, indeed, while failure can be all of these, it can also be funny, can be illustrative, can be poetic or impactful in ways that extend the meaning of the playing experience beyond the feel-good designed successes and empowerments that are most immediately and obviously satisfying.
There was a sort of backlash, which we are still in the reverberations of. First, the resurgence of roguelikes and explosion of variant subgenres. Roguelikes bake failure into the experience of playing, make it normal and unexceptional, divorce it from shame, and make each choice feel consequential because it could so easily lead to disaster. Second, the “Soulslike” sub-genre, difficult games which, crucially, wrote failure into the narrative of the game, making the player’s story one of persistence through catastrophe, rather than rolling back to saved game states whenever the player fails. Third, shortly after, came the Battle Royale — a competitive genre where, by definition, only somewhere between 1-5% of the participants could emerge victorious, where failure was all-but-assured on each attempt, and where much of what determined this outcome was luck and happenstance. Between these, failure came back in a big way.
These sorts of oscillations in taste are commonplace, but I find the timing of this shift quite interesting as it seems concurrent with a shift in societal expectations. Perhaps this observation is ham-fisted, but it’s worth noting that the resurgence of failure as a design trope accompanies numerous economic crashes, unemployment crises, pending apocalypses, and so forth. The world I grew up in tacitly promised that if one “played the game”, did everything the way one was told, followed the path laid out, then prosperity was assured — and we have, over the course of my lifetime, seen these premises dismantled and exposed as fraudulent. (Of course, ever having these expectations in the first place was an artifact of privilege and propaganda, of comforting lies and misleading narratives, but I digress). It is now accepted that our lives are substantially shaped by circumstance, that failure is nearly impossible to completely avoid and that it’s unhealthy to be too scared or ashamed of it. Failure is no longer the exception but the expectation, so we increasingly tell stories about persevering through failure, about learning from it, accepting it, being shaped by it and finding new definitions of success that can survive failure.
There’s a sort of backlash to the backlash, albeit a more subtle one. Roguelikes, once defined by a harsh failure state that sent the player back to the very beginning with nothing to show for it but hard lessons, have increasingly diverged into what some call “Roguelites” — a genre defined by slowly accumulating resources across each failed run. In this format, where the player becomes more powerful on each iteration, failure becomes less and less likely over time and, in some cases, victory becomes near-certain. The use of the term “Roguelite” to highlight this division isn’t common, though: Both tend to colloquially fall under the “Roguelike” umbrella, with the same term used to describe games with almost completely opposing philosophies on failure. In one, a failure is simply one step in accumulating an irresistible power, presaging an inevitable success that may not yet be in reach; in the other, failure is absolute defeat but success is always equally reachable on each attempt.
These “Roguelites” present an appealing narrative, the long arc of history that bends inevitably towards justice. We reposition ourselves outside of success and failure into a third state, one of learning and accumulating for the future, safely hidden from the burdens of victory and defeat. It can be nice to think that, even in our weakest moments we can accomplish something small, something significant, towards our future. It can also be tremendously disempowering — why should we even bother showing up, bother trying, if our eventual victory is assured, if our momentum is so irresistible? Here we see two competing visions of progress, one which requires constant examination and effort and one which simply happens inevitably over time.
This, too, might reflect interesting divergences in cultural expectations. Are we reaching out for stories that extend beyond our successes or failures? Reassurance that whatever story we are part of will not end with our lives? Do we want games that react to our new counter-solipsism, a wish that our lives will not be the end of our existence, that a world will continue on without us in it but affected by our presence for the better?
Maybe. Or maybe they’re just games, and all of these deaths we experience aren’t practice for the real thing. Still, one can’t help wondering what needs we feed in our dreams.
Some game design decisions are hard boundaries — if you jump off a cliff you die, if you try to walk from A to C you will be blocked by a wall, and so forth. Just as often, though, design decisions are more like nudges to the player — fire is effective against ice enemies, turret emplacements are effective against attacking groups, climbing gear is useful for steep terrain, etc. These are the design decisions that don’t define hard boundaries, but that establish an expected approach for the player to take, pushes them to try new things and to experience the world in a particular way. Some of these, like the above examples, are very obvious. Some, such as a tough enemy placed to divert the player towards an interesting side passage, can be quite subtle.
This is all fairly well-understood by most designers. What I’ve found very interesting to think about recently is considering, in addition to how design elements shape the behavior of players, how they shape the behavior of the designer downstream. Whatever design precepts are established early on, these shape the design behavior further on in the project — even if these precepts are later reconsidered and reworked, the impact they’ve left will be noticeable. Sometimes, as in gameplay, these boundaries are hard — deciding a game will have no combat, or that there’s no dialogue system, or that all equipment is purchasable from the start, any decision like this will determine what the narrative or gameplay possibilities are for the future. Sometimes, though, these decisions are like nudges to the future designer — a character’s appearance might suggest an upgrade, methods of acquiring and spending currency or ammo affect how equipment gets balanced, an unusual art style might afford opportunities to conceal or reveal information in a surprising way.
The fact is, we’re not just designing the game for the player, we’re also designing it for ourselves — not just in the sense that we’re building towards a game that we’re (hopefully) interested in and passionate about, but also in that we’re going to be spending most of our days for a significant amount of time working within the confines we’ve set. How much we enjoy the task of building the game, and what direction it ultimately develops in, it all stems from these first crucial decisions. My intent in bringing this up is not to impart decision paralysis — that’s easy enough to come by in starting a new project without me helping it along. My intent is instead to encourage the consideration of two questions when it comes to these preceptive design decisions.
First: Will this decision make for interesting or tedious work in the future? It’s a given that for every design element, there’s an associated downstream labor cost, and it’s vital to consider what that cost will be. However, it’s also important to consider not just the quantity of work the decision will create, but also the kind of work it will create. Is it the kind of work you find easy to start? Easy to finish? Is it the kind of work you can figure out before putting in physical labor or does it require experimentation? Does it need to be figured out in relation to other things or is it mostly independent? These are the sorts of questions I ask — for you, the things that make a given task harder or easier are probably different. On a team it may depend on the team’s specific composition, might depend on who’s allocating tasks as well as who performs them.
Second: Will this decision lead to more or less interesting decisions in the future? In my current project, I decided to have just a few special weapons, have them all share ammo, and have the ammo be rechargeable (but not easily so) during combat. Part of the reason for these decisions was that it would force me to ask whether these weapons were all useful, whether there were situations that demanded one or another, whether they were worth the player remembering to use rather than always using the primary weapon — all-too-often I see games include hypothetically interesting items that lay unused because they’re not significantly differentiated from default abilities. Many decisions can lead to future interesting decisions. While every game ultimately comes down to numbers behind the scenes, one way or another, decisions about what numbers ought to represent can build towards later decisions. What should a luck stat do? What is the impact of a reputation system? What does an injury mean and how is it recovered from? Deciding any one of these can lead to interesting decisions downstream — which is both wonderful, because it expands the possibility of what a game can be, and terrible, because it means you’ll inevitably have to put more work and consideration into actually making the damn game.
These interrelate, of course. All too often we see designs that cut back on decisions that lead to interesting future decisions (because these are risky, they are seldom embraced in high-budget development), but that means the remaining work is more rote and tedious, less interesting, even if there’s not as much of it. We make these decisions and they shape how entertaining and challenging the rest of the project will be to work on — and thus one of the first tasks of game design is designing the game that is making the game. While, of course, I do not subscribe to the belief that work that is fun doesn’t count as work, I do believe that making work fun makes it go significantly faster and smoother, enables developers to focus their efforts more effectively. This might sound like productivity-pilled business brain, but I’m coming at it from the context of a solo developer: If I’m going to be working on this shit every day for a year or three, if I’m going to be building something I’m proud of and investing myself into, what is the version of this that is enjoyable for me to work on and that I’ll genuinely be able to put my best effort into?
These questions are impossible to know all the answers to, naturally. What seemed like a fun creative exercise might become a stressful design constraint, and what seemed like a system full of interesting possibilities may in the end just require a lot of extra effort to reproduce standard results. There are, as always, no hard and fast answers in art — everything is a moving target. It is at least worth wondering, though, as you craft an experience for a distant and unknown other, what experience you’re crafting for yourself.
Well, clearly I’ve fallen behind. I ended up combining two months of DevBlogging here partially because I fell so far behind on putting up a DevBlog and partially because January ended up being a very low-progress month, with about half of it taken up by a moderate cold and a longish vacation and much of the other half taken up by anxiety and indecision. Looking back I’m not too displeased with my overall progress over this time, but the delays have been frustrating to say the least.
After spending all of November working on the new sound system, I had a tough time returning to the core project. This has been an ongoing issue over the last few months, as I near completion of this demo portion of the game. The closer I get, the fewer easy and fun tasks remain, leaving a number of hard/tedious tasks I have to tackle in succession. I could presumably sidestep this by working on more general long-term tasks, but I’m so close to completing this demo now that the idea of putting work into anything that doesn’t take me closer to that goal is frustrating. To mediate this frustration I find myself putting plenty of time into things that don’t technically need to be done but can be considered part of the initial slice of game that the demo is comprised of – stuff like this new sound system, like the intro illustrations, like writing that I can feel unashamed of, and so forth. Some of those side-tasks over the past couple of months have included:
One: Reworking the palette-izing post-processing effect to make it more flexible and adding an ability to dither-blend colors that don’t match the assigned palette. This, too, may become a Unity Asset Store asset in the near future… but doing so will require a day or two of rewriting the interface to split it from Bound City’s systems, so it must be added to the ever-growing stack of non-Bound City professional development tasks.
An illustration from my previous project rendered as (from the left), raw, double-dither, single-dither, no-dither
Two: Writing a new piece of music for use much much later in the game. This track, the theme for a climactic confrontation with reality, incorporates several previous track motifs and plays a lot with the thematic concept of reflection, with certain phrases and sounds being inversions of one another. Also, unlike previous pieces for the game, this one has several phases, intended to be stepped through one by one as a story moment escalates; in that regard it’s almost like several tracks in one. I am quite pleased with how this piece turned out, but it’s probably another year or two of development away from actually being included in the game. Still, that just gives me a little extra motivation to push towards that moment…
Three: Small fixes and expansions to the dialogue interface to allow for more complex conversations and for canceling out of repeated dialogues. These changes were largely made because I found myself frustrated by their absence during play-testing — and, though this demo is not meant to convey the complete experience of the game, I still want it to feel as satisfying as possible in every moment.
Four: Minor fixes to enemy behavior to make them feel a little more robust and interesting. These were also just things that bothered me in testing that I took it upon myself to fix immediately instead of leaving for the time being. Would anyone playing the game notice if dogs got stuck on terrain rather than jumping over it? Well, I would, so I fixed it.
Five: The intro sequence is technically unnecessary for the demo, since it’s more about setting tone and giving an overall sense of the world than in giving information that is required to play the game, but I’ve decided I want it in for… some reason. To that end, I need to make two more illustrations for it. The first one is more-or-less complete and is the header image for this post — while I will likely want to tweak some of the fine details later, it has all necessary elements and makes a striking first impression. The second and third illustrations are half-done, but are coming along well now that I’ve figured out their basic compositions.
This stuff was all optional, but it was at least on the way. So much of how I manage to get things done, I find, is by leaving them conveniently along the way — or inconveniently in the way — of doing the things I would be doing anyway. There were other tasks a bit more pressing — arguably I could have at any point reworked the demo to make these redundant as well, either removing/rewriting characters or disabling sequences until I had a chance to create the systems to fully realize them, but I just don’t really like avoiding challenges. That’s not to say I never do, but I always feel bad afterwards because I know that I’m just going to have to confront them sooner or later and I’m putting myself in effort debt for the future.
One such system is a simple character controller for cutscenes. Once in a while I need to be able to make the player move, jump, attack, whatever, in order to create a story moment. There are a lot of ways to approach this: In this case I created something very similar to the behavior system I built for enemies, a queue of actions that directly took hold of the character and played them via the same set of buttons the player uses. This mostly works but could potentially make some future interactions, such as attacking with specific weapons, a bit tricky.
Another narrative problem I’ve been concerned about recently is that there are some very important characters which, as conceived, only showed up fairly late in the game. These character’s worldviews, and how they change or are perceived differently over time, are core parts of the narrative concept of the game, so it’s vital the player meets them relatively early — but it makes no sense for them to inhabit the early sections of the game. The solution I landed upon was to add a series of “vision” sequences, floating rooms that the player is warped to arbitrarily whenever they meet the requirements and are in a transitional state (such as after dying or restarting the game).
Aside from these notable developments, there’s also been a lot of running the game, testing it, seeing how it goes, noting down things that are bugged or that bother me, tweaking, running again, and so forth. I’m having a hard enough time with this process that I have no idea how I’m ever going to do it for the full version of the game. That’s getting ahead of myself, though: I’ll worry about that later. The most notable of the issues I’ve addressed is a bug that’s plagued the game since the start. There’s a low-percentage chance, each time the player exits a room, of entering the wrong room — most often re-entering the room you just left, most often due to issues with detecting the exiting collision on the wrong side of the character, particularly while moving quickly diagonally. This should, one would think, be an extremely simple problem to solve, but it just keeps recurring, even when I completely rework how the exit collisions are detected. I have high hopes for this most recent solution — I haven’t noticed the error recurring yet — but only time will tell.
It’s tough to maintain enthusiasm at times like this, when the process is more about reinforcing and testing and maintaining than it is about expressing and building. At the same time, I’m having a tough time figuring out how to allocate my focus between this and other tasks — I now have three potential salable Unity Assets I will have to polish and write documentation and pages for, all of the writing I need to do that I’ve fallen dramatically behind on, and a new website I’m shifting over to to showcase this writing along with the mentioned assets, my development work, and miscellaneous portfolio works. I already struggle so much with knowing what to work on, what to turn my attention towards, and having all of these secondary targets just makes it tougher, particularly when I’m already feeling guilty for not working on things I’m “supposed to be.” I’m still not sure how to approach this, whether I’ll have to set aside a day specifically for this type of secondary work or attempt to do it in bits and pieces in the last hour or two of each work-day. As it is, I simply tend to forget about all of this stuff at the beginning of each day, and only remember it at moments like this where I try to take a wider view of what needs doing.
So Bound City continues on, at the precipice of a complete demo, as it has for several months now. When will I be satisfied enough to let go? Will it be soon enough that I can continue to work on the parts of the game I actually care about without resenting the project? I hope so. It’s almost as much a matter of what I’m willing to accept, now, as it is of what needs to be done — which, for the purposes of this demo, is rapidly but asymptotically approaching zero.
As you may have noticed, posts have slowed down. Well, stopped. There are a few reasons for this – my writing habits have been interrupted by getting distracted by holidays and other projects, by my usual writing space being temporarily unavailable, and subsequently by a lack of interest in writing and confidence in my writings being interesting. These things tend to cascade: Lack of habit leads to lack of confidence, lack of confidence leads to lack of interest, lack of interest leads to lack of energy, and so forth, creating a general malaise. I paused the Patreon for a month to provide an opportunity to catch back up a bit, but that month has expired now and I’ve hardly caught up at all.
These things are usually temporary, but it will take a little extra effort this time to make them so, since I have let so many habits lapse. Venting posts like this serve the dual purpose of explaining delays and of easing myself back into the habits that have eroded – as well as, I hope, helping others with the same struggles feel a little companionship. These posts also tend to draw out ideas about where to go in the future, to shift me out of habits of frustration and recrimination and back towards a mindset of problem-solving and excitement — if only to provide a pleasing conclusion to what otherwise tend to be rather dour essays.
I don’t usually post the ones where I can’t figure a conclusion.
I’m still struggling a bit to figure out what’s blocking me and how to navigate it, but in the short term I know that I can make things easier for myself, set things up to more readily accommodate a return, by simply moving habits back into place. It is a useful instinct to tidy a space whenever you’re not happy in it — it may not solve the problem, but it will at least make it better organized and more approachable. I’m trying to apply the same logic to my mental process: If I can’t make myself feel fulfilled and productive, like I’m moving towards a definite end-goal, I can at least make myself feel active, in motion, rather than immobile and waiting for the world to turn around me.
I’m approaching the rough scheduling I’ve used in the past, the list-making and chores and maintenance, the framework of a life. I sit here and I try to write, even when the words are repellant, unsatisfactory, imperfect, inaccurate. I considered stopping the Patreon for another month so I didn’t have to feel guilty that anyone anywhere is paying for second-rate words, discards, so I didn’t have to scrutinize myself so closely.
There are times I envy those who know they can do no wrong for the big perfect lie they’ve branded into their brains.
I’ve seen a lot of people treat the concepts of puns and wordplay with contempt, and it’s an attitude that I disagree with but also find interesting. So much of humor boils down to some form of word play: Mishearings and misunderstandings, artful allusions, sly references and onomatopoeitic justice. To discard the technique as inherently silly and artless is to do a disservice to the power of language – but, at the same time, I get it. Who doesn’t wince at crammed-in references, clumsy sound-alikes, hackneyed that’s-what-she-saids? The problem, however, is not the technique, but the application of the technique.
The way I like to think of it is that wordplay is an ingredient: You use it to make jokes, but wordplay itself is not much of a joke. Treating a pun like it’s the entirety of a joke is the humor equivalent of eating a bag full of chocolate chips: Perhaps enjoyable in its own way, but far less than the possibilities of using it in tandem with other ingredients and techniques.
This sort of play isn’t just about jokes though. Words are fantastically flexible things: They change their shape over time, they squish and stretch to fit the space they occupy. To speak a language is to become part of that shaping process, to both interpret and to craft the meaning, to be marked and to mark. No word survives an utterance completely unscathed, and each speaking shapes new connotation and interpretation, sometimes literally inverting the meaning of a word.
It’s a fascinating process to watch, at times gradual and at times sudden. Jokes and absurd metaphors start to, Pinnochio-like, become Real Words: Raising yourself by your bootstraps becomes a national aspiration rather than an amusing absurdity; robots become automatons become toys become weapons; scary acronyms for everyday concepts come and go, each new one reinvented as each past loses its power. The living history of language passes in front of us every day, and all too often we’re helpless to describe the shift because the words to do so keep eluding us.
The reason why its a bad idea to look down on wordplay too much is because, in some sense, it’s hardly play at all. It is a way of understanding and adapting words, of creating meaning in the space between them and trying it for size. This is not just the realm of humor, but also of metaphor and rhetoric and propaganda, powerful areas where real change can be effected. Many of the adaptations created this way will be pointless gibberish, but many are revealing; of new ideas, of surprising interpretations, of humor and meaning and perspective. It is more useful to respect what a technique can accomplish than to despise its clumsiest practitioners.
(Note: This post is going up quite late into the month, but I actually wrote most of it up at the start of December. The necessity of capturing images and movies to accompany these posts has become a significant bottleneck, not because it’s so very much work but simply because I’m either working on the game and want to be focusing on making progress or not working on the game in which case I don’t want to open the project when I’m meant to be taking a break. I probably just need to get in the habit of taking more screenshots and recordings as I go.)
This month was quite a divergence. I mentioned in the last DevBlog that I’d started working on replacing the sound effect generation system used in the project; I linked to a little cohost post going into some detail on the challenges as I think perceived them, but I didn’t go into much detail in the post itself. However, as the last month has been spent almost entirely on working on this sub-project, I’m going to go into detail here. Before I do, though, here’s a little video of the whole thing in action:
First, some background: Back in 2007 a little sound-generation tool called sfxr was released. This was shared with the indie game-dev community as a tool for quickly and easily generating sounds particularly for use in game jam projects, where impressive quality was a lower priority than speed and convenience. It quickly became a standard tool; it’s very likely that something you’ve played uses sounds generated by sfxr, particularly if it’s a retro-style indie game. In the 15 intervening years, various ports and variations have been developed, with two in particular of interest: First, bfxr, a version which adds several new parameters and which can save the sound parameters to files for later modification; and, second, the lesser-known ufxr, a Unity port of sfxr with most of bfxr’s features.
This latter was what I found when, a year and a half ago, I started this project. I was curious whether someone had made a version of sfxr that ran natively in Unity, which simulated the sounds in real-time, and wondered what-all one might accomplish with such a tool. ufxr did not turn out, in the end, to be such a tool: While it did have ways to play sounds directly, the way it achieved this was by creating an object, completely rendering the sound, loading it into the object, and then deleting the object once the sound playback was complete. This works fine if you’re just playing occasional sounds with little concern for latency, but caused significant performance issues when new sounds needed to be played every frame – and, of course, I wanted every sound played to be a bit different, because otherwise what’s the point of simulating them, rather than just rendering out a sound and playing it normally?
As a sort of stop-gap, I built a system that cached a set number of mutations for each sound and played them back randomly. This still wasn’t great! The game lagged significantly on start-up as it rushed to render and cache every sound, and the sounds only started playing once the caching operation had finished so the game was mute for a while after starting. Furthermore, because the way mutations worked was just a random percentage deviation for each parameter, it was very common for sounds to end up being a bit off – becoming way too loud or too long as some parameter drifted outside of the expected zone and completely changed the feel of the sound. This outcome was invisible beforehand and difficult to address once it came up.
This obviously wasn’t going to work. I needed to do something: I could strip out the whole apparatus, render the sounds to wave files, and play them back. This would be the easy and smart thing to do, being pretty much how most games handle sound playback. It was, of course, unacceptable to me, because I am a maniac. No, rather than this completely reasonable solution, I decided to create my own sound effect synthesizer in Unity – not just a port of sfxr, though I was certainly inspired by it and shamelessly stole all of the ideas I could get my hands on, but something built from the ground up in the way that made the most sense to me.
This sub-project, which I now call Soundmakr, is basically done now. Developing this system took the whole month, which is honestly fine – while I was hoping it would take less, I was also concerned it might take more, and I am quite pleased with the result. I’m going to go into some detail onto what went into this now, and the steps it took to bring this to fruition.
First things first, I had to generate a sound. A sound, from a programmer’s perspective, is just a big array of numbers between -1 and 1 representing the waveform. Normally one would play such a sound by loading it into a Unity Audio Source and letting it play, but that means you have to do the whole thing at once which just leads back to the unacceptably slow methods I was trying to avoid. Fortunately, Unity provides another way: A function called “OnAudioFilterRead” which is automatically called on any script that shares an object with an audio source. Though, as the name suggests, this is meant to process audio, it also makes it possible to write your own data into the audio buffer – which is exactly what I did. I copied all of the basic waveforms used by ufxr, most of which were pretty straightforward, and was able to play them using this function. A good start!
In addition, I created equivalents to the other basic waveform parameters: The duty cycle value, previously only used by square waves, was replaced with a generalized “cycle bias” value that could be used to modify other waveforms in the same way, such as by shaping the triangle wave into a saw wave. I don’t know if this is a common synthesizer ability or if there’s a more established name for it that I’m ignorant of. I recreated the phase-shift effect, which combines the waveform with a slightly shifted copy, and the harmonic overtone effect which combines the waveform with copies at various multiples of the frequency. The “bit crush” effect was replaced with simply having a variable sample rate – though the true output sample rate was locked at whatever Unity’s audio settings had set, the actual synthesizer only simulates at the set sample rate. This makes the synthesizer significantly more efficient, but I’m still not sure how many troublesome side-effects it may be creating…
Regardless, once I had a basic waveform, I had to control how loud it was. Sfxr uses a simple sound attack-hold-release envelope system, where the sound fades in over the attack period, is held for a period, then fades out over the release period. These are the standard terms used in musical synthesis, though in sfxr itself it uses the terms sustain and decay for hold and release, and adds a sustain punch value which is added to the volume during the hold phase. I replaced this envelope with the much more standard attack-decay-sustain-hold-release envelope: This fades in during attack, decays down to the sustain level (equivalent to “sustain punch” + 1), is held for the duration of the hold value, then fades out for the duration of the release. This may seem like a pretty minor change, but one of the things I would like to do someday is adapt this towards musical use – in which case little changes like this could be pretty important.
Okay, I have a sound that fades in and out! It’s a synthesizer! However, to have something equivalent in functionality to what I was replacing, I needed to add filters. This was a task I severely underestimated: While I knew enough about waveforms and envelopes to bang out serviceable ones in a couple of days, I quickly found out I didn’t know shit about filters. For those who haven’t done audio work, a filter is usually a tool for boosting or attenuating certain frequencies of a sound – but what is a frequency? When you’re working at the level of individual audio samples, values between -1 and 1, nothing you can see in a sample indicates what the frequency of the sound is. Looking at the source code to the predecessor tools I was working from didn’t seem to help: The filter functions remained bafflingly opaque. What I learned, in the many days subsequently spent trying to understand filters, is that filters are very complicated.
I’d need to take at least one class to really understand filters, but I managed to scrape together enough to have enough functional knowledge to move forward. To sum up: We can infer the frequency of a sound based on the rate it’s changing over time, and we can calculate that based on the differences between the current sample and N previous samples. We can also attenuate the sound by mixing in the same sound offset a given number of samples – since a sound added to an inverse version of itself is silence, and a sound phase-shifted by its cycle length is more-or-less inverted. This is, as I understand it, the principle noise-canceling-headphones work on. This was all nowhere near enough to allow me to devise a suitable filter, or even really to understand the filter code I was working at, but it was enough to allow me to look through a number of pre-built filter solutions online until I found one that mostly worked and then bang on the relevant parameters until it was what I needed. I actually thought I finished getting filters working several times before finally getting something functional – I at least hope that it’s finished now.
Okay! But… the sfxr synths don’t just play a sound that fades in and fades out, do they? They have all these other parameters: Vibrato, frequency sweep, change amount, and so forth! Here’s the part of the project I’m proudest of, my unique contribution to the lineage: Rather than having all these individual sliders and oscillators, I created a system of Low Frequency Controllers. There are four of these: Sweep, Oscillators 1 and 2, and Step. Sweep changes the controlled value proportional to time, with an additional acceleration parameter; the oscillators control the value according to a waveform and frequency, with the waveform having all the same available shapes as the main tone-generating oscillator; and the step controller changes the value at set intervals, with an option to periodically repeat.
While in the *fxr synthesizers only a few parameters have controls like these, in my synth nearly any value can be controlled. One of the reasons this is possible, from a purely performance-related perspective, is most of these only need to be simulated at most a hundred times a second to sound smooth, as opposed to the thousands of updates per-second needed to generate a tonal waveform, so adding new effects should cost almost nothing in terms of performance. The challenge, however, was how to create an interface for having and modifying all of these available controls without becoming a complete overwhelming mess: I am quite happy with the solution I developed.
New controls can be quickly added (or removed) by clicking the icons to the left of the value to be controlled. Controls are color-coded for quick visual reading, and this with the connecting lines makes it quickly obvious which control type maps to which icon. Universal control values, such as the oscillator waveforms and sweep speed multiplier, are all in their own color-coded sections at the bottom.
Though I’m quite happy with where this interface ended up, working with Unity’s Editor was A Struggle as always. You may have noticed the knob controls on the right and that some sliders have a range of values instead of a single value: This controls the sound mutations, changes that happen every time the sound is played. This particular knob control interface is a largely undocumented and unused Unity feature, and it took a lot of trial and error to get it working – that I bothered at all is mostly a testament to how perfectly this control type met my needs for controlling this particular parameter. Nearly every value can be mutated, and once it is the slider is converted to a double-slider so you can easily set the acceptable bounds for the sound. Another subtle challenge was that of playing the sound when the game was not running – as it turns out, OnAudioFilterRead doesn’t work in the editor, at least as far as I was able to tell. To handle this, I simply created a hidden background object to play the sounds. This required rendering the sound completely before playback, something I largely wanted to avoid, but since it’s just for one sound at a time while running the editor it’s not a big deal (this technique was necessary anyway in order to export sounds as wave files).
Now I had the sound editor and the synthesizer working almost perfectly, as far as I could tell. I began the work of porting it into the Bound City project… and quickly noticed Some Issues. Most immediately, every sound in the old system was addressed by string identifiers, names which were not present at all in the new sound type. It would be easy enough to add a name to each sound, but this felt pretty sloppy – why should a sound need a name? Instead, I gave each Sound Player a library, a little list of known sound files which could be assigned string aliases for quick and easy playback. I also did a little interface work to make building sound libraries quick and painless.
The biggest stumbling block here, near the end of the sub-project, turned out to be the difficulty of porting sounds from old system to the new one. I hadn’t set out to do it this way, but the whole structure of my synthesizer was almost completely different to that used by sfxr – rather than building out each sample one value at a time, modifying each parameter as it went, my synth merely took in whatever the currently elapsed time since the beginning of simulation was and returned whatever sample was appropriate at this point in time. Doing this made it very difficult to convert from *fxr parameters to the sorts of parameters I was using. Additionally, my filters worked in a completely different way than the *fxr filters, so I have no idea how one could meaningfully convert those values. For the most part, I just ended up experimenting via trial and error to figure it all out – and, for the most part, this was enough to import sounds vaguely similar to the ones I had before, but each and every one of them required lots of tweaks and modifications. I got all of the sounds ported from the old system to the new one, but it took several days.
Okay! It’s done! Is it? Well, mostly, for now. I have a number of ideas for improvements I would like to make, and I’m still finding little bugs and issues and fixing them as I get to them. Most improvements can be deferred for a while yet, since they’re more in the realm of expanded and advanced functionality. A few tweaks, making some behaviors more consistent and intuitive and getting a couple of minor features working, might happen much sooner. I’ve also been considering how I might want to go about publishing and/or selling this work: Though this required significant labor on my part, at the start of it all it was based on a freeware tool so I feel slightly scummy just selling it outright. On the other hand, I am very proud of it and would like to both share it and to make money from it! Most likely in the near future I will build a Unity UI for it – that is, the Unity player, not the editor – and release that as a freeware version of the tool, one capable of building and playing and saving all of the same sounds. Meanwhile, the version I’m using, the one that simulates sounds in real-time during gameplay, will be available for purchase on the Unity Asset store… that is, once I build the demo version, once I write up the documentation, once I make the store page, etc. I may try to focus on that more around the dead area that always pops up near the end of the year. I will certainly post about it here once I do.
So, with that all mostly behind me, I’m working on the game again. Much as I left it, there’s not much left to do for this demo version… the demo version I originally planned on reworking the sound after releasing. Will it be done by the end of the year? Maybe! I’ve mostly been fidgeting with this and that, making slight improvements, making everything a little nicer and fixing minor bugs. As I settle into it more, I hope to finish banging out the largely-minor changes that need to be done to wrap up, testing everything, ensuring everything’s in place, adding stuff that I only belatedly notice is missing, and so forth. It feels good to get something done, at any rate.
I’ve noticed that most stories have a strange perspective of violence: Though many of them contain moral injunctions against the acts of violence themselves, they are also strikingly disinterested in depicting that violence from the perspective of its victims. What is the last movie or show you’ve seen, book or story you’ve read, where violence is a terrifying event to be escaped or fended off or recovered from – rather than a mode of engaging with and achieving change in the world? When we are invited to empathize with a victim of violence, it is usually with the anticipation of future righteous violence inflicted against their victimizer. Seldom are these moments of violence just tragic outcomes, unfortunate conclusions to interpersonal interactions: They are almost invariably a thread in a plot intended to begin and conclude in some greater juster and more beautiful violence. Thus, violence exists in two narrative roles: To define bad guys and subsequently to punish them.
This is perhaps simply the structure that emerges when you decide ahead of time that you want to your heroes to partake in violence but don’t want it to be completely random. We want our heroes, we want our heroic bloodbaths, we want to still be able to admire the heroes after they are bathed in blood – so the structure of the story is placed radially around that point, setting up hapless victims, vicious villains, and heroes who have no choice but to intervene in the language of unmediated massacre. The artistic perspective emerging from these constraints one of a deranged and atavistic view of the world, a world where bloodshed is the only language and all reason is gibberish. Over time and repetition and through judicious pruning of the process that selects heroes and villains, this also serves more and more to prop up and justify institutional violence as the sole legitimate bulwark against a violent world.
At the same time, I’m not one who believes there is never any justification for violence, or one who believes people have no right to self-defense. Violence is unavoidable under many circumstances, and reasonable under many others. However, consider the way our conception of violence is shaped by this structure: Victims are erased and flattened, reduced to prizes to be won or infantilized into non-existence, and perpetrators are neatly sorted into Good and Bad, largely based off of who kicks fewer puppies. There is little overlap: There are those privileged to speak the language of blood, and those who are too weak to learn it. This is, we learn, the way the story must be told, the way of the world.
This is all broadly true across genres with one notable exception: Horror. Horror positions violence as a strange and invasive force, one not wieldable by the protagonists for a variety of reasons, ranging from physical disparity to supernatural interference to moral or legal compunction. Even if these protagonists do find a means to fight back, they are usually left scarred by the intrusion of violence into their lives. If there is triumph, it is the triumph of survival, not of justice. Some mention also must be made of True Crime: Even if it isn’t a genre of fiction, it is still a story of violence and victims, and we choose what to focus and emphasize on even if the facts of the story are known. What role do victims play in these stories? Usually, by definition, a mute one. Of course, true crime needn’t necessarily be a story of murder or even of violence – but let’s not kid ourselves, this is usually what crime means in this context. The victim’s role in this story is one of haplessness and innocence, of being the effigy to the sins of society. The story of their death becomes the story of how Evil is real and it is here and it is vested bodily in the form of a bad person. Often left unstated but implied is the conclusion: We must therefore build a counterbalancing bulwark of righteous violence against this evil. Or perhaps I’m wrong about these genres – I am a devotee of neither. These are merely the impressions I have gleaned.
Isn’t it odd, though, that the only time we’re interested in the stories of victims is as they are victimized by supernatural external sources – or criminals so powerful and brilliant they border on the supernatural themselves? There are so many people in this world forced to flee from violence, to redefine their lives around the hole it leaves, to walk in knowledgeable fear of a knife or a gun or a bomb, people who, if they are ever spoken of at all, are used as props to justify further retributive violence. Do we avoid looking at their stories because we are scared of what we may see if we look too close, too deep? An uncanny resemblance in the shape of their suffering, a familiar hand behind the circumstances that torment them.
I find most game stories extremely obnoxious. Beyond the irritations with craftsmanship and cliche, beyond being merely bored and annoyed, there are patterns I see over and over again in intros and cutscenes and store pages that are distastefully tedious and tediously distasteful. Here’s the format of a game intro: This is our world, and it’s great – it better be, we paid a bunch of artists to make this shit! But there’s also some sort of encroaching darkness, some kind of ancient evil, some kind of corruption. It’s made bunch of guys show up to start shit, and they look basically human but, trust me, they are huge jerks in an irrevocably genetically ingrained way; or maybe they’re just magical constructs that look like guys; maybe they’re skeletons or something. In any case, it’s completely fine to kill all of them, and is actually a good thing to do.
This is all obviously at its worst in fantasy titles, though it’s a loose enough archetype that it could be easily applied to a lot of games even outside that domain. There’s often some good and kind king who has been dethroned in the process, some kind of sacred order being profaned, some sort of holy war, whatever. This is all obviously, when examined critically for half a second, an absurdly reactionary framing – one could use the (bad) excuse that it’s all a riff on Tolkien, but even his works had more nuance, and he was willing to admit that the definition of certain races and creatures as constitutionally evil was probably not ideal. Yet this is what a lot of games hew back to: Stories of dark external corruption staining a natural brilliant beauty – a bunch of Make Faeryland Great Again bullshit. Another aspect of this that is very frustrating is how often it seems to crop up in games inspired by Dark Souls, since that game in particular avoided these cliches very adroitly. There is an old god-king – but his and other gods’ senseless clinging to power is a big part of why that world is so fucked up in the first place. There is a “darkness”, a “corruption”, but this is more of a powerful primordial force that can change things for better or for worse. Dark Souls takes so many of these cliches and plays with them in such clever ways, it’s rather revolting to see so many supposed successors play every cliché straight in the most boring possible ways. In addition to being pretty gross, these sorts of stories are extremely boring. Why are we on the side of the king? Why is the corruption evil? Why do we have a better claim to the land than that “corruption” does? We just do, that’s why. It’s bad, we’re not, and you can tell because our UI markings are blue and theirs are red.
Every time I notice something like this, I want to tear it to pieces. This is actually proving to be something of an issue for me on my current project: Part of what I want to do with Bound City is to tackle the ideas of nostalgia and retro-fetishism and the reactionary ideas baked into them, but there are so many little stupid cliches like this that I get overwhelmed. The unstoppable crime waves, the good kings who give quests and whose lives are inseparable from the well-being of the land, the oozing corruption, the untamed wilderness, the pure language of violence, the destruction of beast and environment to harvest resources, the weirdly absolutist moral judgments – it’s wild how many of these often contradictory ideas manage to simultaneously permeate the overall narrative space of games, and it doesn’t feel right to not try to skewer them wherever I have an opportunity.
All too often, though, the games that take aim at the cliches of game narrative and design simply do so by restating them in plain language and rely on that absurdity to appear humorous and insightful. Most of the time it’s pretty superficial stuff like isn’t it weird how many games have you kleptomaniacally steal anything that isn’t bolted down? Almost never are the narrative precepts of good kings and halcyon pasts and corrupting darkness questioned, almost never is it posited as not obvious where a just hero would stand on these things. But who are we, the game players? Do we not have more in common with a “corruption”, something alive and desperate and shifting and evolving, than the royalty, something tyrannical and wealthy and stagnant? Why are we enemies of random animals and creatures? Who gets defined as intractably evil and therefore worthy of massacre? Where are we placed in the narrative, and where do we want to be?
These are the sorts of questions I want to ask – not merely to invoke nostalgia, not merely to poke fun at the occasional silly contradictions, but to ask what lusts and justifications are fed by these sorts of narratives, to ask why we crave them – and to ask what, should we choose to reject them, happens next?
After watching through Better Call Saul I apparently decided I still didn’t have enough anxiety in my life and subsequently binged through Barry – a comedy series following a hitman, played by Bill Hader, who stumbles into a Los Angeles acting class while following a target and subsequently decides to become an actor. I’m going to discuss the broad narrative themes and arc of Barry but won’t be going into much detail, so this all should be fine for the spoiler-averse. I was initially put off by the show’s premise, as comedies about violence are a mixed bag: They can serve to trivialize violence or to portray its innate absurdity, serve to apologize for those who enact it or to humanize them – and these descriptions probably sound rather similar on first glance, which itself illustrates the problem. Violence is a powerful and complicated thing, and doing it justice is a sophisticated challenge, one exacerbated by the challenges of creating a good comedy.
Fortunately, the writers seem to be aware of all this, and while it is an absurd and over the top show it is also frequently quite thoughtful regarding these topics. Though the initial episodes toy with the question of whether it’s possible for Barry to give up his career and lifestyle to become a good person, this question almost becomes a running gag due to its sheer absurdity. What does it even mean to be a good person? Does it merely mean living an inoffensive life where you don’t do any obvious harm? If that’s all it is, then isn’t that just an easy life? I mean, who doesn’t want to be that kind of “good person”? Is being good merely living the good life? That is, however, the kind of good person most of us are: The goodness of convenience. The goodness of buying products subsidized by distant blood rather than blood of neighbors, the goodness of exported violence and imported goods rather than local violence with localized harms. This is the kind of good person that only relatively comfortable get to be, a goodness that correlates with wealth. The good person is a story we tell over and over to comfort ourselves, to make sense of things, to assure our anxious brains that all is in order, all is correct, that all is for the best in this the best of all possible worlds.
What Barry is really about is these stories we tell ourselves. Los Angeles is the ideal setting for this, a city of dreams where reality blends seamlessly into fiction – BoJack Horseman, another complicated story of a bad person who dreams of being better, uses the setting similarly. The people in Barry’s acting class don’t just seek a skill, but seek stories – not stories as sequences of events, but as structures to make sense of sequences of events. The secondary protagonist Sally, a woman who Barry meets in class and enters a relationship with, has her own complicated relationship with violence: As a survivor of domestic abuse she’s still trying to make sense of her own history, constantly approaching and retreating from violence, struggling to articulate her anger without being overwhelmed by it. Gene, the instructor of the class, has lived a life of narcissism mediated by narrative justification, living in a story all about himself – after all, as Fuches, Barry’s erstwhile handler meditates, “Everyone’s the hero of their own story.”
This truism is appropriate enough, but our actual relationship with stories is a bit more complicated, the roles we cast ourselves into more nuanced than purely heroic. We understand the world through narrative structures, through parable and myth and anecdote – and, while most of us do it by habit, art provides an opportunity to take control of the process. Just as we can use art to shape our own narratives, we can share it with others to help them shape theirs – a process that can be generous or malicious, depending how the practice and practitioner. There are industries built around constructing and controlling these narratives: Arts and entertainment, obviously, but somewhat more subtly marketing, politics, education, and even sometimes the sciences. These fields all twine together, are motivated and weaponized by one another. Barry becomes a killer because of the story of patriotic violence, a hitman because of the story of familial and military fidelity, an actor because of simplistic narratives of redemption and forgiveness… a person always taking action but always at the whims of his story, a story in which he has probably not always been the hero. We also learn to regard others in terms of our story. People get typecast as villains, as love interests, as father figures, as confidantes, even when it doesn’t make much sense, even when the role doesn’t line up with the person.
It’s thoughts like these that make me terrified and suspicious of the power of art. It’s such a tempting place to exist, a warm self-annihilating cocoon where everything in the world becomes hypothetical, every terror an experience, every regret a learning moment. I think it is healthy to spend some time here and impossible never to retreat here; nevertheless, the perspective from inside the cocoon is only helpful when it can sees the world outside clearly. When a story finally emerges from the cocoon, slowly sprouts its wings and flies away, we must take care to see that the stories it reproduces later on do not shape further tragedies, terrors, and regrets. Perhaps, though, a regret or two might not go amiss – maybe that’s the idealistic wish underpinning the show is that somehow, somewhere, there’s a story potent enough and poignant enough to finally instill the wicked with a conscience.
A pen may be mightier than a sword, but it is terribly difficult to aim at the distance at which it is most effective.