Objected-oriented design or not has nothing to do if the system is open or not, and I am not familiar with the term open-ended system other than when clients think the contract is open-ended and they can keep asking for free changes

. If an elephant is going to be a 2 hit unit, the 'property' of having 2 hit points must be coded. Then facilities must be hard coded to allow units to have properties, how many properties? If the cardinality is greater than 1 then datastructures must be created to implement this and some hardcode to access this date must be created. If the hit point property were to be truly open, then you would have to hard code for N hit points and a field would have to be created and read by the program to determine if the unit has 1 or 5 or N hit points. It's actually probably the way to go for a complete rewrite. You would have a static list of unit properties (again how could you write a program to deal with properties that are unknown at compile time) and a file that would describe a list of N units each of which has a set of properties ie, Name, Offense, Defense, Number of Hit points, Cost and then a pointer to a relator table to set up the Many to Many relationships between units and more unique properties such as first strike attack as in subs and partisans and first strike neutralization of subs and anti-partisans. Special coding would have to be there to handle AA guns, they would be treated more like a regular unit with a property called AA which in this case means the unit cannot be a casualty in the battle and has a first strike ability of sorts. This is all fairly doable, and from a clean sheet design would probably have been the way to go. Depending on how the data was represented it still might not be too difficult to retrofit onto the existing program.
Programmers almost never have the luxury of seeing what the program should finallly be in the end when doing the initial design work. Most often, we are given the task of creating a chevette, and over the years are instructed to constantly upgrade it towards being a corvette, had we been told to begin with we were going to build a corvette different design choices would have been initially used.
Now, how to handle dynamic rules or new properties....... That is the tricky part. How would you handle dynamically say a unit that reflects 20% of the hits in a battle back to the attacker? This property of damage reflection would never have been coded nor anticipated. In theory its simple, just add 20% of the attackers hits to the defenders return hits, but how to make a program do that when it was never design to do something like that?