Flypostmortem


So, here’s a poorly-structured overly-delayed postmortem about this game.

Key points

  • Didn’t have a concrete design going in to it besides ‘place sticker and not get seen’
  • Level design suffered as a result
  • David’s 3D modelling and design feedback were invaluable to the finished product functioning
  • Wasted too much time on refactoring code instead of making content
  • Need to work on level design + AI programming + actually getting a clear design for the game sorted out in advance.

Context for development cycle.

  • 2024 SBIGJam, excessive sound design
  • Wanted to learn Godot
  • Some inspiration from current election cycle (noticed some flyposting of campaign materials, realised ‘hey that could be a good game idea!’ - and couldn’t see any other games on the topic either)

So, let’s start with some context for the game. This was produced for the 2024 So Bad It’s Good Jam, and this year’s theme was ‘Excessive Sound Design’ - a bit of a tricky one for someone like myself, with zero meaningful audio know-how. So I spent a bit of time utterly stumped for what to do.

However, for some reason, someone decided to have the UK General Election happen on the same week as this year’s SBIGJam - and I couldn’t help but notice some flyposted campaign materials in my local area. This gave me some inspiration for the game - a flyposting simulator! And funnily enough, I couldn’t see any existing flyposting games anyway, so I decided to make a game about flyposting, using Excessive Sound Design to forcibly make the player overwhelmed and overimmersed.

I also decided to try learning Godot this jam. Learning Godot was very much on my to-do list, and I figured that SBIGJam would provide me a great opportunity to force myself to learn it.


Day 1 - phone repair, the design sprint, and teething issues

Saturday (day 1)

  • Started trying to learn Godot
  • Started work late that day.

So, about a week before the jam started, I had a slight whoopsie with my phone and needed it repaired. Mum suggested the guy who fixed her phone a few months ago, I promptly contacted him, but he needed some time for the part for my phone to arrive. He contacted me on the Saturday to let me know he could start fixing it - only problem was getting there. I don’t drive, but my brother does, so he was able to help me out with that. Mum suggested waiting in the cafe of a nearby garden centre, so we did that - and this was incredibly useful for the overall design process.

This was a great opportunity for me to focus on the design work for the game, without any distractions (because, back at home, I would have just continued wasting time faffing around aimlessly in Godot instead). I also gained some invaluable input from my brother, and he floated the idea of helping me out with the 3D modelling.

  • Layout of player room was drafted there.
  • I mentioned enforcers probably robots, motivated primarily by ease of modelling compared to humanoid enforcers (easier to get away with greater abstraction etc)
  • Brother suggested inspiration for enforcers from Wall-E.

Initial draft for game:

  • 3 ‘days’.
    • Player starts in room, propaganda blaring from vidscreen (a la 1984)
    • Player draws own stickers.
    • Player leaves room, heads outside.
    • Level involves placing sticker outside and not getting noticed by Enforcers
    • Player returns to room.
  • Game end after 3rd level. Player tapped on shoulder, forced to turn around, turns out they’ve been caught by Enforcer. Whacked on the head, camera probably falls a bit (maybe fade out), game abruptly crashes (player canonically dead).

My overarching aim was to use the ‘excessive sound design’ to induce a sense of panic and make game feel kinda uncomfortably hyperrealistic(?) - y’know, like a sense of being kinda overwhelmed by the sounds and such of the city looking out for enforcers whilst trying to get away with something illegal.

I initially considered making the game overtly political, but decided to keep the game’s content apolitical because I didn’t know how to do it tastefully, and I also couldn’t really think of anything to say with it. The game probably would have suffered if I had included some hamfisted political messaging anyway, so it’s for the best that it didn’t happen.

Shortcomings - hadn’t actually worked out the specific level design or the sound design. Had the rough idea of ‘place sticker and walk away also there are enforcers’, but didn’t solve the problem of ‘okay, but what is the player meant to be doing about the enforcers?’. Knew I didn’t want to give player any option to attack and wanted enforcers to pose danger to player. But hadn’t worked specifics out.

I jnitially thought of having Flypost work as a stealth game - maybe enforcers patrolling area, get suspicious over time whilst they see the player, and get very suspicious of player if they see player placing a sticker (chasing down + instakilling player if suspicion meter filled up). First level planned to be clear of enforcers, but then one enforcer after placing the sticker to chase player away (to make the player realise ‘enforcers = danger’), in a relatively low-risk area like an alleyway (fewer witnesses for crime). Second level - maybe one enforcer who does a simple patrol route, probably in a street or something? (Medium risk area, some risk of witnesses, but easy to escape) Third level - sticker position in some sort of city square, probably on a prominent Regime monument, with several enforcers and some rather labyrinthine city blocks (high risk, very visible location with high security + many witnesses).

