The Road to Vertical Slice, Part 5 of 5

I’ve wrapped up my Vertical Slice milestone this week. I intended to conclude this series of posts with a postmortem of the whole month, but I haven’t yet taken time to reflect on the current state of the game or figure out exactly what I’ve learned by doing this. I suspect that my current schedule is mildly untenable and I may need to scope down, but that’s a topic for another day.

As I mentioned in the brief update last night, the game is now NEON STRUCT: Die Augen der Welt, or simply NEON STRUCT where the subtitle won’t fit. The new name evokes “cyberpunk brutalism”, fits more neatly in small logos, and is easy to say and remember.

On Tuesday, I spent fourteen hours overhauling my engine’s save/load system. Eldritch had very minimal save/load needs: a single slot managed exclusively by the game instead of the player. (For debugging, Eldritch also had a quicksave/quickload function, but it was compiled out of the shipping game.) For NEON STRUCT, I wanted a player-facing save/load system that would allow players to save anywhere and retry sections of the game.

NEON STRUCT now formally supports quicksave and quickload (as first-class inputs, rebindable on the controls screen). It has a rolling autosave which periodically checkpoints the player’s progress into a cyclical buffer of autosave slots. (Hat tip to Tom Francis for doing that in Gunpoint and making me ask why every game doesn’t do it!)

Finally, there is a fixed number of savegame slots for the player to manage. I wanted to allow an infinite number of savegames, but my UI system doesn’t support scrolling lists. Without that, there’s not a great way to render an arbitrary number of items. Separate pages of 10 savegames each? It’s a solvable problem, but not one that seemed worth the time right now. If this turns out to be a real problem in testing, I can revisit it.

Aside from the big save/load feature, this week was mostly about finishing things that had slipped through the cracks in past weeks. I added readable news terminals, tablets with keycodes to discover, static deco meshes, character configurations, diegetic music, and more. There’s a lot more of this to do to meet my self-imposed “shippable quality” criteria, but I feel I’m on the right track.

In the late hours of Friday night, I finally whipped up a collectibles system. I knew since before this sprint began that collectibles would be an important part of levels in NEON STRUCT. They provide an irresistible incentive for a player to explore a space, and they are extremely low cost to add to levels. But the feature got deprioritized again and again, because it was uncorrelated with anything else I was doing and because I wasn’t sure what kind of MacGuffin would make sense for the player to collect.

I finally chose geocaches as the collectible object. Maybe it was the lack of sleep, but I loved the irony—by signing geocaches, the player is willingly leaving a permanent record of her presence, in a game about trying to keep her presence a secret from systems which would record it without consent. I don’t know yet whether I will incorporate that into the narrative and systems, or just allow it to exist for the curiosity of those who notice the dissonance. Ramping up the enemy population in response to the player’s engagement with collectibles might create some interesting friction and feedback?

As I continue to write quest dialogue and incidental narrative, I am trying to let the tone of the game find itself, rather than prescribing it. The principal subject matter (right to privacy vs. mass surveillance) is important to me, but I do not expect or intend that the game will be a comprehensive statement about the real world version of that topic.

NEON STRUCT is an adventure story, set in an alternate history world with a deliberately 1980s sci-fi vibe. (“2015 as envisioned in 1985” was how I described it at inception.) It has something to say, but it needs to be entertaining as well. It does not need to take itself too seriously, but it does need to depict the subject matter in an internally consistent way. And because it’s a video game, it has to harmonize with the gamut of player behavior.

At the moment, I am settling into a comfortable place where the narrative—like the visuals—is a colorful, minimalist stylization of reality. Incredible things are allowed to happen because it is a work of fiction. Technology can be magic in this world. As long as the story is consistent in the way it deals with things, and as long as it does not muddy the message, I am comfortable letting it be more fantastic than realistic.

NEON STRUCT

A brief announcement before tomorrow’s conclusion of the Vertical Slice story: Die Augen der Welt is now NEON STRUCT: Die Augen der Welt.

All future posts will be made here at neonstruct.com/blog. If you were subscribed to the feed for the blog at dieaugenderwelt.com, you will need to update your subscription to this one.

