I've spent the entire time working on this project swearing black and blue that a small scope is integral to my plan because I want a finished game this time around. I've had people bugging me to add classes and races and I've been politely declining for months now... and all of a sudden I decided to forget all my plans and dive right on in with a bunch of new content.
New races
And the first stage of that has already been rolled out and it's six new races: half-elf, half-orc, tiefling, aasimar, kobold and bugbear. Half-elves, tieflings and aasimar are mostly defined by offering different starting attributes with a couple of race specific features for each (like sleep immunity for half-elves, fire resistance for tieflings, and the very useful healing hands for aasimar).
The monstrous additions are probably more interesting and probably much more unbalanced:
Kobolds have a high natural dexterity which makes them a natural fit for a rogue and their pack tactics trait synergises really effectively with sneak attack. When you and an ally are both next to a target, you get advantage on your attack from the pack tactics trait and the bonus damage from sneak attacks which becomes very powerful.
Half-orcs make for really powerful fighters. The savage attack trait means that when you roll a critical hit, you roll an extra die of damage so you hit extra hard, particularly when combined with the fighter's improved chances at critical hits at higher levels. The relentless endurance trait gives you an extra buffer before being knocked out. Knowing that you can drop to 0 HP once and automatically be given 1 HP to keep fighting means that you're extra resilient in the front of a party.
Bugbears have natural reach on all weapons and bonus reach using weapons already with that trait. What it means is that you can be a great weapon fighter and use a polearm to hit monsters 3 squares away. Or you can be a rogue with bonus stealth and use a finesse weapon and sneak attack from 2 squares away. They are excellent support fighters because you can always attack over the heads of your allies who can take the brunt of the damage for you.
All of these new races are included in the version currently available for download and while there's a few unfinished features, they're all stable and playable.
New class - the druid
I'm halfway through implementing the druid class as well! I've done the basics to do with proficiencies and traits. There's a few spells already written due to crossovers with the wizard and cleric spell schools, and most importantly, I'm about halfway through the wild shape ability. What that means is that at 2nd level, druids can wild shape into a range of animals. I've picked a selection and implemented those already, and I'm ironing out some of the attached issues that go with it, such as what happens when you 'die' in animal form.
The way I've done polymorphing is to simply create a new monster entirely, then store the player within that new object as a variable called 'true_self', and then substitute that new object into the player global. It's really quite simple and works pretty well, despite needing a few edge issues addressed like displaying stats properly and things like that.
I'm hopeful that a work-in-progress druid will be done by this time next week!
Two-weapon fighting
I also implemented two-weapon fighting - this was a pretty huge change through the code.
It involved changing all the inventory and equipment routines to deal with wielding a weapon in the off hand including a menu to allow the player the choice to do so and all the various checks necessary to make sure that two-handed, versatile and other non-light weapons were swapped in and out properly.
The stat bar had to be changed to show a second weapon being used when two-weapon combat was in effect, and this was a fairly complicated process in its own right.
And this let me work on implementing the two-weapon fighting style for figthers which had been commented out for the lifetime of this project so far! The flow-on effect was that this forced a number of changes to deal with calculating the damage bonus (or lack thereof) in the display code. I had to change the attack function so that it identified if an attack was being made as a bonus action with the off hand, which is every situation where two-weapon fighting is in effect and this is the final attack of the turn. This means that with extra attack, those attacks go first followed by the off hand last.
And finally, I had to implement new messages to make it clear when two-weapon fighting is in effect and which weapon you are hitting with.
Full change list:
* Fixed bug with ranged targetting when trying to select an area out of bounds.
* Dealt with closing game window in every possible input state with automatic saving included. Hopefully now should work across the board cleanly.
* Added starting kit for two-weapon fighters so they start with two mediocre light weapons.
* Fixed bug where inconsistent spelling of 'two handed' vs 'two-handed' resulted in fighter's with dueling fighting style getting that bonus for wielding two-handed weapons.
* Fixed bug where opportunity attack would be made with off hand.
* Fixed bug where bonus attack for two-weapons was being applied when throwing.
* Added restriction on sneak attacks so that extra damage is only applied once per round.
* Finished ironing out all weird bugs with two-weapon fighting and inventory management that come from a number of unexpected interactions.
* Added new naming rules for orcs, infernal, and kobolds.
* Implemented relentless endurance for half-orcs (and boars for some reason, although this was just sitting on my to-do list until now). Once per long rest, when HP reduced to 0, it becomes 1 instead.
* Implemented savage attacks trait for half-orcs. When a critical hit is scored, roll an extra damage die.
* Implemented extra reach for bugbears, they can now reach with all weapons and an extra square with reach weapons.
* Implemented healing hands ability for aasimar. Heals up to character level of damage on touch once per long rest. Useful for reviving allies during combat.
* Removed animation for casting light, I didn't like how it looked.
* Replaced veteran with knight as starting NPC option with one less point cost.
* Changed default starting party to one knight and one acolyte.
* Implemented resistance to various damage types. It doesn't apply to bludgeoning, piercing or slashing just yet but that'll be coming shortly.
* Implemented rough wild shape with selection of animals of different CR's depending on character level.
* Fixed bug where casting bless caused a crash due to an error in the stats display code.