My brother mentioned he had been playing some Cyberpunk 2077 recently, and he mentioned several instances of getting jumpscared in that game by threats bursting out of doors. This gave the idea of the game eventually ending as the player returns home after 3rd level, getting ambushed by an enforcer barging out of a door and in the hallway and ‘apprehending’ (canonically killing) the player. (The jumpscare was also loosely inspired by that part of Cardinal of the Kremlin (which I had recently been reading) where Filitov is apprehended by the KGB agent bursting through the door). I had also considered making some enforcers in the actual game levels burst out of a door too - but this ofc didn’t actually get implemented.

Managed to successfully work out a shopping list of 3D models I would need, with these requirements:

  • Apartment, containing the following:
    • Bed
    • Vidscreen (with its own texture, so it can visually be turned ‘on’ and ‘off’)
    • Desk (intended for originally planned sticker creation phase)
    • Vaguely supermax cell-like vibes
    • “Bathroom” containing nothing but a bucket.
  • Apartment hallway, containing the following:
    • many doorways containing doors (for decoration)
    • an exit doorway
    • a doorway for the apartment
    • a doorway leading into a bare room which the jumpscare enforcer would jump out of
  • Door
    • Same as the decorative doors used for the apartment hallway
  • Buildings.
    • Because of urban setting
  • Enforcer
    • Robot
    • I suggested the large hat (commissar vibes)
    • Able to fit through doorways
    • Imposing

David graciously volunteered to provide these models, and I agreed to give him full credit and such. I gave him free reign on the specifics of the designs, but I suggested that he should keep it low-effort/quick-and-dirty rather than aim for works of art. This was motivated by the best interests of both of us; I knew I would need a relatively fast turnaround due to the time constraints of the jam (and needing to start using them ASAP). However, I also knew that he wouldn’t have much time to work on the modelling either, as he was due to move out during the game jam week to start his placement year, and I didn’t want to get in the way of him sorting out his packing and such. The models were made in Blockbench, and he gave me the actual .bbmodel files for them (along with the textures in .png), which was immensely helpful later on for a couple of minor adjustments.

The end result of his modelling greatly exceeded expectations, and it wouldn’t be an exaggeration to say that, without him, Flypost probably wouldn’t have existed, so I’m very grateful for his help.

Anywho, the rest of Saturday was spent trying to learn Godot.

I found out the hard way that, unlike Unity, Godot doesn’t like it if you resize a packed scene containing colliders. This was a problem, because it got in the way of my attempts at trying to build a graybox test scene. In hindsight, it turns out that Godot has a csgbox3d thing I could have used instead for prototyping - however, in the heat of the moment, I made a script which would allow me to ‘resize’ an instance of a box prefab by exposing a ‘real scale’ Vector3, which, when changing the value of that, would update the scale of the child MeshInstance3D and set the size of the BoxShape3D in the child collision shape to match. It still wasn’t very convenient, but it worked in the meantime. There’s probably a better method of making things with collision resizable though, so I need to look into that.


The finished prototype level, and creating the apartment scene.

I managed to get a prototype level up and running on Sunday. Here’s a video of it: https://youtu.be/xxxj5ihCC2c

However, I’m only realising in hindsight that I didn’t get around to recording a version of it with the earlier iterations of That Noise. That Noise was produced following a tutorial on how to make a riser sound effect, and was inspired by some of the sound design of Ghostface in Dead By Daylight (with the anticipatory noise that happens when a survivor can see you whilst stalking). It’s a looping second of white noise, which goes through a band pass filter, an overdrive filter, and [etc]. The intensity of the noise is adjusted via tweaking the Hz target(?) of the band pass filter, rendering it inaudible at 1hz target but very noticeable eventually. Initially, it played as the player was getting close to + placing the sticker, as some sort of ‘overwhelmed by all the sensory overstimulation’/tinnitus effect. However, upon realising that it’s kinda like the suspicion sound effect from the Hitman trilogy, I opted to repurpose it for some ‘enforcer suspicion’ audio (later repurposed into just ‘enforcer proximity’).

The FOV, heartbeat, and ambience are also tweaked by an ‘intensity’ system - ramping up when the player got close to the sticker position, wearing off after doing it. This, too, was intended to make the player feel kinda overwhelmed and overimmersed and such.

Eventually, my brother managed to produce the apartment + hallway models, so I started to get these working in Godot.

This went without incident, after working out how to adjust the import settings and the generated colliders in order to leave the doorways passable. Later on, I adjusted the models a bit (widening bucket room doorway, removing front wall from apartment to use the hallway wall as the front wall + adjusting it other walls/ceiling appropriately, adding some more dummy rooms to the hallway when reworking the ending).

This was also when I had the Great Idea of having the cinematic-y intro with the text appearing as the player moves through the hallway. This was inspired by the intro to ULTRAKILL, and went down rather well.

The doors were implemented via a script for getting charactercontrollers to apply force to rigidbodies they bump into. They are held in place via a hingejoint, and I implemented the ability for them to be ‘locked’ by adjusting the limits for the joint (0° if locked, a big limit if unlocked) along with the mass (big mass when locked, very light when unlocked) and the rate of correcting themselves (instantly when locked, otherwise not bothering). Also I made them not have any collision with the world, only the player/enforcers. This made them stay in place when locked, but swing open dramatically when unlocked and bumped into. The swinging through the world was fully justified imho by the context of the jam - adding some levity to the situation.

