-
Geometry
I’m pushing the limits on terrain size for a single player game in Core, but they aren’t enforcing those rules yet so let’s just agree to look the other way. Using the new merged-mesh system in Core and a better grasp on folder structure for optimization and network contexts, I was able to reduce total game objects by almost 50%, from >28,000 to <15,000!
Lunatic is still a very demanding game. This was my first time making such a large game space with such deep world-building, so in hindsight I struggled to find a balance between aesthetic and minimal use of geometry. Core uses a static asset library with model merging to reduce download times per-game so adding too much detail doesn’t just mean too many poly’s, it means too many game objects as a whole.
Fixing this issue at this point would take several weeks of redesigning every area from the ground up so that will just have to be a lesson learned for now.
-
Lighting
I’ve never made a night scene before so this was an eye opening experience of its own. By increasing the global directional light and tweaking fewer, larger source lights, I was able to maintain the overall feel while minimizing the gloomy claustrophobia. This also allowed for removing shadows from the majority of the area lighting providing massive performance gains while maintaining the worldbuilding that had already been done.
The Majority of the shadows even got put back in later in the rework as I realized too many overlapping VFX, as well as them existing in a server context, was a larger impact on performance. I’m really glad it did too, even with the other big changes to lighting which help keep it from being a bunch of emissive spotlights in the dark, having shadows on the lamp posts etc. really brings back that sinister feel.
-
Scripts
Core is well funded, but still a very young game engine and built on top of the unreal engine. Because of this, it changes rapidly as they implement new features and systems. There were dozens of errors due to deprecated systems and methods that I had to reconfigure to meet the new criteria.
On top of that was taking what I had learned about networking and breaking my old scripts apart. Adding client scripts where necessary to handle SFX and VFX, and optimizing the code using tasks and cross-context events.
As with any large coding projects, as you start to make it all come together on screen, it becomes more and more clear how other approaches could have been cleaner, more readable, or efficient, and I did make some of those changes as I went through. But like any other honest dev, I have to admit that it is a bit of a mess in there and I could tell you exactly how I would do it differently, I just don’t have another 2 months or the sanity to fully rework it as it would also require a methodical rebuild of the entire game hierarchy as I went.
I am happy that none of the dozens of scripts throw any warnings or errors, and isn’t the cause of any of the performance issues in the game whatsoever. My favorite parts of the game are the animated sequences and puzzles that I planned in the early stages and managed to make happen with all the added flavor and timing that gives them their impact.
-
Merged Model Trial & Error
Merged models are a very useful tool that recently came to Core, but comes with its own caveats. At first glance it might seem like the right idea to just group large chunks of the map into single merged models to allow the engine to remove as much unnecessary collision geometry as possible, but what isn’t explicitly mentioned is that merged models are also treated as single game objects when it comes to draw distance, meaning you could set yourself up to load gigantic pieces of the level just because they turned to the side and the edge of that group comes into camera.
Along with that slightly obvious realization, was noticing that certain custom materials simply did not render if they were part of a merged model. This caused a small performance loss (un-gain?) as several relatively complex asset groups had to be separated from their respective merged models.
-
Narrative
Usually story is secondary to game mechanics for me when it comes to designing games, serving only to support the “Why” behind the characters, abilities, zones, races, items/equipment. Lunatic was different. Being a long-time D&D player I was immediately drawn to this game jam and it’s why I approached it with the explicit goal of emphasizing the story and the part of the world it takes place in.
Luna is the goddess of death and chaos. While most regard her as evil, she is actually ambivalent towards the labels of "good" and "evil." The aspect of the darkness which wreaths her being is reminiscent of holy, radiant raiments which Sol, her counterpart, wears. She is a balance to his light, a reprieve from his blazing glory.
The player gets to experience a very small sliver of this story as they have no memory of their past, and only know they awoke in an asylum, to voices in your head and a hole in the wall leading out into the Dark Forest. As they travel through the outskirts of the castle grounds, they uncover truths about themselves and the world as they proceed to fulfil the prophecy and become the next Luna.
-
UI
I love designing UI for games, I always find it comes so naturally and I really enjoy the puzzle of maintaining a uniform minimalism while incorporating the game’s themes into the design.
Visually I could redesign this UI a dozen times and not be done with it so I decided to just go with my first attempt. I have spent hundreds of hours working on this game and since the start I knew that UI would be the last thing I worked on since it was 90% functional for my needs out-of-the-box.
With all that time spent building, testing, and staring at the game, I knew fairly early on that I wanted to pull everything away from the center of the screen and emulate some of the full-width status bars from some of the old classic RPGs. Core has yet to implement any advanced UI canvas objects beyond scrollbar-text and progress bars, so I couldn’t do one of my favorite things: radial health bars. Would have been so on-brand for the game too :(
-
Version 3.0?
So I think it’s fair to say that this is Lunatic version 2.0, but what if I were to make a 3.0?
Since this project, everything I have built in Core has been focused around multiplayer mechanics and abilities, so I would definitely want to expand the story to incorporate players having to compete against each other to ascend as the Moon Deity. Each area would change to facilitate different contests and a leaderboard as well as per-round elimination mechanics.
Players would start in the asylum, each escaping into the forest as the game starts. The forest would be a randomly generated labyrinth-race to find the Crescent-Axe, armed with a trusty stick they would hack and slash through skeletons and get lost in the gloomy underbrush. In Dead Man’s Rest, the cemetery, they would compete in an Easter-egg-hunt style timed mission where whomever has the least Moon Blossoms at the end would be eliminated.
This would continue until the final 4 (of 8) players reach the top of the castle and duel it out with their forged Moonstone weapons to claim the title. Performance in each category as well as completion time would contribute to overall leaderboard scores that could be displayed at the beginning and end of the game (similar to other Core games).