Posts

Synzza Star - Automatic Battle Pause

Image
I discussed in a previous post how I planned to work with Unity at a TimeScale of 0. Let's discuss how my implementation went. When To Pause? A key question when implementing this feature is: when should the game pause to let the player input? In my system, this is handled through events, and the events are dependent on a battler's "status state". Status States Battlers in Synzza Star have a component that tracks a status state. The values and meaning for these states are: OK The battler is not involved with executing a skill in any way and is not under duress. SkillWindUp The battler is preparing to perform a skill. SkillEffect The battler is performing a skill. SkillWindDown The battler is winding down from using a skill. Staggered The battler is in a stunned state, either from being hit with a skill or because a skill they used was blocked by their target. Blocking Self-explanitory. A battler operating under normal conditions will have a skill it intends to use and...

Synzza Star - Designing for Portability

Image
My work on Synzza Star so far as been quite tightly coupled with Unity Engine (To those completely unfamiliar with the terms "tight coupling" and "loose coupling", I'll refer you to  this excellent plain-language write-up by Ben Koshy ). Perhaps that seems like an obvious statement, but in fact many of the action RPG elements I've been designing don't fundamentally need dependencies on the `UnityEngine` scripting API to work. With the project being in such an early state, I thought it pertinent to do some refactoring work now - to separate the Unity systems from the action RPG systems using abstractions - rather than wait until later when such uncoupling would be more cumbersome. The Goal The game project currently has families of systems which are linked in a way borne more out of short-term convenience than long-term planning. This kind of structure occurs commonly when creating a rapid prototype, where code is simply placed wherever it needs to be to...

Reflecting on Early Refinement

I'll begin today by addressing an issue which may or may not convey well in these heavily-curated blog posts I write: this project I'm working on is quite ambitious, especially considering the circumstances I find myself in. Right now, I am a solo developer on Synzza Star. At the moment I am only focused on the battle system, and even then from just a pure functionality standpoint (as should be somewhat obvious from the bare-bones programmer-art GIFs I've been making) - but even then, Synzza Star is not my only engagement, and the system I have endeavored to create is unique enough that I can't exactly leverage many existing designs without at some point modifying them to better suit my needs. To be sure, there are may smaller technical problems along the way which do already have answers, and I'm not unwise enough to ignore existing literature that can help me from that angle. Even so, the task of figuring out how to coordinate all of the potential technical aspect...

Synzza Star - Implementing Skills through Scriptable Objects and Coroutines

Image
In my previous post , I laid out some aspects of Synzza Star's combat system design. Let's discuss how I've been using Unity to realize these designs. Scriptable Objects Before explaining how I have been using Scriptable Objects , I'd like to take a moment to explain what Scriptable Objects actually are. Normally on this blog I like to avoid this kind of exposition, but the term "Scriptable Object" is so uniquely nondescript and awful that I suspect many uninitiated readers will, like me, be confused from the onset what these things are and why they should care about them. What are Scriptable Objects? In short, a Scriptable Object instance can be thought of as a row in a spreadsheet, and the Scriptable Object class definition can be thought of as the column headers on that spreadsheet. FYI: "Scrib" is an abbreviation I use in code to mean "ScriptableObject". You'll see it a lot. Note: Excel is not needed for Scriptable Objects. This is ...

Synzza Star - Designing Combat AI

Image
 I’d like to discuss the design behind Synzza Star’s combat AI agents, which will be used for both friendly party members as well as enemies and other NPCs. The following discussion will be somewhat complex and technical. If you’re interested in the philosophy behind these designs, check out this post here . A Brief Clarification Before going into detail about what it is I’m going to do, I should clarify what I’m not going to do. Again, if you’re interested in a more philosophical discussion, check out the post linked above . In Synzza Star’s combat I seek to avoid a situation I call “AI slapfighting”, which is when two AI combatants within melee range of each other simply begin wailing away until one of them drops. To be sure, it’s an effective formula for games to employ, even if it is a bit simple. Many well-respected, tactical, strategic games use combat like this as a base to build more complex abilities and satisfying mechanics atop of. Players intuitively understan...

Synzza Star - Learning 3D Navmesh in Unity

Image
Given Synzza Star's requirements of AI agents capable of autonomous navigation without player input, and given the previously discussed benefits  of moving the project to 3D, I decided to finally try Unity's Navmesh system . This was my first time using this technology myself - I've been on projects before where other designers have created and configured a Navmesh, but before now I had never interfaced with it directly. Creating the Navmesh In my previous post , I actually gave a preview to this subject by showing a simple level I whiteboxed in Unity. Here it is again: I'm no level designer, but my goal was to make a simple level which had a few features that can stress-test a navigation AI. This is both to learn how Unity's Navmesh works and to give me confidence that whatever geometry I'd later like to design for levels shouldn't present too much of an issue from a navigation standpoint. Here is the level again with the Navmesh baked and applied to the le...