The New World Update #16

The latest development update for Iron Tower Studio's upcoming sci-fi RPG The New World gets a touch technical and talks about the transition from their previous Torque 3D engine, used in The Age of Decadence and Dungeon Rats, to Unreal Engine 4. If you're into the nuts and bolts of game development, you'll probably find a lot of interesting stuff in there. An excerpt:

Much like a hero is only as good as his weapon (rule #15), a developer is only as good as his tools. So when we switched to Unreal, our main concern was whether or not we'd be able to find our way around the 'blueprints' (Unreal's visual scripting system). We started with Unreal 4.14 and several plug-ins to get the ball rolling and get a quick feel of the engine:
  • LE Extended Standard Library (blueprints that add general functionality and improvements)
  • Unreal.js (brings V8-powered Javascript into Unreal Engine 4)
  • Rama's Victory Plugin (C++ Blueprint Function Library)
  • Dialogue Plugin (a node-based editor)
We needed the javascript plug-in to tie scripts to dialogue: doing checks like "aod.str > 7" or executing actions like "dlgAddItem(35,5);", but integrating an entire programming language and running a separate instance of the interpreter engine for such a basic task is overkill (it's like running Google Chrome in the background as a part of the game). Plus, big and complex subsystems tend to cause big and complex problems over time, which we don't need, so we kept experimenting and this is our progress report (technically it's Nick's report, so I'll post his email as is and call it a day):

#1 - The Dialogue Editor

We managed to combine Unreal's blueprint graph (visual scripting) with DialoguePlugin's tree structure into a new asset and made a proper editor[.]

This means that both the dialogue structure (text, parts, answers, links) and dialogue scripts (spawn characters, switch mission, add items, unlock door, etc) are all contained within a single asset and not scattered around the build. Whereas in AoD we could only add something from a pre-defined list of scripts to get a list of commands like "do this, then this, then this, ...", now we can code a complex action with checks, loops and whatever UE blueprints allow and they allow pretty much everything.

We can also call functions from the blueprint libraries, if we need to store and reuse some generic scripts (examples from AoD: scheduleEnding, setMapLighting, etc). We've also managed to plug into Unreal context menus and asset categories, so dialogues (and everything else) are created in a convenient manner[.]

It's very easy to use it and there are only two simple rules:
  • In order to qualify as a dialogue check and appear in a dropdown list in dialogue nodes' properties, the function must receive 0 parameters and return 1 bool value. That value is basically a result of your check and tells the dialogue system if this NPC text / PC answer should appear;
  • In order to qualify as a dialogue event (action, script, call it whatever you like), your function should have 0 input parameters and 0 output. It's just does inside what you want and doesn't take or return anything.