Over this past month, I have mostly been focusing on enhancements to the scripting and dialogue system (along with the usual fixing of bugs along the way). Dialogue in particular is a feature that I feel is important to get nailed down early on since it plays an important role in most games. Scripting is vital as well since it will open up a lot of potential for customization.

The video below is a demonstration of some new functionality I implemented for scripted player movement which will be useful for things like scripted sequences or cut-scenes for your games. This can be used in both standard and first-person views as shown in the video.

The next function, “Set Entity Model”, will allow you to swap an entity’s model out for another. This should allow for some interesting possibilities in your games! In this example, each lever is scripted to swap the bridge out for a different tile model.

A couple of other new functions I have added let you adjust the animation speed and movement speed for an entity. Check out the GIF below for a somewhat silly example of this function in action. Power walking! 🙂

Localization was originally not something I had planned to pursue this early on in development, but it turned out to be more straightforward than anticipated since I was able to reuse a lot of functionality that already exists in Godot (the underlying engine). It’s still very much a work in progress, but you now have the ability to use the “Import Resources” tool to import a CSV file containing translation data for multiple languages. You basically define a key for each translated message and then reference that key in your game’s dialogue as shown below and the appropriate translation will be plugged in during the game.

Somewhat similar to the above feature is the introduction of “placeholder expressions”. These can be used to display the values of properties within dialogue or messages as shown in the screenshot below. By wrapping the property reference in the special enclosure ${…}, they will be evaluated and replaced with the resulting value. For example, when the message below is displayed in-game, ${global.property[“test_message”]} will be replaced with “Hello World!” since that global property was previously set to contain that value.

The “NPC” node in the Dialogue Editor was modified a bit so you can now define the speaker name. Previously, the speaker name displayed would just default to the NPC from which the dialogue was initiated. There are now two additional options for determining the speaker name: by entity ID (the character name of the entity in the scene with that ID will be used), or by simply specifying a custom name which will be displayed as is.

In the example below, I used the custom name option and entered “Mysterious Voice” since I didn’t have a specific character to reference.

The “Script” node in the Dialogue Editor (for triggering scripts) was improved to contain some additional functionality. You can choose either a resource file that was created in the visual editor as before, or you can now create an ad hoc quick script directly in the box. This will be more efficient for cases where you only need a small one-time script. I also added a checkbox to specify whether or not the dialogue should be paused until the script has fully completed.

Another new function, which I most recently finished up, is the “Rotate Entity Towards” function. This is used to rotate a character towards an entity, for example towards another character, over a duration of time. This will be especially useful in complex dialogue where there a multiple characters talking to each other. There is also a “Reset Entity Rotation” function to accompany it which will reset the character’s rotation back to its original direction.

Other Updates/News

Another change that I implemented recently is a smooth fade for map transitions. Now whenever a different map is loaded, the screen will briefly fade to black while loading. While only a small change, I think it makes the transition look much nicer.

Just for fun as a break from development, I quickly recreated a bit of the first labyrinth level from Shining in the Darkness using RPG in a Box. I’ll most likely be revisiting this down the road once more functionality is added to the engine! I grew up playing this game on the SEGA Genesis along with Shining Force I and II, all of which are sources of inspiration for my project.

And finally, I am excited to say that I have reached 100 followers on Twitter as of last week! Thank you to everyone for your interest and encouragement, it really means a lot! 🙂