The apartment + hallway is used as an instanced scene in the scenes it’s used in. It has some events exposed to the scene scripts that use it (reporting stuff like when the player hits trigger areas inside it), various important components (like references to the room/enforcer doors, the sticker object, etc), and methods to perform certain bits of important functionality (like getting the vidscreen audio source to play a given announcement audio track), or to lock/unlock the doors. The lightmaps etc are also stored within this instanced scene, which was also very convenient for the scenes which use it (wouldn’t get that from Unity’s prefabs!).

It was at this point I opted to cut the ‘designing a sticker’ part of the game. I wasn’t sure how I could implement it, so I instead resorted to the ‘collect the obvious sticker’ process present in the final game. I still wanted to make the player appreciate the act of ‘grabbing the sticker that they will use later on’, to add some level of rituality or something to the proceedings - a feeling which would be absent if they just started with the sticker in their hand.


The original version of the ending scene

After getting the intro scenes and such together, I then moved on to the final scene. Why? Same location, and figured it would be a decent place to work out how to handle the enforcers, due to the very simple nature of this scene.

So, again, the player would initially get ambushed by the enforcer on their way back to their apartment. I had no idea how to use navmeshagents in Godot at this point, so I initially controlled the enforcer via the level itself. Upon the player reaching the hallway trigger, the enforcer would be spawned in, their door would be unlocked, and their charactercontroller would move towards a certain node in the hallway, before then being moved to face the player and walk into them.

At this point, I made the decision to make the enforcer distance determine the ‘intensity’ of the white noise, heartbeating, and the FOV stuff, to heighten the panic they would induce in the player.

It was late at night when I first got the Enforcer moving. It honestly scared me when it started going, but it kept moving forward, bumped into the wall, and fell over, but I managed to record a funny video of it. Later on I finally managed to get it to cooperate, and, with that, I moved on to some actual level creation. Here’s what it looked like.

Also, take a listen to That Noise!

I knew that I wanted the game to end with the player getting killed by the enforcer. In the initial concept, I had considered ending the game with the screen fading to dark red (or black) as the camera falls down (like the player’s now lifeless body falling to the floor), before having the game close itself. I didn’t manage to implement the camera falling, but I worked out how to force close the game, which was suitably abrupt.

I would adjust it a bit more later on, but I’ll discuss that later.


The return to the room

This technically happened after the first level was made, but it makes more sense to discuss this here.

You may have noticed that, after each level, there’s a short sequence of the player back in the apartment hallway, and walking back to their room (with the intensity effects initially at 100%, but fading down to 0 decently quickly) - and yes, it might feel like ‘filler’. However, these mundane scenes are vital to the game.

I wanted to add a sense of ‘routine’ to the game, and make the player feel immersed in the mundane routine of their character. I could have just had each level end and then start the player back in their room for the next day - but I wanted the player to, y’know, actually do the going home themselves.

The intensity effects start out at maximum (and rapidly wear off) to make the player feel like they’re at the end of the high from the stress and such of doing the thing, but they’re now in somewhere they would consider to be a ‘safe’ place.

And this would ultimately make it hit even harder when this safety is ultimately desecrated at the end.

Later on, when I put a link to the (pre-release) build in the SBIGJam server, someone mentioned that they got a bit lost in this scene (not knowing what door to enter) - hence the addition of the sticker on the player’s door, to solve this issue.


Levels (my detested)

The first level (with navmeshes and shader woes)

Level design was a challenge.

The first level was relatively simple in concept, and I wanted the player to be ambushed by the enforcer as they tried leaving via the route they came, before being chased down an alternative exit.

Initially, the real exit was directly next to where the sticker was, with the jumpscare trigger next to where the Enforcer came out of (as you can kinda see here). When I got my brother to playtest it, he pointed out that I made a massive mistake by just exiting via the side exit rather than getting jumpscared. This prompted me to redo the layout for that level, putting the side exit further away, and putting the trigger for the jumpscare between the sticker area and the entrance to the side route (so the player would definitely trigger the enforcer and get chased away).

I also realised when doing this that I would need to make the enforcer actually use a navmesh in order to follow the player through the winding paths. So I spent some time working on that. Initially, this enforcer AI was very simple - it would be given a ‘chase target’ (the player, usually) and would just, y’know, chase it via the navmesh. Wasn’t too hard to refactor the ending to work via the navmesh instead, but there was an issue with the Enforcer leaving the ground for some reason.

I have no idea what caused the Enforcer to go airborne. But lowering the cell height in the navmesh (from the default value of 0.25 to the minimum possible value of 0.001) appeared to solve it - albeit at the cost of Godot complaining about a mismatch somewhere.

I later went back to the first level to add an invisible wall over the side route which would block it off until the sticker was placed. I couldn’t work out how to ‘disable’ the collision of a staticbody in Godot, but I eventually found a solution - destroying the node at the appropriate time. It worked. But, again, there’s probably a better solution which I probably should try to find out.

