Separate names with a comma.
Discussion in 'Command Ops Series' started by Dave 'Arjuna' O'Connor, Jan 15, 2015.
Minor SITREP update.
Started playtesting the first Khalkhin-Gol scenario.
SITREP 29 Apr 2019
Just put out a new build 5.1.41 to our beta testers. I've been focused on eliminating all formation lockups and overruns. Overruns are when the formation hub or a filler keep moving when the guards have stopped , thus ending up with the HQs in the front - not a good outcome. This ended up in me completely overhauling the formation movement code.
The code now uses current location rather than next location for all tests. It no longer uses the boss Indexes to determine where a subordinate should be. Rather it now calculates that on the fly every minute. I also ditched the phase line code designed to ignore the location checks unless the force was at a phase line. I was worried that these two changes would slow the game down a little, but in fact it is marginally faster now. But the most important thing is that I have not seen any more lockups or overruns. No doubt the beta testers will try and prove me wrong on that.
- FPRouteOutput - Added EndIndex to GetFirstPassableIndexWithinRange() parameters so the search can be terminated before the end of the route
- GameRecorder - Action logs - Isolated logging of Action time to debug versions as time is not recorded in release versions of the game.
- ScenEvent - ScenEvent::GetPartialMinuteExecutionTime() - added default return value of zero to prevent crash from this moribund function.
- ScenForceGroupUtils - SplitForceByReachabilityAndReasonableRangeFunction() added RequiresLineUnit parameter and if it does require a line unit then the process function will call CullNonLineUnitFGs(). This ensures that HQs and support units don't move to enemy controlled objectives without a line unit.
- PlanAttack - DevelopAttack() - If there was no reserve task it was using the subjectLoc to determine the closest point on the boss route. Now if no reserve loc it will use the FUP loc and only if it can't find that will it use the subject loc. This ensures the boss doesn't advance too far along their route when a subordinate guard is launching an attack.
- Plan Attack - ConfirmFinalReorgTaskDetails() - the final reorg task was using the assault formation's formation type but potentially changing its facing. This could see the assault companies try to advance further into enemy territory. Now it sets the formation type to inSitu to ensure the assault companies reorg on their objectives.
- PlanDefend - Added DetermineSpecialRequirements() to ensure that a line unit is allocated to a force if the objective is enemy controlled or enemy nearby. This ensures non-line units don't go moving to and defending at threatened objectives without a line unit.
- PlanMove - DevelopTaskPlanSelf() and DetermineSpecialRequirements()- Added code to ensure line units are allocated to split forceGroups if the objective is enemy controlled or enemy are nearby
- ScenTask - Added GetCurrentRouteIndex() to use the actual locatioin on the route rather than the "next" location. This is part of the formation movement overhaul.
- ScenScenario - GetTodaysFirstLight() and GetTodaysLastLight() - Ensure these handle cases where a scenario ends on a day before first light or starts on a day after last light.
- TaskMove - ReassessOptions() - Prevent AssessChangeInAdvanceFormation() or AssessChgFormationIfGuardsTired() from being called if the force has a subForce attacking
- ScenRoute - CalcRouteFromSubjectToJoinIndex() - Added a proximity margin to mitigate against culling minor loopbacks. Modified the way bossIndexes are calculated.
- ScenRoute - CalcRouteBetweenJoinAndLeaveIndex() - added assert to ensure correct bossIndexes
- ScenRoute - MustWaitForUnitAhead() and MustWaitForUnitBehind() - Use current index not next index. Factor in offsetIndexes into test.
- ScenRoute - MustWaitForOffsetUnit() - Ensure subGroups governed by order of march call MustWaitForReassessingSubordinate() and MustWaitForReactingSubordinate()
- ScenRoute - MustWaitForReassessingSubordinate() - removed redundant indexOffset parameter
- ScenRoute - CalcTempBossMoveIndex() - overhauled. Now calls GetClosestIndexToStart() and passes in the reserveLoc or FUPLoc or if nothing else the subjectLoc.
- ScenMoveEvent:: ProcessEventSelf() - Onl;y calls CalcNewUnitFormation() if not routing, retreating or halted - ie routStatus is normal.
- ScenBaseForce - Added IsRoutingRetreatingOrHalted().
- ScenPlanScheduling::CalcNewUnitFormation() - now defaults to using the task formation type if it's been specified and the unit is not routing, retreating or halted and it hasn't achieved its objective and it's not close to its objective. This prevents a lot of unnecessary changing of unit formations.
- ScenRoute - GetIndexOffset() - now used Cos() instead of Sin() to determine the effective boss offset
- ScenRoute - Added GetSubGroupIndexOffset() to calc its offset from the boss. Now all calcs are relative to the boss's route and use Cos() instead of Sin() to determine the correct distance offset.
- ScenRoute::CalcBossOffsetRoute() - now uses Cos() instead of Sin().
- ScenRoute::CanMove() - Ignore Phase Lines. Now checks offset for all subordinates not governed by order of march.
- ScenRoute::MustWaitForBoss() - Ditch use of bossIndexes. Now calc offset on the fly.
- ScenRoute::MustWaitForOffsetUnit() - Ditch use of bossIndexes and only ignore subordinates waiting on orders if they do not havce a current subject task.
- ScenRoute::IsAtOrBeyondLeaveIndex() - Now uses current subject loc instead of next route loc. All offsets determined on current locations.
- ScenRoute::IsAtOrBeyondJoinIndex() - Now uses current subject loc instead of next route loc. All offsets determined on current locations.
I have received a lot of feedback about senior HQs ending up on the front line. This has been from beta testers and general users, both here and on Steam. Now that I have the formation movement working a lot better, I did some tests and ran one of the new Bradley at Bay scenarios which has five senior HQs. After ten hours four of them ended up on the front line. these were key objectives and they didn't overrun their subordinate guards. But they did close enough to come under fire. This is not realistic. So I am going to initiate a new feature to base these senior HQs, not just for attacks, as they do now, but for all tasks. I'll do this while the beta testers are testing the latest build - a bit of concurrent activity.
Sounds like an excellent development, Dave. Thanks. Would it then be going too far to ask for similar basing code for the other types of 'rear' unit that end up out front? For bases, artillery, mortars, AT guns, for example? (Especially when they're wheeled.)
Let's just do this one step at a time. I'll get HQ's doing it right first. Then we can see about the others. There already is code to handle the basing of arty and bases. It may need to be tweaked. What I think happens is that they only move when their HQ does a move with the whole force. So I am hoping that as soon was we base the HQ, they will base too. But we'll see.