Oh no, I've been arsed to do it.
Really though I've been working on this off-and-on for about 2 years, mostly with big breaks in between. My last break was actually 5 months. It's a point where it's somewhat presentable now so hey, time to share.
So far the features it has are:
- public chatting (no party, whispers, guild yet)
- regular attacks and spell casting
- hotkeys with 'timed attack' support
- map loading
- audio system
- effects system (hurt fx, spell fx, misc fx like cast circles, etc)
- expandable animation system (server can tell client to play an unlimited number of animations)
- GAT editing/exporting (to update the mapcache)
It's been an interesting learning experience, helping me get better at C# programming and understanding networking and stuff. Because I'm using Unity as the engine I don't have to use any of Gr*vity's formats which makes it sooooo much easier to create assets and get them in game. It only takes a few hours to start a character from scratch, model them, texture them, import them into Unity, and get them in game. Imagine not having to worry about which tool to use for which format.
Anything involving sprites is just a .png spritesheet. STR-like effects are billboards animations made with Unity's animation tools. Maps are prefabs composed of a 3D ground mesh and prop prefabs for details (things like beanstalks, mushrooms hills, houses). Making the map in 3D saves dev time and will (probably) be more flexible than doing it with tiles. The heightmap is another 3D mesh that actors snap their Y positions to.
Parts of the video will look incomplete compared to others, but that's mostly due to how I implement stuff. When I'm working on a new feature I'll usually just get it to a point where it works, then move on to something else. Example of that would be how some of the maps have art, and others are still greybox tiles. Once I got the map system working I moved on to a new feature instead of updating the art for all the existing maps. Actors don't have actual animations because once the system for playing the animations was done I moved on to a new feature. Only one prop so far uses vertex colours because... well, you get the idea. Once something actually works I can make it better later.
The way the timed attacks work now are pretty neat. When I was still using an RO client you would have to use the 'ALL_ATTACK' skill to trigger a timed attack (you can see this in older videos). This is true whether it was a normal attack, an aoe spell, a targeted spell, whatever. With the Unity client I can keep track of a timer after you've used a spell, so that if you hit that same hotkey again, it sends the 'ALL_ATTACK' skill instead. If you've ever played Super Mario RPG this is how the system works in that game. You hit Y to go into the Special menu, use the spell, then hit Y again during the animation to do the timed hit.
I've started adding custom packets for some things. Previously how I handled the process of a normal attack went like this:
- player starts attacking enemy, send 'damage' packet from src->target with 0 damage to play the attack anim
- if player did a timed hit, send the 'use Skill' packet so player does the 'jumping' animation
- send the 'damage' packet from target->target with actual damage so enemy plays their 'hurt' animation
Now it's more like:
- player starts attacking the enemy, send 'PlayAnimation' packet that tells src to face target and play animation 7 (this number could change based on their equipped weapon)
- if player did a timed hit, send 'PlayAnimation' packet that tells src to face target and play animation 13
- if attack didn't miss, send 'TakeDamage' packet where target faces src, plays animation 2 ("hurt" anim), and the damage numbers appear
With this I can tell the actors to play an infinite number of animations based on their equipment, player state, class, whatever.
Few of the next big things to implement will be inventory and equipment management, NPC dialogue, and a window for choosing level up stats. That last one will require some new UI and custom packets so that would be the next thing to add.