I'm still here, checking for any munginess.
I don't know if this will help or confuse things further, but let me explain the withdraws from the code's perspective. Here's the algorithm:
- Each unit is checked at the start of the Withdraw Phase. If it's in Withdraw posture, then a "withdrawing" flag is checked.
- For each unit marked withdrawing, the game checks if it's in an EZOC. If not, the withdrawing flag is cleared (back to Attack posture). These are the criteria for a unit NOT exerting a ZOC into another unit's hex:
- Unit is from the same side/army
- Unit is not adjacent
- Unit is in Travel posture
- Unit has a disruption of 3 or greater
- Unit is dispersed
- Unit must be able to move into the hex otherwise (so wheeled units don't exert a ZOC over a river)
- Withdraw Check takes place, which can result in hits or added disruption. Fort Levels are removed.
- Minimum and Maximum Withdraw Movement Points are assigned
- The "Movement Grid" is established, which blocks all hexes containing enemy units and their ZOCs.
- A withdrawing unit is then selected and the allowed movement is highlighted. These criteria will block a hex for withdraw movement:
- Movement Grid shows it as an enemy hex or ZOC.
- Unit cannot physically move into/over that terrain (normal movement rules)
- Stacking rules would be violated
- The new hex is not further from the enemy than the old hex
- After all the potential movement hexes are mapped out, a check is made to see if the unit can fully withdraw (green hexes). If not, another Withdraw Check is made (more potential withdraw and/or hits).
That pretty much covers it.
So what jumps out at me is the "The new hex is not further from the enemy than the old hex". Looking at the "should have withdrawn but didn't" example above, the unit can only move south to get out of the EZOCs, where it is two hexes from the nearest enemy. From there, it can only move Southwest or South, but both of these are also two hexes from the enemy, so these would both be invalid hexes according to the code. That would prevent a full withdraw, which would prevent any withdraw.
I assume that that one test scenario is repeatable? I'll try to test this theory out tonight (can't at the moment). If that's the problem, it's an easy(ish) fix. The check is in there to prevent units from basically circling an enemy to burn their required withdraw movement points, but if the only option is to parallel enemy units (given the limitations of hexes) then I would think it should be allowed.
Boku Strategy Games, Developer of Combat Command and Horse & Musket