Well, "a monster attacking an NPC" isn't really a thing in the way I look at stuff. We organize all of the game objects into actors and static objects, usually, and then each actor has various abilities that they might trigger. But the fact is, in AVWW, Tidalis, and AI War the data structures are all wildly different. You can see the common thread in them in terms of how Keith and I approach this sort of thing, and the utility classes are all shared, but each design is tailored to the specific game.
It's not really a simple thing to answer: when Keith first came on board, he and I spent 6 hours straight on Skype looking through all the code and discussing its structure and design. And then for a few weeks (if not months) after that, there were still a lot of followup questions. When you're talking a codebase with hundreds of thousands of lines of code, if not more, it really becomes a complex thing to explain to someone because no matter what your explanation is incomplete if you don't spend a ridiculous amount of time explaining the whole thing. Something like "Drawing an enemy" might involve code from 30 different classes and files, thanks to general OOP encapsulation, etc. And you have the loops that render each object, and the stuff that the object does itself, and the wrapper methods around the raw draw calls, and all sorts of things like that.