Much progress today. Text systems are *fiddly*. I ended up writing a basic string concatenation routine, as otherwise erasing the full line of text when it's built out of so many small parts was a state tracking nightmare.
I want to generalize the player / enemy structures a bit so that attacks can swing in either direction, and therefore share most of their code. Then enemies can respond with attacks of their own, and that should close the interaction loop for battles. Then onward to magic!