I have finally reached my arbitrarily-chosen milestone of having a playable game! After a break that felt way too long, I got back to work and started to wrap this project up.
So here’s a conclusion post that goes over what I did and what I will do with this prototype in the future.
State Of Development
- The cast system has been improved
- A lot more skills have been added, around 6-8 per class with some overlap
- Audio and visual cues have been added to skills and animations
- UI improvements
- Smaller, more quality-of-lifeish but needed improvements
Cast System Improvements
Previously, the cast system would have been attached to the animation system. Broadly speaking, a timer would start, and the animation system would control the cast animation based on that timer. After a specific amount of time, the animation would go into a “CastSuccess” state and trigger the end of the skill as well as any state changes within the player.
This system made it really easy for me to keep the actual casting and animation in sync to look nice.
It worked fine as long as there was no lag involved.
With lag, this would cause horrible desyncs and sometimes skills would not even go through. The obvious (and arguably best) solution was to detach the casting system from the animation system completely, and deal with syncing the animations in persona afterwards. The cast montage no longer carries any logic, and instead handles on-client sound effects and other cues (if needed).
I created a Component which now handles the cast from a character itself. It can be interrupted, handles states like knockdown and updates the character on what it is currently doing. To do this, event dispatchers (see CORPG Prototype #0004) are used. The character sends a command to the cast system what skill it wants to use, using the data previously shown in another post, and the Component answers with what it is currently doing: OnStartedCast, OnFinishedCast, OnInterruptedCast and so on. It also additional info needed so that the character knows what to do, and the animation system knows what to show.
I have created a variety of new skills to show off the system and hopefully create fun, albeit limited, dynamics!
Every class has a unique loadout with different skills. The Warrior is aimed to be a disruptive damage dealer at close range, while the elementalist is purely focused on dealing a lot of damage in a short time. The Monk focuses purely on reactive supporting, aka healing. I realize that these are not the most impressive skills to ever exist, but as it was all about functionality first, I wanted to make sure that I have got the basics down before moving on to more advanced skills.
The values are not listed, but they are balanced around arbitrary values. The standard values are 500 Health and 40 Energy, with higher or lower values depending on class. Skills take 5-30 energy and, depending on strength, have cooldowns up to 30 seconds and cast times up to 3 seconds. These values are not really important right now so I did not bother writing them down other than in the internal skill list.
If you want to see some of those skills in action, check out this small playlist I compiled to show some of them off!
Since it is really important to know what is going on in a game like this, I have added various improvements to the UI.
Skills now have proper (even if ugly) tooltips that show a skill’s function. Also all skills now have proper icons (taken from http://game-icons.net/, credits given in project) that should show what a skill roughly does.
On top of that, any active effects are shown on the “OnCharacter-HUD” directly above a player (currently, limited to colors indicating an effect’s type), and are also shown on the affected players’ interface. In this screenshot you can see the yellow icon above the player, indicating other players that this character has an active condition. In this case it’s easy to tell, since the condition is “Knocked Down” which is clearly shown through the animation system. Other effects could be more difficult to tell if they are not indicated by other tells (such as Burning, which can be clearly seen by an effect). But the affected player will always clearly know what is going on by just hovering over the effect at the top left.
Quality Of Life Improvements
There have been various smaller improvements to increase playability.
- Players can double click to start attacking an enemy with your basic attack
- Players can use Tab to select the nearest enemy, Shift + Tab to select the nearest ally
- Some skills that are cast instantly can be casted even when another skill is already being casted
- If a skill is targetting yourself only, but you have another target select, the cast system skips the target selection and casts it on yourself
Looking back at my declared goals for this prototype, I can pretty much cross all things off the list. Technically I could’ve done this a lot sooner, but I wanted to do further improvements first to have things proper.
The current prototype…
- … can handle game lobbies through simple matchmaking (steam) or direct connection
- … can handle and disconnect cheaters (very basic)
- … runs a complete match of “King Of The Hill” with adjustable winning condition
- … has a complete skill-based combat system with editable skill blueprints, effects and more complex logic (with more features than initially planned)
- … has three different classes that players can pick in the game lobby (missing: skill selection)
- … is not optimized at all but still runs on older machines very well
- … can be distributed with a small and simple game launcher (was not a goal, but turned out awesome)
And thus I can safely say that the first big milestone has been reached!
With the first artificially-declared milestone reached, I can finally come to a closure with this project. However, that does not mean I will abandon the work I have done here. I will continue to use this as a playground and add more features I would like to see, starting with the skill selection, an account-based login system, persistent servers (running on dedicated machines) and so on.
However, I will also start shifting focus on smaller projects again, which I might write about on here as well. Though I will probably not have a lot of time to keep this blog updated, one can always try, right? Last but not least, I have started working on a small group project that is still in the early design and production phase. Hopefully I can start talking about that soon!