Although boolean flags and enums work for simple state machines, they can quickly become hard to manage. Your approach is definitely the simplest and it works when you don't have many states to deal with, but you might want to look into more robust state machine implementations if things get out of hand.
As far as open source fighting games go there are a variety of open source MUGEN clones that might be worth investigating. Even if they don't necessarily produce very good fighters there are probably some good ideas to be had on how to build a fighting game engine. If you want to look at open source beat 'em ups Beats of Rage is an open source game that is actually pretty good.
I looked into Beats of rage before, Back when I was into the Dreamcast Mod Scene. Ill definitely look into MUGEN though, I figure a Fighting game and a beat-em up contain lots of similar elements, but fighting games have more advanced combo and block systems.
I'd stick to boolean states for most of the cases, because multiple states can often be triggered at once and you need to have clear control over what happens.
For example if an ennemy is hit AND in the air, or hit AND doing a move that makes him immune to interruption. You'd need to be able to trigger multiple conditions in your logic (without having to make a shit ton of enum fields for every possible combination).
this makes sense, but I feel like the enum still works for this, if the enemy is in the air, it cant be stunned or knocked down, but can be hit, and in the case of the un-interruptable move, this would be a enum state, even if the enemy has 3 moves that cant be interrupted all 3 moves call the same state.
this being said Im still more comfortable with the boolean machine, I just understand how this could be beneficial.