The Road to Vertical Slice, Part 4 of 5

As I approach the final week of the vertical slice milestone period, I am feeling more confident about my schedule. I still have a lot of art and sound to create next week, but the third level is mostly complete and the last few systems I intended to include in this milestone have been implemented.

I took an unexpected detour into new post-processing effects while trying to establish a mood for this third level. In contrast to the soft neon glow of the previous level, this map needed a murky, grimy feel. I added a film grain effect and a simple chromatic aberration that separates the RGB channels around the edges of the screen. My first pass at the film grain was a multiplicative filter, but that caused brighter parts of the screen to show the most grain, with darker regions showing almost no change. The effect I wanted was that of high ISO (or film speed), where most of the grain is visible in the poorly lit parts of an image. I switched to a subtractive filter, which pulls out proportionally more value from darker colors than lighter ones, and it gave me exactly the look I desired.

A few weeks ago, I had disabled dynamic voxel lighting because it was getting very expensive to update. There were noticeable hitches in the framerate whenever a door was opened or shut. (This was not a concern in Eldritch, because it had fewer lights with smaller falloff radii; but Die Augen utilizes light and shadow for its core game mechanics, so it necessarily has a darker ambient term and many more shadow-casting lights.)

Last night, it occurred to me that I could make a very simple optimization to reduce the amount of voxels I needed to relight when occlusion changed. The performance improvement was incredible—in the scene shown above, the time to recompute lighting when opening the door dropped by a factor of almost 50.

Finally, I implemented a couple of less exciting but quite important systems this week. Shown above is the signage system, which displays a short string when looking at an object in the world. On BioShock, we called these “art subtitles”, and they are a simple way to localize art assets with text baked into them. For Die Augen, they are also a low cost way to label rooms and provide directions.

Shown below is the new objectives screen. It is only a player-facing model, not a formal game system—under the hood, quests are implemented in an ad hoc fashion, and their scripts notify the objectives screen to add, remove, or update objectives.

My next week will be spent decorating and polishing these levels, writing and rewriting dialogue to provide clear player direction, and adding a bit more “juice” to hacking, takedowns, and the like.

The Road to Vertical Slice, Part 3 of 5

One reason I wanted to create a vertical slice for Die Augen der Welt is to discover how long it would take me to build three levels (and their respective assets) to a shippable state. With this data, I will be able to meaningfully evaluate the scope of the game. If I can build these three levels in five weeks, then I can reasonably estimate how long it will take to build another dozen or so levels.

Currently, I’m not filled with optimism about the schedule. With two weeks remaining in this milestone period, I still have one whole level left to build, a big pile of art and sound assets to create, and a few low priority systems that may not make the cut for this milestone. On the bright side, most of the work I’m doing this month will be reusable in later levels; and systems work in particular is taking a much bigger chunk of my time this milestone than it will in the future.

The biggest new feature I added this week is a security system, comprising a network of CCTV cameras linked to central alarm boxes. Each can be hacked. Hacking a camera disables it, but does not silence the alarm if the player has already been spotted. Alarm boxes will be difficult to access, placed behind locked doors or surrounded by guards; but the reward for hacking one is commensurate to the challenge: it silences the alarm and disables all cameras on its network.

This week, I also began building out the first “social” level in Die Augen. These are small interstitial levels between the core stealth missions, where the player can recover her health, restock her inventory, and learn about the world from friendly NPCs and news terminals.

I started building the level with only a vague idea of its structure—not a best practice!—and have been figuring out a lot about the nature of social levels in real time. The worst thing these levels could be is a glorified menu screen for healing, shopping, and narrative. Instead, I’m beginning to think of them like the hub levels from any Deus Ex game: open spaces to explore, hidden nooks to discover, brief questlines to resolve.

My goal is that these social levels complement the stealth levels on several axes. Stealth missions are tense, social areas are relaxing. Stealth gameplay is predictable and consistent, social gameplay is unexpected and unique. Stealth systems offer freedom of player choice in a smaller domain, social systems offer prescriptive choices in a larger domain. Stealth levels are constructed pop songs, social levels are improvisational jams.

The Road to Vertical Slice, Part 2 of 5

As described in last week’s update, I’m developing three levels for a vertical slice milestone: two stealth missions and one interstitial “social” space (where the player can rest up, shop for gear, and pull narrative morsels from NPCs or news terminals).

The first of the stealth missions is now playable end-to-end. This level is sequenced near the start of the game, and has a somewhat more linear or strictly gated flow than I intend for later levels. I chose it for inclusion in the vertical slice for that reason (among others), as it forced me to frontload some scripting work I might have otherwise delayed. Level-specific scripting is a new experience in this engine; Eldritch had a modicum of scripting in its library hub, but its procedurally generated levels precluded traditional level scripting. It turned out to be straightforward to implement scripts using the existing event and component systems, anyway.

Sadly, I already broke my rule from last week by implementing a sequence in which the player is required to take an “optional” phone call to progress. There is a strong narrative justification for it, and it occurs at a moment when it cannot possibly interrupt any ongoing gameplay; but I still feel like I’m betraying some core value of systemic games in doing it. I expect this won’t be the last cognitive dissonance I feel as I reconcile this game’s narrative needs with systemic liberty. C’est la vie.

The Road to Vertical Slice, Part 1 of 5

One of the practices I’ve borrowed from AAA games is rigorous scheduling toward regular milestones. My self-imposed deadlines on Eldritch helped me manage the scope of that game and ship it ahead of schedule, and I aim to be equally disciplined in the development of Die Augen der Welt. To that end, I have given myself a deadline of May 31 to complete a “vertical slice”, a demonstration of all (or most) of the game’s systems in a representative level.

Sometimes in AAA game development, a level will be built specifically for the vertical slice, especially if the milestone build may serve the additional purpose of being taken to trade and press events to demonstrate the game. (This is one of a few reasons viewers may see early footage of maps which wind up absent from the final game.) But the schedule for Die Augen is ambitious, and I don’t expect to have time to make a throwaway map, or even to redo the work done during this milestone period. What I build this month needs to be something I can ship next year.

Until just earlier this week, I’d only had a loose idea for the player path and narrative structure of the game. But with the vertical slice milestone looming, I needed to select which level (or levels) to build; and that meant figuring out what all the levels would be. It stresses me out a little, committing to something as fundamental as the master list of levels in a game. The sequence isn’t immutable, but other decisions will be built on top of it. The cost of changing any of these assumptions will continue to grow from here. But it was a good exercise. I charted out the game from intro to ending, selected the vertical slice levels, found and resolved some narrative discrepancies, and got excited all over again about what I’m going to spend the next 6-8 months making.

I chose to develop a contiguous sequence of three levels from the first half of the game: two missions and one non-combat interstitial space. (The screenshot at the top of this post is the blockout for the first of these missions, after two days of planning and building.) Trying to build three maps in one month may be too aggressive, but I’ll need to know that so I can scale the rest of the game accordingly.

I felt more productive than usual this week. In addition to level planning and building, I implemented a few small features that will be needed for the vertical slice. Locked doors may now have numeric keypads, as an orthogonal entry system to swiping a keycard or hacking the lock. On the tools/editor side, I created an easy interface to wire switches to any number of doors, lights, or other electric objects.

I also added an “incoming call” mechanic where the player can choose to take a phone call during a mission and enter a conversation. Not the most exciting thing in its own right, but it implies an unusual choice and constraint about the writing in this game. Die Augen won’t have voice actors talking in the player’s ear during gameplay. All dialogue will be delivered through the conversation interface. And because the conversation interface is modal (i.e., it pauses the game and blocks all other interaction), I want most dialogue to be opt-in and skippable. If the player doesn’t want to stop playing the game to talk to someone, that’s a valid choice. And if the player chooses to ignore a conversation, they shouldn’t miss anything critical (e.g., a door keycode or a primary objective). This might lead to strange cases later where the dialogue assumes a prior conversation took place when in fact the player skipped it; but I’m betting that the players who skip the former conversation are likely to skip the latter as well.