Files
EscapistsReintroduced/docs/evidence/convoy-survivors-2026-10-02/loss-diagnostic.patch
T
jakub 6a667d8deb Capture current mission, AI, map and administration development
Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
2026-10-13 22:52:53 +02:00

45 lines
2.8 KiB
Diff

--- a/addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeConvoyProbe.c
+++ b/addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeConvoyProbe.c
@@ -137,6 +137,31 @@
if (scripted) detail = scripted.GetActionDebugInfo();
if (detail.Length() > 200) detail = detail.Substring(0, 200);
return string.Format("%1 state=%2 suspended=%3", detail, action.GetActionState(), action.GetActionIsSuspended());
+ }
+ // Read-only state at the failed proof boundary, not a claim about the earlier
+ // release trigger. Release may already have cleared its waypoint and order.
+ protected void LossDiagnostic(ERR_ConvoyVehicle unit, int slot, float now)
+ {
+ if (!unit) { PrintFormat("ERR CONVOY LOSS: slot=%1 record missing", slot); return; }
+ PrintFormat("ERR CONVOY LOSS: slot=%1 index=%2 entity=%3 alive=%4 released=%5 arrived=%6",
+ slot, unit.Index, unit.Entity, ERR_Actors.Alive(unit.Entity), unit.Released, unit.Arrived);
+ bool enemyGroup = unit.Group && unit.Group.GetFaction() == m_Mode.EnemyFaction();
+ bool aboard;
+ if (unit.Driver && unit.Entity) aboard = ERR_ConvoyRules.PartOf(CompartmentAccessComponent.GetVehicleIn(unit.Driver), unit.Entity);
+ PrintFormat("ERR CONVOY LOSS: group=%1 enemyGroup=%2 driver=%3 alive=%4 canFight=%5 player=%6",
+ unit.Group, enemyGroup, unit.Driver, ERR_Actors.Alive(unit.Driver), ERR_Actors.CanFight(unit.Driver), ERR_Actors.Player(unit.Driver));
+ int routeCount;
+ if (m_Task.Route) routeCount = m_Task.Route.Count();
+ PrintFormat("ERR CONVOY LOSS: aboard=%1 routeIndex=%2 routeCount=%3 now=%4 legDeadline=%5",
+ aboard, unit.RouteIndex, routeCount, now, unit.LegDeadline);
+ PrintFormat("ERR CONVOY LOSS: waypoint=%1 members=%2 taskReady=%3 taskStopped=%4 reason=%5",
+ unit.Waypoint, unit.Members.Count(), m_Task.Ready, m_Task.Stopped, m_Task.Reason);
+ for (int i = 0; i < unit.Members.Count() && i < 32; i++)
+ {
+ IEntity member = unit.Members[i];
+ PrintFormat("ERR CONVOY LOSS: member=%1 actor=%2 alive=%3 canFight=%4 player=%5 sameGroup=%6",
+ i, member, ERR_Actors.Alive(member), ERR_Actors.CanFight(member), ERR_Actors.Player(member), ERR_Actors.Group(member) == unit.Group);
+ }
}
protected void MovementDiagnostic(float now)
{
@@ -376,7 +401,8 @@
for (int i = 0; i < 6; i++)
{
ERR_ConvoyVehicle vehicle = m_Task.Vehicles[i];
- if (!vehicle.Entity || (vehicle.Released && !vehicle.Arrived)) { Check(false, "vehicle released before road movement proof"); return -1; }
+ if (!vehicle || !vehicle.Entity || (vehicle.Released && !vehicle.Arrived))
+ { LossDiagnostic(vehicle, i, now); Check(false, "vehicle released before road movement proof"); return -1; }
minimum = Math.Min(minimum, vector.DistanceXZ(m_Origins[i], vehicle.Entity.GetOrigin()));
}
float leader = vector.DistanceXZ(m_Origins[0], m_Task.Vehicles[0].Entity.GetOrigin());