Have a look at the first article in the series of posts on the game design techniques behind Dishonored by Calvin Simpson.
Have a look at the first article in the series of posts on the game design techniques behind Dishonored by Calvin Simpson. The first one focuses on the base systems of the game and some of the aspects of character production. That’s an astonishing chance to dive into AAA production, so don’t miss it!
This week I have worked on refining up the prototype which I have split into the sections of; back-end & code base, shader development, UI, front-end mechanics, level design tools, and character production.
Back End & Code Base
I’ve cleaned up the primary code base which lies in the player actor as the game is very mechanics orientated, and I am also considering encapsulating the player and enemies into their own sub-classes of a super class in order to follow a more maintainable development methodology (that being object-orientated design).
I’ve also started to think in terms of component-based design as I have extrapolated ammo into its own self-contained component which can be added to any actor to handle ammo – I’ve done this as I saw that the enemies will be able to shoot you and you as the player will also be able to shoot them, so a generic component to handle the ammo data and interact with that using functions seemed the most sensible.
The entire ability system has also been modularised into their own blueprint actors with some slight support from the player actor in order to utilise them in such a way where you simply inherit from the base (super) class to create something with that same “right-hand” functionality with a lot of utility functions also present to make prototyping of new powers as easy as possible as the entire logic is defined with functions and events which can be overridden – making this class more of a skeleton class with the features, components, and base functionality shared among all powers.
This also allowed me to extract the pistol logic (in combination with the ammo component) into the ability system flawlessly – which means I could inherit from this pistol class to add any other equipment (such as throw-ables) down the line.
master shader, cloth shader, master as shader func with master metal with procedural dirt/wear masking, master particle shader, sharpen post process, sprint blur
On the shader side I have started revamping a bunch of shaders from the prototype with my new-found knowledge and experience from working heavily with shaders on contract work. More specifically I have started separating everything up a lot more into their own shader functions to re-use this logic and essentially create shader tools for myself (i.e. triplanar coords, HSV adjustment, emissive pulsing, grunge mapping, noise map extraction etc).
I have also started thinking more about the environment art pipeline in which I wish to re-use a lot of assets and textures and vary them up using shaders (as one method) to save production time down the line. For example I have made a white painted wood material easily by adjusting the parameters set in the master shader as an instance of the wood trim material instance.
To further expand on the environment art I also realised that some materials will require functionality which lies outside of the preset master shader – so I have got around this by extracting the master shader into its own shader function so that the HLSL code only needs to be compiled once and can be re-used across multiple shaders for material layer blending (or other functionality). Such an example of this is the master metal shader which in addition to the master shader’s core functionality includes vertex painting for blending in dirt/rust along with global controls to add that on-top of the vertex painted areas.
The core features of the master shader now currently has a lot of extra features which can all be toggled on/off with static toggles to re-compile new sub-shaders, with features such as; HSV, opacity (with material domain overrides), AO albedo/roughness contribution, Z-masked dust layer, emissive pulsing, fresnel (with lit/unlit support and controls for offset, colour, and exponent), normal mapping, detail normal mapping (with view distance-based intensity), parallax offset (bump only at the moment unless I see a reason to use parallax occlusion), specular extraction from albedo map (for higher quality materials), metalness controls, roughness controls, roughness grunge/noise mapping, UV offset/tiling/rotation, triplanar UVs, and vertex paint layering.
I’ve also introduced a wind system controlled by a global parameter collection (known as uniform variables in HLSL) which is driven by a blueprint actor dropped into the level for controlling wind direction, tiling, strength etc.
This can be used by anything by dropping the wind shader function into the core shader, such as the cloth shader which also supports a simple custom cloth lighting model using a dual-layered fresnel (inner and outer contributions) and detail normals (which also distort the albedo sampling for a fuzzy feel) – though this is subject to change to support UE4’s built-in cloth shading model down the line depending on the character shader pipeline.
Developed health and mana UI bars in Photoshop (as well as controller face button prompts), and then developed a special UI shader which re-uses modular shader functions (such as contrast, HSV, adding a pulse etc) to cut down the assets required to develop (for example the images behind the bars are simply made in the shader by lowering contrast and value).
Also got the UI functional and working with the health & mana attributes system with regeneration outside of usage.
Alongside that I got a standard prompt system working which allows me to script in any prompts for the user (such as picking up a health elixir) which is easily accessed through a function on the player’s HUD to set the prompt image, prompt, and inspection text – this has also been integrated with the base pickup actor so any new pickups will automatically default to a sensible set of values.
Front End Mechanics
I’ve added in some more movement mechanics to the player and cleaned up existing systems (such as the core locomotion system and the climbing system and how to interact with it from external actors). Such mechanics I’ve added are crouch (with volumes for lowering the crouch height to fit through), double jump, and the blink tap dash.
To compliment this I’ve implemented a bunch of audio queues across the whole game from a mixture of mixed sounds from freesound.org and https://sonniss.com/gameaudiogdc2016/ (ripped Dishonored 2 audio files) – I claim no credit for these as audio design is not my specified area and I am just using it as a form of enhancing the end product. Though the system to trigger certain sound effects I have put in place using physics materials – where I have created a base actor inheriting from the existing physics material class to interject my own logic and data to tie to material instances, which allows me for example to change footsteps based on the surface the player is standing on which works well with my modular material set-up for things like woods, metals, concrete/stone etc.
Level Design Tools
To help with level design down the road (before I properly start on that) I have started developing a bunch of tools and upgrading some existing ones from the prototype stage, such as a spline tool for creating curved pipes with support for adding end caps.
The main tool I have created however is a new base actor which extends the static mesh actor functionality by inheriting from that class and interjecting my own construction logic, as well as a panel of editor exposed functions for pseudo editor scripts – these do small tasks like rotate the actor by a set amount or flip the specified axis which is useful for speed. Their main useage is the material override system which allows me to define sets of material overrides to override the current actor’s material array with – essentially allowing me to easily flick through say metal, green metal, painted white metal materials on a set of pipes – something which varies a lot in the recent Dishonored games.
Started production of guard character – picked design with room for changes and shader shifts. Will develop skeleton and gore pieces. Separate up by material so that shaders are adjustable as possible (i.e. shirt, trousers, boots, leather, skin, misc pieces such as pen, belt, sword etc). Developed from base mesh to ensure correct proportions.
And more recently I have started work on the enemy character high poly asset which I require to best showcase the gameplay and add extra visual effects, and complex character shading (skin, cloth, dynamic elements etc). Currently I have most of the character complete and developed in such a way that I can use the base mesh elements to retopologize quickly by wrapping them around and manually adjusting the topology to provide the quickest character workflow I know.
To compliment the character I have also decided that I will develop an underlying skeleton for the visual effects down the line, as well as split the mesh up by their respective “gore” pieces (i.e. bottom half of torso, possibly feet, arms, and head). And to add the most visual variety and expand from my environment art pipeline I will split the materials of the character up into the respective real world materials the best I can (i.e. shirt cloth, skin, leather, trouser material, misc metal parts etc) – this way I should be able to create multiple enemies using easy material changes and I will develop the shader to handle this as I come to implement the character in-engine next week.
Though the basic plan is to allow for baked maps (AO, normal, curvature possibly) and utilise tiling textures and detail normals with the cloth/skin shading models (and possibly a custom mask for tricky areas, and a dirt overlay) to best do this – and this is based on my experience with how characters are set up in a AAA project and will allow me to showcase my technical knowledge on complex character-based shading.