Wednesday 8 December 2021

Off Grid Development Update - November 2021

 Once again it's time for a new Off Grid development update, and we certainly have a bunch of interesting changes to the game to talk about this time!

Streamlined item use and interactions

Deciding to continue with the gameplay and user experience-improvements we started in the last sprint by adding visual indicators for game characters to better telegraph their actions and state to the player, we've made some more major changes to the the game.

The old Quickslot system where the player had to select the item the player character would use for interactions beforehand, by pausing the game, and assigning an item to the character's "hand", is now gone. If that item was something that would be sued constantly during gameplay that system would have made sense, but since it's pretty much always just a single-use for a specific interaction, we wanted to replace that system with something bit more dynamic and less interrupting.

Now, the whole Quickslot system is gone, and instead interactable MissionObjects (various devices around the game levels, for example), can be set to require an item or a data file for interaction. When player tries to interact with such item, we automatically pop open a menu listing items (or data) in player's inventory for the player to select what to use for the interaction.

Not only does this mean that interactions now require less menu-browsing, especially if the player didn't know an item was needed and to assign one to Quickslot beforehand, but also more flexibility like being able to ask for a data file instead of a physical item. Now we also have the option for even more specific filtering in the future should we find good uses for that. For example, requesting only key files for unlocking a doors, avoiding the need for the player to search for the keys from all the data they have in their inventory.

While small (but surprisingly nice feeling) change for the player, this required a fair amount of refactoring things on the game systems side, so this all comes with a bunch of changes on our Lua scripting API side as well.

Finding the needle from the haystack

Another gameplay aspect we wanted to improve on was finding the meaningful data in the levels. With metadata being more important in the game now (for example gaining enough knowledge about specific character in a level to gain access to their devices), we needed to do something to help the player spot the data worth downloading, but without having to reduce the total data in the levels. All data is useful to the player, but only some of it is worth downloading, while the rest is mainly locational information about the areas and routes different characters use in the levels.

The old setup we had used different visual Data shapes for different types of data; one shape for Image files, one for text, one for SMS and so on. This is now replaced with different shapes (and sizes!) based on how valuable the data is to the player. Data points with only locational value are small and easy enough to ignore when scanning through the level for data to download, while the ones that contain useful information, and metadata about characters, are displayed in different and larger shapes that help them to stand out. And then there's even higher special tier for data the level's designer (us, or the modder) has specifically marked as being mission critical and that the player should always be able to spot easily. Apart from that mission critical data, the game determines each data point's value automatically and assigns the correct shape for it.

While working on that improvement, we also add a bit of extra "juice" to data interactions, with some popup notifications and particle effects related to the amount of new metadata the player gained from downloading a specific data file.

New main menu

And talking about visual improvements, we've finally gotten rid of the old static background image in the main menu screen. In it's place you'll now find some animated data points and trails. This looks a lot nicer and also scales to different display aspect ratios better than an image does. There's a bit more to the main menu screen than just animation, but we'll leave that all to the players and modders to find out... ;)

Giving the AI a break

We implemented a new AI action called RestAction, giving us one more action to diversify the NPC’s behaviour. it's especially useful because it can benefit the player as well giving a more natural behaviour for the NPCs.


The RestAction has two different important behaviours. The first, more common one, makes the NPC will rest when their energy is low, so when they want to rest they'll find the closest available chair to sit on a while and partially restore their energy.

The second behaviour is that, if while the NPCs are seated, their world state that indicates their sleepiness value is true, then they will fall asleep. The sleepiness level can only become true through specific player action, or if set so in the level's design. (For example anyone who's played our demo/ First Access builds might remember the guard sleeping near the beginning of the Apostle level).

By player’s action we mean interactions with the world to make that change. For example when a guard is hearing a calm music while resting. For that to happen the player needs to hack a radio and set it on a station that plays calm music. When the NPCs are asleep they'll wake up to unexpected noises, so the player will need to be careful walking or running near them.

So the RestAction can be perfect for when a player wants to “disable” a guard to sneak past it, and also gives a more unpredictable factor for the player to be always careful about the guard's behaviour.


Another important thing to mention about the RestAction is how to make a chair sittable, as every chair that any NPCs can sit on needs to be set up for the NPCs to use it. For that purpose we created a tool that helps in the process. The user can drag one or various “chairs” (these “chairs” can be any GameObject possible, even Unity’s default cube can be a chair if you really want) to the "Gameobjects" section of the tool. If any GameObject is a prefab then the respective prefab will also be updated and saved. The tool also allows you to set the chair direction, determining the direction the NPC will sit on. After setting things up as desired, it's just a question of clicking a button (and baking the level’s navigation mesh) and everything is set for any NPC to use the respective chairs.

Small bug fixes etc:

  • Fixed Lua Snippet file & API documentation generation, updated our wiki (kind of nice after all these recent changes of the game systems and the API ;))

  • Fixed UI layout issues that caused overlapping text in some places

  • Optimized tracking status console, and changed it to allow displaying more lines of text and handle long lines of text/overflow better

  • Fixed localisation of text when viewing data files in the Data Inventory menu

  • Fixed various Lua script errors in levels/conversations/devices

  • Added alternative keyboard bindings for selecting/using apps, to make the buttons easier to reach with left hand without moving your hand away from WASD

  • Camera now always starts behind the player when a level starts

  • When a guard has a flashlight they'll will aim it correctly, depending on their path

  • Graphics settings now only affect the level main camera

  • Fixed NPC status icon spawning various times in a short time or spawning incorrectly

  • Saving in the game now saves information about MissionObjects interaction changes

  • Secretary in the secretary level fixed to react better and quickly to the player entrance

  • Fixed Drones not stopping movement when the game is paused

  • Fixed camera rotating continuously when the player is caught by a guard

  • NPCs now use chairs to rest when their energy is low

  • When the NPCs are resting in the chairs it’s also possible to make them fall asleep

  • New tool to make chairs usable by NPCs.

If you haven’t already - be sure to wishlist Off Grid on Steam - each wishlist makes a big difference to us, and we really appreciate your support!

No comments: