I really like that implementation as it avoids having a map (with cover and features etc.)
Although, I am not sure about the tactics (when is it best to simply swing the weapon, to dodge, to help, to disengage, to switch targets triggering an AoO, to defenestrate an opponent).
I mentioned above that the "AI", which is the Encounter battle() method, is a mess of conditional statements for case specific actions. So it might need a fix to be allow more tactical decisions.
I was adding more features as I went and I wasn't expecting this much stuff. I am half considering making a list of available actions (method references like cast_barkskin, but better) and a respective list of assessment methods that would return a value rating the move, so that the top ranked action could be called. The factors affecting the rating could be tweaked random allowing a random walk towards the best strategy. Anyway, that is just crazy talk.
I forgot to write that some data mentioned in my first post is present here: report 1 and report 2.