I showed this level in the SBIGJam discord server (see https://youtu.be/biLU0Ah0vzw for a reupload of that video), and received some positive feedback. Someone suggested adding a vignette shader to the narrowed FOV (to further emphasize the mood). It took me an embarrassingly long time of looking up how shaders work and trying to specifically look up ‘godot vignette shader’ to eventually find a whole pack of shaders for Godot in the Godot asset library, which included a very good vignette shader. However, I’d say that the vignette was a very worthwhile addition to the game. You can see the version with the vignette here: https://youtu.be/C0GOdCihOVo


The second level (more AI wrangling, doors, level design issues, and navigational problems)

The second level was genuinely difficult to make.

Between the level creation attempts, I had a stupid idea - I was heavily considering making a level that would effectively be the honeycomb maze/square maze from Takeshi’s Castle (with a kazoo cover of the bgm used for it). This, however, would require the enforcer AI to be rewritten to allow it to be dumb enough for it to work in this situation (with stuff like line of sight checks, patrolling and chasing behaviour, etc). So, I started trying to rewrite the enforcer code, keeping in the existing behaviour as a ‘giga monty’ mode (so I wouldn’t need to completely redo the other scenes). This took some time to complete.

I opted to basically rip off the patrolling AI behaviour from Lethal Company (see those ‘Lethal Company AI explained’ videos by alter ego) - and I think it went rather well in hindsight. Only slight issue is that it does make the Enforcer behaviour very deterministic (unless a player hits a door and sets off the ‘investigation’ mode/gets seen) because the nodes and the enforcers are all in the same place to begin with, but I figured that players wouldn’t stick around long enough to realize.

I also went back to the 3D models my brother had made, and extracted the doorway from the apartment model and created a model consisting of just the doorway - so I could then create a prefab scene of a doorway with a pushable door in it (instead of just standalone doors)

But anyway - the second level. I realized during the enforcer rewrite that a honeycomb/square maze level wouldn’t work with the lore, so I scrapped that idea. I ultimately opted to make the second level more of a maze-like thing where the player would need to escape through the somewhat confusing layout of the city.

I started from the starting area - the courtyard, with an enforcer statue that the player would put the sticker on. Then I surrounded it with buildings, and gave it four exits. Then there was the problem of creating the rest of the level.

After some faffing around with the structure, I had the idea of making the general structure of the level into two concentric ‘rings’ around the central courtyard. Then, the routes via the inner ‘ring’ would have doors in the way (unlike the outer ring) - so, if a player wanted to use the shortcut of the inner ring, there would be the risk of alerting the enforcers to their location. However, the specifics of the level design were still very tricky, and ultimately I just put things down where I thought they would be suitably not terrible - aiming for a heuristic of 3m wide ‘corridors’ and trying to avoid incredibly long unobstructed sightlines.

Working out where to place the exit was difficult. Originally, the first level just abruptly ended after the player reached an area with a less dense buildup of buildings - which would be a problem with the second level, as I wasn’t sure where to put that. This is where I had the idea of putting in a doorway with a red door, and having the exit through there (kinda mirroring the departure from the apartment hallway). I subsequently went back to the first level and put a red doorway at the exit there as well, in an attempt to show the player via gameplay that ‘hey the red door is the exit’. So I eventually put it in the outer ring, behind where the sticker was placed (as that was the last area I needed to build and I just wanted to get it over and done with).

I wasn’t sure how many enforcers to put in the level. I was considering three, but as I was having issues with getting through with three enforcers, I knocked it down to only two (one of which starting right in front of the exit). I think this amount worked.

One major oversight with this level was the difficulty with knowing where to go. At this point in time, my brother had departed for his placement year, so I didn’t have anyone nearby to playtest the level without already knowing where to go. During the jam rating period, in response to some feedback about it being completely unclear where the player was meant to go, I attempted to remedy the issue via an audio source on the exit zone, to indicate to somewhat nearby players where to go to leave. imho this wasn’t the best solution, however, I didn’t want to put any more non-diegetic HUD elements in the way. The location of the exit in the 2nd level did pose a problem for this solution as well, as I needed to limit the radius of the audio source in order to prevent it from being heard as the player was placing the sticker on the statue, limiting the utility of it as a guide - however, I theoretically could have made it extend to the whole level (and be a bit more useful) if I had set up some area colliders set up to turn it off if the player was in the starting courtyard area. Another solution I was considering was trying to add some signposts with arrows on them, but I opted against that because it felt a bit too handholdy and obvious.

I encountered a couple of other AI issues when putting this level together, such as the enforcers getting stuck inside some doors. After faffing around with changing the enforcer collider size (and re-baking the navmeshes with the new enforcer size), ensuring all the AI patrol nodes were some distance away from the doors, and adding in some code to forcibly make the Enforcer change its patrol target if it stopped moving for a bit, the problem appeared to be solved.


Scrapped level concepts

I had a few other level ideas during development. I had considered implementing the ‘square maze’ idea by starting the player in one area, spawning in a “giga monty” enforcer to chase the player inside (not going in there itself), then having some of the patrollers in there (then maybe ending in a last section outside again). This was scrapped partially due to the time investment necessary to put such a thing together - as not only would I need to put the level geometry together, but I would also need to re-rewrite the enforcer code to co-operate with the segmented nature of this level idea (as each Enforcer would need to remain in its assigned area, and only attempt patrolling using nodes within a certain area etc) - hence why it never happened.

Another idea I had (intended for the final level) would have been an entire army of Enforcers chasing the player down a boulevard or something like that, maybe with some obstacles in the way to keep gameplay somewhat engaging. However, I genuinely wasn’t sure what sort of obstacles would actually make sense in the context of the game - and the game simply didn’t have any mechanics that would be usable in this situation to create a suitably engaging gameplay experience (so it would just end up as a very underwhelming failed attempt at spectacle). Also, for some reason, I had Tenebrae Rosso Sanguine stuck in my head with this concept, probably envisioning something grand, climactic, and generally very challenging (like that’s ever gonna happen). This concept would have probably made more sense in the context of an endless runner game or something instead.

I also considered making the square maze level anyway and adding it as an easter egg of sorts (throwing the player into it upon launching the game after beating it). But I simply couldn’t be arsed, so it didn’t happen.


Further adventures in AI wrangling

So, there were some other adjustments to the Enforcers that I made.

I added a red spotlight to the Enforcers. I had considered making it like a menacing red glow to make them seem a bit more menacing at first, however, I wasn’t quite able to get that done. But the second purpose they served was successfully delivered by them. In Dead by Daylight, killers have a ‘red stain’ (a red spotlight) in front of them in the direction where they’re looking (only visible to survivors), in order to help survivors work out where the killer is looking even if the killer themselves is hiding behind a corner. This same purpose is served by the red spotlight in front of the Enforcers - indicating roughly where the Enforcer’s line of sight is (and where the general danger zone is), whilst providing some sense of danger to the Enforcers.

I also managed to work out how to get a rudimentary line of sight system working for the enforcers. It works using a raycast node from the enforcer pointing towards the player (at all times) - but I limited the Enforcer’s effective fov by manually restricting the local Y angle of the raycast node (and then checking if the ray can hit the player). It’s incredibly scuffed, but it worked.

I also added in some code for some audio sources to play some ‘patrolling’/‘investigating’/‘chasing’ noises for the enforcers. I’ll discuss these shortly.

Finally, you might still be wondering about why I simply made the current level reset upon having the enforcer hit a player instead of any sort of ‘you died!’ scene. Well, I didn’t want to add a ‘you died’ scene because that would be a bit too non-diegetic for this game, and I also wanted it to feel like those other deaths weren’t canon and didn’t happen (hence immediately going back to the start of the scene). Also, I felt that the abrupt nature of death in this way (without any sort of fanfare or anything, nor an opportunity to process it) kinda just felt right for this game.

Anywho, a video of the second level with these changes can be seen at https://youtu.be/qbn_-Ogmrxw


Reworking the final scene

As the final scene was intended to be a desecration of a ‘returning home’ scene, it would have to happen after a level. However, the voice acting script I wrote involved 3 vidscreen daymessages - needing 3 intros. But now the game only had 2 levels and 2 outros. So, I opted to rework the final scene into an ‘intro’ rather than an ‘outro’. I think it probably works a bit better as an ‘intro’, because the player is undoubtedly cornered now (whilst a player could have theoretically fled out the apartment door if it was an outro), but it does lose the shock value of the ‘violated calm after storm’ of the original version.

I did need to adjust the hallway model to add some more enforcer cubby holes (so I could adjust the enforcer spawn point), but Blockbench did make this very easy to do, which was pretty useful.

At this point, the game’s ending was still just ‘game closes abruptly’. The final version of this ending came about after I was done with the audio.


The Remaining Excessive Sound Design

I’ll go over this point by point in no particular order, for ease of writing this.


The drums!

I already mentioned some ULTRAKILL inspiration in the intro, but the drums in the game were also heavily inspired by it (I was listening to the soundtrack whilst developing this game) - and I figured that adding some breakbeat-ish drum loops to the game would work in context. However, there were the problems of finding the drum loops and working out how to implement them.

Luckily, I found a couple of CC0 drum loops on freesound (by deller24) which both had the same beats/timings, with different intensities.

Now, implementing them. Both of these loops are constantly playing in the scenes they’re used in, controlled based on a ‘layer’ system. They can be completely off, or on one of three ‘layer’ modes. ‘Layer 0’ has them off, but they’re turned off via fading out. ‘Layer 1’ just has the first loop on (fading in if it was previously off), but not the second loop (fading out if it was on). Finally, ‘Layer 2’ has both loops on (fading in each loop if they were previously off).

The scenes with ‘Giga Monty’ enforcers (level 1 and ending) had simple implementations - Starting ‘off’, going to ‘layer 1’ when the enforcer spawns in, and being in ‘layer 2’ whilst the player is in the Enforcer’s line of sight. The ‘returning home’ scenes likewise had an even simpler implementation - starting off the scene in ‘layer 1’ (on full volume), but immediately being set to ‘layer 0’ (immediately fading out).

Level 2 was trickier. At first, I had it work identically to Level 1 - silent until the sticker is placed, then immediately going into layer 1 during the level, but being in layer 2 during a chase. However, I didn’t like it, as it just felt a bit inappropriate having it in layer 1 constantly, as it felt inappropriate for those times where the player was simply evading the patrollers. Ultimately, I opted for a system where it would remain in ‘layer 0’, but be in ‘layer 1’ if any Enforcers were in ‘investigation’ mode, or ‘layer 2’ whilst being chased by any Enforcer (adding in some methods to work out the current ‘danger level’ from all the enforcers and then using that to set the drum loop layer appropriately). This felt a lot better, and works rather well to induce a sense of “I’m in danger!” when actively put in danger by the enforcers.


Voice acting

I wrote the script for the voice acting relatively early in the development process. I wanted three announcements from the vidscreen - the first two by Percival (a character I invented back in SBIGJam 2020 and has unfortunately been re-appearing in every other entry since then), the last from Percival’s replacement (following Percival getting unpersoned off-screen) - with plenty of Newspeak. I also knew I wanted the enforcers to effectively be voiced via sentence mixing (to add a sense of artificiality to their audio, and because the structure of Newspeak (with many word fragments stuck together) lent itself to this approach).

In keeping with the 1984 vibes, I opted to write the script using a hefty amount of newspeak. Of course, 1984 only contains a few examples of newspeak, nowhere near a comprehensive dictionary - but enough to guide the creation of some new newspeak words.

One such word was ‘propcrime’ - as in ‘propaganda crime’ (such as flyposted stickers), somewhat derived from the phrase ‘agitprop’ (agitation propaganda, from the USSR). I needed to coin this word because I needed a newspeak-y noun to cover the act performed by the player, and the existing nouns of ‘thoughtcrime’ and ‘sexcrime’ obviously wouldn’t be applicable. However, it probably came off more like ‘crime related to props’ rather than ‘propaganda crime’ - but I suppose that’s the issue with constructing new vocabulary for a language where adding vocabulary is intentionally doubleplusuneaseful (like Newspeak). Likewise, as newspeak doesn’t contain the word ‘stop’, I coined the term ‘unproceed’ - again, a bit of a questionable construction, but ‘proceed’ is mentioned within a Newspeak sentence within 1984, so it made sense to avoid adding a new word to the limited newspeak dictionary.

Percival’s lines are a mix of newspeak and oldspeak, delivered with his usual unprofessionalism. The first announcement he delivers is mostly intended as some worldbuilding (and mild fanservice for the people who give a crap about that), reminding everyone to obey The Regime and to NOT put up any stickers anywhere at all. The second announcement he gives is more like fanservice-y lore stuff - mentioning that this game takes place after Committy (the democratic Committy canonically got overthrown by the totalitarian Regime due to general apathy towards the Committy), and having Percival go on a tirade about not liking stickers, saying too much, and ending mildly forebodingly. I’d say these two announcements served their purpose, and the fanservice was noticed, which is also a positive.


The final announcement posed some more problems. The writing of it was a somewhat fun challenge - I knew from the start that I wanted it entirely in newspeak, so I had to find/invent the appropriate newspeak words to convey the message. I think I managed to get that done successfully, which is doubleplusgood. Recording it was a bit more problematic.

So, for context, I have a stammer (and a crappy microphone but that’s a secondary issue). This isn’t a problem for the Percival lines, as the horrible delivery was part of the joke. However, this announcement, all in Newspeak, would need to be delivered clearly, professionally, and at a suitably brisk pace to provide the intended feeling of drill sergeant-ing the listener. I made a few attempts, but I kept stammering and needing to scrap the cut. Things were looking a bit pessimistic.

Usually, in this sort of situation, I’d try drafting in my brother (who, y’know, actually is able to speak clearly) to help me out with the good voice acting (like with the good vocals from The Button Factory (SBIGJam 2020)). However, by this point in time, he had already departed to move into his new house, and didn’t have any internet (only having mobile data), so, y’know, he definitely wasn’t in a position to help. I had also considered trying to see if I could draft in one of my parents to help with the voice acting (as a last resort), or just using some text-to-speech (y’know, the proper old-fashioned TTS stuff, not the newfangled ethically-dubious AI stuff), but luckily this wasn’t needed.

I had mentioned some of my woes in passing to one of my friends (Virety_Rammithel) - and she volunteered to help with the voice acting. I sent her the script for the announcement (and gave her some directions for how to say it). Took a couple of takes, but the outcome was much better than anything I could have done myself.

I also asked her if she could help with voicing the enforcers as well - I explained the concept was for them to effectively be voiced via sentence mixing (so I’d need her to record some fragments of words which I’d then stitch together to produce some lines), and she was down for that. I sent her the list of fragments, needed a couple of re-takes, but, again, a much better end result than anything I’d have been able to produce.

I think the final end result for the enforcer voices didn’t quite match up to the initial goal though - the fragments flowed a bit too well, not quite sounding as obviously sentence-mixed as desired. Maybe if I made the fragments play over each other a bit, it might have made the effect more obvious, but I think the end result was acceptable.

On an unrelated note, I think that having the Enforcers and the final daymessage voiced by the same voice actress (completely different from Percival’s voice actress ~~me~~) probably worked well thematically (as, y’know, it’s like Virety’s the undisputed voice of The Regime or something like that - like how whoever did The Combine’s civil protection announcements in Half Life 2 (not talking about Dr. Breen’s ‘breencasts’, but the female voice commanding the Combine forces directly throughout) is like the voice of The Combine.)


The Music

It’s not a SBIGJam entry by 11BelowStudio without some crappy kazoo covers. This time, there was only one kazoo song (fewer than usual) - the anthem of The Regime (used for the main menu and end credits).

I decided to look up some material related to 1984 for inspiration with this game, and I had a listen to the Eurhythmics album For The Love of Big Brother (originally produced for the film 1984 (1984)) in search of something good. Unfortunately, nothing in that album stuck out as something that would be a great song to cover (however, I was tempted to create a cover of Sexcrime, but call it Propcrime instead - but I knew I didn’t have the audio wizardry know-how to do it justice). A rethink was needed.

It was at this point I remembered the song Oceania, ’tis For Thee (the main theme of 1984 (1984), the anthem of Oceania, and an orchestral piece with plenty of wind instruments). In other words - a great target for a crappy kazoo cover. And so, I recorded a cover of it with my long-suffering kazoo. Giving it a listen, however, I realised it was missing something - it needed more than one kazoo. So I recorded another kazoo (filling in some bits missed by the first kazoo, joining in on the important bits, and generally fleshed it out a bit). It still wasn’t quite there - but after recording a quartet, it sounded appropriately impressive. And so, this was used as the main theme for the game.

However, the song (like most national anthems, real or fictional) actually has lyrics - it’s not just an instrumental, and the version with lyrics is used at the end of the film. So I then had the bright idea of changing the ending to go to end credits instead of closing the game (a trivial task, given that I was using a game template asset from the Godot asset library which has end credits built in to it), with a lyrics version playing for the end credits.

These lyrics were a bit tricky, as they were mostly just ad-libbed, and this took several attempts, using different approaches to the lyrics. One of these attempts was along the lines of ‘oh no you’re canonically dead the regime didn’t like your stickers yes you’re dead’ - but that one was crap and not very funny, so I scrapped it. Then I tried something kinda as a meta-commentary of ‘wow this game sucked and that ending was a downer’ - but, again, ehhhhh that was also garbage. There were some other failed attempts before I finally realised the obvious solution.

I had the lyrics for Oceania, ’tis for thee open (as, y’know, I wanted to know the syllables for each line and such). And I realised that ‘hey, why not just replace praise for Oceania with insults instead, inverting the descriptors and making the chorus just an announcement of how much it sucks?’. So I did that. And it was very nice - but it felt like it needed more than just one voice track (to feel more fleshed out), so I re-recorded myself singing it (and trying to remember the words) a couple of times. The end result was suitably godawful but entertaining, and added a welcome sense of ceremony to the occasion. Great success!

In hindsight, I guess the lyrics of The Anthem of The Regime did have some unintended meaning to them, which kinda adds some actually tasteful political subtext to the proceedings. In the original, one of the lyrics was about ‘our people ceaselessly strive / to keep the revolution [Ingsoc] alive!’ - and in my crappy rip-off, this was changed to ‘our people ceaselessly slack off / to keep the regime going’. I think I was aiming for ‘uninterested in keeping the regime going’ or something with those lyrics, but, in hindsight, it gives off a meaning of ‘the only thing keeping the regime going is that everyone’s too lazy to oppose it’ - which kinda does ring very true about the real world. Just some food for thought I guess.


The vidscreen fanfare

Originally, the vidscreen audio in the intro levels would just be playing automatically (with the vidscreen on and such). This worked, but didn’t really grab one’s attention. Looking back at the film 1984, the telescreens in that film would play a short snippet of the Oceanian anthem before playing the actual announcement. So, I decided to adopt the same approach here, recording a kazoo cover of that fanfare (using multiple kazoo tracks), making that play via vidscreen audio source before the announcement plays, in order to attract the player’s attention. This seemed to work appropriately well.


Launching the game

It probably could have gone better.

I opted to release Flypost primarily as a downloadable game because the performance of the first web build I attempted to build felt a bit shaky (for lack of a better term). That, and I tried to faff around with lighting stuff in the game, and the things I tried faffing around with weren’t entirely supported on web, leading to the two having completely different lightings. However, I’m not overly keen on the way the lighting ultimately looks in either of the builds.

I’m also not very satisfied with the thumbnail I ended up using for the itch.io page. I was originally thinking of either a depiction of someone getting chased by the enforcers (problem with that was depicting an individual to be chased when there is no canon player model) or something akin to a propaganda broadcast from The Regime - neither really materialised, so I just slapped a crappy sticker-ish rectangle thing on the vidscreen background texture and called it a day. A month or so later, in August (during my process of procrastination on writing this postmortem), I decided to add a simple animation to the thumbnail, using a render of the enforcer model, and basically just fading it in and out of frame (in the layer between the sticker and the background). It works, I suppose.


Assessment of the overall development process

The overall development process of Flypost was carried out incredibly poorly. I didn’t go into it with a real plan, level design was just a few vague ideas, and I spent much more time than I should have re-writing and refactoring spaghetti code in order to add functionality outside the vague plans I had put together. Granted, there is the excuse of ‘first time using Godot teething problems etc’, but inexperience with an engine isn’t an excuse for neglecting to put in the effort in the design phase. If it wasn’t for my phone whoopsie, I would have wasted all of Saturday aimlessly faffing around with Godot, with nary a trace of design work done. Furthermore, without my brother graciously volunteering to handle the 3D modelling for me, this game almost definitely wouldn’t have been made, so, in all honesty, he’s the true MVP here.

My own conduct during the development process was also rather poor. On a positive note - recording those WIP videos (and posting some of them to the SBIGJam discord) was a great idea. It provided an archive of the game at a certain point in time, made me feel like I was actually doing something, and it was validating to see the feedback on the server (and the feedback did help quite a bit to enhance the game).

However, my overall working pattern was incredibly unhealthy, and probably caused more harm than good. I made the horrible decision of basically making the development process my sole obsession for the week, getting to bed incredibly late when working on it (and waking up late as well (but I guess it gave me an excuse to watch the election night coverage live this time round)), and generally neglecting everything else in my life for the week. I had already posted my postal vote for the general election, but, in hindsight, getting outside to vote in person instead may have been a better choice, or just giving the dog one of her walks each day (if just to force myself to touch grass or something) would have been beneficial for my mental (and physical) health. I need to stop subjecting myself to these unhealthy working practices. I need to stop trying to put blood, sweat, and tears into these games, and re-assess why I’m making these games in the first place - because whilst I am satisfied with the end result, the journey to get there was not worth it. I’m a bit concerned in case the pneumothorax I had the following weekend may have been related to the abuse I put my body through for this jam, and I really need to stop myself and pace myself before my working practices become the death of me.

Actually fleshing out a game design prior to the actual development period (like I did for The Button Factory and One Unspecified Period of Time at Kevin’s, or, to a lesser extent, Committy) is something that I need to do next time. This would help me to avoid wasting time re-refactoring code later on in development, I’ll be able to work out roughly how far to completion I am throughout the development process, and it’ll help me work out what assets I’ll need earlier on (so there will be much less of a rush to get help with creating assets later on). Furthermore, I really do need to work out how to do 3D modelling myself, so I’m not imposing on others to do these tasks for me.

I should also strongly consider investing in a better microphone, doing some voice training, and maybe learn an instrument besides the kazoo, because I know I won’t be able to rely on kazoo noises alone for all my future projects ~~but then again there’s the question of ‘which instrument?’ and then things get even more complicated from there~~.

But I think that my ongoing procrastination on writing this postmortem has been actively detrimental to the efficacy of this postmortem, so I need to get the postmorteming over and done with much sooner.

Things could have certainly gone better; but they certainly could have gone worse. 7th place (3.701/5 overall) is my best SBIGJam result so far, which is honestly rather good to see; ~60% of all the ratings my game got were between four (39.6%) and five (21.5%) stars, with ‘Overall bad’ being the category I did the worst in (3.5/5 overall, 29th place), and ‘Modifier’ being the best (3.875/5, 7th place) - but that modifier score was still trounced by that of One Unspecified Period Of Time At Kevin’s (2022, 4.438/5, #1 modifier (#9 overall, 3.5/5)). I’m not sure what takeaways there are for me to take away from the jam ratings, however; but as only 11.1% of all the ratings I got were one or two stars, I suppose that most aspects of Flypost were rather well-received.

But at least I can say with some confidence that I have a bit of Godot experience, and Godot felt pretty nice to use :)

Now, what’s next? I’m going to be participating in this year’s GMTK jam this weekend. Whatever I end up making for that jam is definitely going to be smaller in scale than Flypost was - but I’m definitely thinking about using Godot again. But will Godot actually help me with my attempts at getting a job? No idea, probably not any time soon (and I suppose that learning Unreal might help a bit more in that regard - but knowing how bloated that engine is, I’m not chomping at the bit to try learning that and using that for a jam). Might make something kinda related to the overwhelming sense of regret and existential terror and overall feeling of being trapped by my own mistakes I’ve been struggling with lately (hot weather tends to send my brain down very unpleasant trains of thought)

Files

flypost windows 0.0.4.exe 198 MB
71 days ago
flypost linux 0.0.4.x86_64 191 MB
71 days ago
flypost web 0.0.4.zip Play in browser
71 days ago

Get Flypost

Leave a comment

Log in with itch.io to leave a comment.