Wink Commander Postmortem Part 1: Inspirations & 7DFPS
This post is Part 1 in a 3 part series. Part 1 looks at the game's inspirations and gives a day-by-day jam log. Part 2 explores the intention behind post-jam updates and cut features. Part 3 dives into the music contributed by various talented musicians.
Contents
This post is very long! Feel free to skim/jump to the bits you're interested in.
- Decisions
- Inspirations
- Resources
- Jam log
- End-of-jam thoughts
Decisions
After many years of not quite finding time, I was finally able to participate in 7DFPS again. For past 7DFPS jams, I've made less-traditional first person games like a sci-fi ice skating combat game, a puzzle game where you play as a participant in a progressive dance (builds currently unavailable), or a text adventure with first person mouselook controls. Over the years, I've also worked on a few other games for 7DFPS where I didn't quite have enough time to make anything releaseable, so it's been very gratifying to be able to wrangle the time, do the work, and get something out the door.
In the lead up to the jam, I'd more or less decided that I didn't have time to participate, but an idea wormed its way into my brain and I decided that if I got enough of the other work I had planned to do before the end of the year, I'd take the time I'd usually give to an annual patch for FLAT and spend it on making a game about winking where left and right mouse buttons control left and right eyelids.
While letting the idea simmer in the background, it began to take more solid form, and by the time I made a start, I'd settled on wanting to make something about building relationships with/context for others through passing contact. Being isolated in a space ship felt like a good fit, and from there, Wink Commander was an obvious name.
My initial instincts were to make something non-violent, but the name did make me consider making a game where you are a fighter pilot, making gestures to wingmen and enemies, maybe with an overarching narrative about cutting through conflict with respect and acknowledgement, but making a space combat sim and finding a way to pace it such that the emphasis would still be on the gestures felt like a bit more work than I was willing to embrace (not to mention that I enjoy the notion of the player being a pilot who never gets to control their ship).
Inspirations
When I first had the idea for Wink Commander, I think my primary influence was the text parser adventure Conquests of Camelot. Toward the end of the game, there's a section where Arthur arrives in Jerusalem, and must solve a problem for each of the characters he encounters there. I think there's some white saviour stuff that should not go overlooked (nothing like a stranger rolling into town with all the answers and then disappearing before really having a chance to understand or being account able for the consequences of their actions), but that aside, the game asking the player to listen to and empathise with everybody, without preconceptions or prejudices and regardless of how big or small their concerns might be, left a big impact on me when I was a young Cheese.
The idea of making a game that did similar, giving players some context, and then asking them to empathise with/understand characters' subjective hurdles/hopes in order to take an action that improves a life even if only in a small way is very compelling to me, as is hiding that behind actions that at first seem mundane. In Cloud Courier, a jam game I made in 2021, I had implemented a disposition system where NPCs came to like and trust the player more after successive deliveries, with the intention of unlocking some unique deliveries that revealed something about their character and gave the player an opportunity to feel like they played a side role in something significant in that character's life (eg: delivering a ring, or delivering some critical medicine, or delivering an apology letter). Unfortunately, I ran out of time to actually surface any of the disposition stuff or implement the unique deliveries. When starting on Wink Commander, I wanted to do something similar, but make sure I had that disposition stuff there as the focus from the outset.
In 2020, I had done some prototyping on a small game called Gunnar, in which a player controls a turret on a capital spaceship, shooting down small fighters. If I ever get around to making that game, it will have sequences where the player can walk around and discover things within the ship they're on, and exploring some of that informed the direction I decided to go for the player ship in Wink Commander.
I think the other primary inspiration I drew upon was Hardwar, a sci-fi exploration/trading/combat game set on Titan, where the player takes on the role of a pilot trying to make ends meet in a no-longer-profitable mining colony. The game primarily takes place from within the cockpit of your ship (or "moth"), and in my memory, carries a sense of loneliness, isolation, and some oppression. Through that though, I had some feelings of camaraderie with the other moth pilots out there, trying to eke out a living in an economically, politically, and physically dangerous world.
I wanted to draw upon some of that, but leave the actual socioeconomic forces at play vague. I hoped to give the impression of feeling oppressed by a dehumanising job, but without explicitly saying what that job is. Maybe you're transporting freight, maybe you're a courier, maybe you're maybe you're doing something else - whatever feels like a good fit in the player's mind is right.
Resources
As is generally the case for my work, I used some pre-existing tools and resources to speed things along. This doesn't include music contributions - more on that in Part 3!
Tools
- Godot 3.4 (game engine)
- Inkscape 1.1 (vector illustration)
- GNU Imp 2.10 (raster painting/image editing)
- Blender 3.6 (3D modelling/rendering)
- Tenacity 1.4 (audio editing)
- Zoom H4n Pro (audio recorder)
- Rode NTG2 (microphone)
Third party assets
- Godot Mirror (dynamic mirror addon)
- Godot TTS (text-to-speech addon)
- Downgraded 32 (modified for 3D swatch palette)
- Orbitron by Matt McInerney (heading font)
- Universalis ADF Std by Arkandis Digital Foundry (body font)
- Full radio sweep.wav by vedas (modified for radio tuning sounds)
Jam log
To reflect on Wink Commander, and to give some context for what I was making, I wrote this dev log based on notes and commit messages from during the jam. It let me see where I'd spent my time and why, and has been an important part of assessing my work.
Day 0 (2 hours)
Before committing to participating, I spent a couple of hours making a head model and adapting the hexagonal wipe shader I made for Hive Time to work for handling a wink/blink mask and then slept on it.
Day 1 (8 hours)
By the time I decided to take part, the jam had been running for a couple of days. 7DFPS as an event is pretty casual/flexible, and more about providing people with a reason to make stuff than a restrictive set of constraints, so I was comfortable with starting late and finishing late.
I was mostly keen to make something solo, but I was also mindful that my productivity isn't what it used to be. Knowing that music tends to be the first thing I cut when running out of time, I thought it might be nice to reach out to people who'd previously expressed interest in collaborating with me (I normally end up having people reach out to me after I've already got music sorted, so I had a list of people I'd be open to working with, but had to turn down). I put out an open call for any musically inclined people I knew or had social context for who would be interested in contributing something (read more about them and their work in Part 3!).
I spent "day one" adding some basic mouselook controls inspired by Yo Soy Freeman's "Achieving better mouse input in Godot 4: The perfect camera controller" article. I'd previously done some mouselook stuff in Godot a few years back, and my quick-and-dirty solution back then was a bit jittery/janky. I figured that it'd be nice to take a look at how other developers are tackling that kind of thing, and Yo Soy Freeman's approach gave nicely smooth results.
I also added basic WASD movement and brought in a plugin called Godot Mirror for testing so that I could see my head and blink animations doing their thing as I worked, and made a test level to put them in. It's pretty rare for me to use plugins or work that wasn't made by me/for my projects (the combination of enjoying making stuff, and not liking to use other people's stuff without knowing what it does ends up making the use-cases for third party work in my projects fairly narrow and specific), but after reviewing the source code and making sure I had an understanding of how it worked, I made an exception here (as I would also later with Godot TTS).
I made some shape keys for the blink animations in two steps, one half closed, and one fully closed. With the low poly model I'd made, this was sufficient for what I needed, and I could use tweens on both at once to get a smooth blink. To make it easier to understand what was happening in screenshots and videos, I made a quick overlay showing the state of each mouse button and indicating when the mouse was moving.
With some minimal work, I was able to graft my low poly head onto a low poly body I'd made and rigged during some Blendsday sessions earlier in the year. Using this as a base felt like a good time-saver, even if the mesh and rig are pretty rough - the focus of the game is on hands and faces after all. I updated the character model's render layers so that it wouldn't be visible to the player camera, but would be visible in the mirrors.
I'd never manipulated bone poses directly before, but this is something I am planning to do in Fossil Sweeper, and so it made sense to have a fiddle with that here. Since I was planning to implement nodding and head shaking via some gesture recognition that would follow the player's movement over time with mouselook controls, it made sense to tilt the head and neck up and down to make those movements easier to read in the mirrors. Using up axis rotation (Z in Blender and Y in Godot, just to make sure things aren't consistent) on the entire character model for looking left/right seemed to work well enough for now, figuring I could come back for more complex procedural animations later if I needed.
Toward the end of the day, I started making a cockpit model. Across the project, I've been back and forthing on "cockpit" vs "bridge" - cockpit was my first instinct, but as the game grew and I added more interactive stuff outside of the chair, I started to wonder if bridge is more appropriate. Eventually, I settled back on cockpit with the primary thought being that the ship is being controlled/manned by a single person, rather than a bridge or flight deck where a captain oversees subordinate who do the actual work.
My first pass was intentionally a quick and dirty placeholder, made with the intent of giving me something to do testing in while also exploring a possible layout. I drew inspiration from what I remember of a shot from Alien (I didn't have time to hunt up a reference, but I've seen the location referred to as the "observation pod") and what I remember of a backer reward ship from the original Star Citizen crowdfunding campaign (which I can't be bothered finding a reference for - it's the Constellation, I think?), where a forward seat is surrounded by glass that protrudes from the main chassis, providing a broad field of view. My placeholder cockpit came out a little too small for my player model/camera height, but as always, it was still fun and exciting to make a space and then go and stand in it.
Recently, I'd made a fancy space chair for Blendsday, so I brought that into the scene as well. I popped a little mirror above it that the player could see themselves in, and that felt like something nice to have.
Day 2 (9 hours)
Since I was already getting responses from musicians/composers coming in (with a 32 second WIP of Drew Van Camp's Nav Elation arriving first), I turned my attention to implementing the in-game radio.
I wrote a Radio class that treats folders on a particular path as "stations" and the songs within each folder as the songs played on those stations. Tapping the interact key turns the radio on or off, while holding changes stations.
I brought some convenience methods across from my Globals class in my other projects, including functions for interrogating the file system and loading resources that prioritise stuff in the user's home folder over stuff that ships with the game. This acts as a sort of quick-and-dirty mod support, and meant I could sent builds out to my collaborators and they could drop their music in the right folder to hear it in-game, allowing them to iterate without waiting for me to give them a new build.
I modelled up a retro radio, drawing inspiration from 1960s stuff like the Bush VTR 103, and giving it a little receiver dish to make it feel "futuristic" in a slightly silly way. I used this model as a way of trying to find/arrive at some stylistic decisions, and while I don't think I managed to carry it forward to any other aspect of the game in a meaningful way (mostly due to focusing on being quick/minimal with everything), I think this model more than anything speaks to the aesthetic I'd aim for if I was making this game in a more relaxed context with room for iteration.
Colour isn't my strong suit, and in an effort to simplify things, I decided to use a swatch texture and grabbed an existing palette from Lospec (downgraded 32) to use as a base. I reordered the palette into 6 rows of varying hues, which increased from black to white using the existing palette colours plus a couple of extras to fill in blanks. My thought was that I could shift UV maps up and down for colour variations without having to think/care about which specific colours, and end up with some interesting/surprising results that were still vaguely "nice" thanks to the choices behind the initial palette (or however much of that survived my tinkering).
While working on the radio, I created three material variants, a normal one, a shiny one, and an emissive one, all using the same swatch texture. This gave me some good options for variation without moving beyond my palette.
With my remaining time in the evening, I returned to cockpit work. I knew that I wanted to have a large console/dashboard with room for lots of buttons, which my initial "protruding bubble of glass" placeholder cockpit didn't really feel like it would lend itself to. For my second pass, I started with the console, blocking out a shape that covered 70% of the space in front of the chair (coinciding with the default FOV), and having a couple of levels/tiers that could act as shelves to store things on while giving vertical surfaces that could have displays on them.
I'd fallen in love with the idea that the cockpit would be full of buttons and dials and displays and things, but all of them would be inscrutable (like the tank sequence in Another World, which I also love). My thought was that it'd be fun if buttons did unexpected/unpredictable things like a little door opens and a doughnut slides out or a library card is printed, and then those objects could be shown to NPC pilots to act mechanically as different gestures. I wasn't sure if I'd get to any of that, but it still made sense to do a little prep for just in case I could squeeze it in.
I built a "windshield" above the console that curved back overhead, and continued on until I'd made a room that was round in front to follow the console, and then tapered back toward a door behind the chair, leaving some standing room that I could fill with consoles and other interactive stuff if I had time (at this stage, I was open to leaving the player locked in the chair if that's what I needed to do in order to keep the scope down). While working on this, I was thinking about the cockpit shown in this Wing Commander screenshot which suggests that the cockpit is a space recessed into the ship rather than a space that protrudes beyond the body of the ship, compared to say, something like my initial placeholder or the A-Wing from Star Wars. That felt like it resonated better with the idea of living on and being isolated within a space ship.
Last, but not least, I put some geometry behind the eyelids of my player model so that instead of a gaping hole, there were, you know, eyes. I shouldn't have been, but I was surprised at how much this made it feel like a person instead of a creepy soulless puppet.
Day 3 (7 hours)
I put a little free standing mirror on the console to replace the ceiling mirror from the first cockpit. Having it off to the side felt like a nicer fit that give more emphasis to the stuff going on in space.
I added WCPilot class (the WC prefix is meant to indicate Wink Commander, but I was sloppy and didn't use it consistently) to store pilot details such as name, ship, disposition, and some gesture/expression parsing stuff, as well as a WCExpression class to hold and parse more complex gesture combinations, which at the moment was just winking, but I had hoped for combinations and sequences to become relevant for gameplay later in the game.
Knowing that menu/new game flow is less effort the earlier it's done, I made a placeholder main menu and implemented some level setup/teardown functions to handle things like automatically placing mirrors on top of meshes called "Mirror," hooking up the Radio class to the relevant mesh and collider in a level (if present), instantiating pilots, and so on.
The level now automatically spawned pilots one after the other, represented by a coloured cube indicating their state (out of range, in range, fulfilled, and unfulfilled), and returned to the main menu once they had all passed by. I added a label on the right of the screen to hold status messages for the ships. My plan was to make this a list where new messages appeared at the bottom, pushing older messages up, which would fade out over time.
I added a little emissive ring to the radio model that would be toggled to indicate its on/off state, and fixed a bug where audio popping can occur if an OGG file has been loaded, assigned to an AudioStreamPlayer, and play() is called, all during the same tick. I'm pretty sure that's related to some decoding overheads, as it didn't seem to happen with WAV audio. Regardless, a yield() before calling play() resolved it - something I'd discovered in previous projects, but each time forgotten in the meantime (maybe now that I've written it down, I'll remember).
I adapted my build system from Bat Egg, wrote up a short testing_notes.txt, and pushed test builds up to itch for the various people who'd expressed interest, which by this point I think had already exceeded six.
Day 4 (8 hours)
I had Hive Time's anniversary patch to ship, so in the morning, I fixed a few bugs and added a toggle for mouse invert in case any of my contributors feels that pulling back should look down and shifted focus back to Hive Time.
Later in the day, I came back to spent time on menu stuff. I bought across my credits parser/UI generator, Binder (my library for managing/generating UI for custom bindings), settings handler/UI generator, and some more convenience functions for things like saving/loading config files, playing sound non-spatial effects and UI sounds, connecting up common UI signals for mouse over events, etc., and calculating a scale multiplier based on window dimensions.
I've got a script I originally wrote for Hive Time that I use in all of my Godot projects, which parses a json file, and generates a series of Label and GridContainer nodes, using dictionary keys as headings and array values as names. It also handles auto scrolling/wrapping and allows for manual scrolling via arrow keys, gamepad joystick, and mouse click and drag.
It might seem premature to care about credits, but I feel like it's something that's very easy to forget to make time for. Since I always have my Patreon supporters to thank, and in this case contributing musicians to credit, it makes sense to front-load that work. It also means that I can update credits immediately whenever I bring a new contribution or third party asset (like a font) instead of leaving it for later and potentially forgetting.
I added some initial UI for showing ship and pilot details, and implemented a check to make sure the player is looking vaguely at the NPC ship in order for gestures to be processed - prior to that, it was easy to do a gesture and not realise or see that the NPC had responded.
Before heading to bed, I spent some time making space ships. My plan was to take some simple shapes - cubes, wedges, cylinders, and make a range of different ship designs from those common elements, then add some greebles and tweaks to give them character.
The first ship I made was primarily comprised of wedge shapes, with two forward facing wings jutting past a sloped cockpit. I don't think I had any specific inspirations - I've made plenty of things with similar forward, pincer-like wings, going back to little made-up Lego ships I'd made when I was a little Cheese.
The second ship I made from a series of cylinders, strung together as a series of modules with different attachments suggesting cargo containers, engines, power generation, habitation, and so on. I was thinking about the Discovery One from 2001: A Space Odyssey while making this one, but that influence doesn't show through so clearly. As with my first placeholder cockpit, I avoided looking up references while making stuff - generally, I'm more interested in exploring what my impression/memory of a thing inspires in me than what the thing itself inspires, so I only tend to go hunting after I've done a first pass.
I spent a bit longer than I was planning on the first two ships, and figured it was a better use of time to make additional variations using the modules from the second ship than make a bunch more. I was able to make another 4 ships that (I hope) feel distinct enough in a few minutes. While I'm a bit bummed that I didn't make a diverse range of ships to suggest a more interesting universe with varying cultures and design sensibilities, I did have a bunch of fun making the two that I did put time into.
Day 5 (10.5 hours)
By the fifth day, I had nine or so music tracks in the game, so I put some time into updating my credits handler to generate song credits similar to what one might see on the end of a movie's credits, drawing details from each track's metadata at runtime. This was fun to do, and I appreciate that it guaranteed that any last-minute contributions won't be left out if I was too busy with other work.
I made a quick and dirty starfield and did a render with a nearby yellow star and threw it behind the main menu, which up until that point was several buttons with default Godot styling on a flat grey background). Even though I didn't change the buttons, I think it elevated the game a bit, helping to set the tone and suggest the visual style of what's to come. I did another render of the starfield, threw some faint clouds over the top with a screen blending mode, and used that as a quick and dirty skybox texture.
With everything else coming together, then next biggest priority item was a game loop. Looking at the time I had remaining, I decided that an interactive map showing a network of routes joining destinations was doable, and quickly got to work making some initial icons in Inkscape, including stars and several possible station icons.
Starting with a very quick/naive random location placement algorithm as a placeholder, I wrote a Location class and some code to set up connections between them, along with some draw functions for rendering those connections. As I iterated, I replaced random placement with jittered grid placement as a low-effort way of guaranteeing even spacing while still looking vaguely organic.
Each location will try to create a reciprocal connection to the nearest location that has fewer than two connections, giving a distribution of short and long routes. locations generally only have two connections but I'm only checking destinations' connection list size rather than the current location when iterating through, so there's a chance for some to end up with up to four.
I spent the rest of the evening making space stations, going a lot longer than I was intending, but still having fun. I made four stations all up, with the first re-using some of the motifs from the modular ship I'd made the day before and drawing some loose inspiration from Space Station V from 2001: A Space Odyssey. The second station had a central dome surrounded by docking hubs connected back to the centre via arms, loosely drawing upon some of the starbase designs from Star Trek. The third was an asteroid with various structures protruding from/sunk into its surface, suggesting it had been hollowed out. Finally, the fourth evokes some stylistic sensibilities of the ISS. With the exception of the asteroid station (which I guess I forgot about), I copied and pasted some docked ships into each to help suggest scale.
Day 6 (10 hours)
I made a quick little comms station with a monitor and keyboard, set into a tall cabinet as if for standing use. I made the geometry in such a way that the screen could be withdrawn into a recess and the keyboard fold up to cover that space and make it flush, but I didn't think it was worth animating at the time given how little of my week was left.
I'd set up the radio interaction such that if the parent of the collider has an activate() function, that'll get called. It's not a particularly complex pattern, but it let me add new interactive items little effort. I added an Empty positioned and angled to "look at" the monitor geometry, and then made it so that the player camera moves to that point when the comms station is interacted with. This guaranteed proper centring of the monitor so that when I displayed the map screen (which has no background), it'd give the impression of that being something displayed on the monitor.
Several more music tracks came in, I think bringing the total up to twelve at that point. Building on work I did for the song credits, I updated the composer section for the credits to be generated from the artist field in the music track metadata. More credits automation always makes me feel better.
Around the middle of the day, I wrote a little devlog over on Patreon to go along with preview builds.
I added the station icons to the map screen and spawned in the matching station model when arriving at a location. I hooked up the call that previously ended the game when the current list of pilots was exhausted to make some lights appear on the comms station instead, and positioned the comms station model so that those lights would be visible in the mirror on the main console in the hope that it would help guide new players toward interactions they hadn't yet discovered. I wanted the stations to spin so that there'd be some visual activity when waiting at a station. I gave them some axial tilt too, and it took a while to get the spinning happening correctly with that tilt because my maths brain is teeny tiny, and transform basis rotation still doesn't quite come naturally to me.
I also made it so that a little icon shows appears when mousing over an NPC pilot's name on the map screen to show which route they'll be travelling on to make it easier to chase down a specific pilot.
When arriving at a location, I update a currentLocation, and when a location on the map screen was clicked, I set a pendingLocation variable. I updated NPC pilots to have corresponding variables to track who would and wouldn't be on the current route, and every time a destination was reached, the NPC pilots all picked a random destination from their new location's connections. Quick and dirty, but good enough - the game was now playable indefinitely, and since I was already updating pilot dispositions after processing expressions, that meant the core of the game was in and functional, and more or less anything from here was a bonus.
With locations, persistent pilots, the map layout, etc. all in swing now, I refactored new game setup stuff (which was still temp code attached to the main menu's New Game button) into a setupGame() function in my Globals singleton. Up to that point, pilot and location setup/map generation were temp code, so I reworked those to better work with persistent game data and busted them out into their own functions as well. I also moved the placeholder arrays of pilot names and station names out to external json files so that they could be edited/modded without doing new builds.
Day 7 (14.5 hours)
At some point, I'd miscounted days, so I entered day seven thinking I had another day left. Since I'd gotten the core of the game done though, I focused mostly on supporting aspects/polish. I downloaded a radio band sweep sample from Freesound, and clipped out some bits that felt appropriate for a tuning sound to give some more feedback/texture to changing stations. I also added some quick and dirty particles that appear when the ship is in motion to help communicate travel vs non-travel states. I updated the map screen to add a confirm button whenever a destination has been selected so that the close button can consistently act as a "cancel" action (previously, closing after selecting a destination would confirm it).
Sunday mornings are Blendsday time, so I allocated that to working on refining my character rig and doing some animations in Blender. I made thumbs up and thumbs down animations, and both hooked those up as expressions/gestures that NPC pilots can respond to, and as a way for NPC pilots to give visual feedback on their response to your actions/inaction.
My low poly character mesh didn't have separate fingers, so I chopped up my "mitten" hand geometry into some quick and dirty fingers, and added extra digits to the armature. I made a duplicate mesh that was just the hands, and added that in a way that was visible to the player camera, but not mirrors. Being able to see your own thumbs up in first person turned out to be fun! I also made some "rest" animations for each hand with both standing variants that the hands can return to when a gesture isn't being performed.
I was hoping to use this project as an opportunity to use Godot's AnimationTree features, but I struggled to get them to do what I wanted and fell back to just duplicating the imported AnimationPlayer at runtime to have a separate AnimationPlayer for each hand. I had some trouble with the Blender GLTF exporter and getting it to only export keyframes for bones with keyframes (in my other Godot projects, I use a modified version of Godot's Collada exporter for Blender that I've tweaked to meet my needs over the years - at this point, I couldn't tell you exactly what my changes were, but I do remember being intensely frustrated with keyframes being applied to unkeyed bones and all exported animations being the same length regardless of content), which may have been the source of my problems with AnimationTree, but after spending a bunch of time, it made sense to fall back on more familiar stuff.
I had made a quick sitting animation, but after giving up and having multiple animation players, I decided to not bother with animations for legs/body, even though I'd made a quick sitting animation. The placement of the mirror on the console and the location of the chair means that the player's bottom half is never visible, and there's no way for the player to know their feet are hanging out the bottom of the ship when they enter the chair, so there was no reason to spend effort on that.
I added an interaction collider to the chair, which would trigger the camera model to be snapped into a "sitting" position on the chair and movement to be ignored. When sitting, I updated the position of the chair collider to fill the empty space to the right of the chair next to the radio, in the direction players would look when trying to look for the comms station's light after seeing it in the mirror. When standing, the collider is returned to cover the chair model. I also updated expression processing to not happen unless the player is sitting.
With that done, my next priority was collisions. I added a collision mesh for the cockpit walls, and wrote checks when moving to see whether the proposed move would place the character inside the walls, and prevent movement if so. I had written code to move up to the collider and then allow remaining movement to be applied along the collider, but I couldn't get it behaving correctly (after the jam, I realised that I had been rotating my checks in the wrong direction, and it was otherwise working, but at the time I decided that just preventing moving out of the cockpit was good enough for now).
I also put in collision checks against the interaction colliders for the comms console and chair so that they couldn't be walked through anymore either.
Thinking about what sense of progression a player could get from their interactions with NPC pilots, I updated the map screen to not list pilots unless they had been successfully interacted with, and updated status messages to say that unknown pilots had been added to "contacts" when the first successful interaction occurs. With pilot locations now being completely unknown, I updated setupPilots() to guarantee that at least two pilots will be encountered on the player's first route.
A couple more music tracks came in before the end of the day, bringing the total up to fourteen - far more than I had hoped for. The radio implementation meant that I could never have "too many" music tracks. Grouping them by station makes it easy for players to focus on what they enjoy and avoid what they don't. I spent some time trying to think through the tracks that had been submitted so far and consider which ones might be good candidates for the main menu and credits.
Day 8 (??? hours)
I got up on day eight, assuming it was my 7th day, and did a bunch of misc housekeeping stuff. I created an application icon, filled out some more the Itch page, did some build system tweaks, added an in-game instructions screen to render the content of testing_notes.txt, and added placeholder controls screen to the settings menu. I also filled out rest of the game's credits with special thanks, testers, and Patreon supporters, and tweaked some credits layout stuff to ensure better centring of columns with varying content width. At some point along the way, I realised I'd miscalculated my days, and decided to put aside most of the development tasks I had planned for the day.
I went back to my notes from the night before on menu music, and found it very difficult to narrow down a shortlist. I wanted to make sure to prioritise tracks composed during the jam, so that took a few out of the running (a couple of people had submitted existing works, and while I was very happy to welcome those, it felt like it wouldn't be in the spirit of the jam to give them prominence when most tracks had been made for Wink Commander). Just about any of them could be solid choices though. I could imagine Deep Space Dreamer or Space Age or Celestial Quest or Space Winking each working as a musical introduction to the game.
I think a lot of my indecisiveness boiled down to what kind of first impression I wanted the game to have, and what kind of tone I wanted to set players up with going into the game. In my mind, the game itself is a bit experimental, a little silly, but it's also about loneliness, unsatisfying workplaces, and a struggle to break through isolation (even if I made the conscious decision to not overtly surface those and leave them as subtext instead). I think some of those aspects are stronger when the player arrives at them on their own, although with the jam's timeline, there are definitely beats missing that could establish/reinforce those themes across the game.
After a lot of back and forthing, I eventually whittled it down to two options. First was Arroz' Newer Beginning (with its lonely, but driven and expansive feel - at the time, I hadn't realised it was a remake of one of Arroz' older tracks) for the main menu and Drew's Cosmic Railway (with its energetic, bouncy, and wondrous vibe that I think reflected the tone of the development process) for the credits. The other option was Jepp's Semicolon Right Parenthesis (with its acoustic style carrying a more personal and human-scale feel and ambiguity leaving room for interpretation that could be positive and energetic or a little melancholy and weary with its blues-ish sensibilities) for the main menu and Hodge's An Omelet To Remember (with its laid back, dreamy feel that in context evokes a kind of irreverent whimsy saying, "Hey, we're all here. Let's just chill out and have a good time.").
It still ended up being a tough decision, but I settled on the latter option in the end. Semicolon Right Parenthesis feels like it's maybe closer to the space I would have ended up in if I did music myself, and An Omelet To Remember was such an unexpected delight when I first heard it. Both resonated with me in general and specific ways that I think made them the right choice. Reflecting now, a month later, they both feel like such natural fits for their respective roles.
In response to some observations of people testing the game, I added a placeholder console to fill the space on the left of the chair to reduce the likelihood of players wanting to stand up on that side. Since it didn't do anything, all I had to do was add some simple geometry (copied from the bottom half of the comms station) with a collision shape as a child, and the game would automatically describe it on the HUD and play an error sound when trying to interact with it.
While waiting for a couple of last minute music tracks to come in, I fixed a crash when trying to launch the mirror_test level (launched by shift+clicking the new game button) thanks to a bunch of level setup stuff that assumed the presence of a bunch of cockpit elements. It wasn't really important, and I don't think it enhances the game at all, but I enjoy surfacing a peek behind the development curtain and an opportunity to poke around with things outside of the gameplay loop context, so I was happy to spend a little time on it.
The final music track count for my "end of jam build" was eighteen. When those arrived, I committed my work, tagged 0.2, submitted the game to 7DFPS 2024, and took the rest of the day off from computer stuff.
End-of-jam thoughts
The "7th day" builds of Wink Commander didn't quite execute the kind of experience I was aiming for, but they did have the core elements that I wanted to nail down. I spent a lot more time on it than I was intending - I don't think I reached an unhealthy workload, but I didn't come anywhere near close to my target of 6 hours a day. Ultimately though, participating in an event like this is more about making time to make something than it is about meeting goals, and I am content with how things went.
I did still feel like there was room to do a bit more work, and in Part 2, I'll be reflecting on what I tried to accomplish with post-jam work.
Get Wink Commander (7DFPS 2024)
Wink Commander (7DFPS 2024)
A game about winking at spaceships
Status | Prototype |
Author | Cheeseness |
Genre | Simulation |
Tags | Low-poly, relationship, Space, wink |
Languages | English |
More posts
- Wink Commander Postmortem Part 3: Space Tunes1 day ago
- Wink Commander Postmortem Part 2: Post-jam Development1 day ago
- v0.3-6 changelog1 day ago
- v0.3, v0.3-3 changelogs36 days ago
- v0.2-1 changelog51 days ago
Leave a comment
Log in with itch.io to leave a comment.