diff --git a/addons/ai/Prefabs/ERR/MortarCrew.et b/addons/ai/Prefabs/ERR/MortarCrew.et new file mode 100644 index 0000000..1159fe9 --- /dev/null +++ b/addons/ai/Prefabs/ERR/MortarCrew.et @@ -0,0 +1,8 @@ +SCR_AIGroup : "{8DE0C0830FE0C33D}Prefabs/Groups/OPFOR/Group_USSR_Base.et" { + m_aUnitPrefabSlots { + "{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et" + "{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et" + "{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et" + "{612F43A4D5AE765F}Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_RTO.et" + } +} diff --git a/addons/ai/Prefabs/ERR/MortarCrew.et.meta b/addons/ai/Prefabs/ERR/MortarCrew.et.meta new file mode 100644 index 0000000..adaeb61 --- /dev/null +++ b/addons/ai/Prefabs/ERR/MortarCrew.et.meta @@ -0,0 +1,7 @@ +MetaFileClass { + Name "{B84C05941C4C81B8}Prefabs/ERR/MortarCrew.et" + Configurations { + EntityTemplateResourceClass PC {} + EntityTemplateResourceClass HEADLESS {} + } +} diff --git a/addons/ai/Scripts/Game/ERR/ERR_HQ.c b/addons/ai/Scripts/Game/ERR/ERR_HQ.c index 46d2a27..5b8110e 100644 --- a/addons/ai/Scripts/Game/ERR/ERR_HQ.c +++ b/addons/ai/Scripts/Game/ERR/ERR_HQ.c @@ -11,10 +11,11 @@ class ERR_HQUnit ref ERR_HQReport PendingOrder; ref ERR_HQReport Assignment; AIWaypoint Waypoint; + bool ReservedForSupport; bool Eligible(ERR_GameMode mode) { - if (!Group || !Utility || Group.GetPlayerCount(true) > 0 || Group.IsSlave() || Group.GetFaction() != mode.EnemyFaction()) return false; + if (ReservedForSupport || !Group || !Utility || Group.GetPlayerCount(true) > 0 || Group.IsSlave() || Group.GetFaction() != mode.EnemyFaction()) return false; array agents = {}; Group.GetAgents(agents); bool survivor; @@ -44,6 +45,7 @@ class ERR_HQUnit class ERR_HQ : ERR_CommandService { protected ERR_GameMode m_Mode; + protected ref ERR_MortarSystem m_Mortars; protected ref array m_Units = {}; protected ref array m_Contacts = {}; protected ref ERR_HQNetwork m_Network = new ERR_HQNetwork(); @@ -52,11 +54,84 @@ class ERR_HQ : ERR_CommandService protected float m_NextNetwork; protected float m_NextAssignment; - void ERR_HQ(ERR_GameMode mode) { m_Mode = mode; } + void ERR_HQ(ERR_GameMode mode) { m_Mode = mode; m_Mortars = new ERR_MortarSystem(this); } + static ERR_HQ Get() + { + ERR_GameMode mode = ERR_GameMode.Get(); + if (!mode) return null; + return ERR_HQ.Cast(mode.Command()); + } + static bool MissionActive() + { + ERR_GameMode mode = ERR_GameMode.Get(); + return mode && mode.Active(); + } + static void Event(string kind, string message, int messageId = 0) + { + ERR_HQ hq = Get(); + if (hq) hq.Journal().Write(kind, message, messageId); + } + ERR_MortarSystem Mortars() { return m_Mortars; } + bool PrepareSupport() { return m_Mortars.Prepare(); } + void ReserveGroup(SCR_AIGroup group) + { + foreach (ERR_HQUnit unit : m_Units) + { + if (unit.Group != group) continue; + unit.Release(); + unit.ReservedForSupport = true; + } + } + void PhysicalForces(out array entities) + { + entities.Clear(); + foreach (ERR_HQUnit unit : m_Units) + { + if (!unit.Group) continue; + array agents = {}; + unit.Group.GetAgents(agents); + foreach (AIAgent agent : agents) + { + if (!agent || !agent.GetControlledEntity()) continue; + IEntity actor = agent.GetControlledEntity(); + if (!entities.Contains(actor)) entities.Insert(actor); + IEntity vehicle = CompartmentAccessComponent.GetVehicleIn(actor); + if (vehicle && !entities.Contains(vehicle)) entities.Insert(vehicle); + } + } + m_Mortars.AppendGuns(entities); + } + bool MortarConnected(SCR_AIGroup group) + { + foreach (ERR_HQUnit unit : m_Units) + if (unit.Group == group && unit.Radio) return m_Network.Route(unit.Radio) != null; + return false; + } + ERR_HQRoute Downlink(SCR_AIGroup group, string kind, string detail, int sourceId) + { + foreach (ERR_HQUnit unit : m_Units) + { + if (unit.Group != group || !unit.Radio) continue; + ERR_HQRoute route = m_Network.Route(unit.Radio, true); + if (!route) return null; + route.MessageId = m_Journal.Message(); + route.Payload = string.Format("%1 from report M%2; %3", kind, sourceId, detail); + m_Journal.Write("ORDER QUEUED", route.Payload, route.MessageId); + return route; + } + return null; + } + void SupportContacts(out array contacts, float now) + { + contacts.Clear(); + foreach (ERR_HQReport contact : m_Contacts) + if (ERR_MortarPrediction.Fresh(contact, now)) contacts.Insert(contact.Snapshot()); + } + ERR_HQJournal Journal() { return m_Journal; } string Status() { - return string.Format("HQ: %1 groups, %2 delivered contacts, %3 assignments", m_Units.Count(), m_Contacts.Count(), Assigned()); + return string.Format("HQ: %1 groups, %2 delivered contacts, %3 assignments", m_Units.Count(), m_Contacts.Count(), Assigned()) + "; " + m_Mortars.Status(); } override void RegisterGroup(SCR_AIGroup group) @@ -167,6 +242,8 @@ class ERR_HQ : ERR_CommandService if (!order || !ERR_MissionRules.ContactFresh(order.ObservedAt, now) || !unit.Eligible(m_Mode)) { unit.Release(); return; } SCR_AIGroupPerception perception = unit.Utility.m_Perception; if (perception && !perception.m_aTargets.IsEmpty()) { unit.Release(); return; } + int deliveryId; + if (unit.Downlink) deliveryId = unit.Downlink.MessageId; unit.Release(); vector position = order.Position; if (order.HasVelocity) position = ERR_HQReport.Predict(position, order.Velocity, (now - order.ObservedAt) / 1000); @@ -175,7 +252,7 @@ class ERR_HQ : ERR_CommandService unit.Waypoint = waypoint; unit.Assignment = order; unit.Group.AddWaypointAt(waypoint, 0); - m_Journal.Write("ORDER DELIVERED", string.Format("group %1: %2", unit.Id, order.Description(now)), order.MessageId); + m_Journal.Write("ORDER DELIVERED", string.Format("group %1 from report M%2: %3", unit.Id, order.MessageId, order.Description(now)), deliveryId); } protected void Assign(float now) @@ -240,11 +317,13 @@ class ERR_HQ : ERR_CommandService Observe(unit, now); } if (now >= m_NextAssignment) { Assign(now); m_NextAssignment = now + 5000; } + m_Mortars.Tick(now); m_Journal.Flush(); } override void Stop() { + m_Mortars.Stop(); foreach (ERR_HQUnit unit : m_Units) unit.Release(); m_Units.Clear(); m_Contacts.Clear(); diff --git a/addons/ai/Scripts/Game/ERR/ERR_MortarBattery.c b/addons/ai/Scripts/Game/ERR/ERR_MortarBattery.c new file mode 100644 index 0000000..c0df185 --- /dev/null +++ b/addons/ai/Scripts/Game/ERR/ERR_MortarBattery.c @@ -0,0 +1,460 @@ +// Migrated from the independently authored AI extension; successor-owned physical groups. +// Each site/phase has its own repeat limiter. Changed reasons and lifecycle +// events are immediate; only identical polling results are summarized. +class ERR_MortarTraceState +{ + string LastReason; + float NextLog; + int Suppressed; + + bool Due(string reason, float now) + { + if (reason != LastReason || now >= NextLog) + { + LastReason = reason; + NextLog = now + 30000; + return true; + } + Suppressed++; + return false; + } +} + +class ERR_MortarBattery +{ + static const ResourceName GUN = "{D1FFE458E8AC4BDB}Prefabs/Weapons/Mortars/2B14/Mortar_2B14.et"; + static const ResourceName SHELL = "{98EC9C526AFBA282}Prefabs/Weapons/Ammo/Ammo_Shell_82mm_HE_O832DU.et"; + static const ResourceName CREW = "{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et"; + static const ResourceName RADIO_OPERATOR = "{612F43A4D5AE765F}Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_RTO.et"; + IEntity RadioOperator; + IEntity Gun; + SCR_AIGroup Group; + ref SCR_AIStaticArtilleryActivity Activity; + ref ERR_HQReport Report; + ref ERR_HQRoute RadioOrder; + ref ERR_HQReport PendingRadioReport; + vector Position; + vector Impact; + vector AimOffset; + int AimedShot = -1; + float FlightTime; + float AimedAt = -1; + float AirspaceUntil; + vector AirspaceImpact; + float AirspaceRadius = 600; + float OrderedAt; + float NextOrder; + float SpawnedAt; + bool StartupActivated; + bool Released; + bool Rejected; + bool Claimed; // keeps the world slot occupied after the battery is destroyed + int SiteId; + int OrderId; + int RadioId; + int SourceId; + int OrderShots; + int TotalShots; + bool CommandOpen; + string LastFailure; + string SpawnFailure; + vector LastCandidate; + ref map SearchCounts = new map(); + ref map Traces = new map(); + + void Audit(string kind, string detail) + { + ERR_HQ.Event("MORTAR " + kind, string.Format("site=%1 order=%2 radio=M%3 source=M%4 position=%5; %6", SiteId, OrderId, RadioId, SourceId, Position, detail), RadioId); + } + + void Trace(string phase, string reason, string detail) + { + ERR_MortarTraceState state; + if (!Traces.Find(phase, state)) + { + state = new ERR_MortarTraceState(); + Traces.Insert(phase, state); + } + string previous = state.LastReason; + if (!state.Due(reason, GetGame().GetWorld().GetWorldTime())) + return; + Audit(phase, string.Format("reason=%1; %2; previous=%3 repeated polls omitted=%4", reason, detail, previous, state.Suppressed)); + state.Suppressed = 0; + } + + void FlushTraces() + { + foreach (string phase, ERR_MortarTraceState state : Traces) + { + if (state.Suppressed > 0) + Audit("REPEATS", string.Format("phase=%1 reason=%2 repeated polls omitted=%3", phase, state.LastReason, state.Suppressed)); + } + Traces.Clear(); + } + + string OperationalReason() + { + if (!Gun) return "gun missing"; + if (!SpawnFailure.IsEmpty()) return SpawnFailure; + if (!Group || !Group.GetGroupUtilityComponent()) return "crew group missing"; + if (Group.GetFaction() != ERR_GameMode.Get().EnemyFaction()) return "crew changed faction"; + if (Group.GetPlayerCount(true) > 0) return "player in crew group"; + if (Group.GetAgentsCount() == 0) return "crew group empty"; + DamageManagerComponent damage = DamageManagerComponent.Cast(Gun.FindComponent(DamageManagerComponent)); + if (damage && damage.IsDestroyed()) return "gun destroyed"; + return ""; + } + + void BeginRequest(ERR_HQReport report, float now) + { + Cancel("superseded by new HQ order"); + FlushTraces(); + OrderId++; + RadioId = 0; + SourceId = report.MessageId; + OrderShots = 0; + Released = false; + CommandOpen = true; + OrderedAt = now; + LastFailure = ""; + Audit("COMMAND", string.Format("requested rounds=%1 HE radius=%2m; %3", ERR_MortarSalvo.ROUNDS, ERR_MortarSalvo.RADIUS_METRES, report.Description(now))); + } + + void ObserveProjectile(IEntity projectileEntity, IEntity firingCharacter, bool playerGunner) + { + if (!projectileEntity) + { + Audit("FIRE CALLBACK", "native OnWeaponFired had no projectile; no confirmed shot counted"); + return; + } + TotalShots++; + if (CommandOpen && Released && !playerGunner) + { + OrderShots++; + // Only a physical projectile unlocks the next load. It must be aimed again. + Released = false; + AimedAt = -1; + Audit("FIRED", string.Format("physical projectile=%1 origin=%2 order shots=%3 total shots=%4 predicted impact=%5 predicted flight=%6s gunner=%7 (impact not observed)", projectileEntity, projectileEntity.GetOrigin(), OrderShots, TotalShots, Impact, FlightTime, firingCharacter)); + } + else + Audit("FIRED UNASSIGNED", string.Format("physical projectile=%1 origin=%2 player gunner=%3 order open=%4 committed=%5 total shots=%6; no active HQ order attribution", projectileEntity, projectileEntity.GetOrigin(), playerGunner, CommandOpen, Released, TotalShots)); + } + + void ReserveShellAirspace(float now) + { + // Enclose every still-airborne shell, including an earlier, longer flight. + // A later round must not move/shrink the existing exclusion or deadline. + if (now >= AirspaceUntil) + { + AirspaceImpact = Impact; + AirspaceRadius = 600; + } + AirspaceRadius = Math.Max(AirspaceRadius, vector.DistanceXZ(AirspaceImpact, Impact) + 600); + AirspaceUntil = Math.Max(AirspaceUntil, now + (FlightTime + 10) * 1000); + } + + bool SpawnFailed(string reason) + { + SpawnFailure = reason; + Audit("DEPLOY FAILED", string.Format("reason=%1 claimed=%2 gun=%3 group=%4", reason, Claimed, Gun, Group)); + return false; + } + + void SearchResult(vector candidate, string reason) + { + LastCandidate = candidate; + int count; + SearchCounts.Find(reason, count); + SearchCounts.Set(reason, count + 1); + } + + void SiteStatus(float now) + { + if (!SearchCounts.IsEmpty()) + { + string counts; + foreach (string reason, int count : SearchCounts) counts += string.Format("%1=%2; ", reason, count); + Audit("SITE SEARCH", string.Format("candidate counts since last summary: %1 last candidate=%2", counts, LastCandidate)); + SearchCounts.Clear(); + } + int agents, living; + int actionState = -1; + if (Group) + { + array crew = {}; + Group.GetAgents(crew); + agents = crew.Count(); + foreach (AIAgent agent : crew) + { + if (agent && ERR_Actors.CanFight(agent.GetControlledEntity())) living++; + } + } + if (Activity) actionState = Activity.GetActionState(); + bool connected; + ERR_HQ hq = ERR_HQ.Get(); + if (hq && Group) connected = hq.MortarConnected(Group); + Audit("SITE STATUS", string.Format("claimed=%1 startup=%2 operational=%3 crew agents=%4 fighting=%5 inventory HE=%6 radio connected=%7 cooldown remaining=%8s", Claimed, StartupActivated, Operational(), agents, living, CountShells(), connected, Math.Max(0, NextOrder - now) / 1000)); + Audit("ORDER STATUS", string.Format("open=%1 route pending=%2 native action=%3 shell committed=%4 order shots=%5 total shots=%6 age=%7s last failure=%8", CommandOpen, RadioOrder != null, actionState, Released, OrderShots, TotalShots, Math.Max(0, now - OrderedAt) / 1000, LastFailure)); + if (!SpawnFailure.IsEmpty()) Audit("PARTIAL DEPLOYMENT", SpawnFailure); + if (!Operational()) Trace("SITE BLOCK", OperationalReason(), "spawn failure=" + SpawnFailure); + } + + bool Operational() + { + return OperationalReason().IsEmpty(); + } + + int CountShells() + { + if (!Group) + return 0; + int count; + array agents = {}; + Group.GetAgents(agents); + foreach (AIAgent agent : agents) + { + if (!agent || !ERR_Actors.CanFight(agent.GetControlledEntity())) + continue; + InventoryStorageManagerComponent inventory = InventoryStorageManagerComponent.Cast(agent.GetControlledEntity().FindComponent(InventoryStorageManagerComponent)); + if (!inventory) + continue; + array items = {}; + inventory.GetItems(items); + foreach (IEntity item : items) + { + if (item && item.GetPrefabData() && item.GetPrefabData().GetPrefabName() == SHELL) + count++; + } + } + return count; + } + + void Bind(int siteId, SCR_AIGroup group, IEntity gun, float now) + { + SiteId = siteId; + Group = group; + Gun = gun; + Position = gun.GetOrigin(); + SpawnedAt = now; + Claimed = true; + } + + + protected int InventoryShells(InventoryStorageManagerComponent inventory) + { + if (!inventory) + return 0; + int count; + array items = {}; + inventory.GetItems(items); + foreach (IEntity item : items) + { + if (item && item.GetPrefabData() && item.GetPrefabData().GetPrefabName() == SHELL) + count++; + } + return count; + } + + protected void Equip(IEntity soldier) + { + InventoryStorageManagerComponent inventory = InventoryStorageManagerComponent.Cast(soldier.FindComponent(InventoryStorageManagerComponent)); + if (!inventory) + { + Audit("EQUIP FAILED", string.Format("crew=%1 inventory missing", soldier)); + return; + } + if (soldier == RadioOperator) + { + int capability = ERR_HQRadio.Capability(soldier); + Audit("RADIO EQUIP", string.Format("operator=%1 capability=%2 (2=physical manpack); next HQ radio index verifies route", soldier, capability)); + return; + } + if (ERR_HQRadio.Capability(soldier) == 0 && !inventory.TrySpawnPrefabToStorage("{E1A5D4B878AA8980}Prefabs/Items/Equipment/Radios/Radio_R148.et")) + Print("Rereintroduced AI [mortar]: crew radio did not fit; HQ handoff required", LogLevel.WARNING); + // Native mortar-crew backpacks carry three EMPTY three-round boxes. + // Fill them once. No infinite ammunition or replacement after casualties. + for (int i = InventoryShells(inventory); i < 9; i++) + { + if (!inventory.TrySpawnPrefabToStorage(SHELL, purpose: EStoragePurpose.PURPOSE_DEPOSIT)) + break; + } + Audit("EQUIP", string.Format("crew=%1 inventory HE=%2 requested=9 radio capability=%3 (0=none)", soldier, InventoryShells(inventory), ERR_HQRadio.Capability(soldier))); + } + + bool SupplyGunner() + { + if (!Operational()) + return SupplyFailed(OperationalReason()); + SCR_AIVehicleUsageComponent usage = SCR_AIVehicleUsageComponent.Cast(Gun.FindComponent(SCR_AIVehicleUsageComponent)); + IEntity gunner; + if (usage && usage.GetTurretCompartmentSlot()) + gunner = usage.GetTurretCompartmentSlot().GetOccupant(); + array agents = {}; + Group.GetAgents(agents); + float nearest = float.MAX; + if (!gunner) + { + foreach (AIAgent candidate : agents) + { + if (!candidate || candidate.GetControlledEntity() == RadioOperator || !ERR_Actors.CanFight(candidate.GetControlledEntity())) + continue; + float distance = vector.DistanceXZ(Gun.GetOrigin(), candidate.GetControlledEntity().GetOrigin()); + if (distance < nearest) + { + nearest = distance; + gunner = candidate.GetControlledEntity(); + } + } + } + if (!gunner) return SupplyFailed("no fighting gunner found"); + if (ERR_Actors.Group(gunner) != Group) return SupplyFailed("turret occupant belongs to another group"); + if (!ERR_Actors.CanFight(gunner)) return SupplyFailed("gunner cannot fight"); + InventoryStorageManagerComponent destination = InventoryStorageManagerComponent.Cast(gunner.FindComponent(InventoryStorageManagerComponent)); + if (!destination) + return SupplyFailed("gunner inventory missing"); + if (InventoryShells(destination) > 0) + return true; + int nearbyDonors, donorShells, storageRejected, moveRejected; + foreach (AIAgent bearer : agents) + { + if (!bearer || !ERR_Actors.CanFight(bearer.GetControlledEntity())) + continue; + IEntity donor = bearer.GetControlledEntity(); + if (donor == gunner || vector.DistanceXZ(donor.GetOrigin(), gunner.GetOrigin()) > 12) + continue; + InventoryStorageManagerComponent inventory = InventoryStorageManagerComponent.Cast(donor.FindComponent(InventoryStorageManagerComponent)); + if (!inventory) + continue; + nearbyDonors++; + array items = {}; + inventory.GetItems(items); + foreach (IEntity item : items) + { + if (!item || !item.GetPrefabData() || item.GetPrefabData().GetPrefabName() != SHELL) + continue; + donorShells++; + BaseInventoryStorageComponent storage = destination.FindStorageForItem(item, EStoragePurpose.PURPOSE_DEPOSIT); + if (!storage) { storageRejected++; continue; } + if (inventory.TryMoveItemToStorage(item, storage)) + { + Audit("AMMO TRANSFER", string.Format("request accepted donor=%1 gunner=%2 shell=%3; inventory move is not a fired shot", donor, gunner, item)); + return true; + } + moveRejected++; + } + } + return SupplyFailed(string.Format("gunner empty; fighting donors with inventory within 12m=%1 donor HE=%2 destination storage rejected=%3 native move rejected=%4", nearbyDonors, donorShells, storageRejected, moveRejected)); + } + + bool SupplyFailed(string reason) + { + LastFailure = reason; + Audit("AMMO FAILED", reason); + return false; + } + + void Cancel(string reason = "cancel requested") + { + if (CommandOpen) + { + FlushTraces(); + Audit("ORDER END", string.Format("reason=%1 observed shots=%2 shell committed=%3 elapsed=%4s last failure=%5", reason, OrderShots, Released, (GetGame().GetWorld().GetWorldTime() - OrderedAt) / 1000, LastFailure)); + } + CommandOpen = false; + RadioOrder = null; + PendingRadioReport = null; + Report = null; + AimedAt = -1; + if (Activity) + Activity.Complete(); + Activity = null; + } + + // Idle distant batteries still report through HQ's scheduler. Their native + // AI needs full detail while firing or when players can interact with them. + protected void UpdateCrewDetail(float now, bool firing = false) + { + if (!Group || Group.GetPlayerCount(true) > 0) + return; + bool active = firing || Activity != null || ERR_MortarSystem.NearPlayer(Position); + int lod = -1; + if (active) + lod = 0; + if (Group.GetPermanentLOD() != lod) + Group.SetPermanentLOD(lod); + if (active && !Group.IsAIActivated()) + Group.ActivateAI(); + array agents = {}; + Group.GetAgents(agents); + foreach (AIAgent agent : agents) + { + if (!agent || EntityUtils.IsPlayer(agent.GetControlledEntity())) + continue; + if (agent.GetPermanentLOD() != lod) + agent.SetPermanentLOD(lod); + if (active && !agent.IsAIActivated() && ERR_Actors.CanFight(agent.GetControlledEntity())) + agent.ActivateAI(); + } + } + + void Update(float now) + { + if (!Operational()) + { + Cancel(OperationalReason()); + return; + } + if (!StartupActivated && now - SpawnedAt >= 10000) + { + SCR_AIVehicleUsageComponent usage = SCR_AIVehicleUsageComponent.Cast(Gun.FindComponent(SCR_AIVehicleUsageComponent)); + if (!usage || !Group.GetGroupUtilityComponent().m_VehicleMgr || !Group.GetGroupUtilityComponent().m_VehicleMgr.TryAddVehicle(usage)) + { + SpawnFailure = "native gun registration failed"; + Cancel(SpawnFailure); + return; + } + array initialCrew = {}; + Group.GetAgents(initialCrew); + foreach (AIAgent initialAgent : initialCrew) + { + IEntity initialActor = initialAgent.GetControlledEntity(); + if (initialActor && initialActor.GetPrefabData() && initialActor.GetPrefabData().GetPrefabName() == RADIO_OPERATOR) RadioOperator = initialActor; + } + StartupActivated = true; + Audit("CREW ACTIVATE", "startup delay elapsed; activating and equipping crew"); + Group.ActivateAI(); + array agents = {}; + Group.GetAgents(agents); + foreach (AIAgent agent : agents) + { + if (agent && ERR_Actors.CanFight(agent.GetControlledEntity())) + { + agent.SetPermanentLOD(0); + agent.ActivateAI(); + Equip(agent.GetControlledEntity()); + } + } + } + if (Activity) + { + Trace("ACTIVITY", string.Format("native state=%1", Activity.GetActionState()), string.Format("age=%1s aim age=%2s committed=%3 shots=%4", (now - OrderedAt) / 1000, (now - AimedAt) / 1000, Released, OrderShots)); + if (Activity.GetActionState() == EAIActionState.FAILED) Cancel("native artillery activity FAILED"); + else if (Activity.GetActionState() == EAIActionState.COMPLETED) Cancel("native artillery activity COMPLETED (shot count is separate)"); + else if (now - OrderedAt > ERR_MortarSalvo.TIMEOUT_MS) Cancel("120s artillery salvo timeout"); + } + if (StartupActivated) + UpdateCrewDetail(now); + } + + void Order(ERR_HQReport report, float now) + { + Report = report.Snapshot(); + OrderedAt = now; + NextOrder = now + 30000; + Released = false; + UpdateCrewDetail(now, true); + Activity = new SCR_AIStaticArtilleryActivity(Group.GetGroupUtilityComponent(), null, report.Position, SCR_EAIArtilleryAmmoType.HIGH_EXPLOSIVE, ERR_MortarSalvo.ROUNDS); + Group.GetGroupUtilityComponent().AddAction(Activity); + Audit("AIM", string.Format("native activity created; latest source=M%1 observed=%2", report.MessageId, report.Description(now))); + } +} diff --git a/addons/ai/Scripts/Game/ERR/ERR_MortarFiring.c b/addons/ai/Scripts/Game/ERR/ERR_MortarFiring.c new file mode 100644 index 0000000..eeaf1ec --- /dev/null +++ b/addons/ai/Scripts/Game/ERR/ERR_MortarFiring.c @@ -0,0 +1,221 @@ +// The dedicated manpack operator has no mortar-shell backpack. Preserve the +// native chooser and its caller's original index for every eligible gunner. +modded class SCR_AIStaticArtilleryActivity +{ + protected override AIAgent FindBestAgentForArtillery(notnull array agents, notnull IEntity artilleryEntity, out int outIndex) + { + ERR_MortarSystem system = ERR_MortarSystem.Get(); + ERR_MortarBattery battery; + if (system) battery = system.FindGun(artilleryEntity); + if (!battery) return super.FindBestAgentForArtillery(agents, artilleryEntity, outIndex); + array gunners = {}; + foreach (AIAgent agent : agents) + { + if (agent && agent.GetControlledEntity() != battery.RadioOperator && ERR_Actors.CanFight(agent.GetControlledEntity())) + gunners.Insert(agent); + } + int filteredIndex; + AIAgent selected = super.FindBestAgentForArtillery(gunners, artilleryEntity, filteredIndex); + outIndex = -1; + if (selected) outIndex = agents.Find(selected); + return selected; + } +} + +// Leave all other artillery (including player-operated captured guns) native. +modded class SCR_AIGetArtilleryAimDistanceCompensation +{ + override ENodeResult EOnTaskSimulate(AIAgent owner, float dt) + { + IEntity gun; + GetVariableIn(PORT_ARTILLERY_ENTITY, gun); + ERR_MortarSystem system = ERR_MortarSystem.Get(); + ERR_MortarBattery battery; + if (system) + battery = system.FindGun(gun); + if (!battery) + return super.EOnTaskSimulate(owner, dt); + battery.AimedAt = -1; + float now = GetGame().GetWorld().GetWorldTime(); + ERR_HQReport report = system.Latest(battery, now); + if (!ERR_HQ.MissionActive()) { system.Withhold(battery, "aim: mission inactive"); return ENodeResult.FAIL; } + if (!battery.CommandOpen || battery.OrderShots >= ERR_MortarSalvo.ROUNDS) { system.Withhold(battery, "aim: salvo complete or order closed"); return ENodeResult.FAIL; } + if (battery.Released) { system.Withhold(battery, "aim: waiting for committed projectile"); return ENodeResult.FAIL; } + if (!report) { system.Withhold(battery, "aim: " + system.ContactFailure(battery)); return ENodeResult.FAIL; } + battery.Trace("AIM START", "solving moving intercept", string.Format("latest source=M%1; %2", report.MessageId, report.Description(now))); + ResourceName ammo; + GetVariableIn(PORT_AMMO_PREFAB, ammo); + if (ammo != ERR_MortarBattery.SHELL) { system.Withhold(battery, "unsupported ammunition prefab", ammo); return ENodeResult.FAIL; } + Resource resource = Resource.Load(ammo); + if (!resource || !resource.IsValid() || !resource.GetResource()) { system.Withhold(battery, "shell resource load failed", ammo); return ENodeResult.FAIL; } + IEntitySource source = resource.GetResource().ToEntitySource(); + if (!source) { system.Withhold(battery, "shell resource has no entity source", ammo); return ENodeResult.FAIL; } + array coefficients = {}; + GetAmmoInitialSpeedCoefficients(ammo, coefficients); + if (coefficients.IsEmpty()) + coefficients.Insert(1.0); + float minimum, maximum; + GetVerticalAimLimits(gun, minimum, maximum); + float flight = 30; + float offset; + int charge; + vector impact; + vector salvoOffset = ERR_MortarSalvo.Offset(battery.SiteId, battery.OrderId, battery.OrderShots); + bool converged; + // Iterate the moving intercept using the native shell's flight time. + // Reject non-convergence rather than fire with an arbitrary lead time. + for (int iteration = 0; iteration < 4; iteration++) + { + if (!ERR_MortarPrediction.Predict(report, now, flight + 2, impact)) { system.Withhold(battery, "aim prediction: " + ERR_MortarPrediction.FailureReason, string.Format("flight lead=%1s; %2", flight + 2, report.Description(now))); return ENodeResult.FAIL; } + if (!system.OutsideSettlements(impact)) { system.Withhold(battery, "aim target inside settlement exclusion", system.SettlementReason); return ENodeResult.FAIL; } + impact += salvoOffset; + impact[1] = SCR_TerrainHelper.GetTerrainY(impact); + float distance = vector.DistanceXZ(gun.GetOrigin(), impact); + float altitude = impact[1] - gun.GetOrigin()[1]; + if (distance < 350 || distance > 4000) { system.Withhold(battery, "predicted impact out of range", string.Format("iteration=%1 distance=%2m impact=%3 allowed=350..4000m", iteration, distance, impact)); return ENodeResult.FAIL; } + bool reachable; + float calculated; + for (int i = 0; i < coefficients.Count(); i++) + { + if (!BallisticTable.GetAimHeightOfProjectileAltitudeFromSource(distance, offset, calculated, source, altitude, coefficients[i])) + continue; + float tangent = (offset + altitude) / distance; + if (calculated <= 0 || calculated > 75 || tangent < Math.Tan(minimum) || tangent > Math.Tan(maximum)) + continue; + charge = i; + reachable = true; + break; + } + if (!reachable) { system.Withhold(battery, "no native ballistic solution within elevation/flight-time limits", string.Format("iteration=%1 distance=%2 altitude=%3 charges=%4 elevation radians=%5..%6 flight limit=75s", iteration, distance, altitude, coefficients.Count(), minimum, maximum)); return ENodeResult.FAIL; } + converged = Math.AbsFloat(calculated - flight) < 1; + flight = calculated; + if (converged) + break; + } + if (!converged) { system.Withhold(battery, "moving intercept did not converge in four iterations"); return ENodeResult.FAIL; } + if (!system.Safe(battery, impact, flight + 2)) { system.Withhold(battery, "aim impact safety rejected", system.SafetyReason); return ENodeResult.FAIL; } + battery.Impact = impact; + battery.AimOffset = salvoOffset; + battery.AimedShot = battery.OrderShots; + battery.FlightTime = flight; + battery.AimedAt = now; + battery.LastFailure = ""; + battery.Trace("AIM SOLUTION", "ready", string.Format("predicted impact=%1 flight=%2s charge index=%3 aim height offset=%4m latest source=M%5", impact, flight, charge, offset, report.MessageId)); + vector aim = impact + Vector(0, offset, 0); + SetVariableOut(PORT_AIM_POS, aim); + SetVariableOut(PORT_INIT_SPEED_ID, charge); + return ENodeResult.SUCCESS; + } +} + +modded class SCR_AIShootStaticArtillery +{ + override ENodeResult EOnTaskSimulate(AIAgent owner, float dt) + { + IEntity gun; + GetVariableIn(PORT_ARTILLERY_ENTITY, gun); + ERR_MortarSystem system = ERR_MortarSystem.Get(); + ERR_MortarBattery battery; + if (system) + battery = system.FindGun(gun); + if (battery && !system.AllowShot(battery)) + { + battery.Trace("SHOOT NODE", "authorization rejected", battery.LastFailure); + return ENodeResult.FAIL; + } + ENodeResult result = super.EOnTaskSimulate(owner, dt); + if (battery) + battery.Trace("SHOOT NODE", string.Format("native result=%1", result), "authorization passed; node result does not confirm a physical shot"); + return result; + } +} + +modded class SCR_MortarMuzzleComponent +{ + protected override void TransferShellToMortar() + { + ERR_MortarSystem system = ERR_MortarSystem.Get(); + ERR_MortarBattery battery; + if (system && m_CharController && !EntityUtils.IsPlayer(m_CharController.GetOwner())) + battery = system.FindGun(GetOwner()); + if (battery) + { + // The loading animation takes time. Recheck at the actual transfer, + // before native inventory insertion triggers the physical projectile. + if (!system.AllowShot(battery)) + { + if (m_ShellComponent) + { + m_ShellComponent.GetOnShellUsed().Remove(TransferShellToMortar); + m_ShellComponent.SetLoadedState(false); + } + CharacterAnimationComponent animation = m_CharController.GetAnimationComponent(); + if (animation && animation.GetCommandHandler()) + animation.GetCommandHandler().FinishItemUse(false); + battery.Audit("ABORT", "final shell transfer rejected; " + battery.LastFailure); + return; + } + battery.Released = true; + battery.ReserveShellAirspace(GetGame().GetWorld().GetWorldTime()); + battery.Audit("SHELL COMMIT", string.Format("final safety passed; gunner=%1 predicted impact=%2 flight=%3s; invoking native transfer, awaiting projectile event", m_CharController.GetOwner(), battery.Impact, battery.FlightTime)); + } + super.TransferShellToMortar(); + } + + override void OnWeaponFired(IEntity effectEntity, BaseMuzzleComponent muzzle, IEntity projectileEntity) + { + IEntity firingCharacter; + if (m_CharController) firingCharacter = m_CharController.GetOwner(); + super.OnWeaponFired(effectEntity, muzzle, projectileEntity); + ERR_MortarSystem system = ERR_MortarSystem.Get(); + ERR_MortarBattery battery; + if (system) + battery = system.FindGun(GetOwner()); + if (!battery) + return; + bool playerGunner; + if (firingCharacter) playerGunner = EntityUtils.IsPlayer(firingCharacter); + battery.ObserveProjectile(projectileEntity, firingCharacter, playerGunner); + } +} + +// The native tree normally re-aims only every five shots (and skips the first +// re-aim). Each salvo shell needs its own spread point and fresh authorization. +modded class SCR_AIStaticArtilleryBehavior +{ + ERR_MortarBattery ERR_GetMortarBattery() + { + ERR_MortarSystem system = ERR_MortarSystem.Get(); + if (!system) return null; + return system.FindGun(m_ArtilleryEntity.m_Value); + } +} + +modded class SCR_AIStaticArtilleryBehavior_ShootingLogic +{ + override ENodeResult EOnTaskSimulate(AIAgent owner, float dt) + { + ERR_MortarBattery battery; + SCR_AIStaticArtilleryBehavior behavior; + if (m_Utility) + { + behavior = SCR_AIStaticArtilleryBehavior.Cast(m_Utility.GetExecutedAction()); + if (behavior) battery = behavior.ERR_GetMortarBattery(); + } + if (battery) + { + if (!battery.CommandOpen) return ENodeResult.FAIL; + // Loading can outlast the native pause. Count confirmed shells only. + if (battery.OrderShots <= behavior.GetShotCount()) return ENodeResult.RUNNING; + } + ENodeResult result = super.EOnTaskSimulate(owner, dt); + if (battery && result == ENodeResult.SUCCESS) + { + SetVariableOut(PORT_AIMING_NEEDED, true); + // Transfer existing nearby crew ammunition before the next native load. + if (battery.CommandOpen && battery.OrderShots < ERR_MortarSalvo.ROUNDS) + battery.SupplyGunner(); + } + return result; + } +} diff --git a/addons/ai/Scripts/Game/ERR/ERR_MortarSystem.c b/addons/ai/Scripts/Game/ERR/ERR_MortarSystem.c new file mode 100644 index 0000000..23ba25f --- /dev/null +++ b/addons/ai/Scripts/Game/ERR/ERR_MortarSystem.c @@ -0,0 +1,216 @@ +// Owned and ticked by HQ. Initial assets are authored once; losses are never replaced. +class ERR_MortarSystem +{ + protected ERR_HQ m_HQ; + protected ref array m_Batteries = {}; + protected ref ERR_SettlementSafety m_Settlements = new ERR_SettlementSafety(); + protected bool m_Prepared; + protected bool m_Stopped; + protected float m_NextDecision; + string SafetyReason; + string SettlementReason; + + void ERR_MortarSystem(ERR_HQ hq) { m_HQ = hq; } + static ERR_MortarSystem Get() + { + ERR_HQ hq = ERR_HQ.Get(); + if (!hq || !Replication.IsServer()) return null; + return hq.Mortars(); + } + static bool NearPlayer(vector position) + { + array players = {}; + ERR_Actors.Players(players); + foreach (IEntity player : players) + if (vector.DistanceXZ(player.GetOrigin(), position) <= 1200) return true; + return false; + } + bool Prepare() + { + if (!Replication.IsServer() || m_Prepared || m_Stopped) return false; + m_Prepared = true; + vector position = ERR_Actors.Ground("6000 0 7000"); + if (position[1] < 1) return false; + IEntity gun = ERR_Actors.Spawn(ERR_MortarBattery.GUN, position); + SCR_AIGroup group = SCR_AIGroup.Cast(ERR_Actors.Spawn(MortarGroup(), ERR_Actors.Ground(position + "0 0 4"))); + if (!gun || !group) + { + ERR_Actors.DeleteSpawned(gun); + ERR_Actors.DeleteSpawned(group); + return false; + } + group.InitFactionKey("USSR"); + FactionAffiliationComponent affiliation = FactionAffiliationComponent.Cast(gun.FindComponent(FactionAffiliationComponent)); + if (affiliation) affiliation.SetAffiliatedFaction(ERR_GameMode.Get().EnemyFaction()); + ERR_MortarBattery battery = new ERR_MortarBattery(); + battery.Bind(1, group, gun, GetGame().GetWorld().GetWorldTime()); + m_Batteries.Insert(battery); + ERR_GameMode mode = ERR_GameMode.Get(); + mode.Own(gun); + mode.RegisterGroup(group); + m_HQ.ReserveGroup(group); + battery.Audit("DEPLOY", "authored gun and four-person crew; finite ammunition initialization pending"); + return true; + } + static ResourceName MortarGroup() { return "{B84C05941C4C81B8}Prefabs/ERR/MortarCrew.et"; } + ERR_MortarBattery FindGun(IEntity gun) + { + foreach (ERR_MortarBattery battery : m_Batteries) + if (gun && battery.Gun == gun) return battery; + return null; + } + ERR_MortarBattery FindGroup(SCR_AIGroup group) + { + foreach (ERR_MortarBattery battery : m_Batteries) + if (group && battery.Group == group) return battery; + return null; + } + ERR_HQReport Latest(ERR_MortarBattery battery, float now) + { + // Only the coordinates actually delivered to this battery are available. + // A newer HQ contact cannot update a gun's knowledge without another downlink. + if (!battery || !ERR_MortarPrediction.Fresh(battery.Report, now)) return null; + return battery.Report; + } + string ContactFailure(ERR_MortarBattery battery) + { + if (!battery.Report) return "no delivered target report"; + return "delivered target report expired or invalid"; + } + bool OutsideSettlements(vector impact) + { + bool clear = m_Settlements.OutsideSettlements(impact); + SettlementReason = m_Settlements.SettlementReason; + return clear; + } + bool Safe(ERR_MortarBattery battery, vector impact, float flight) + { + SafetyReason = "clear"; + if (!battery.Operational()) { SafetyReason = battery.OperationalReason(); return false; } + if (!OutsideSettlements(impact)) { SafetyReason = SettlementReason; return false; } + if (SCR_TerrainHelper.GetTerrainY(impact) < 0) { SafetyReason = "impact below Everon sea level"; return false; } + Faction faction = battery.Group.GetFaction(); + if (!faction) { SafetyReason = "battery faction missing"; return false; } + array friendlies = {}; + m_HQ.PhysicalForces(friendlies); + foreach (IEntity entity : friendlies) + { + Faction friendly = SCR_FactionManager.SGetFaction(entity); + if (!friendly || faction.IsFactionEnemy(friendly) || !ERR_Actors.Alive(entity)) continue; + vector velocity; + IEntity moving = CompartmentAccessComponent.GetVehicleIn(entity); + if (!moving) moving = entity; + if (moving.GetPhysics()) velocity = moving.GetPhysics().GetVelocity(); + if (ERR_MortarPrediction.ThreatensFriendly(impact, entity.GetOrigin(), velocity, flight)) + { + SafetyReason = "friendly physical force can enter the impact area"; + return false; + } + } + return true; + } + bool Withhold(ERR_MortarBattery battery, string reason, string detail = "") + { + battery.LastFailure = reason + "; " + detail; + battery.Trace("WITHHELD", reason, detail); + // Finish the activity from the next HQ tick, never from inside its own node. + battery.Rejected = true; + return false; + } + bool AllowShot(ERR_MortarBattery battery) + { + float now = GetGame().GetWorld().GetWorldTime(); + if (!ERR_HQ.MissionActive()) return Withhold(battery, "mission inactive"); + if (!battery.Operational()) return Withhold(battery, battery.OperationalReason()); + if (!battery.CommandOpen || battery.OrderShots >= ERR_MortarSalvo.ROUNDS) return Withhold(battery, "salvo complete or order closed"); + if (battery.Released) return Withhold(battery, "waiting for committed projectile"); + if (battery.AimedShot != battery.OrderShots || battery.AimedAt < 0 || now - battery.AimedAt > 10000) return Withhold(battery, "fresh aim solution required"); + ERR_HQReport report = Latest(battery, now); + if (!report) return Withhold(battery, ContactFailure(battery)); + vector updated; + if (!ERR_MortarPrediction.Predict(report, now, battery.FlightTime, updated)) return Withhold(battery, ERR_MortarPrediction.FailureReason); + updated += battery.AimOffset; + if (vector.DistanceXZ(updated, battery.Impact) > 60) return Withhold(battery, "predicted target left aimed impact area"); + if (!OutsideSettlements(updated)) return Withhold(battery, SettlementReason); + if (!Safe(battery, battery.Impact, battery.FlightTime)) return Withhold(battery, SafetyReason); + return true; + } + protected void AdvanceOrder(ERR_MortarBattery battery, float now) + { + if (!battery.RadioOrder) return; + int state = battery.RadioOrder.Advance(now, m_HQ.Journal()); + if (state == 0) return; + ERR_HQReport delivered = battery.PendingRadioReport; + battery.RadioOrder = null; + battery.PendingRadioReport = null; + if (state < 0 || !ERR_MortarPrediction.Fresh(delivered, now) || !battery.Operational() || battery.Activity || !battery.SupplyGunner()) + { + battery.Cancel("radio delivery, report freshness or gunner availability failed"); + battery.NextOrder = now + 10000; + return; + } + battery.Order(delivered, now); + } + void Tick(float now) + { + if (m_Stopped || !Replication.IsServer()) return; + foreach (ERR_MortarBattery battery : m_Batteries) + { + if (battery.Rejected && !battery.Released) + { + battery.Cancel("native aim or firing authorization rejected"); + battery.NextOrder = now + 10000; + } + battery.Rejected = false; + battery.Update(now); + AdvanceOrder(battery, now); + } + if (now < m_NextDecision) return; + m_NextDecision = now + 10000; + array reports = {}; + m_HQ.SupportContacts(reports, now); + ERR_MortarBattery selected; + ERR_HQReport target; + float distance = float.MAX; + foreach (ERR_MortarBattery battery : m_Batteries) + { + if (!battery.StartupActivated || !battery.Operational() || battery.Activity || battery.RadioOrder || now < battery.NextOrder || battery.CountShells() == 0) continue; + foreach (ERR_HQReport report : reports) + { + float candidate = vector.DistanceXZ(battery.Position, report.Position); + if (candidate < 350 || candidate > 4000 || candidate >= distance || !OutsideSettlements(report.Position)) continue; + selected = battery; + target = report; + distance = candidate; + } + } + if (!selected || !target) return; + ERR_HQRoute route = m_HQ.Downlink(selected.Group, "MORTAR ORDER", target.Description(now), target.MessageId); + if (!route) return; + selected.BeginRequest(target, now); + selected.RadioId = route.MessageId; + selected.RadioOrder = route; + selected.PendingRadioReport = target.Snapshot(); + m_NextDecision = now + 20000; + } + void AppendGuns(array entities) + { + foreach (ERR_MortarBattery battery : m_Batteries) + if (battery.Gun && !entities.Contains(battery.Gun)) entities.Insert(battery.Gun); + } + string Status() + { + int ready, shells; + foreach (ERR_MortarBattery battery : m_Batteries) + { + if (battery.StartupActivated && battery.Operational()) ready++; + shells += battery.CountShells(); + } + return string.Format("mortars %1/%2; HE shells %3", ready, m_Batteries.Count(), shells); + } + void Stop() + { + m_Stopped = true; + foreach (ERR_MortarBattery battery : m_Batteries) battery.Cancel("HQ stopped"); + } +} diff --git a/addons/ai/Scripts/Game/ERR/ERR_SettlementSafety.c b/addons/ai/Scripts/Game/ERR/ERR_SettlementSafety.c new file mode 100644 index 0000000..f76d2ba --- /dev/null +++ b/addons/ai/Scripts/Game/ERR/ERR_SettlementSafety.c @@ -0,0 +1,63 @@ +// Vanilla named settlements supply exclusion areas; no original mission location system. +// Shared town/village exclusion for mortar impacts, roadblocks and mine sites. +// Fixed distance from mapped settlement centres, independent of mission +// activation radii. Scattered buildings and props are not settlements. +class ERR_SettlementSafety +{ + static const float RADIUS = 200; + string SettlementReason; + protected vector m_SafeImpact; + protected bool m_SettlementNear; + protected vector m_LastSettlementImpact; + protected float m_LastSettlementCheck = -1; + protected bool m_LastSettlementClear; + + bool OutsideSettlements(vector impact) + { + float now = GetGame().GetWorld().GetWorldTime(); + if (m_LastSettlementCheck >= 0 && now >= m_LastSettlementCheck && now - m_LastSettlementCheck < 1000 && vector.DistanceXZ(impact, m_LastSettlementImpact) == 0) + return m_LastSettlementClear; + m_LastSettlementCheck = now; + m_LastSettlementImpact = impact; + m_LastSettlementClear = false; + m_SafeImpact = impact; + m_SettlementNear = false; + SettlementReason = "clear"; + // Also cover named native map settlements, independent of whether the + // mission placed a garrison marker there. Generic building entities also + // include deer stands, bridge pillars, rubble and electrical cabinets. + // Broad vertical bounds keep the 200m distance horizontal on hills. + GetGame().GetWorld().QueryEntitiesByAABB(impact - Vector(RADIUS, 5000, RADIUS), impact + Vector(RADIUS, 5000, RADIUS), CheckSettlement, FilterSettlement, EQueryEntitiesFlags.ALL); + m_LastSettlementClear = !m_SettlementNear; + return m_LastSettlementClear; + } + + protected bool FilterSettlement(IEntity entity) + { + return entity && entity.FindComponent(MapDescriptorComponent); + } + + protected bool CheckSettlement(IEntity entity) + { + float radius; + MapDescriptorComponent descriptor = MapDescriptorComponent.Cast(entity.FindComponent(MapDescriptorComponent)); + if (descriptor) + { + int type = descriptor.GetBaseType(); + if (type == EMapDescriptorType.MDT_NAME_CITY) + radius = RADIUS; + else if (type == EMapDescriptorType.MDT_NAME_TOWN) + radius = RADIUS; + else if (type == EMapDescriptorType.MDT_NAME_VILLAGE || type == EMapDescriptorType.MDT_NAME_SETTLEMENT) + radius = RADIUS; + } + if (radius > 0 && vector.DistanceXZ(m_SafeImpact, entity.GetOrigin()) <= radius) + { + m_SettlementNear = true; + SettlementReason = string.Format("named map settlement entity=%1 position=%2 distance=%3m exclusion=%4m", entity, entity.GetOrigin(), vector.DistanceXZ(m_SafeImpact, entity.GetOrigin()), radius); + return false; + } + return true; + } + +} diff --git a/addons/ai/Scripts/Game/ERR/ERR_SupportScenario.c b/addons/ai/Scripts/Game/ERR/ERR_SupportScenario.c new file mode 100644 index 0000000..1cb5412 --- /dev/null +++ b/addons/ai/Scripts/Game/ERR/ERR_SupportScenario.c @@ -0,0 +1,9 @@ +modded class ERR_ScenarioComponent +{ + protected override bool PrepareAdditionalForces() + { + if (!super.PrepareAdditionalForces()) return false; + ERR_HQ hq = ERR_HQ.Get(); + return hq && hq.PrepareSupport(); + } +} diff --git a/addons/chat/Scripts/Game/ERR/ERR_NativeMortarProbe.c b/addons/chat/Scripts/Game/ERR/ERR_NativeMortarProbe.c new file mode 100644 index 0000000..74516fd --- /dev/null +++ b/addons/chat/Scripts/Game/ERR/ERR_NativeMortarProbe.c @@ -0,0 +1,10 @@ +#ifdef WORKBENCH +modded class ERR_MortarSystem +{ + ERR_MortarBattery ERR_ProbeBattery() + { + if (m_Batteries.Count() != 1) return null; + return m_Batteries[0]; + } +} +#endif diff --git a/addons/chat/Scripts/Game/ERR/ERR_NativeRadioProbe.c b/addons/chat/Scripts/Game/ERR/ERR_NativeRadioProbe.c index 601f07c..f6a35e5 100644 --- a/addons/chat/Scripts/Game/ERR/ERR_NativeRadioProbe.c +++ b/addons/chat/Scripts/Game/ERR/ERR_NativeRadioProbe.c @@ -4,8 +4,9 @@ modded class ERR_HQ { vector ERR_ProbeResponseOrigin() { - if (m_Units.IsEmpty() || !m_Units[0].Group) return vector.Zero; - return m_Units[0].Group.GetOrigin() + "0 0 20"; + foreach (ERR_HQUnit unit : m_Units) + if (!unit.ReservedForSupport && unit.Group) return unit.Group.GetOrigin() + "0 0 20"; + return vector.Zero; } bool ERR_ProbeDeliveredResponse() { @@ -22,7 +23,7 @@ modded class ERR_HQ if (!unit.Assignment || waypoints.Contains(unit.Waypoint)) return false; waypoints.Insert(unit.Waypoint); } - return m_Units.Count() == 3 && waypoints.Count() > 0 && Assigned() <= m_Mode.Settings().Get("supportSquadLimit"); + return waypoints.Count() > 0 && Assigned() <= m_Mode.Settings().Get("supportSquadLimit"); } string ERR_ProbePerception() { @@ -47,15 +48,17 @@ modded class ERR_HQ } bool ERR_ProbeSquadsReady() { - if (m_Units.Count() != 3) return false; + int infantry; foreach (ERR_HQUnit unit : m_Units) { + if (unit.ReservedForSupport) continue; + infantry++; if (!unit.Group || ERR_HQRadio.Capability(unit.Radio) != 2) return false; array agents = {}; unit.Group.GetAgents(agents); if (agents.Count() != 6) return false; } - return true; + return infantry == 3; } } diff --git a/addons/chat/Scripts/Game/ERR/ERR_NativeSmoke.c b/addons/chat/Scripts/Game/ERR/ERR_NativeSmoke.c index bf30553..be911e7 100644 --- a/addons/chat/Scripts/Game/ERR/ERR_NativeSmoke.c +++ b/addons/chat/Scripts/Game/ERR/ERR_NativeSmoke.c @@ -13,6 +13,7 @@ modded class ERR_GameMode protected bool m_ERRTestPlayerDeath; protected bool m_ERRTestRadioNetwork; protected bool m_ERRTestHQResponse; + protected bool m_ERRTestMortar; protected float m_ERRNextProbeLog; protected ref ERR_NativeRadioProbe m_ERRRadioProbe; protected ref array m_ERRCacheFolders = {}; @@ -26,7 +27,8 @@ modded class ERR_GameMode m_ERRTestLostHelicopter = System.GetCLIParam("errSmokeOutcome", outcome) && outcome == "lost-helicopter"; m_ERRTestRadioNetwork = outcome == "radio-network"; m_ERRTestHQResponse = outcome == "hq-response"; - m_ERRTestPlayerDeath = outcome == "player-death" || m_ERRTestRadioNetwork || m_ERRTestHQResponse; + m_ERRTestMortar = outcome == "mortar-inventory"; + m_ERRTestPlayerDeath = outcome == "player-death" || m_ERRTestRadioNetwork || m_ERRTestHQResponse || m_ERRTestMortar; m_ERRSmokeDeadline = GetWorld().GetWorldTime() + 150000; OnPhaseChanged().Insert(ERR_SmokePhase); GetGame().GetCallqueue().CallLater(ERR_SmokeTick, 500, true); @@ -117,6 +119,12 @@ modded class ERR_GameMode if (players.Count() != 1 || Phase() != ERR_Phase.PRISON) return; m_ERRSmokePlayer = players[0]; if (!ERR_CheckRoster()) return; + if (m_ERRTestMortar) + { + DamageManagerComponent.Cast(m_ERRSmokePlayer.FindComponent(DamageManagerComponent)).EnableDamageHandling(false); + m_ERRSmokeStep = 120; + return; + } if (m_ERRTestHQResponse) { DamageManagerComponent.Cast(m_ERRSmokePlayer.FindComponent(DamageManagerComponent)).EnableDamageHandling(false); @@ -227,6 +235,45 @@ modded class ERR_GameMode m_ERRSmokeStep = 7; m_ERRSmokeWait = now + 3000; } + else if (m_ERRSmokeStep == 120) + { + ERR_MortarBattery battery = ERR_MortarSystem.Get().ERR_ProbeBattery(); + if (!battery || !battery.StartupActivated) return; + if (!ERR_Check(battery.Operational() && battery.Group.GetAgentsCount() == 4, "authored physical mortar and four-person crew initialize")) return; + if (!ERR_Check(ERR_HQRadio.Capability(battery.RadioOperator) == 2, "mortar has a dedicated physical manpack operator")) return; + if (!ERR_Check(battery.CountShells() == 27, "mortar starts with exactly 27 physical HE shells")) return; + array agents = {}; + battery.Group.GetAgents(agents); + foreach (AIAgent agent : agents) + { + InventoryStorageManagerComponent inventory = InventoryStorageManagerComponent.Cast(agent.GetControlledEntity().FindComponent(InventoryStorageManagerComponent)); + array items = {}; + inventory.GetItems(items); + foreach (IEntity item : items) + if (item && item.GetPrefabData() && item.GetPrefabData().GetPrefabName() == ERR_MortarBattery.SHELL) SCR_EntityHelper.DeleteEntityAndChildren(item); + } + m_ERRSmokeStep = 121; + m_ERRSmokeWait = now + 15000; + } + else if (m_ERRSmokeStep == 121) + { + ERR_MortarBattery battery = ERR_MortarSystem.Get().ERR_ProbeBattery(); + if (!ERR_Check(battery.CountShells() == 0 && battery.TotalShots == 0, "depleted mortar inventory stays empty without fabricated ammunition")) return; + ERR_Actors.DeleteSpawned(battery.Gun); + ERR_Actors.DeleteSpawned(battery.Group); + m_ERRSmokeStep = 122; + m_ERRSmokeWait = now + 12000; + } + else if (m_ERRSmokeStep == 122) + { + ERR_MortarBattery battery = ERR_MortarSystem.Get().ERR_ProbeBattery(); + if (!ERR_Check(battery && !battery.Gun && !battery.Group && !battery.Operational(), "lost mortar and crew remain lost without replacement spawning")) return; + m_ERRSmokeStep = 9; + SCR_CharacterDamageManagerComponent damage = SCR_CharacterDamageManagerComponent.Cast(m_ERRSmokePlayer.FindComponent(SCR_CharacterDamageManagerComponent)); + damage.EnableDamageHandling(true); + damage.Kill(Instigator.CreateInstigator(m_ERRSmokePlayer)); + m_ERRSmokeWait = now + 4000; + } else if (m_ERRSmokeStep == 110) { ERR_HQ hq = ERR_HQ.Cast(Command()); diff --git a/addons/core/Scripts/Game/ERR/ERR_ScenarioComponent.c b/addons/core/Scripts/Game/ERR/ERR_ScenarioComponent.c index 82eb5c6..2a4b89b 100644 --- a/addons/core/Scripts/Game/ERR/ERR_ScenarioComponent.c +++ b/addons/core/Scripts/Game/ERR/ERR_ScenarioComponent.c @@ -62,10 +62,13 @@ class ERR_ScenarioComponent : ScriptComponent group.AddWaypoint(defend); GetGame().GetCallqueue().CallLater(RegisterGroup, 2000, false, group); } + if (!PrepareAdditionalForces()) { Rollback(); return false; } foreach (IEntity entity : m_Spawned) mode.Own(entity); return true; } + protected bool PrepareAdditionalForces() { return true; } + protected vector TablePoint(vector lower, vector upper, float along, float across) { float x = along; diff --git a/docs/acceptance.json b/docs/acceptance.json index a779de4..34517e9 100644 --- a/docs/acceptance.json +++ b/docs/acceptance.json @@ -133,6 +133,14 @@ "docs/evidence/native-2026-09-19-013224/runner.json.txt", "docs/evidence/native-2026-09-19-013224/source-sha256.json" ] + }, + "scripted_mortar_inventory_losses": { + "status": "passed", + "scope": "Two headless muted local Workbench rounds; 30 assertions. One authored gun, four physical crew, manpack, 27 inventory shells; removed ammunition and destroyed assets stay depleted/lost. Actual mortar firing remains unverified. Seven inherited vehicle schema errors remain.", + "evidence": [ + "docs/evidence/native-2026-09-19-014052/report.json", + "docs/evidence/native-2026-09-19-014052/source-sha256.json" + ] } } } diff --git a/docs/architecture.md b/docs/architecture.md index c410f75..9f9371f 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -14,7 +14,7 @@ Physical group members observe through vanilla AI perception. `ERR_HQObservation The coordinator is the sole source of strategic response orders. Individual units retain vanilla tactical combat. It does not spawn reinforcements when alerted. Initial physical forces are authored by the scenario. No distant-unit virtual simulation is implemented. -The current coordinator is a reduced implementation. Full contact scheduling, supporting aircraft, mortar firing and physical logistics are not operational yet. The migrated availability/prediction/salvo helpers must not be mistaken for those controllers. +The current coordinator is a reduced implementation. Full contact scheduling, supporting aircraft and physical logistics remain incomplete. A finite physical mortar controller now compiles; its initialization, ammunition depletion and permanent asset loss pass local tests. Actual firing has not been validated. Aircraft availability helpers must not be mistaken for an operational controller. ## Bounded work and ownership diff --git a/docs/evidence/native-2026-09-19-014052/console.log.txt b/docs/evidence/native-2026-09-19-014052/console.log.txt new file mode 100644 index 0000000..c8206fb --- /dev/null +++ b/docs/evidence/native-2026-09-19-014052/console.log.txt @@ -0,0 +1,630 @@ +--------------------------------------------- +Log Z:\tmp\erri-workbench-profile\logs\logs_2026-09-19_01-40-52\console.log started at 2026-09-19 01:40:52 (2026-09-18 23:40:52 UTC) + +01:40:52.637 ENGINE : FileSystem: Adding relative directory 'Z:\tmp\erri-workbench-profile\logs\logs_2026-09-19_01-40-52' to filesystem under name logs +01:40:52.637 ENGINE : FileSystem: Adding relative directory 'Z:\tmp\erri-workbench-profile\profile' to filesystem under name profile +01:40:52.637 ENGINE : FileSystem: Current working directory: 'Z:\home\jakub\.local\share\Steam\steamapps\common\Arma Reforger Tools\Workbench\' +01:40:52.639 PROFILING : Workbench Create Engine took: 12.101900 ms +01:40:53.674 INIT : INIT : Workbench Init Engine +01:40:53.674 ENGINE : Initializing engine, version 192142 +01:40:53.674 ENGINE : CLI Params: -gproj Z:/home/jakub/devel/escapistsrereintroduced/addons/chat/addon.gproj -addonsDir Z:/home/jakub/devel/escapistsrereintroduced/addons -profile Z:/tmp/erri-workbench-profile -logconsole -wbModule WorldEditor -load Worlds/ERR_Everon.ent -plugin ERR_ValidateWorldPlugin -errPlay 1 -errSmoke 1 -errSmokeOutcome mortar-inventory -noThrow +01:40:53.682 ENGINE : Addon dirs: +01:40:53.682 ENGINE : dir: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/chat/' +01:40:53.682 ENGINE : dir: 'Z:/home/jakub/devel/escapistsrereintroduced/addons' +01:40:53.682 ENGINE : dir: './addons' +01:40:53.682 ENGINE : dir: 'Z:/tmp/erri-workbench-profile/addons' +01:40:53.682 ENGINE : Available addons: +01:40:53.682 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/chat/addon.gproj' guid: 'FA804F411BDDF2C6' +01:40:53.682 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/ai/addon.gproj' guid: '5192138CB9D5B911' +01:40:53.682 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/core/addon.gproj' guid: '2528466DE220D91C' +01:40:53.682 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/intel/addon.gproj' guid: 'D31039C7C53E348A' +01:40:53.682 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/map/addon.gproj' guid: '9AAEE9041D79809E' +01:40:53.682 ENGINE : gproj: './addons/core/core.gproj' guid: '5614BBCCBB55ED1C' (packed) +01:40:53.682 ENGINE : gproj: 'Z:/tmp/erri-workbench-profile/addons/ArmaReforger/ArmaReforger.gproj' guid: '58D0FB3206B6F859' (packed) +01:40:53.683 ENGINE : FileSystem: Adding relative directory 'Z:\home\jakub\devel\escapistsrereintroduced\addons\chat' to filesystem under name ERR_Chat +01:40:53.683 ENGINE : FileSystem: Adding relative directory 'Z:\home\jakub\devel\escapistsrereintroduced\addons\map' to filesystem under name ERR_Map +01:40:53.684 ENGINE : FileSystem: Adding relative directory 'Z:\home\jakub\devel\escapistsrereintroduced\addons\intel' to filesystem under name ERR_Intel +01:40:53.684 ENGINE : FileSystem: Adding relative directory 'Z:\home\jakub\devel\escapistsrereintroduced\addons\ai' to filesystem under name ERR_Ai +01:40:53.684 ENGINE : FileSystem: Adding relative directory 'Z:\home\jakub\devel\escapistsrereintroduced\addons\core' to filesystem under name ERR_Core +01:40:53.800 ENGINE : FileSystem: Adding package 'Z:/tmp/erri-workbench-profile/addons/ArmaReforger/' (pak count: 14) to filesystem under name ArmaReforger +01:40:53.803 ENGINE : FileSystem: Adding package './addons/core/' (pak count: 2) to filesystem under name core +01:40:53.803 ENGINE : CPU vendor : AuthenticAMD +01:40:53.803 ENGINE : CPU type : 2 +01:40:53.803 ENGINE : CPU name : AMD Ryzen 7 3800XT 8-Core Processor +01:40:53.803 ENGINE : CPU cache info : L1 [Inst 32KB, Data 32KB], L2 [Unif 512KB], L3 [Unif 16384KB] +01:40:53.803 ENGINE : CPU count logical : 16 +01:40:53.803 ENGINE : CPU count physical : 8 +01:40:53.803 ENGINE : CPU features : mmx sse sse2 sse3 ssse3 sse4_1 sse4_2 popcnt aesni pclmulqdq osxsave avx sha avx2 +01:40:53.803 RESOURCES : ResourceDB: loading cache (id=0 name=ERR_Chat path=Z:\home\jakub\devel\escapistsrereintroduced\addons\chat/resourceDatabase.rdb) +01:40:53.804 RESOURCES : ResourceDB: loading cache (id=1 name=ERR_Map path=Z:\home\jakub\devel\escapistsrereintroduced\addons\map/resourceDatabase.rdb) +01:40:53.804 RESOURCES : ResourceDB: loading cache (id=2 name=ERR_Intel path=Z:\home\jakub\devel\escapistsrereintroduced\addons\intel/resourceDatabase.rdb) +01:40:53.805 RESOURCES : ResourceDB: loading cache (id=3 name=ERR_Ai path=Z:\home\jakub\devel\escapistsrereintroduced\addons\ai/resourceDatabase.rdb) +01:40:53.805 RESOURCES : ResourceDB: loading cache (id=4 name=ERR_Core path=Z:\home\jakub\devel\escapistsrereintroduced\addons\core/resourceDatabase.rdb) +01:40:53.805 RESOURCES : ResourceDB: loading cache (id=5 name=ArmaReforger path=Z:/tmp/erri-workbench-profile/addons/ArmaReforger/resourceDatabase.rdb) +01:40:53.938 RESOURCES : ResourceDB: loading cache (id=6 name=core path=./addons/core/resourceDatabase.rdb) +01:40:53.940 RESOURCES : ResourceDB: loading cache (id=7 name=profile path=Z:\tmp\erri-workbench-profile\profile/resourceDatabase.rdb) +01:40:53.940 RESOURCES : ResourceDB: loading cache (id=8 name=logs path=Z:\tmp\erri-workbench-profile\logs\logs_2026-09-19_01-40-52/resourceDatabase.rdb) +01:40:54.084 RESOURCES : RESOURCES : ResourceDB: full scan +01:40:54.089 RESOURCES : RESOURCES : scanning... +01:40:54.089 RESOURCES : RESOURCES : scanning @"ERR_Chat" +01:40:54.091 RESOURCES : RESOURCES : scanning @"ERR_Map" +01:40:54.092 RESOURCES : RESOURCES : scanning @"ERR_Intel" +01:40:54.093 RESOURCES : RESOURCES : scanning @"ERR_Ai" +01:40:54.094 RESOURCES : RESOURCES : scanning @"ERR_Core" +01:40:54.096 RESOURCES : RESOURCES : scanning @"ArmaReforger" +01:40:54.231 RESOURCES : RESOURCES : scanning @"core" +01:40:54.235 RESOURCES : RESOURCES : scanning @"profile" +01:40:54.235 RESOURCES : RESOURCES : scanning @"logs" +01:40:54.235 RESOURCES : RESOURCES : processing meta-files... +01:40:54.299 RESOURCES : RESOURCES : processing files... +01:40:54.310 INIT : Workbench startup +01:40:54.310 INIT : Workbench Init Engine +01:40:54.310 RESOURCES : ResourceDB: full scan +01:40:54.310 RESOURCES : processing files... +01:40:54.310 RESOURCES (W): resource not registered: @"$profile:rereintroduced.json". Setting null GUID +01:40:54.310 RESOURCES : RESOURCES : processing folders... +01:40:54.317 RESOURCES : RESOURCES : creating GUID-item mapping... +01:40:54.332 RESOURCES : RESOURCES : building tree... +01:40:54.384 PROFILING : ResourceDB: full scan took: 299.172000 ms +01:40:54.385 RESOURCES : ResourceDB: saving cache (id=0 name=ERR_Chat path=Z:\home\jakub\devel\escapistsrereintroduced\addons\chat/resourceDatabase.rdb) +01:40:54.386 RESOURCES : ResourceDB: written 630/630 bytes +01:40:54.386 RESOURCES : ResourceDB: cache successfully saved +01:40:54.386 RESOURCES : ResourceDB: saving cache (id=1 name=ERR_Map path=Z:\home\jakub\devel\escapistsrereintroduced\addons\map/resourceDatabase.rdb) +01:40:54.387 RESOURCES : ResourceDB: written 804/804 bytes +01:40:54.387 RESOURCES : ResourceDB: cache successfully saved +01:40:54.388 RESOURCES : ResourceDB: saving cache (id=2 name=ERR_Intel path=Z:\home\jakub\devel\escapistsrereintroduced\addons\intel/resourceDatabase.rdb) +01:40:54.389 RESOURCES : ResourceDB: written 227/227 bytes +01:40:54.389 RESOURCES : ResourceDB: cache successfully saved +01:40:54.389 RESOURCES : ResourceDB: saving cache (id=3 name=ERR_Ai path=Z:\home\jakub\devel\escapistsrereintroduced\addons\ai/resourceDatabase.rdb) +01:40:54.391 RESOURCES : ResourceDB: written 985/985 bytes +01:40:54.391 RESOURCES : ResourceDB: cache successfully saved +01:40:54.391 RESOURCES : ResourceDB: saving cache (id=4 name=ERR_Core path=Z:\home\jakub\devel\escapistsrereintroduced\addons\core/resourceDatabase.rdb) +01:40:54.393 RESOURCES : ResourceDB: written 1664/1664 bytes +01:40:54.393 RESOURCES : ResourceDB: cache successfully saved +01:40:54.393 RESOURCES : ResourceDB: saving cache (id=7 name=profile path=Z:\tmp\erri-workbench-profile\profile/resourceDatabase.rdb) +01:40:54.394 RESOURCES : ResourceDB: written 206/206 bytes +01:40:54.394 RESOURCES : ResourceDB: cache successfully saved +01:40:54.394 RESOURCES : ResourceDB: saving cache (id=8 name=logs path=Z:\tmp\erri-workbench-profile\logs\logs_2026-09-19_01-40-52/resourceDatabase.rdb) +01:40:54.396 RESOURCES : ResourceDB: written 81/81 bytes +01:40:54.396 RESOURCES : ResourceDB: cache successfully saved +01:40:54.396 ENGINE : GameProject load +01:40:54.396 ENGINE : Loaded addons: +01:40:54.396 ENGINE : gproj: './addons/core/core.gproj' guid: '5614BBCCBB55ED1C' +01:40:54.396 ENGINE : gproj: 'Z:/tmp/erri-workbench-profile/addons/ArmaReforger/ArmaReforger.gproj' guid: '58D0FB3206B6F859' +01:40:54.396 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/core/addon.gproj' guid: '2528466DE220D91C' +01:40:54.396 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/ai/addon.gproj' guid: '5192138CB9D5B911' +01:40:54.396 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/intel/addon.gproj' guid: 'D31039C7C53E348A' +01:40:54.396 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/map/addon.gproj' guid: '9AAEE9041D79809E' +01:40:54.396 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/chat/addon.gproj' guid: 'FA804F411BDDF2C6' +01:40:54.399 ENGINE : Loading custom engine user config '$profile:.save/app1874910_user76561198020202999/settings/ReforgerEngineSettings.conf' +01:40:54.400 INIT : GameProject engine user settings load @"$profile:.save/app1874910_user76561198020202999/settings/ReforgerEngineSettings.conf" +01:40:54.400 ENGINE : Engine user settings config loaded +01:40:54.400 PROFILING : Settings changed took: 0.002000 ms +01:40:54.503 RENDER : (OK) Adapter 'AMD Radeon RX 6950 XT (RADV NAVI21)' supports feature level 12_0 +01:40:54.504 RENDER : Basic screen setup: +01:40:54.504 RENDER : Back buffer format : TEXFMT_R8G8B8A8_SRGB (29) +01:40:54.504 RENDER : MSAA : none +01:40:54.515 RENDER : AMD AGS library initialized, version 6.1.0 x DLL 6.1.0 +01:40:54.515 RENDER : Extendeded AMD info for AMD Radeon RX 6950 XT (RADV NAVI21) (primary device) +01:40:54.516 RENDER : * architecture RDNA2, 80 CUs, 40 WGPs (for RDNA), 64 ROPs +01:40:54.516 RENDER : * core clocks 2720 MHz, memory 1124 MHz +01:40:54.516 RENDER : * TFlops 27.9, memory bandwidth (562.0 GB/s) +01:40:54.516 RENDER : AMD AGS correctly initialized +01:40:54.516 RENDER : GPU_ATI (0x1002) (AMD Radeon RX 6950 XT (RADV NAVI21)) with 1 GPU detected, VRAM 16128MB (fast 0MB), shared 64362MB, driver version 99.19.02-230831a-396538C-AMD-Software-Adrenalin-Edition +01:40:54.516 RENDER : Detected output devices: +01:40:54.516 RENDER : * 1 device/s connected to AMD Radeon RX 6950 XT (RADV NAVI21): +01:40:54.516 RENDER : Generic Non-PnP Monitor (\\.\DISPLAY1), 1280x720 (offset 0x0), 30Hz +01:40:54.516 RENDER : Concurrent frames limit 2 +01:40:54.592 RENDER : DX12 device successfully created by AMD AGS library +01:40:54.592 RENDER : * user markers not supported in this version AMD SW +01:40:54.592 RENDER : Graphics device features +01:40:54.592 RENDER : Needed: +01:40:54.592 RENDER : * Highest supported shader model: 6.8 (6.0 needed) +01:40:54.592 RENDER : Optional: +01:40:54.592 RENDER : * Allow tearing (VSYNC) : 1 +01:40:54.592 RENDER : * 16 bits : 1 +01:40:54.592 RENDER : * Resource heap tier : 3 +01:40:54.592 RENDER : * Persistent heaps (DRED) : 1 +01:40:54.592 RENDER : * DRED 1.2 is supported by compiler +01:40:54.615 RENDER : Main RT format setup. +01:40:54.615 RENDER : Main RT format for quality 0 : TEXFMT_R11G11B10_FLOAT (26) +01:40:54.615 RENDER : Main RT format for quality 1 : TEXFMT_R16G16B16A16_FLOAT (10) +01:40:54.617 ENGINE : Job system settings: coreCount=16, shortJobContextCount=16, shortJobThreadCount=15, longJobThreadCount=16 +01:40:54.647 PROFILING : Settings changed took: 0.017700 ms +01:40:55.045 AUDIO : Endpoint: Speakers (PulseAudio Output) +01:40:55.045 AUDIO : Format: Channels: 2, Sample rate: 48kHz, Avg. bytes: 384kB, Sample bits: 32, Block align: 8B +01:40:55.046 AUDIO : Audio client: +01:40:55.046 AUDIO : Format: Channels: 2, Sample rate: 48kHz, Buffer size: 1536B, Frame: 512 +01:40:55.049 RENDER : RENDER : Reload shaders +01:40:55.050 RENDER : Enfusion shader version 13 +01:40:55.050 INIT : INIT : ShaderListReload +01:40:55.050 PROFILING : ShaderListReload took: 0.000500 ms +01:40:55.190 AUDIO : Endpoint: Speakers (PulseAudio Output) +01:40:55.190 AUDIO : Format: Channels: 2, Sample rate: 48kHz, Avg. bytes: 384kB, Sample bits: 32, Block align: 8B +01:40:55.190 AUDIO : Audio client: +01:40:55.190 AUDIO : Format: Channels: 2, Sample rate: 48kHz, Buffer size: 1536B, Frame: 512 +01:40:55.407 RENDER : Loaded 3752 newer shader binaries +01:40:55.407 PROFILING : Reload shaders took: 357.774200 ms +01:40:55.407 ENGINE : Initializing inputs. +01:40:55.420 NETWORK : Initializing networking. +01:40:55.421 NETWORK : Using new GameRplScheduler. +01:40:55.421 SCRIPT : SCRIPT : Initializing scripts +01:40:55.421 SCRIPT : SCRIPT : ScriptProjectManager init +01:40:57.621 PROFILING : ScriptProjectManager init took: 2199.497400 ms +01:40:57.707 PROFILING : Initializing scripts took: 2286.077800 ms +01:40:57.725 ENGINE : Enfusion engine successfully created. +01:40:57.725 PROFILING : Workbench Init Engine took: 4050.389200 ms +01:40:57.725 INIT : INIT : Workbench Create Game +01:40:57.737 GUI : Using default language (en_us) +01:40:57.737 GUI : Loading 'en_us' localization file. +01:40:57.737 INIT : INIT : Loading StringTable +01:40:57.760 PROFILING : Loading StringTable took: 23.572500 ms +01:40:57.760 SCRIPT : SCRIPT : Compiling GameLib scripts +01:40:57.829 SCRIPT : Module: Workbench; loaded 18x files; 36x classes; used 125K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_VHC_OVERRIDE,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE"; CRC32: 90ce0460 +01:40:57.830 SCRIPT : Module: GameLib; loaded 465x files; 648x classes; used 828K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_VHC_OVERRIDE,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE"; CRC32: 4507af04 +01:40:57.830 PROFILING : Compiling GameLib scripts took: 69.679300 ms +01:40:57.830 SCRIPT : SCRIPT : Compiling Game scripts +01:40:59.045 INIT : Workbench Create Game +01:40:59.045 SCRIPT : Compiling Game scripts +01:40:59.045 SCRIPT (W): @"Scripts/Game/Editor/Components/EditableEntity/SCR_EditableEntityComponent.c,785": 'GetPlayerPlatformKind' is obsolete +01:40:59.045 SCRIPT (W): @"Scripts/Game/Editor/Components/EditableEntity/SCR_EditableEntityComponent.c,786": 'GetPlayerPlatformId' is obsolete +01:40:59.302 SCRIPT (W): @"Scripts/Game/Workshop/SCR_AddonManager.c,876": 'GetRefCount' is obsolete: Will be removed +01:40:59.333 SCRIPT (W): @"Scripts/Game/Campaign/SCR_PlayerProfileManagerComponent.c,142": 'PlayerData' is obsolete +01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,159": 'GetDSSession' is obsolete +01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,162": 'RoomID' is obsolete +01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,197": 'GetDSSession' is obsolete +01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,201": 'RoomID' is obsolete +01:40:59.532 SCRIPT (W): @"Scripts/Game/DataCollection/SCR_DataCollectorComponent.c,481": 'GetStorage' is obsolete +01:40:59.532 SCRIPT (W): @"Scripts/Game/DataCollection/SCR_DataCollectorComponent.c,483": 'GetOnlineWritePrivilege' is obsolete +01:40:59.533 SCRIPT (W): @"Scripts/Game/Utilities/SCR_PlayerIdentityUtils.c,20": 'GetPlayerIdentityId' is obsolete +01:40:59.575 SCRIPT (W): @"Scripts/Game/UI/Menu/MainMenuUI.c,643": 'GetNotifyCount' is obsolete: Will be substitued by Notification Api. +01:40:59.575 SCRIPT (W): @"Scripts/Game/UI/Menu/MainMenuUI.c,645": 'GetNotifyItem' is obsolete: Will be substitued by Notification Api. +01:40:59.630 SCRIPT (W): @"Scripts/Game/DataCollection/PlayerData/SCR_PlayerData.c,210": 'PlayerData' is obsolete +01:40:59.895 SCRIPT : Module: WorkbenchGame; loaded 171x files; 616x classes; used 2481K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_VHC_OVERRIDE,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE"; CRC32: ad6a2625 +01:40:59.902 SCRIPT : Module: Game; loaded 5695x files; 11168x classes; used 32439K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_VHC_OVERRIDE,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE,ENABLE_BASE_DESTRUCTION,BUDGET_OPTIMIZATION_CHECKS,SHOW_DISCLAIMER,DEBUG,RESPAWN_TIMER_COMPONENT_DEBUG,GAME_MODE_DEBUG,DEBUG_CONFIGURABLE_DIALOGS,DISABLE_WEAPON_SWITCHING,SCRIPTED_AIM_MODIFIER_DEBUG"; CRC32: 25e8ccf6 +01:40:59.939 PROFILING : Compiling Game scripts took: 2108.960100 ms +01:40:59.945 INIT : Creating game instance(ArmaReforgerScripted), version 1.8.0.13 built 2026-08-21 14:30:18 UTC. +01:40:59.985 ENGINE : Game successfully created. +01:40:59.986 PROFILING : Workbench Create Game took: 2260.919200 ms +01:40:59.994 DEFAULT : Using thumbnail cache directory: C:/users/steamuser/AppData/Local/Temp/Arma Reforger Workbench/Projects/ERR_Chat/thumbnails +01:41:00.821 INIT : INIT : Workbench Reload Game +01:41:00.823 ENGINE : Game destroyed. +01:41:00.830 GUI : Using default language (en_us) +01:41:00.830 GUI : Loading 'en_us' localization file. +01:41:00.830 INIT : INIT : Loading StringTable +01:41:00.844 PROFILING : Loading StringTable took: 13.885100 ms +01:41:00.845 INIT : Creating game instance(ArmaReforgerScripted), version 1.8.0.13 built 2026-08-21 14:30:18 UTC. +01:41:00.852 SCRIPT : Unable to register a script command due keyword duplicity: ban +01:41:00.852 SCRIPT : Unable to register a script command due keyword duplicity: kick +01:41:00.852 ENGINE : Game successfully created. +01:41:00.852 ENGINE : Game successfully initialized. +01:41:00.852 PROFILING : Workbench Reload Game took: 31.214800 ms +01:41:01.520 WORLD : WORLD : Entities load '$ERR_Core:Worlds/ERR_Everon.ent' +01:41:02.515 PROFILING : Entities load took: 994.643200 ms +01:41:02.529 WORLD : WORLD : CreateEntities +01:41:02.535 WORLD : WORLD : NotifyBeforeEntitiesCreated +01:41:02.536 PROFILING : NotifyBeforeEntitiesCreated took: 0.003800 ms +01:41:02.536 WORLD : WORLD : Wait for preloading data +01:41:02.536 PROFILING : Wait for preloading data took: 0.004100 ms +01:41:02.649 ENTITY : Create entity @"ENTITY:2" ('Eden', GenericTerrainEntity) at <0.000000 0.000000 0.000000> @"{5AD924374E8C7AF6}Prefabs/World/Game/Eden/GenericTerrain_Eden.et" +01:41:02.649 PROFILING : PROFILING : Terrain load +01:41:04.597 PROFILING : Terrain load took: 1947.730900 ms +01:41:08.624 WORLD : CreateEntities +01:41:08.625 ENTITY : Create entity @"ENTITY:610406" ('StaticModelEntity','Assets/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.xob') at <1931.796021 81.777000 5138.725098> @"{6A004A8F0571D456}Prefabs/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.et" +01:41:08.625 ENTITY : CreateComponent 'ScriptedRadioComponent' +01:41:08.625 DEFAULT (W): World doesn't contain RadioManagerEntity to support any BaseRadioComponent. +01:41:19.046 WORLD : WORLD : NotifyBeforeEntitiesInitialized +01:41:19.046 PROFILING : NotifyBeforeEntitiesInitialized took: 0.005300 ms +01:41:19.488 WORLD : WORLD : NotifyEntitiesInitialized +01:41:19.488 TERRAIN : TERRAIN : Initializing road networks... +01:41:19.491 PROFILING : Initializing road networks... took: 2.319400 ms +01:41:19.491 PROFILING : NotifyEntitiesInitialized took: 2.801500 ms +01:41:19.491 PROFILING : CreateEntities took: 16961.426100 ms +01:41:19.664 PROFILING : * WorldEditor: LoadWorld: 18149.563700 ms +01:41:21.127 TERRAIN : Loading tile map config (worlds/Eden/Eden/tileMap.conf) +01:41:21.128 TERRAIN : Loading minimap config (worlds/Eden/Eden/miniMap.conf) +01:41:21.129 TERRAIN : The default minimap texture ('worlds/Eden/EdenRasterized.edds') not found. Trying 'worlds/Eden/Eden.edds'... +01:41:21.129 TERRAIN : The default minimap texture ('worlds/Eden/Eden.edds') not found. Skipping... +01:41:21.226 SCRIPT : ERR VALIDATION: prison terrain=211.344, radio terrain=159.656, extraction terrain=65.1562 +01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7154 y=211.531 +01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7157 y=211.516 +01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7160 y=211.5 +01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7163 y=211.453 +01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7166 y=211.406 +01:41:21.226 SCRIPT : ERR TERRAIN: x=6087 z=7154 y=211.438 +01:41:21.226 SCRIPT : ERR TERRAIN: x=6087 z=7157 y=211.438 +01:41:21.227 SCRIPT : ERR TERRAIN: x=6087 z=7160 y=211.422 +01:41:21.227 SCRIPT : ERR TERRAIN: x=6087 z=7163 y=211.391 +01:41:21.227 SCRIPT : ERR TERRAIN: x=6087 z=7166 y=211.344 +01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7154 y=211.344 +01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7157 y=211.344 +01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7160 y=211.344 +01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7163 y=211.328 +01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7166 y=211.281 +01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7154 y=211.25 +01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7157 y=211.281 +01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7160 y=211.25 +01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7163 y=211.234 +01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7166 y=211.188 +01:41:21.228 SCRIPT : ERR TERRAIN: x=6096 z=7154 y=211.156 +01:41:21.228 SCRIPT : ERR TERRAIN: x=6096 z=7157 y=211.172 +01:41:21.228 SCRIPT : ERR TERRAIN: x=6096 z=7160 y=211.156 +01:41:21.229 SCRIPT : ERR TERRAIN: x=6096 z=7163 y=211.141 +01:41:21.229 SCRIPT : ERR TERRAIN: x=6096 z=7166 y=211.094 +01:41:21.250 SCRIPT : ERR SITE CANDIDATE: position=<6090,211.344,7160> elevationRange=0.640625 +01:41:21.275 BACKEND : Attempting online Game Config instead. +01:41:24.563 INIT : INIT : Workbench Reload Game +01:41:24.565 ENGINE : Game destroyed. +01:41:24.572 GUI : Using default language (en_us) +01:41:24.572 GUI : Loading 'en_us' localization file. +01:41:24.572 INIT : INIT : Loading StringTable +01:41:24.593 PROFILING : Loading StringTable took: 20.977700 ms +01:41:24.594 INIT : Creating game instance(ArmaReforgerScripted), version 1.8.0.13 built 2026-08-21 14:30:18 UTC. +01:41:24.602 SCRIPT : Unable to register a script command due keyword duplicity: ban +01:41:24.602 SCRIPT : Unable to register a script command due keyword duplicity: kick +01:41:24.602 ENGINE : Game successfully created. +01:41:24.602 ENGINE : Game successfully initialized. +01:41:24.602 PROFILING : Workbench Reload Game took: 39.087100 ms +01:41:24.605 DEFAULT (W): LogiLED: Cannot initialize! (service not running or no compatible device detected) +01:41:24.670 PLATFORM : Save data from container 'settings' have been loaded +01:41:24.759 PLATFORM : Save data from container 'sessions' have been loaded +01:41:24.759 PLATFORM : GameProject user settings load from profile @"ReforgerGameSettings.conf" +01:41:24.759 ENGINE : Game user settings config loaded +01:41:24.857 DEFAULT : [SaveGameManager] Starting new playthrough nr.0 '' for mission '{B6C516F86302C679}Worlds/ERR_Everon.ent'. +01:41:24.866 WORLD : WORLD : Game::LoadEntities +01:41:24.866 WORLD : WORLD : Initializing world systems @"{1C60D2EDA2B468B8}Configs/Systems/BaseGameModeSystems.conf" +01:41:24.867 NETWORK : Enabled lag compensation, 29 frames with 100 FPS and 280 ms rewind limits. +01:41:24.867 WORLD : WORLD : CreateEntities +01:41:24.867 WORLD : WORLD : CreateEntities +01:41:24.867 WORLD : WORLD : NotifyBeforeEntitiesCreated +01:41:24.879 RESOURCES : Loaded mission headers from 7 addon(s)! +01:41:24.879 PROFILING : NotifyBeforeEntitiesCreated took: 11.838100 ms +01:41:24.879 WORLD : WORLD : Wait for preloading data +01:41:24.879 PROFILING : Wait for preloading data took: 0.000700 ms +01:41:29.309 WORLD : Game::LoadEntities +01:41:29.309 WORLD : CreateEntities +01:41:29.309 WORLD : CreateEntities +01:41:29.309 ENTITY : Create entity @"ENTITY:610406" ('StaticModelEntity','Assets/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.xob') at <1931.796021 81.777000 5138.725098> @"{6A004A8F0571D456}Prefabs/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.et" +01:41:29.309 ENTITY : CreateComponent 'ScriptedRadioComponent' +01:41:29.309 DEFAULT (W): World doesn't contain RadioManagerEntity to support any BaseRadioComponent. +01:41:30.730 ENTITY : Create entity @"ENTITY:842066" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1080.213013 10.776751 6018.347168> +01:41:30.730 ENTITY : CreateComponent 'Hierarchy' +01:41:30.730 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842066" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1080.213013 10.776751 6018.347168>') +01:41:30.730 ENTITY : Create entity @"ENTITY:842068" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1082.185913 10.778749 6018.331055> +01:41:30.730 ENTITY : CreateComponent 'Hierarchy' +01:41:30.730 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842068" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1082.185913 10.778749 6018.331055>') +01:41:30.730 ENTITY : Create entity @"ENTITY:842070" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1084.190918 10.790751 6018.334961> +01:41:30.730 ENTITY : CreateComponent 'Hierarchy' +01:41:30.730 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842070" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1084.190918 10.790751 6018.334961>') +01:41:30.735 ENTITY : Create entity @"ENTITY:842333" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4425.594727 9.981750 11029.402344> +01:41:30.735 ENTITY : CreateComponent 'Hierarchy' +01:41:30.735 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842333" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4425.594727 9.981750 11029.402344>') +01:41:30.735 ENTITY : Create entity @"ENTITY:842335" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4426.584473 9.983749 11031.109375> +01:41:30.735 ENTITY : CreateComponent 'Hierarchy' +01:41:30.735 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842335" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4426.584473 9.983749 11031.109375>') +01:41:30.735 ENTITY : Create entity @"ENTITY:842337" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4427.572266 9.995750 11032.853516> +01:41:30.735 ENTITY : CreateComponent 'Hierarchy' +01:41:30.735 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842337" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4427.572266 9.995750 11032.853516>') +01:41:30.739 ENTITY : Create entity @"ENTITY:842591" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.946289 10.470250 1551.986084> +01:41:30.739 ENTITY : CreateComponent 'Hierarchy' +01:41:30.739 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842591" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.946289 10.470250 1551.986084>') +01:41:30.739 ENTITY : Create entity @"ENTITY:842593" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.430664 10.472250 1550.081421> +01:41:30.739 ENTITY : CreateComponent 'Hierarchy' +01:41:30.739 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842593" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.430664 10.472250 1550.081421>') +01:41:30.740 ENTITY : Create entity @"ENTITY:842595" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10008.926758 10.484250 1548.140869> +01:41:30.740 ENTITY : CreateComponent 'Hierarchy' +01:41:30.740 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842595" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10008.926758 10.484250 1548.140869>') +01:41:35.790 ENTITY : Create entity @"ENTITY:2305843009213693956" ('Factions', SCR_FactionManager) at <0.000000 0.000000 0.000000> @"{589540B35EBA8CDC}Prefabs/MP/Managers/Factions/FactionManager_USxUSSR.et" +01:41:35.790 RESOURCES : GetResourceObject @"{5168FEA3054D6D15}Prefabs/Vehicles/Wheeled/M151A2/M151A2_M2HB_MERDC.et" +01:41:35.790 WORLD : Entity prefab load @"{5168FEA3054D6D15}Prefabs/Vehicles/Wheeled/M151A2/M151A2_M2HB_MERDC.et" +01:41:35.790 RESOURCES : GetResourceObject @"{F6B23D17D5067C11}Prefabs/Vehicles/Wheeled/M151A2/M151A2_M2HB.et" +01:41:35.790 WORLD : Entity prefab load @"{F6B23D17D5067C11}Prefabs/Vehicles/Wheeled/M151A2/M151A2_M2HB.et" +01:41:35.791 RESOURCES : GetResourceObject @"{F649585ABB3706C4}Prefabs/Vehicles/Wheeled/M151A2/M151A2.et" +01:41:35.791 WORLD : Entity prefab load @"{F649585ABB3706C4}Prefabs/Vehicles/Wheeled/M151A2/M151A2.et" +01:41:35.791 WORLD (E): Unknown keyword/data 'SlidingTrackMaterial' at offset 19441(0x4bf1) +01:41:35.836 RESOURCES : GetResourceObject @"{F7B9B434FCFF00B3}Prefabs/Vehicles/Wheeled/Conflict_Variants/BRDM2_Conflict.et" +01:41:35.836 WORLD : Entity prefab load @"{F7B9B434FCFF00B3}Prefabs/Vehicles/Wheeled/Conflict_Variants/BRDM2_Conflict.et" +01:41:35.836 RESOURCES : GetResourceObject @"{254289B9C09904AB}Prefabs/Vehicles/Wheeled/BRDM2/BRDM2.et" +01:41:35.836 WORLD : Entity prefab load @"{254289B9C09904AB}Prefabs/Vehicles/Wheeled/BRDM2/BRDM2.et" +01:41:35.836 RESOURCES : GetResourceObject @"{532B5F3CF8496E59}Prefabs/Vehicles/Wheeled/BRDM2/BRDM2_base.et" +01:41:35.836 WORLD : Entity prefab load @"{532B5F3CF8496E59}Prefabs/Vehicles/Wheeled/BRDM2/BRDM2_base.et" +01:41:35.836 WORLD (E): Unknown keyword/data 'Parent' at offset 35955(0x8c73) +01:41:35.836 WORLD (E): Unknown keyword/data 'Parent' at offset 36915(0x9033) +01:41:35.839 RESOURCES : GetResourceObject @"{BD75A18920BD1278}Prefabs/Vehicles/Wheeled/Conflict_Variants/BTR70_Conflict.et" +01:41:35.839 WORLD : Entity prefab load @"{BD75A18920BD1278}Prefabs/Vehicles/Wheeled/Conflict_Variants/BTR70_Conflict.et" +01:41:35.839 RESOURCES : GetResourceObject @"{C012BB3488BEA0C2}Prefabs/Vehicles/Wheeled/BTR70/BTR70.et" +01:41:35.839 WORLD : Entity prefab load @"{C012BB3488BEA0C2}Prefabs/Vehicles/Wheeled/BTR70/BTR70.et" +01:41:35.839 RESOURCES : GetResourceObject @"{1C5FE7B7FF49BB8D}Prefabs/Vehicles/Wheeled/BTR70/BTR70_Base.et" +01:41:35.839 WORLD : Entity prefab load @"{1C5FE7B7FF49BB8D}Prefabs/Vehicles/Wheeled/BTR70/BTR70_Base.et" +01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 42646(0xa696) +01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 43645(0xaa7d) +01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 44617(0xae49) +01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 45590(0xb216) +01:41:36.152 WORLD : WORLD : NotifyBeforeEntitiesInitialized +01:41:36.152 PROFILING : NotifyBeforeEntitiesInitialized took: 0.044800 ms +01:41:38.078 WORLD : InitEntities 'world' +01:41:38.078 ENTITY : Init entity @"ENTITY:2305843009213693953" ('Rereintroduced', ERR_GameMode) at <1076.468018 51.000999 1325.246948> @"{978E045E53EF36C8}Prefabs/ERR/GameMode.et" +01:41:38.078 SCRIPT (W): SCR_PerceivedFactionManagerComponent trying to set fall back faction 'CIV' but this faction could not be found so it is null instead. +01:41:38.104 WORLD : InitEntities 'world' +01:41:38.104 ENTITY : Init entity @"ENTITY:2305843009213693953" ('Rereintroduced', ERR_GameMode) at <1076.468018 51.000999 1325.246948> @"{978E045E53EF36C8}Prefabs/ERR/GameMode.et" +01:41:38.104 SCRIPT : ERR SMOKE: scripted integration test enabled; gameplay acceptance remains separate +01:41:38.105 WORLD : WORLD : NotifyEntitiesInitialized +01:41:38.105 TERRAIN : TERRAIN : Initializing road networks... +01:41:38.107 PROFILING : Initializing road networks... took: 2.516200 ms +01:41:38.107 DEFAULT : DEFAULT : WorldVolumesCollection +01:41:38.165 PROFILING : WorldVolumesCollection took: 57.969400 ms +01:41:38.165 INIT : INIT : SoundWorldInit +01:41:38.178 PROFILING : SoundWorldInit took: 13.175700 ms +01:41:38.179 PROFILING : NotifyEntitiesInitialized took: 73.950500 ms +01:41:38.179 PROFILING : CreateEntities took: 13311.136000 ms +01:41:38.179 PROFILING : CreateEntities took: 13311.314800 ms +01:41:38.179 WORLD : WORLD : Wait for preloading data around camera +01:41:38.179 PROFILING : Wait for preloading data around camera took: 0.000900 ms +01:41:38.179 WORLD : WORLD : EOnActivate +01:41:38.212 PROFILING : EOnActivate took: 32.311200 ms +01:41:38.212 PROFILING : Game::LoadEntities took: 13345.939800 ms +01:41:38.502 DEFAULT : Entered offline game state. +01:41:38.605 NETWORK : Player connected: connectionID=2147483646 +01:41:38.605 NETWORK : ### Connecting player: connectionID=2147483646, Name= +01:41:38.605 NETWORK : ### Creating player: PlayerId=1, Name=jakub +01:41:38.610 ENTITY : SpawnEntityPrefab @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et" +01:41:38.611 ENTITY : Create entity @"ENTITY:4611686018427388381" ('SCR_PlayerController') at <0.000000 0.000000 0.000000> +01:41:38.611 ENTITY : EntityPrefabUse @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et" +01:41:38.611 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_PUNISHMENT_KILLING_SET'. There should only be one of each key! +01:41:38.611 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_TYPE_DISABLED'. There should only be one of each key! +01:41:38.613 SCRIPT (W): Can't open config file "" +01:41:38.620 WORLD : InitEntities 'world' +01:41:38.620 ENTITY : Init entity @"ENTITY:4611686018427388381" ('SCR_PlayerController') at <0.000000 0.000000 0.000000> @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et" +01:41:38.621 GUI : WidgetManager: CrateWidgets @"{3C9DCDD76AB83157}UI/layouts/HUD/HUDLayouts/HUDManager_Root.layout" +01:41:38.621 SCRIPT (W): Slot_WeaponInfo Has no Content! +01:41:38.621 SCRIPT (W): Slot_Chat Has no Content! +01:41:38.621 SCRIPT (W): Slot_VON Has no Content! +01:41:38.621 SCRIPT (W): Slot_AvailableActions Has no Content! +01:41:38.621 SCRIPT (W): Slot_Vehicle Has no Content! +01:41:38.622 SCRIPT (W): Slot_GameVersion Has no Content! +01:41:38.622 SCRIPT (W): Slot_Notifications Has no Content! +01:41:38.622 SCRIPT (W): Slot_Hints Has no Content! +01:41:38.637 NETWORK : ### Updating player: PlayerId=1, Name=jakub, rplIdentity=0xFFFFFFFE, IdentityId=00000000-0000-0000-0000-000000000000 +01:41:38.637 SCRIPT (W): Ban Settings could not be loaded from BE Storage: Relying on default config +01:41:38.638 NETWORK : Players connecting: 0 +01:41:38.638 NETWORK : Players connected: 1 / 1 +01:41:38.663 DEFAULT : Using autosave directory: C:/users/steamuser/AppData/Local/Temp/Arma Reforger Workbench/Projects/ERR_Chat/autosaves +01:41:38.664 PROFILING : Workbench startup took: 46095.096100 ms +01:41:38.688 WORLD : Frame start +01:41:38.688 SCRIPT : ScenarioFramework: Available tasks are empty, no new tasks will be generated. +01:41:38.701 WORLD : UpdateEntities +01:41:38.701 WORLD : Frame +01:41:38.701 SCRIPT : SCR_BaseGameMode::OnGameStateChanged = GAME +01:41:38.883 WORLD : UpdateEntities +01:41:38.883 WORLD : PostFrame +01:41:38.883 GUI : WidgetManager: CrateWidgets @"{D89BBA18F99053D6}UI/layouts/HUD/Chat/ChatHud.layout" +01:41:38.883 SCRIPT (W): EditBoxFilterComponent used on invalid widget type. +01:41:38.925 RESOURCES : GetResourceObject @"{20A6917D2114E29A}UI/layouts/HUD/Hint/HintInfoDisplay.layout" +01:41:38.925 GUI : Layout load @"{20A6917D2114E29A}UI/layouts/HUD/Hint/HintInfoDisplay.layout" +01:41:38.925 GUI : Widget prefab @"{EA1CC57D868E94F9}UI/layouts/HUD/Hint/Hint.layout" +01:41:38.925 GUI (W): Overridden prefab member (GUID: '{661AB14E0F471C66}' type: ButtonWidgetClass) no longer exists in prefab +01:41:39.067 RENDER : RENDER : ObjectsHeightMap::Build +01:41:39.067 RENDER : RENDER : MeshOccupancyGridManager::GenerateAllForWorld +01:41:39.238 PROFILING : MeshOccupancyGridManager::GenerateAllForWorld took: 170.403800 ms +01:41:39.247 PROFILING : ObjectsHeightMap::Build took: 180.078800 ms +01:41:40.508 SCRIPT : Rereintroduced [mission]: phase 0 -> 1 +01:41:40.919 SCRIPT : INFO: Faction: player jakub (playerID = 1 | UUID = 00000000-0000-0000-0000-000000000000) has joined faction #AR-Faction_US (US) +01:41:40.999 SCRIPT : Rereintroduced [spawn]: player 1 at <6090,211.344,7160> +01:41:41.049 SCRIPT : ERR SMOKE PASS: new identity may enter prison +01:41:41.049 SCRIPT : ERR SMOKE PASS: spawn consumes identity life +01:41:41.050 SCRIPT : ERR SMOKE PASS: disconnect retains living actor and clears connection +01:41:41.050 SCRIPT : ERR SMOKE PASS: reconnected identity retains spent life +01:41:41.050 SCRIPT : ERR SMOKE PASS: duplicate active identity rejected +01:41:41.050 SCRIPT : ERR SMOKE PASS: recycled connection receives independent life and extraction admission policy +01:41:51.140 SCRIPT : ERR SMOKE PASS: authored physical mortar and four-person crew initialize +01:41:51.140 SCRIPT : ERR SMOKE PASS: mortar has a dedicated physical manpack operator +01:41:51.141 SCRIPT : ERR SMOKE PASS: mortar starts with exactly 27 physical HE shells +01:42:06.266 SCRIPT : ERR SMOKE PASS: depleted mortar inventory stays empty without fabricated ammunition +01:42:18.384 SCRIPT : ERR SMOKE PASS: lost mortar and crew remain lost without replacement spawning +01:42:18.385 SCRIPT : INFO: KILL SUICIDE: jakub (playerID = 1 | UUID = 00000000-0000-0000-0000-000000000000) from US faction at <6090, 211.344, 7160> killed himself! +01:42:22.418 SCRIPT : ERR SMOKE PASS: native damage kills prisoner +01:42:22.418 SCRIPT : ERR SMOKE PASS: death selects spectator without another life +01:42:22.418 SCRIPT : ERR SMOKE PASS: spectator camera activates after native death +01:42:49.204 SCRIPT : Rereintroduced [mission]: phase 1 -> 6 +01:42:49.204 SCRIPT : ERR SMOKE PASS: death exhausts round life and reaches defeat after spectator grace +01:42:49.204 SCRIPT : ERR SMOKE COMPLETE: terminal=6 lostHelicopterCase=0 playerDeathCase=1 +01:42:49.250 SCRIPT : SCR_BaseGameMode::OnGameStateChanged = POSTGAME +01:42:49.253 GUI : WidgetManager: CrateWidgets @"{144919871D65F121}UI/layouts/HUD/GameOver/EndScreen/EndScreen.layout" +01:42:49.253 SCRIPT (W): Slot_Chat Has no Content! +01:42:49.253 SCRIPT (W): Slot_VON Has no Content! +01:42:49.253 SCRIPT (W): Slot_GameVersion Has no Content! +01:42:49.253 SCRIPT (W): Slot_Notifications Has no Content! +01:42:51.240 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent Back +01:42:51.240 SCRIPT : -- Stack trace -- +01:42:51.240 SCRIPT : GetComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_ScriptedWidgetComponent.c : 43 +01:42:51.241 SCRIPT : GetInputButtonComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_InputButton/SCR_InputButtonComponent.c : 1214 +01:42:51.241 SCRIPT : OnMenuOpen() Scripts/Game/UI/GameOverScreen/SCR_GameOverScreenInput.c : 15 +01:42:51.241 SCRIPT : OpenGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 447 +01:42:51.241 SCRIPT : ShowGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 177 +01:42:51.241 SCRIPT : OnUpdate() Scripts/Game/game.c : 885 +01:42:51.241 SCRIPT : ----------------- +01:42:51.241 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent ChatButton +01:42:51.242 SCRIPT : -- Stack trace -- +01:42:51.242 SCRIPT : GetComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_ScriptedWidgetComponent.c : 43 +01:42:51.242 SCRIPT : GetInputButtonComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_InputButton/SCR_InputButtonComponent.c : 1214 +01:42:51.242 SCRIPT : OnMenuOpen() Scripts/Game/UI/GameOverScreen/SCR_GameOverScreenInput.c : 21 +01:42:51.242 SCRIPT : OpenGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 447 +01:42:51.242 SCRIPT : ShowGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 177 +01:42:51.242 SCRIPT : OnUpdate() Scripts/Game/game.c : 885 +01:42:51.242 SCRIPT : ----------------- +01:42:51.244 GUI : WidgetManager: CrateWidgets @"{144919871D65F121}UI/layouts/HUD/GameOver/EndScreen/EndScreen.layout" +01:42:51.244 SCRIPT (W): Slot_Chat Has no Content! +01:42:51.244 SCRIPT (W): Slot_VON Has no Content! +01:42:51.245 SCRIPT (W): Slot_GameVersion Has no Content! +01:42:51.245 SCRIPT (W): Slot_Notifications Has no Content! +01:42:53.227 RESOURCES : Screenshot saved to $logs:err-result.png +01:43:19.217 SCRIPT (W): Maybe a problem: DataProgression is not ready but the analytics event was requested +01:43:19.438 DEFAULT (W): Achievements cannot be saved. +01:43:19.438 DEFAULT (W): Achievements failed to save. Consecutive calls to Achievements API may fail. +01:43:19.736 PLATFORM : Save data from container 'settings' have been loaded +01:43:19.836 PLATFORM : Save data from container 'sessions' have been loaded +01:43:19.836 PLATFORM : GameProject user settings load from profile @"ReforgerGameSettings.conf" +01:43:19.836 ENGINE : Game user settings config loaded +01:43:22.928 DEFAULT : [SaveGameManager] Starting new playthrough nr.0 '' for mission '{B6C516F86302C679}Worlds/ERR_Everon.ent'. +01:43:22.928 WORLD : WORLD : Entities load '$ERR_Core:Worlds/ERR_Everon.ent' +01:43:23.632 PROFILING : Entities load took: 703.289600 ms +01:43:23.634 WORLD : WORLD : Game::LoadEntities +01:43:23.635 WORLD : WORLD : Initializing world systems @"{1C60D2EDA2B468B8}Configs/Systems/BaseGameModeSystems.conf" +01:43:23.635 NETWORK : Enabled lag compensation, 29 frames with 100 FPS and 280 ms rewind limits. +01:43:23.635 WORLD : WORLD : CreateEntities +01:43:23.635 WORLD : WORLD : CreateEntities 'world' +01:43:23.635 WORLD : WORLD : NotifyBeforeEntitiesCreated +01:43:23.635 RESOURCES : Unloading all loaded mission headers from 7 addon(s)! +01:43:23.645 RESOURCES : Loaded mission headers from 7 addon(s)! +01:43:23.645 PROFILING : NotifyBeforeEntitiesCreated took: 9.256600 ms +01:43:23.645 WORLD : WORLD : Wait for preloading data +01:43:23.645 PROFILING : Wait for preloading data took: 0.000900 ms +01:43:23.645 ENTITY : Create entity @"ENTITY:2" ('Eden', GenericTerrainEntity) at <0.000000 0.000000 0.000000> @"{5AD924374E8C7AF6}Prefabs/World/Game/Eden/GenericTerrain_Eden.et" +01:43:23.645 PROFILING : PROFILING : Terrain load +01:43:25.207 PROFILING : Terrain load took: 1561.481800 ms +01:43:28.068 WORLD : Game::LoadEntities +01:43:28.068 WORLD : CreateEntities +01:43:28.068 WORLD : CreateEntities 'world' +01:43:28.068 ENTITY : Create entity @"ENTITY:610406" ('StaticModelEntity','Assets/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.xob') at <1931.796021 81.777000 5138.725098> @"{6A004A8F0571D456}Prefabs/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.et" +01:43:28.068 ENTITY : CreateComponent 'ScriptedRadioComponent' +01:43:28.068 DEFAULT (W): World doesn't contain RadioManagerEntity to support any BaseRadioComponent. +01:43:29.407 ENTITY : Create entity @"ENTITY:842066" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1080.213013 10.776751 6018.347168> +01:43:29.407 ENTITY : CreateComponent 'Hierarchy' +01:43:29.407 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842066" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1080.213013 10.776751 6018.347168>') +01:43:29.407 ENTITY : Create entity @"ENTITY:842068" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1082.185913 10.778749 6018.331055> +01:43:29.407 ENTITY : CreateComponent 'Hierarchy' +01:43:29.407 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842068" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1082.185913 10.778749 6018.331055>') +01:43:29.407 ENTITY : Create entity @"ENTITY:842070" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1084.190918 10.790751 6018.334961> +01:43:29.407 ENTITY : CreateComponent 'Hierarchy' +01:43:29.407 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842070" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1084.190918 10.790751 6018.334961>') +01:43:29.412 ENTITY : Create entity @"ENTITY:842333" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4425.594727 9.981750 11029.402344> +01:43:29.413 ENTITY : CreateComponent 'Hierarchy' +01:43:29.413 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842333" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4425.594727 9.981750 11029.402344>') +01:43:29.413 ENTITY : Create entity @"ENTITY:842335" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4426.584473 9.983749 11031.109375> +01:43:29.413 ENTITY : CreateComponent 'Hierarchy' +01:43:29.413 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842335" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4426.584473 9.983749 11031.109375>') +01:43:29.413 ENTITY : Create entity @"ENTITY:842337" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4427.572266 9.995750 11032.853516> +01:43:29.413 ENTITY : CreateComponent 'Hierarchy' +01:43:29.413 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842337" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4427.572266 9.995750 11032.853516>') +01:43:29.417 ENTITY : Create entity @"ENTITY:842591" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.946289 10.470250 1551.986084> +01:43:29.417 ENTITY : CreateComponent 'Hierarchy' +01:43:29.417 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842591" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.946289 10.470250 1551.986084>') +01:43:29.418 ENTITY : Create entity @"ENTITY:842593" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.430664 10.472250 1550.081421> +01:43:29.418 ENTITY : CreateComponent 'Hierarchy' +01:43:29.418 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842593" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.430664 10.472250 1550.081421>') +01:43:29.418 ENTITY : Create entity @"ENTITY:842595" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10008.926758 10.484250 1548.140869> +01:43:29.418 ENTITY : CreateComponent 'Hierarchy' +01:43:29.418 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842595" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10008.926758 10.484250 1548.140869>') +01:43:34.514 WORLD : WORLD : NotifyBeforeEntitiesInitialized +01:43:34.514 PROFILING : NotifyBeforeEntitiesInitialized took: 0.034100 ms +01:43:36.462 WORLD : InitEntities 'world' +01:43:36.462 ENTITY : Init entity @"ENTITY:2305843009213693953" ('Rereintroduced', ERR_GameMode) at <1076.468018 51.000999 1325.246948> @"{978E045E53EF36C8}Prefabs/ERR/GameMode.et" +01:43:36.462 SCRIPT (W): SCR_PerceivedFactionManagerComponent trying to set fall back faction 'CIV' but this faction could not be found so it is null instead. +01:43:36.462 WORLD : InitEntities 'world' +01:43:36.462 ENTITY : Init entity @"ENTITY:2305843009213693953" ('Rereintroduced', ERR_GameMode) at <1076.468018 51.000999 1325.246948> @"{978E045E53EF36C8}Prefabs/ERR/GameMode.et" +01:43:36.462 SCRIPT : ERR SMOKE: scripted integration test enabled; gameplay acceptance remains separate +01:43:36.463 WORLD : WORLD : NotifyEntitiesInitialized +01:43:36.463 TERRAIN : TERRAIN : Initializing road networks... +01:43:36.465 PROFILING : Initializing road networks... took: 1.744900 ms +01:43:36.465 DEFAULT : DEFAULT : WorldVolumesCollection +01:43:36.521 PROFILING : WorldVolumesCollection took: 56.157900 ms +01:43:36.521 INIT : INIT : SoundWorldInit +01:43:36.521 PROFILING : SoundWorldInit took: 0.389200 ms +01:43:36.521 PROFILING : NotifyEntitiesInitialized took: 58.456400 ms +01:43:36.521 PROFILING : CreateEntities took: 12885.704000 ms +01:43:36.522 PROFILING : CreateEntities took: 12885.896000 ms +01:43:36.522 WORLD : WORLD : Wait for preloading data around camera +01:43:36.522 PROFILING : Wait for preloading data around camera took: 0.001300 ms +01:43:36.522 WORLD : WORLD : EOnActivate +01:43:36.551 PROFILING : EOnActivate took: 28.585000 ms +01:43:36.551 PROFILING : Game::LoadEntities took: 12916.663600 ms +01:43:36.551 PROFILING : * LoadEntities: 12917.015400 ms +01:43:37.037 DEFAULT : Entered offline game state. +01:43:37.146 NETWORK : Player connected: connectionID=2147483646 +01:43:37.146 NETWORK : ### Connecting player: connectionID=2147483646, Name= +01:43:37.146 NETWORK : ### Creating player: PlayerId=1, Name=jakub +01:43:37.148 ENTITY : SpawnEntityPrefab @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et" +01:43:37.148 ENTITY : Create entity @"ENTITY:4611686018427388381" ('SCR_PlayerController') at <0.000000 0.000000 0.000000> +01:43:37.148 ENTITY : EntityPrefabUse @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et" +01:43:37.148 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_PUNISHMENT_KILLING_SET'. There should only be one of each key! +01:43:37.149 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_TYPE_DISABLED'. There should only be one of each key! +01:43:37.150 SCRIPT (W): Can't open config file "" +01:43:37.150 SCRIPT (W): Cannot update game blocklist. Another request in progress. +01:43:37.151 WORLD : InitEntities 'world' +01:43:37.151 ENTITY : Init entity @"ENTITY:4611686018427388381" ('SCR_PlayerController') at <0.000000 0.000000 0.000000> @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et" +01:43:37.151 GUI : WidgetManager: CrateWidgets @"{3C9DCDD76AB83157}UI/layouts/HUD/HUDLayouts/HUDManager_Root.layout" +01:43:37.151 SCRIPT (W): Slot_WeaponInfo Has no Content! +01:43:37.151 SCRIPT (W): Slot_Chat Has no Content! +01:43:37.152 SCRIPT (W): Slot_VON Has no Content! +01:43:37.152 SCRIPT (W): Slot_AvailableActions Has no Content! +01:43:37.152 SCRIPT (W): Slot_Vehicle Has no Content! +01:43:37.152 SCRIPT (W): Slot_GameVersion Has no Content! +01:43:37.152 SCRIPT (W): Slot_Notifications Has no Content! +01:43:37.152 SCRIPT (W): Slot_Hints Has no Content! +01:43:37.159 NETWORK : ### Updating player: PlayerId=1, Name=jakub, rplIdentity=0xFFFFFFFE, IdentityId=00000000-0000-0000-0000-000000000000 +01:43:37.159 NETWORK : Players connecting: 0 +01:43:37.159 NETWORK : Players connected: 1 / 1 +01:43:37.182 WORLD : Frame start +01:43:37.182 SCRIPT : ScenarioFramework: Available tasks are empty, no new tasks will be generated. +01:43:37.195 WORLD : UpdateEntities +01:43:37.195 WORLD : Frame +01:43:37.195 SCRIPT : SCR_BaseGameMode::OnGameStateChanged = GAME +01:43:37.327 WORLD : UpdateEntities +01:43:37.327 WORLD : PostFrame +01:43:37.327 GUI : WidgetManager: CrateWidgets @"{D89BBA18F99053D6}UI/layouts/HUD/Chat/ChatHud.layout" +01:43:37.327 SCRIPT (W): EditBoxFilterComponent used on invalid widget type. +01:43:37.349 RENDER : RENDER : ObjectsHeightMap::Build +01:43:37.349 RENDER : RENDER : MeshOccupancyGridManager::GenerateAllForWorld +01:43:37.518 PROFILING : MeshOccupancyGridManager::GenerateAllForWorld took: 169.161400 ms +01:43:37.526 PROFILING : ObjectsHeightMap::Build took: 176.719600 ms +01:43:38.733 SCRIPT : Rereintroduced [mission]: phase 0 -> 1 +01:43:39.219 SCRIPT : INFO: Faction: player jakub (playerID = 1 | UUID = 00000000-0000-0000-0000-000000000000) has joined faction #AR-Faction_US (US) +01:43:39.246 SCRIPT : Rereintroduced [spawn]: player 1 at <6090,211.444,7160> +01:43:39.269 SCRIPT : ERR SMOKE PASS: new identity may enter prison +01:43:39.269 SCRIPT : ERR SMOKE PASS: spawn consumes identity life +01:43:39.270 SCRIPT : ERR SMOKE PASS: disconnect retains living actor and clears connection +01:43:39.270 SCRIPT : ERR SMOKE PASS: reconnected identity retains spent life +01:43:39.270 SCRIPT : ERR SMOKE PASS: duplicate active identity rejected +01:43:39.270 SCRIPT : ERR SMOKE PASS: recycled connection receives independent life and extraction admission policy +01:43:49.368 SCRIPT : ERR SMOKE PASS: authored physical mortar and four-person crew initialize +01:43:49.369 SCRIPT : ERR SMOKE PASS: mortar has a dedicated physical manpack operator +01:43:49.369 SCRIPT : ERR SMOKE PASS: mortar starts with exactly 27 physical HE shells +01:44:04.535 SCRIPT : ERR SMOKE PASS: depleted mortar inventory stays empty without fabricated ammunition +01:44:16.624 SCRIPT : ERR SMOKE PASS: lost mortar and crew remain lost without replacement spawning +01:44:16.625 SCRIPT : INFO: KILL SUICIDE: jakub (playerID = 1 | UUID = 00000000-0000-0000-0000-000000000000) from US faction at <6090, 211.342, 7160> killed himself! +01:44:20.660 SCRIPT : ERR SMOKE PASS: native damage kills prisoner +01:44:20.661 SCRIPT : ERR SMOKE PASS: death selects spectator without another life +01:44:20.661 SCRIPT : ERR SMOKE PASS: spectator camera activates after native death +01:44:47.538 SCRIPT : Rereintroduced [mission]: phase 1 -> 6 +01:44:47.538 SCRIPT : ERR SMOKE PASS: death exhausts round life and reaches defeat after spectator grace +01:44:47.539 SCRIPT : ERR SMOKE COMPLETE: terminal=6 lostHelicopterCase=0 playerDeathCase=1 +01:44:47.583 SCRIPT : SCR_BaseGameMode::OnGameStateChanged = POSTGAME +01:44:47.585 GUI : WidgetManager: CrateWidgets @"{144919871D65F121}UI/layouts/HUD/GameOver/EndScreen/EndScreen.layout" +01:44:47.585 SCRIPT (W): Slot_Chat Has no Content! +01:44:47.586 SCRIPT (W): Slot_VON Has no Content! +01:44:47.586 SCRIPT (W): Slot_GameVersion Has no Content! +01:44:47.586 SCRIPT (W): Slot_Notifications Has no Content! +01:44:49.577 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent Back +01:44:49.577 SCRIPT : -- Stack trace -- +01:44:49.577 SCRIPT : GetComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_ScriptedWidgetComponent.c : 43 +01:44:49.577 SCRIPT : GetInputButtonComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_InputButton/SCR_InputButtonComponent.c : 1214 +01:44:49.577 SCRIPT : OnMenuOpen() Scripts/Game/UI/GameOverScreen/SCR_GameOverScreenInput.c : 15 +01:44:49.577 SCRIPT : OpenGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 447 +01:44:49.577 SCRIPT : ShowGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 177 +01:44:49.577 SCRIPT : OnUpdate() Scripts/Game/game.c : 885 +01:44:49.578 SCRIPT : ----------------- +01:44:49.578 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent ChatButton +01:44:49.578 SCRIPT : -- Stack trace -- +01:44:49.578 SCRIPT : GetComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_ScriptedWidgetComponent.c : 43 +01:44:49.578 SCRIPT : GetInputButtonComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_InputButton/SCR_InputButtonComponent.c : 1214 +01:44:49.578 SCRIPT : OnMenuOpen() Scripts/Game/UI/GameOverScreen/SCR_GameOverScreenInput.c : 21 +01:44:49.578 SCRIPT : OpenGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 447 +01:44:49.579 SCRIPT : ShowGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 177 +01:44:49.579 SCRIPT : OnUpdate() Scripts/Game/game.c : 885 +01:44:49.579 SCRIPT : ----------------- +01:44:49.580 GUI : WidgetManager: CrateWidgets @"{144919871D65F121}UI/layouts/HUD/GameOver/EndScreen/EndScreen.layout" +01:44:49.580 SCRIPT (W): Slot_Chat Has no Content! +01:44:49.581 SCRIPT (W): Slot_VON Has no Content! +01:44:49.581 SCRIPT (W): Slot_GameVersion Has no Content! +01:44:49.581 SCRIPT (W): Slot_Notifications Has no Content! +01:44:51.563 RESOURCES : Screenshot saved to $logs:err-result.png diff --git a/docs/evidence/native-2026-09-19-014052/err-result.png b/docs/evidence/native-2026-09-19-014052/err-result.png new file mode 100644 index 0000000..6ea79ab Binary files /dev/null and b/docs/evidence/native-2026-09-19-014052/err-result.png differ diff --git a/docs/evidence/native-2026-09-19-014052/error.log.txt b/docs/evidence/native-2026-09-19-014052/error.log.txt new file mode 100644 index 0000000..59b322e --- /dev/null +++ b/docs/evidence/native-2026-09-19-014052/error.log.txt @@ -0,0 +1,202 @@ +--------------------------------------------- +Log Z:\tmp\erri-workbench-profile\logs\logs_2026-09-19_01-40-52\error.log started at 2026-09-19 01:40:54 (2026-09-18 23:40:54 UTC) + +01:40:54.310 INIT : Workbench startup +01:40:54.310 INIT : Workbench Init Engine +01:40:54.310 RESOURCES : ResourceDB: full scan +01:40:54.310 RESOURCES : processing files... +01:40:54.310 RESOURCES (W): resource not registered: @"$profile:rereintroduced.json". Setting null GUID +01:40:59.045 INIT : Workbench Create Game +01:40:59.045 SCRIPT : Compiling Game scripts +01:40:59.045 SCRIPT (W): @"Scripts/Game/Editor/Components/EditableEntity/SCR_EditableEntityComponent.c,785": 'GetPlayerPlatformKind' is obsolete +01:40:59.045 SCRIPT (W): @"Scripts/Game/Editor/Components/EditableEntity/SCR_EditableEntityComponent.c,786": 'GetPlayerPlatformId' is obsolete +01:40:59.302 SCRIPT (W): @"Scripts/Game/Workshop/SCR_AddonManager.c,876": 'GetRefCount' is obsolete: Will be removed +01:40:59.333 SCRIPT (W): @"Scripts/Game/Campaign/SCR_PlayerProfileManagerComponent.c,142": 'PlayerData' is obsolete +01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,159": 'GetDSSession' is obsolete +01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,162": 'RoomID' is obsolete +01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,197": 'GetDSSession' is obsolete +01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,201": 'RoomID' is obsolete +01:40:59.532 SCRIPT (W): @"Scripts/Game/DataCollection/SCR_DataCollectorComponent.c,481": 'GetStorage' is obsolete +01:40:59.532 SCRIPT (W): @"Scripts/Game/DataCollection/SCR_DataCollectorComponent.c,483": 'GetOnlineWritePrivilege' is obsolete +01:40:59.533 SCRIPT (W): @"Scripts/Game/Utilities/SCR_PlayerIdentityUtils.c,20": 'GetPlayerIdentityId' is obsolete +01:40:59.575 SCRIPT (W): @"Scripts/Game/UI/Menu/MainMenuUI.c,643": 'GetNotifyCount' is obsolete: Will be substitued by Notification Api. +01:40:59.575 SCRIPT (W): @"Scripts/Game/UI/Menu/MainMenuUI.c,645": 'GetNotifyItem' is obsolete: Will be substitued by Notification Api. +01:40:59.630 SCRIPT (W): @"Scripts/Game/DataCollection/PlayerData/SCR_PlayerData.c,210": 'PlayerData' is obsolete +01:41:08.624 WORLD : CreateEntities +01:41:08.624 ENTITY : Create entity @"ENTITY:610406" ('StaticModelEntity','Assets/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.xob') at <1931.796021 81.777000 5138.725098> @"{6A004A8F0571D456}Prefabs/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.et" +01:41:08.625 ENTITY : CreateComponent 'ScriptedRadioComponent' +01:41:08.625 DEFAULT (W): World doesn't contain RadioManagerEntity to support any BaseRadioComponent. +01:41:24.605 DEFAULT (W): LogiLED: Cannot initialize! (service not running or no compatible device detected) +01:41:29.309 WORLD : Game::LoadEntities +01:41:29.309 WORLD : CreateEntities +01:41:29.309 WORLD : CreateEntities +01:41:29.309 ENTITY : Create entity @"ENTITY:610406" ('StaticModelEntity','Assets/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.xob') at <1931.796021 81.777000 5138.725098> @"{6A004A8F0571D456}Prefabs/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.et" +01:41:29.309 ENTITY : CreateComponent 'ScriptedRadioComponent' +01:41:29.309 DEFAULT (W): World doesn't contain RadioManagerEntity to support any BaseRadioComponent. +01:41:30.730 ENTITY : Create entity @"ENTITY:842066" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1080.213013 10.776751 6018.347168> +01:41:30.730 ENTITY : CreateComponent 'Hierarchy' +01:41:30.730 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842066" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1080.213013 10.776751 6018.347168>') +01:41:30.730 ENTITY : Create entity @"ENTITY:842068" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1082.185913 10.778749 6018.331055> +01:41:30.730 ENTITY : CreateComponent 'Hierarchy' +01:41:30.730 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842068" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1082.185913 10.778749 6018.331055>') +01:41:30.730 ENTITY : Create entity @"ENTITY:842070" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1084.190918 10.790751 6018.334961> +01:41:30.730 ENTITY : CreateComponent 'Hierarchy' +01:41:30.730 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842070" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1084.190918 10.790751 6018.334961>') +01:41:30.735 ENTITY : Create entity @"ENTITY:842333" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4425.594727 9.981750 11029.402344> +01:41:30.735 ENTITY : CreateComponent 'Hierarchy' +01:41:30.735 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842333" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4425.594727 9.981750 11029.402344>') +01:41:30.735 ENTITY : Create entity @"ENTITY:842335" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4426.584473 9.983749 11031.109375> +01:41:30.735 ENTITY : CreateComponent 'Hierarchy' +01:41:30.735 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842335" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4426.584473 9.983749 11031.109375>') +01:41:30.735 ENTITY : Create entity @"ENTITY:842337" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4427.572266 9.995750 11032.853516> +01:41:30.735 ENTITY : CreateComponent 'Hierarchy' +01:41:30.735 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842337" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4427.572266 9.995750 11032.853516>') +01:41:30.739 ENTITY : Create entity @"ENTITY:842591" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.946289 10.470250 1551.986084> +01:41:30.739 ENTITY : CreateComponent 'Hierarchy' +01:41:30.739 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842591" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.946289 10.470250 1551.986084>') +01:41:30.739 ENTITY : Create entity @"ENTITY:842593" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.430664 10.472250 1550.081421> +01:41:30.739 ENTITY : CreateComponent 'Hierarchy' +01:41:30.739 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842593" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.430664 10.472250 1550.081421>') +01:41:30.740 ENTITY : Create entity @"ENTITY:842595" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10008.926758 10.484250 1548.140869> +01:41:30.740 ENTITY : CreateComponent 'Hierarchy' +01:41:30.740 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842595" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10008.926758 10.484250 1548.140869>') +01:41:35.790 ENTITY : Create entity @"ENTITY:2305843009213693956" ('Factions', SCR_FactionManager) at <0.000000 0.000000 0.000000> @"{589540B35EBA8CDC}Prefabs/MP/Managers/Factions/FactionManager_USxUSSR.et" +01:41:35.790 RESOURCES : GetResourceObject @"{5168FEA3054D6D15}Prefabs/Vehicles/Wheeled/M151A2/M151A2_M2HB_MERDC.et" +01:41:35.790 WORLD : Entity prefab load @"{5168FEA3054D6D15}Prefabs/Vehicles/Wheeled/M151A2/M151A2_M2HB_MERDC.et" +01:41:35.790 RESOURCES : GetResourceObject @"{F6B23D17D5067C11}Prefabs/Vehicles/Wheeled/M151A2/M151A2_M2HB.et" +01:41:35.790 WORLD : Entity prefab load @"{F6B23D17D5067C11}Prefabs/Vehicles/Wheeled/M151A2/M151A2_M2HB.et" +01:41:35.791 RESOURCES : GetResourceObject @"{F649585ABB3706C4}Prefabs/Vehicles/Wheeled/M151A2/M151A2.et" +01:41:35.791 WORLD : Entity prefab load @"{F649585ABB3706C4}Prefabs/Vehicles/Wheeled/M151A2/M151A2.et" +01:41:35.791 WORLD (E): Unknown keyword/data 'SlidingTrackMaterial' at offset 19441(0x4bf1) +01:41:35.836 RESOURCES : GetResourceObject @"{F7B9B434FCFF00B3}Prefabs/Vehicles/Wheeled/Conflict_Variants/BRDM2_Conflict.et" +01:41:35.836 WORLD : Entity prefab load @"{F7B9B434FCFF00B3}Prefabs/Vehicles/Wheeled/Conflict_Variants/BRDM2_Conflict.et" +01:41:35.836 RESOURCES : GetResourceObject @"{254289B9C09904AB}Prefabs/Vehicles/Wheeled/BRDM2/BRDM2.et" +01:41:35.836 WORLD : Entity prefab load @"{254289B9C09904AB}Prefabs/Vehicles/Wheeled/BRDM2/BRDM2.et" +01:41:35.836 RESOURCES : GetResourceObject @"{532B5F3CF8496E59}Prefabs/Vehicles/Wheeled/BRDM2/BRDM2_base.et" +01:41:35.836 WORLD : Entity prefab load @"{532B5F3CF8496E59}Prefabs/Vehicles/Wheeled/BRDM2/BRDM2_base.et" +01:41:35.836 WORLD (E): Unknown keyword/data 'Parent' at offset 35955(0x8c73) +01:41:35.836 WORLD (E): Unknown keyword/data 'Parent' at offset 36915(0x9033) +01:41:35.839 RESOURCES : GetResourceObject @"{BD75A18920BD1278}Prefabs/Vehicles/Wheeled/Conflict_Variants/BTR70_Conflict.et" +01:41:35.839 WORLD : Entity prefab load @"{BD75A18920BD1278}Prefabs/Vehicles/Wheeled/Conflict_Variants/BTR70_Conflict.et" +01:41:35.839 RESOURCES : GetResourceObject @"{C012BB3488BEA0C2}Prefabs/Vehicles/Wheeled/BTR70/BTR70.et" +01:41:35.839 WORLD : Entity prefab load @"{C012BB3488BEA0C2}Prefabs/Vehicles/Wheeled/BTR70/BTR70.et" +01:41:35.839 RESOURCES : GetResourceObject @"{1C5FE7B7FF49BB8D}Prefabs/Vehicles/Wheeled/BTR70/BTR70_Base.et" +01:41:35.839 WORLD : Entity prefab load @"{1C5FE7B7FF49BB8D}Prefabs/Vehicles/Wheeled/BTR70/BTR70_Base.et" +01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 42646(0xa696) +01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 43645(0xaa7d) +01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 44617(0xae49) +01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 45590(0xb216) +01:41:38.078 WORLD : InitEntities 'world' +01:41:38.078 ENTITY : Init entity @"ENTITY:2305843009213693953" ('Rereintroduced', ERR_GameMode) at <1076.468018 51.000999 1325.246948> @"{978E045E53EF36C8}Prefabs/ERR/GameMode.et" +01:41:38.078 SCRIPT (W): SCR_PerceivedFactionManagerComponent trying to set fall back faction 'CIV' but this faction could not be found so it is null instead. +01:41:38.610 ENTITY : SpawnEntityPrefab @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et" +01:41:38.611 ENTITY : Create entity @"ENTITY:4611686018427388381" ('SCR_PlayerController') at <0.000000 0.000000 0.000000> +01:41:38.611 ENTITY : EntityPrefabUse @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et" +01:41:38.611 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_PUNISHMENT_KILLING_SET'. There should only be one of each key! +01:41:38.611 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_TYPE_DISABLED'. There should only be one of each key! +01:41:38.613 SCRIPT (W): Can't open config file "" +01:41:38.620 WORLD : InitEntities 'world' +01:41:38.620 ENTITY : Init entity @"ENTITY:4611686018427388381" ('SCR_PlayerController') at <0.000000 0.000000 0.000000> @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et" +01:41:38.621 GUI : WidgetManager: CrateWidgets @"{3C9DCDD76AB83157}UI/layouts/HUD/HUDLayouts/HUDManager_Root.layout" +01:41:38.621 SCRIPT (W): Slot_WeaponInfo Has no Content! +01:41:38.621 SCRIPT (W): Slot_Chat Has no Content! +01:41:38.621 SCRIPT (W): Slot_VON Has no Content! +01:41:38.621 SCRIPT (W): Slot_AvailableActions Has no Content! +01:41:38.621 SCRIPT (W): Slot_Vehicle Has no Content! +01:41:38.622 SCRIPT (W): Slot_GameVersion Has no Content! +01:41:38.622 SCRIPT (W): Slot_Notifications Has no Content! +01:41:38.622 SCRIPT (W): Slot_Hints Has no Content! +01:41:38.637 SCRIPT (W): Ban Settings could not be loaded from BE Storage: Relying on default config +01:41:38.883 WORLD : UpdateEntities +01:41:38.883 WORLD : PostFrame +01:41:38.883 GUI : WidgetManager: CrateWidgets @"{D89BBA18F99053D6}UI/layouts/HUD/Chat/ChatHud.layout" +01:41:38.883 SCRIPT (W): EditBoxFilterComponent used on invalid widget type. +01:41:38.925 RESOURCES : GetResourceObject @"{20A6917D2114E29A}UI/layouts/HUD/Hint/HintInfoDisplay.layout" +01:41:38.925 GUI : Layout load @"{20A6917D2114E29A}UI/layouts/HUD/Hint/HintInfoDisplay.layout" +01:41:38.925 GUI : Widget prefab @"{EA1CC57D868E94F9}UI/layouts/HUD/Hint/Hint.layout" +01:41:38.925 GUI (W): Overridden prefab member (GUID: '{661AB14E0F471C66}' type: ButtonWidgetClass) no longer exists in prefab +01:42:49.253 GUI : WidgetManager: CrateWidgets @"{144919871D65F121}UI/layouts/HUD/GameOver/EndScreen/EndScreen.layout" +01:42:49.253 SCRIPT (W): Slot_Chat Has no Content! +01:42:49.253 SCRIPT (W): Slot_VON Has no Content! +01:42:49.253 SCRIPT (W): Slot_GameVersion Has no Content! +01:42:49.253 SCRIPT (W): Slot_Notifications Has no Content! +01:42:51.240 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent Back +01:42:51.241 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent ChatButton +01:42:51.244 GUI : WidgetManager: CrateWidgets @"{144919871D65F121}UI/layouts/HUD/GameOver/EndScreen/EndScreen.layout" +01:42:51.244 SCRIPT (W): Slot_Chat Has no Content! +01:42:51.244 SCRIPT (W): Slot_VON Has no Content! +01:42:51.245 SCRIPT (W): Slot_GameVersion Has no Content! +01:42:51.245 SCRIPT (W): Slot_Notifications Has no Content! +01:43:19.217 SCRIPT (W): Maybe a problem: DataProgression is not ready but the analytics event was requested +01:43:19.438 DEFAULT (W): Achievements cannot be saved. +01:43:19.438 DEFAULT (W): Achievements failed to save. Consecutive calls to Achievements API may fail. +01:43:28.068 WORLD : Game::LoadEntities +01:43:28.068 WORLD : CreateEntities +01:43:28.068 WORLD : CreateEntities 'world' +01:43:28.068 ENTITY : Create entity @"ENTITY:610406" ('StaticModelEntity','Assets/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.xob') at <1931.796021 81.777000 5138.725098> @"{6A004A8F0571D456}Prefabs/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.et" +01:43:28.068 ENTITY : CreateComponent 'ScriptedRadioComponent' +01:43:28.068 DEFAULT (W): World doesn't contain RadioManagerEntity to support any BaseRadioComponent. +01:43:29.407 ENTITY : Create entity @"ENTITY:842066" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1080.213013 10.776751 6018.347168> +01:43:29.407 ENTITY : CreateComponent 'Hierarchy' +01:43:29.407 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842066" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1080.213013 10.776751 6018.347168>') +01:43:29.407 ENTITY : Create entity @"ENTITY:842068" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1082.185913 10.778749 6018.331055> +01:43:29.407 ENTITY : CreateComponent 'Hierarchy' +01:43:29.407 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842068" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1082.185913 10.778749 6018.331055>') +01:43:29.407 ENTITY : Create entity @"ENTITY:842070" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1084.190918 10.790751 6018.334961> +01:43:29.407 ENTITY : CreateComponent 'Hierarchy' +01:43:29.407 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842070" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1084.190918 10.790751 6018.334961>') +01:43:29.412 ENTITY : Create entity @"ENTITY:842333" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4425.594727 9.981750 11029.402344> +01:43:29.413 ENTITY : CreateComponent 'Hierarchy' +01:43:29.413 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842333" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4425.594727 9.981750 11029.402344>') +01:43:29.413 ENTITY : Create entity @"ENTITY:842335" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4426.584473 9.983749 11031.109375> +01:43:29.413 ENTITY : CreateComponent 'Hierarchy' +01:43:29.413 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842335" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4426.584473 9.983749 11031.109375>') +01:43:29.413 ENTITY : Create entity @"ENTITY:842337" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4427.572266 9.995750 11032.853516> +01:43:29.413 ENTITY : CreateComponent 'Hierarchy' +01:43:29.413 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842337" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4427.572266 9.995750 11032.853516>') +01:43:29.417 ENTITY : Create entity @"ENTITY:842591" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.946289 10.470250 1551.986084> +01:43:29.417 ENTITY : CreateComponent 'Hierarchy' +01:43:29.417 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842591" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.946289 10.470250 1551.986084>') +01:43:29.418 ENTITY : Create entity @"ENTITY:842593" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.430664 10.472250 1550.081421> +01:43:29.418 ENTITY : CreateComponent 'Hierarchy' +01:43:29.418 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842593" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.430664 10.472250 1550.081421>') +01:43:29.418 ENTITY : Create entity @"ENTITY:842595" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10008.926758 10.484250 1548.140869> +01:43:29.418 ENTITY : CreateComponent 'Hierarchy' +01:43:29.418 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842595" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10008.926758 10.484250 1548.140869>') +01:43:36.462 WORLD : InitEntities 'world' +01:43:36.462 ENTITY : Init entity @"ENTITY:2305843009213693953" ('Rereintroduced', ERR_GameMode) at <1076.468018 51.000999 1325.246948> @"{978E045E53EF36C8}Prefabs/ERR/GameMode.et" +01:43:36.462 SCRIPT (W): SCR_PerceivedFactionManagerComponent trying to set fall back faction 'CIV' but this faction could not be found so it is null instead. +01:43:37.148 ENTITY : SpawnEntityPrefab @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et" +01:43:37.148 ENTITY : Create entity @"ENTITY:4611686018427388381" ('SCR_PlayerController') at <0.000000 0.000000 0.000000> +01:43:37.148 ENTITY : EntityPrefabUse @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et" +01:43:37.148 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_PUNISHMENT_KILLING_SET'. There should only be one of each key! +01:43:37.149 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_TYPE_DISABLED'. There should only be one of each key! +01:43:37.150 SCRIPT (W): Can't open config file "" +01:43:37.150 SCRIPT (W): Cannot update game blocklist. Another request in progress. +01:43:37.151 WORLD : InitEntities 'world' +01:43:37.151 ENTITY : Init entity @"ENTITY:4611686018427388381" ('SCR_PlayerController') at <0.000000 0.000000 0.000000> @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et" +01:43:37.151 GUI : WidgetManager: CrateWidgets @"{3C9DCDD76AB83157}UI/layouts/HUD/HUDLayouts/HUDManager_Root.layout" +01:43:37.151 SCRIPT (W): Slot_WeaponInfo Has no Content! +01:43:37.151 SCRIPT (W): Slot_Chat Has no Content! +01:43:37.152 SCRIPT (W): Slot_VON Has no Content! +01:43:37.152 SCRIPT (W): Slot_AvailableActions Has no Content! +01:43:37.152 SCRIPT (W): Slot_Vehicle Has no Content! +01:43:37.152 SCRIPT (W): Slot_GameVersion Has no Content! +01:43:37.152 SCRIPT (W): Slot_Notifications Has no Content! +01:43:37.152 SCRIPT (W): Slot_Hints Has no Content! +01:43:37.327 WORLD : UpdateEntities +01:43:37.327 WORLD : PostFrame +01:43:37.327 GUI : WidgetManager: CrateWidgets @"{D89BBA18F99053D6}UI/layouts/HUD/Chat/ChatHud.layout" +01:43:37.327 SCRIPT (W): EditBoxFilterComponent used on invalid widget type. +01:44:47.585 GUI : WidgetManager: CrateWidgets @"{144919871D65F121}UI/layouts/HUD/GameOver/EndScreen/EndScreen.layout" +01:44:47.585 SCRIPT (W): Slot_Chat Has no Content! +01:44:47.586 SCRIPT (W): Slot_VON Has no Content! +01:44:47.586 SCRIPT (W): Slot_GameVersion Has no Content! +01:44:47.586 SCRIPT (W): Slot_Notifications Has no Content! +01:44:49.577 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent Back +01:44:49.578 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent ChatButton +01:44:49.580 GUI : WidgetManager: CrateWidgets @"{144919871D65F121}UI/layouts/HUD/GameOver/EndScreen/EndScreen.layout" +01:44:49.580 SCRIPT (W): Slot_Chat Has no Content! +01:44:49.581 SCRIPT (W): Slot_VON Has no Content! +01:44:49.581 SCRIPT (W): Slot_GameVersion Has no Content! +01:44:49.581 SCRIPT (W): Slot_Notifications Has no Content! diff --git a/docs/evidence/native-2026-09-19-014052/headless-launch.log.txt b/docs/evidence/native-2026-09-19-014052/headless-launch.log.txt new file mode 100644 index 0000000..6ec1d0d --- /dev/null +++ b/docs/evidence/native-2026-09-19-014052/headless-launch.log.txt @@ -0,0 +1,156 @@ +[gamescope] [Info] console: gamescope version 3.16.28 (gcc 16.2.1) +No CAP_SYS_NICE, falling back to regular-priority compute and threads. +Performance will be affected. +[gamescope] [Info] scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts' +[gamescope] [Info] scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts/00-gamescope' +[gamescope] [Info] scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts/00-gamescope/common' +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/common/inspect.lua' (id: 0) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/common/modegen.lua' (id: 1) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/common/util.lua' (id: 2) +[gamescope] [Info] scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts/00-gamescope/displays' +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/asus.rogally.lcd.lua' (id: 3) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/deckhd.steamdeck.deckhd-lcd.lua' (id: 4) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/gpd.win4.lcd.lua' (id: 5) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/lenovo.legiongo.lcd.lua' (id: 6) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/lenovo.legiongos.lcd.lua' (id: 7) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/onexplayer.f1.oled.lua' (id: 8) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/valve.steamdeck.lcd.lua' (id: 9) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/valve.steamdeck.oled.lua' (id: 10) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/zotac.zone.oled.lua' (id: 11) +[gamescope] [Info] scriptmgr: Loading scripts from: '/etc/gamescope/scripts' +[gamescope] [Warn] scriptmgr: Directory '/etc/gamescope/scripts' does not exist +[gamescope] [Info] scriptmgr: Loading scripts from: '/home/jakub/.config/gamescope/scripts' +[gamescope] [Warn] scriptmgr: Directory '/home/jakub/.config/gamescope/scripts' does not exist +[gamescope] [Info] vulkan: selecting physical device 'AMD Radeon RX 6950 XT (RADV NAVI21)': queue family 1 (general queue family 0) +[gamescope] [Info] vulkan: physical device supports DRM format modifiers +[gamescope] [Info] wlserver: [backend/headless/backend.c:60] Creating headless backend +[gamescope] [Info] vulkan: supported DRM formats for sampling usage: +[gamescope] [Info] vulkan: AR24 (0x34325241) +[gamescope] [Info] vulkan: XR24 (0x34325258) +[gamescope] [Info] vulkan: AB24 (0x34324241) +[gamescope] [Info] vulkan: XB24 (0x34324258) +[gamescope] [Info] vulkan: RG16 (0x36314752) +[gamescope] [Info] vulkan: NV12 (0x3231564E) +[gamescope] [Info] vulkan: AB4H (0x48344241) +[gamescope] [Info] vulkan: XB4H (0x48344258) +[gamescope] [Info] vulkan: AB48 (0x38344241) +[gamescope] [Info] vulkan: XB48 (0x38344258) +[gamescope] [Info] vulkan: AB30 (0x30334241) +[gamescope] [Info] vulkan: XB30 (0x30334258) +[gamescope] [Info] vulkan: AR30 (0x30335241) +[gamescope] [Info] vulkan: XR30 (0x30335258) +[gamescope] [Info] wlserver: Using explicit sync when available +[gamescope] [Info] wlserver: Running compositor on wayland display 'gamescope-0' +[gamescope] [Info] wlserver: [backend/headless/backend.c:17] Starting headless backend +[gamescope] [Info] wlserver: Successfully initialized libei for input emulation! +[gamescope] [Error] wlserver: [xwayland/sockets.c:47] Failed to bind socket @/tmp/.X11-unix/X0: Address already in use +[gamescope] [Info] wlserver: [xwayland/server.c:108] Starting Xwayland on :2 +The XKEYBOARD keymap compiler (xkbcomp) reports: +> Warning: Multiple symbols for level 1/group 1 on key +> Using F23, ignoring XF86TouchpadOff +> Warning: Symbol map for key redefined +> Using last definition for conflicting fields +> Warning: Symbol map for key redefined +> Using last definition for conflicting fields +> Warning: Could not resolve keysym XF86ElectronicPrivacyScreenOn +> Warning: Could not resolve keysym XF86ElectronicPrivacyScreenOff +> Warning: Could not resolve keysym XF86ActionOnSelection +> Warning: Could not resolve keysym XF86ContextualInsert +> Warning: Could not resolve keysym XF86ContextualQuery +Errors from xkbcomp are not fatal to the X server +[gamescope] [Info] pipewire: stream state changed: connecting +[gamescope] [Info] pipewire: stream state changed: paused +[gamescope] [Info] pipewire: stream available on node ID: 177 +[gamescope] [Info] vblank: Using timerfd. +fsync: up and running. +[Gamescope WSI] No application info given. +[Gamescope WSI] Executable name: explorer.exe +ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment. +[Gamescope WSI] Application info: + pApplicationName: xalia.exe + applicationVersion: 0 + pEngineName: DXVK + engineVersion: 12587008 + apiVersion: 4206592 +[Gamescope WSI] Executable name: xalia.exe +ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment. +[Gamescope WSI] No application info given. +[Gamescope WSI] Application info: + pApplicationName: ArmaReforgerWorkbenchSteamDiag.exe + applicationVersion: 1 + pEngineName: DXVK + engineVersion: 12587008 + apiVersion: 4206592 +[Gamescope WSI] Executable name: ArmaReforgerWorkbenchSteamDiag.exe +ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment. +[Gamescope WSI] No application info given. +The XKEYBOARD keymap compiler (xkbcomp) reports: +> Warning: Unsupported maximum keycode 709, clipping. +> X11 cannot support keycodes above 255. +> Warning: Virtual modifier Hyper multiply defined +> Using 0, ignoring 0 +> Warning: Virtual modifier ScrollLock multiply defined +> Using 0, ignoring 0 +Errors from xkbcomp are not fatal to the X server +ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment. +[Gamescope WSI] Application info: + pApplicationName: ArmaReforgerWorkbenchSteamDiag.exe + applicationVersion: 0 + pEngineName: DXVK + engineVersion: 12587008 + apiVersion: 4206592 +ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment. +[Gamescope WSI] Application info: + pApplicationName: ArmaReforgerWorkbenchSteamDiag.exe + applicationVersion: 0 + pEngineName: vkd3d + engineVersion: 12587008 + apiVersion: 4206592 +[Gamescope WSI] Forcing on VK_EXT_swapchain_maintenance1. +ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment. +[Gamescope WSI] No application info given. +ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment. +[Gamescope WSI] Application info: + pApplicationName: ArmaReforgerWorkbenchSteamDiag.exe + applicationVersion: 0 + pEngineName: vkd3d + engineVersion: 12587008 + apiVersion: 4206592 +[Gamescope WSI] Forcing on VK_EXT_swapchain_maintenance1. +[Gamescope WSI] Creating Gamescope surface: xid: 0x1a001a4 +[Gamescope WSI] Atom of T was wrong type. Expected XCB_ATOM_CARDINAL. +[Gamescope WSI] Made gamescope surface for xid: 0x1a001a4 +[Gamescope WSI] Surface state: + steam app id: 1874910 + window xid: 0x1a001a4 + wayland surface res id: 5 + layer client flags: 0x4 + server hdr output enabled: false + hdr formats exposed to client: false +[Gamescope WSI] Creating Gamescope surface: xid: 0x1a003a4 +[Gamescope WSI] Atom of T was wrong type. Expected XCB_ATOM_CARDINAL. +[Gamescope WSI] Made gamescope surface for xid: 0x1a003a4 +[Gamescope WSI] Surface state: + steam app id: 1874910 + window xid: 0x1a003a4 + wayland surface res id: 10 + layer client flags: 0x4 + server hdr output enabled: false + hdr formats exposed to client: false +[Gamescope WSI] Creating swapchain for xid: 0x1a003a4 - oldSwapchain: (nil) - provided minImageCount: 3 - minImageCount: 3 - format: VK_FORMAT_B8G8R8A8_UNORM - colorspace: VK_COLOR_SPACE_SRGB_NONLINEAR_KHR - flip: false +[Gamescope WSI] Created swapchain for xid: 0x1a003a4 swapchain: 0x55557b39d190 - imageCount: 4 +[Gamescope WSI] Destroying swapchain: 0x55557b39d190 +[Gamescope WSI] Destroyed swapchain: 0x55557b39d190 +[Gamescope WSI] Creating swapchain for xid: 0x1a003a4 - oldSwapchain: (nil) - provided minImageCount: 3 - minImageCount: 3 - format: VK_FORMAT_B8G8R8A8_UNORM - colorspace: VK_COLOR_SPACE_SRGB_NONLINEAR_KHR - flip: false +[Gamescope WSI] Created swapchain for xid: 0x1a003a4 swapchain: 0x55557b39d190 - imageCount: 4 +[Gamescope WSI] Destroying swapchain: 0x55557b39d190 +[Gamescope WSI] Destroyed swapchain: 0x55557b39d190 +[Gamescope WSI] Creating swapchain for xid: 0x1a003a4 - oldSwapchain: (nil) - provided minImageCount: 3 - minImageCount: 3 - format: VK_FORMAT_B8G8R8A8_UNORM - colorspace: VK_COLOR_SPACE_SRGB_NONLINEAR_KHR - flip: false +[Gamescope WSI] Created swapchain for xid: 0x1a003a4 swapchain: 0x55557b344af0 - imageCount: 4 +[Gamescope WSI] Creating swapchain for xid: 0x1a001a4 - oldSwapchain: (nil) - provided minImageCount: 3 - minImageCount: 3 - format: VK_FORMAT_R8G8B8A8_UNORM - colorspace: VK_COLOR_SPACE_SRGB_NONLINEAR_KHR - flip: true +[Gamescope WSI] Created swapchain for xid: 0x1a001a4 swapchain: 0x55557c7565c0 - imageCount: 3 +[Gamescope WSI] Destroying swapchain: 0x55557c7565c0 +[Gamescope WSI] Destroyed swapchain: 0x55557c7565c0 +[Gamescope WSI] Creating swapchain for xid: 0x1a001a4 - oldSwapchain: (nil) - provided minImageCount: 3 - minImageCount: 3 - format: VK_FORMAT_R8G8B8A8_UNORM - colorspace: VK_COLOR_SPACE_SRGB_NONLINEAR_KHR - flip: true +[Gamescope WSI] Created swapchain for xid: 0x1a001a4 swapchain: 0x55557c7565c0 - imageCount: 3 +[gamescope] [Error] xwm: X11 I/O error! This is fatal. Aborting... diff --git a/docs/evidence/native-2026-09-19-014052/report.json b/docs/evidence/native-2026-09-19-014052/report.json new file mode 100644 index 0000000..ad3259f --- /dev/null +++ b/docs/evidence/native-2026-09-19-014052/report.json @@ -0,0 +1,17 @@ +{ + "log": "docs/evidence/native-2026-09-19-014052/console.log.txt", + "smoke_completions": 2, + "assertions_passed": 30, + "script_or_runtime_failures": [], + "engine_errors": [ + "01:41:35.791 WORLD (E): Unknown keyword/data 'SlidingTrackMaterial' at offset 19441(0x4bf1)", + "01:41:35.836 WORLD (E): Unknown keyword/data 'Parent' at offset 35955(0x8c73)", + "01:41:35.836 WORLD (E): Unknown keyword/data 'Parent' at offset 36915(0x9033)", + "01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 42646(0xa696)", + "01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 43645(0xaa7d)", + "01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 44617(0xae49)", + "01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 45590(0xb216)" + ], + "missing_end_screen": [], + "scope": "scripted local Workbench integration only; no multiplayer, piloting or FPS claim" +} diff --git a/docs/evidence/native-2026-09-19-014052/rereintroduced-hq.log.txt b/docs/evidence/native-2026-09-19-014052/rereintroduced-hq.log.txt new file mode 100644 index 0000000..8976305 --- /dev/null +++ b/docs/evidence/native-2026-09-19-014052/rereintroduced-hq.log.txt @@ -0,0 +1,22 @@ +#1 t=1.3s M0 REGISTER group 1 [session=1789774898-1] +#2 t=1.3s M0 MORTAR DEPLOY site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; authored gun and four-person crew; finite ammunition initialization pending [session=1789774898-1] +#3 t=3.3s M0 REGISTER group 2 [session=1789774898-1] +#4 t=3.3s M0 REGISTER group 3 [session=1789774898-1] +#5 t=3.3s M0 REGISTER group 4 [session=1789774898-1] +#6 t=11.8s M0 MORTAR CREW ACTIVATE site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; startup delay elapsed; activating and equipping crew [session=1789774898-1] +#7 t=11.8s M0 MORTAR EQUIP site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; crew=SCR_ChimeraCharacter<0x00000000D4A99170> @"ENTITY:4611686018427388719" ('SCR_ChimeraCharacter','Assets/Characters/Basebody/Basebody_Male_01.xob') at <6000.000000 203.316498 7004.000000> @"{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et" inventory HE=9 requested=9 radio capability=1 (0=none) [session=1789774898-1] +#8 t=11.8s M0 MORTAR EQUIP site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; crew=SCR_ChimeraCharacter<0x00000000D4A9F530> @"ENTITY:4611686018427388825" ('SCR_ChimeraCharacter','Assets/Characters/Basebody/Basebody_Male_01.xob') at <6003.000000 202.817322 7001.000000> @"{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et" inventory HE=9 requested=9 radio capability=1 (0=none) [session=1789774898-1] +#9 t=11.8s M0 MORTAR EQUIP site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; crew=SCR_ChimeraCharacter<0x00000000D4AAA670> @"ENTITY:4611686018427389135" ('SCR_ChimeraCharacter','Assets/Characters/Basebody/Basebody_Male_01.xob') at <5997.000000 202.910233 7001.000000> @"{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et" inventory HE=9 requested=9 radio capability=1 (0=none) [session=1789774898-1] +#10 t=11.8s M0 MORTAR RADIO EQUIP site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; operator=SCR_ChimeraCharacter<0x00000000D4AB1530> @"ENTITY:4611686018427389297" ('SCR_ChimeraCharacter','Assets/Characters/Basebody/Basebody_Male_01.xob') at <6006.000000 202.378983 6998.000000> @"{612F43A4D5AE765F}Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_RTO.et" capability=2 (2=physical manpack); next HQ radio index verifies route [session=1789774898-1] +#11 t=70s M0 STOP HQ stopped; tactical orders released [session=1789774898-1] +#1 t=1.4s M0 REGISTER group 1 [session=1789775016-2] +#2 t=1.4s M0 MORTAR DEPLOY site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; authored gun and four-person crew; finite ammunition initialization pending [session=1789775016-2] +#3 t=3.4s M0 REGISTER group 2 [session=1789775016-2] +#4 t=3.4s M0 REGISTER group 3 [session=1789775016-2] +#5 t=3.4s M0 REGISTER group 4 [session=1789775016-2] +#6 t=11.9s M0 MORTAR CREW ACTIVATE site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; startup delay elapsed; activating and equipping crew [session=1789775016-2] +#7 t=11.9s M0 MORTAR EQUIP site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; crew=SCR_ChimeraCharacter<0x00000000D4A97AB0> @"ENTITY:4611686018427388719" ('SCR_ChimeraCharacter','Assets/Characters/Basebody/Basebody_Male_01.xob') at <6000.000000 203.316498 7004.000000> @"{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et" inventory HE=9 requested=9 radio capability=1 (0=none) [session=1789775016-2] +#8 t=11.9s M0 MORTAR EQUIP site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; crew=SCR_ChimeraCharacter<0x00000000D4AB88B0> @"ENTITY:4611686018427388825" ('SCR_ChimeraCharacter','Assets/Characters/Basebody/Basebody_Male_01.xob') at <6003.000000 202.817322 7001.000000> @"{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et" inventory HE=9 requested=9 radio capability=1 (0=none) [session=1789775016-2] +#9 t=11.9s M0 MORTAR EQUIP site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; crew=SCR_ChimeraCharacter<0x00000000D4ADD230> @"ENTITY:4611686018427389135" ('SCR_ChimeraCharacter','Assets/Characters/Basebody/Basebody_Male_01.xob') at <5997.000000 202.910233 7001.000000> @"{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et" inventory HE=9 requested=9 radio capability=1 (0=none) [session=1789775016-2] +#10 t=11.9s M0 MORTAR RADIO EQUIP site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; operator=SCR_ChimeraCharacter<0x00000000D4A3B0F0> @"ENTITY:4611686018427389297" ('SCR_ChimeraCharacter','Assets/Characters/Basebody/Basebody_Male_01.xob') at <6006.000000 202.378983 6998.000000> @"{612F43A4D5AE765F}Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_RTO.et" capability=2 (2=physical manpack); next HQ radio index verifies route [session=1789775016-2] +#11 t=70.2s M0 STOP HQ stopped; tactical orders released [session=1789775016-2] diff --git a/docs/evidence/native-2026-09-19-014052/runner.json.txt b/docs/evidence/native-2026-09-19-014052/runner.json.txt new file mode 100644 index 0000000..b4653d5 --- /dev/null +++ b/docs/evidence/native-2026-09-19-014052/runner.json.txt @@ -0,0 +1,8 @@ +{ + "result": "smoke-completed", + "session": "/tmp/erri-workbench-profile/logs/logs_2026-09-19_01-40-52", + "rounds_required": 2, + "display": "headless Gamescope 1280x720/30Hz", + "dedicated_server": false, + "audio": "silent sink and per-test-stream mute" +} diff --git a/docs/evidence/native-2026-09-19-014052/script.log.txt b/docs/evidence/native-2026-09-19-014052/script.log.txt new file mode 100644 index 0000000..97787a6 --- /dev/null +++ b/docs/evidence/native-2026-09-19-014052/script.log.txt @@ -0,0 +1,188 @@ +--------------------------------------------- +Log Z:\tmp\erri-workbench-profile\logs\logs_2026-09-19_01-40-52\script.log started at 2026-09-19 01:40:55 (2026-09-18 23:40:55 UTC) + +01:40:55.421 SCRIPT : SCRIPT : Initializing scripts +01:40:55.421 SCRIPT : SCRIPT : ScriptProjectManager init +01:40:57.760 SCRIPT : SCRIPT : Compiling GameLib scripts +01:40:57.829 SCRIPT : Module: Workbench; loaded 18x files; 36x classes; used 125K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_VHC_OVERRIDE,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE"; CRC32: 90ce0460 +01:40:57.830 SCRIPT : Module: GameLib; loaded 465x files; 648x classes; used 828K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_VHC_OVERRIDE,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE"; CRC32: 4507af04 +01:40:57.830 SCRIPT : SCRIPT : Compiling Game scripts +01:40:59.045 SCRIPT : Compiling Game scripts +01:40:59.045 SCRIPT (W): @"Scripts/Game/Editor/Components/EditableEntity/SCR_EditableEntityComponent.c,785": 'GetPlayerPlatformKind' is obsolete +01:40:59.045 SCRIPT (W): @"Scripts/Game/Editor/Components/EditableEntity/SCR_EditableEntityComponent.c,786": 'GetPlayerPlatformId' is obsolete +01:40:59.302 SCRIPT (W): @"Scripts/Game/Workshop/SCR_AddonManager.c,876": 'GetRefCount' is obsolete: Will be removed +01:40:59.333 SCRIPT (W): @"Scripts/Game/Campaign/SCR_PlayerProfileManagerComponent.c,142": 'PlayerData' is obsolete +01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,159": 'GetDSSession' is obsolete +01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,162": 'RoomID' is obsolete +01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,197": 'GetDSSession' is obsolete +01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,201": 'RoomID' is obsolete +01:40:59.532 SCRIPT (W): @"Scripts/Game/DataCollection/SCR_DataCollectorComponent.c,481": 'GetStorage' is obsolete +01:40:59.532 SCRIPT (W): @"Scripts/Game/DataCollection/SCR_DataCollectorComponent.c,483": 'GetOnlineWritePrivilege' is obsolete +01:40:59.533 SCRIPT (W): @"Scripts/Game/Utilities/SCR_PlayerIdentityUtils.c,20": 'GetPlayerIdentityId' is obsolete +01:40:59.575 SCRIPT (W): @"Scripts/Game/UI/Menu/MainMenuUI.c,643": 'GetNotifyCount' is obsolete: Will be substitued by Notification Api. +01:40:59.575 SCRIPT (W): @"Scripts/Game/UI/Menu/MainMenuUI.c,645": 'GetNotifyItem' is obsolete: Will be substitued by Notification Api. +01:40:59.630 SCRIPT (W): @"Scripts/Game/DataCollection/PlayerData/SCR_PlayerData.c,210": 'PlayerData' is obsolete +01:40:59.895 SCRIPT : Module: WorkbenchGame; loaded 171x files; 616x classes; used 2481K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_VHC_OVERRIDE,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE"; CRC32: ad6a2625 +01:40:59.902 SCRIPT : Module: Game; loaded 5695x files; 11168x classes; used 32439K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_VHC_OVERRIDE,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE,ENABLE_BASE_DESTRUCTION,BUDGET_OPTIMIZATION_CHECKS,SHOW_DISCLAIMER,DEBUG,RESPAWN_TIMER_COMPONENT_DEBUG,GAME_MODE_DEBUG,DEBUG_CONFIGURABLE_DIALOGS,DISABLE_WEAPON_SWITCHING,SCRIPTED_AIM_MODIFIER_DEBUG"; CRC32: 25e8ccf6 +01:41:00.852 SCRIPT : Unable to register a script command due keyword duplicity: ban +01:41:00.852 SCRIPT : Unable to register a script command due keyword duplicity: kick +01:41:21.226 SCRIPT : ERR VALIDATION: prison terrain=211.344, radio terrain=159.656, extraction terrain=65.1562 +01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7154 y=211.531 +01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7157 y=211.516 +01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7160 y=211.5 +01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7163 y=211.453 +01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7166 y=211.406 +01:41:21.226 SCRIPT : ERR TERRAIN: x=6087 z=7154 y=211.438 +01:41:21.226 SCRIPT : ERR TERRAIN: x=6087 z=7157 y=211.438 +01:41:21.227 SCRIPT : ERR TERRAIN: x=6087 z=7160 y=211.422 +01:41:21.227 SCRIPT : ERR TERRAIN: x=6087 z=7163 y=211.391 +01:41:21.227 SCRIPT : ERR TERRAIN: x=6087 z=7166 y=211.344 +01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7154 y=211.344 +01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7157 y=211.344 +01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7160 y=211.344 +01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7163 y=211.328 +01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7166 y=211.281 +01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7154 y=211.25 +01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7157 y=211.281 +01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7160 y=211.25 +01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7163 y=211.234 +01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7166 y=211.188 +01:41:21.228 SCRIPT : ERR TERRAIN: x=6096 z=7154 y=211.156 +01:41:21.228 SCRIPT : ERR TERRAIN: x=6096 z=7157 y=211.172 +01:41:21.228 SCRIPT : ERR TERRAIN: x=6096 z=7160 y=211.156 +01:41:21.229 SCRIPT : ERR TERRAIN: x=6096 z=7163 y=211.141 +01:41:21.229 SCRIPT : ERR TERRAIN: x=6096 z=7166 y=211.094 +01:41:21.250 SCRIPT : ERR SITE CANDIDATE: position=<6090,211.344,7160> elevationRange=0.640625 +01:41:24.602 SCRIPT : Unable to register a script command due keyword duplicity: ban +01:41:24.602 SCRIPT : Unable to register a script command due keyword duplicity: kick +01:41:38.078 SCRIPT (W): SCR_PerceivedFactionManagerComponent trying to set fall back faction 'CIV' but this faction could not be found so it is null instead. +01:41:38.104 SCRIPT : ERR SMOKE: scripted integration test enabled; gameplay acceptance remains separate +01:41:38.611 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_PUNISHMENT_KILLING_SET'. There should only be one of each key! +01:41:38.611 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_TYPE_DISABLED'. There should only be one of each key! +01:41:38.613 SCRIPT (W): Can't open config file "" +01:41:38.621 SCRIPT (W): Slot_WeaponInfo Has no Content! +01:41:38.621 SCRIPT (W): Slot_Chat Has no Content! +01:41:38.621 SCRIPT (W): Slot_VON Has no Content! +01:41:38.621 SCRIPT (W): Slot_AvailableActions Has no Content! +01:41:38.621 SCRIPT (W): Slot_Vehicle Has no Content! +01:41:38.622 SCRIPT (W): Slot_GameVersion Has no Content! +01:41:38.622 SCRIPT (W): Slot_Notifications Has no Content! +01:41:38.622 SCRIPT (W): Slot_Hints Has no Content! +01:41:38.637 SCRIPT (W): Ban Settings could not be loaded from BE Storage: Relying on default config +01:41:38.688 SCRIPT : ScenarioFramework: Available tasks are empty, no new tasks will be generated. +01:41:38.701 SCRIPT : SCR_BaseGameMode::OnGameStateChanged = GAME +01:41:38.883 SCRIPT (W): EditBoxFilterComponent used on invalid widget type. +01:41:40.508 SCRIPT : Rereintroduced [mission]: phase 0 -> 1 +01:41:40.919 SCRIPT : INFO: Faction: player jakub (playerID = 1 | UUID = 00000000-0000-0000-0000-000000000000) has joined faction #AR-Faction_US (US) +01:41:40.999 SCRIPT : Rereintroduced [spawn]: player 1 at <6090,211.344,7160> +01:41:41.049 SCRIPT : ERR SMOKE PASS: new identity may enter prison +01:41:41.049 SCRIPT : ERR SMOKE PASS: spawn consumes identity life +01:41:41.050 SCRIPT : ERR SMOKE PASS: disconnect retains living actor and clears connection +01:41:41.050 SCRIPT : ERR SMOKE PASS: reconnected identity retains spent life +01:41:41.050 SCRIPT : ERR SMOKE PASS: duplicate active identity rejected +01:41:41.050 SCRIPT : ERR SMOKE PASS: recycled connection receives independent life and extraction admission policy +01:41:51.140 SCRIPT : ERR SMOKE PASS: authored physical mortar and four-person crew initialize +01:41:51.140 SCRIPT : ERR SMOKE PASS: mortar has a dedicated physical manpack operator +01:41:51.141 SCRIPT : ERR SMOKE PASS: mortar starts with exactly 27 physical HE shells +01:42:06.266 SCRIPT : ERR SMOKE PASS: depleted mortar inventory stays empty without fabricated ammunition +01:42:18.384 SCRIPT : ERR SMOKE PASS: lost mortar and crew remain lost without replacement spawning +01:42:18.385 SCRIPT : INFO: KILL SUICIDE: jakub (playerID = 1 | UUID = 00000000-0000-0000-0000-000000000000) from US faction at <6090, 211.344, 7160> killed himself! +01:42:22.418 SCRIPT : ERR SMOKE PASS: native damage kills prisoner +01:42:22.418 SCRIPT : ERR SMOKE PASS: death selects spectator without another life +01:42:22.418 SCRIPT : ERR SMOKE PASS: spectator camera activates after native death +01:42:49.204 SCRIPT : Rereintroduced [mission]: phase 1 -> 6 +01:42:49.204 SCRIPT : ERR SMOKE PASS: death exhausts round life and reaches defeat after spectator grace +01:42:49.204 SCRIPT : ERR SMOKE COMPLETE: terminal=6 lostHelicopterCase=0 playerDeathCase=1 +01:42:49.251 SCRIPT : SCR_BaseGameMode::OnGameStateChanged = POSTGAME +01:42:49.253 SCRIPT (W): Slot_Chat Has no Content! +01:42:49.253 SCRIPT (W): Slot_VON Has no Content! +01:42:49.253 SCRIPT (W): Slot_GameVersion Has no Content! +01:42:49.253 SCRIPT (W): Slot_Notifications Has no Content! +01:42:51.240 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent Back +01:42:51.240 SCRIPT : -- Stack trace -- +01:42:51.240 SCRIPT : GetComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_ScriptedWidgetComponent.c : 43 +01:42:51.241 SCRIPT : GetInputButtonComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_InputButton/SCR_InputButtonComponent.c : 1214 +01:42:51.241 SCRIPT : OnMenuOpen() Scripts/Game/UI/GameOverScreen/SCR_GameOverScreenInput.c : 15 +01:42:51.241 SCRIPT : OpenGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 447 +01:42:51.241 SCRIPT : ShowGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 177 +01:42:51.241 SCRIPT : OnUpdate() Scripts/Game/game.c : 885 +01:42:51.241 SCRIPT : ----------------- +01:42:51.241 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent ChatButton +01:42:51.242 SCRIPT : -- Stack trace -- +01:42:51.242 SCRIPT : GetComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_ScriptedWidgetComponent.c : 43 +01:42:51.242 SCRIPT : GetInputButtonComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_InputButton/SCR_InputButtonComponent.c : 1214 +01:42:51.242 SCRIPT : OnMenuOpen() Scripts/Game/UI/GameOverScreen/SCR_GameOverScreenInput.c : 21 +01:42:51.242 SCRIPT : OpenGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 447 +01:42:51.242 SCRIPT : ShowGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 177 +01:42:51.242 SCRIPT : OnUpdate() Scripts/Game/game.c : 885 +01:42:51.243 SCRIPT : ----------------- +01:42:51.244 SCRIPT (W): Slot_Chat Has no Content! +01:42:51.244 SCRIPT (W): Slot_VON Has no Content! +01:42:51.245 SCRIPT (W): Slot_GameVersion Has no Content! +01:42:51.245 SCRIPT (W): Slot_Notifications Has no Content! +01:43:19.217 SCRIPT (W): Maybe a problem: DataProgression is not ready but the analytics event was requested +01:43:36.462 SCRIPT (W): SCR_PerceivedFactionManagerComponent trying to set fall back faction 'CIV' but this faction could not be found so it is null instead. +01:43:36.462 SCRIPT : ERR SMOKE: scripted integration test enabled; gameplay acceptance remains separate +01:43:37.148 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_PUNISHMENT_KILLING_SET'. There should only be one of each key! +01:43:37.149 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_TYPE_DISABLED'. There should only be one of each key! +01:43:37.150 SCRIPT (W): Can't open config file "" +01:43:37.150 SCRIPT (W): Cannot update game blocklist. Another request in progress. +01:43:37.151 SCRIPT (W): Slot_WeaponInfo Has no Content! +01:43:37.151 SCRIPT (W): Slot_Chat Has no Content! +01:43:37.152 SCRIPT (W): Slot_VON Has no Content! +01:43:37.152 SCRIPT (W): Slot_AvailableActions Has no Content! +01:43:37.152 SCRIPT (W): Slot_Vehicle Has no Content! +01:43:37.152 SCRIPT (W): Slot_GameVersion Has no Content! +01:43:37.152 SCRIPT (W): Slot_Notifications Has no Content! +01:43:37.152 SCRIPT (W): Slot_Hints Has no Content! +01:43:37.182 SCRIPT : ScenarioFramework: Available tasks are empty, no new tasks will be generated. +01:43:37.195 SCRIPT : SCR_BaseGameMode::OnGameStateChanged = GAME +01:43:37.327 SCRIPT (W): EditBoxFilterComponent used on invalid widget type. +01:43:38.733 SCRIPT : Rereintroduced [mission]: phase 0 -> 1 +01:43:39.219 SCRIPT : INFO: Faction: player jakub (playerID = 1 | UUID = 00000000-0000-0000-0000-000000000000) has joined faction #AR-Faction_US (US) +01:43:39.246 SCRIPT : Rereintroduced [spawn]: player 1 at <6090,211.444,7160> +01:43:39.269 SCRIPT : ERR SMOKE PASS: new identity may enter prison +01:43:39.269 SCRIPT : ERR SMOKE PASS: spawn consumes identity life +01:43:39.270 SCRIPT : ERR SMOKE PASS: disconnect retains living actor and clears connection +01:43:39.270 SCRIPT : ERR SMOKE PASS: reconnected identity retains spent life +01:43:39.270 SCRIPT : ERR SMOKE PASS: duplicate active identity rejected +01:43:39.270 SCRIPT : ERR SMOKE PASS: recycled connection receives independent life and extraction admission policy +01:43:49.368 SCRIPT : ERR SMOKE PASS: authored physical mortar and four-person crew initialize +01:43:49.369 SCRIPT : ERR SMOKE PASS: mortar has a dedicated physical manpack operator +01:43:49.369 SCRIPT : ERR SMOKE PASS: mortar starts with exactly 27 physical HE shells +01:44:04.535 SCRIPT : ERR SMOKE PASS: depleted mortar inventory stays empty without fabricated ammunition +01:44:16.624 SCRIPT : ERR SMOKE PASS: lost mortar and crew remain lost without replacement spawning +01:44:16.625 SCRIPT : INFO: KILL SUICIDE: jakub (playerID = 1 | UUID = 00000000-0000-0000-0000-000000000000) from US faction at <6090, 211.342, 7160> killed himself! +01:44:20.660 SCRIPT : ERR SMOKE PASS: native damage kills prisoner +01:44:20.661 SCRIPT : ERR SMOKE PASS: death selects spectator without another life +01:44:20.661 SCRIPT : ERR SMOKE PASS: spectator camera activates after native death +01:44:47.538 SCRIPT : Rereintroduced [mission]: phase 1 -> 6 +01:44:47.538 SCRIPT : ERR SMOKE PASS: death exhausts round life and reaches defeat after spectator grace +01:44:47.539 SCRIPT : ERR SMOKE COMPLETE: terminal=6 lostHelicopterCase=0 playerDeathCase=1 +01:44:47.584 SCRIPT : SCR_BaseGameMode::OnGameStateChanged = POSTGAME +01:44:47.585 SCRIPT (W): Slot_Chat Has no Content! +01:44:47.586 SCRIPT (W): Slot_VON Has no Content! +01:44:47.586 SCRIPT (W): Slot_GameVersion Has no Content! +01:44:47.586 SCRIPT (W): Slot_Notifications Has no Content! +01:44:49.577 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent Back +01:44:49.577 SCRIPT : -- Stack trace -- +01:44:49.577 SCRIPT : GetComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_ScriptedWidgetComponent.c : 43 +01:44:49.577 SCRIPT : GetInputButtonComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_InputButton/SCR_InputButtonComponent.c : 1214 +01:44:49.577 SCRIPT : OnMenuOpen() Scripts/Game/UI/GameOverScreen/SCR_GameOverScreenInput.c : 15 +01:44:49.577 SCRIPT : OpenGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 447 +01:44:49.577 SCRIPT : ShowGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 177 +01:44:49.577 SCRIPT : OnUpdate() Scripts/Game/game.c : 885 +01:44:49.578 SCRIPT : ----------------- +01:44:49.578 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent ChatButton +01:44:49.578 SCRIPT : -- Stack trace -- +01:44:49.578 SCRIPT : GetComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_ScriptedWidgetComponent.c : 43 +01:44:49.578 SCRIPT : GetInputButtonComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_InputButton/SCR_InputButtonComponent.c : 1214 +01:44:49.578 SCRIPT : OnMenuOpen() Scripts/Game/UI/GameOverScreen/SCR_GameOverScreenInput.c : 21 +01:44:49.578 SCRIPT : OpenGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 447 +01:44:49.579 SCRIPT : ShowGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 177 +01:44:49.579 SCRIPT : OnUpdate() Scripts/Game/game.c : 885 +01:44:49.579 SCRIPT : ----------------- +01:44:49.580 SCRIPT (W): Slot_Chat Has no Content! +01:44:49.581 SCRIPT (W): Slot_VON Has no Content! +01:44:49.581 SCRIPT (W): Slot_GameVersion Has no Content! +01:44:49.581 SCRIPT (W): Slot_Notifications Has no Content! diff --git a/docs/evidence/native-2026-09-19-014052/source-sha256.json b/docs/evidence/native-2026-09-19-014052/source-sha256.json new file mode 100644 index 0000000..3f55aa4 --- /dev/null +++ b/docs/evidence/native-2026-09-19-014052/source-sha256.json @@ -0,0 +1,74 @@ +{ + "addons/ai/Prefabs/ERR/MortarCrew.et": "05d3e7353ff9fe5523218a1487b31b7b742b0be8adbcb060c7099978cf008bce", + "addons/ai/Prefabs/ERR/MortarCrew.et.meta": "fdfd4fcd21a67c3d698fa4aadc4e5c76e665cebf4be86013bc389e493fab63cc", + "addons/ai/Scripts/Game/ERR/ERR_HQ.c": "532b0073fc19625a72a057b92dcbfa46309dd0826a9912896c75d64ec37350c6", + "addons/ai/Scripts/Game/ERR/ERR_HQJournal.c": "b3e402cfe92d415f37f666045afb062e6e11670ba03a0ca6f2d9fd4fc3520ac1", + "addons/ai/Scripts/Game/ERR/ERR_HQNetwork.c": "92ff2caca52e94c2cc9642dfc8509ce6e9349b257012bade8650bace9231128c", + "addons/ai/Scripts/Game/ERR/ERR_HQObservation.c": "36c978ec5f052213ac1236e1398d85063efbfd7ef60fe04f1fc11447fefe1d68", + "addons/ai/Scripts/Game/ERR/ERR_HQReport.c": "c4d16ccb571db4d9444c0a8d2be7318845d25ff90238b6d304e96a9ea19f1a08", + "addons/ai/Scripts/Game/ERR/ERR_HelicopterAvailability.c": "60eaef2f6d4b2fd44861c5a4434ef97e732e40a5ff7401e2da451ed2dd9c2762", + "addons/ai/Scripts/Game/ERR/ERR_MortarBattery.c": "66b8f16b692a0f75fc9d920f5224d9292a0f1dc7dd8b2dde912e676fa80ddc9c", + "addons/ai/Scripts/Game/ERR/ERR_MortarFiring.c": "657e96d1112b68c8ced37793e99f88e6078b38a579190e63d00b1f9a9a032e26", + "addons/ai/Scripts/Game/ERR/ERR_MortarPrediction.c": "470dd196ed64800c697d24c09d1344bacd2502587fac76af4ee0edae2563092d", + "addons/ai/Scripts/Game/ERR/ERR_MortarSalvo.c": "697c01f479df6c505a41d984a29c02002e3052114dafa2ec6252ae55e2979a2b", + "addons/ai/Scripts/Game/ERR/ERR_MortarSystem.c": "9369e9227eef9d0a46f4a86535aa498751bc780ee7d23c58e99ece877b910e21", + "addons/ai/Scripts/Game/ERR/ERR_SettlementSafety.c": "e5c0ebc95521a9a33a3f7d9cca6c551dda862a08b7af20b017877aba9584795b", + "addons/ai/Scripts/Game/ERR/ERR_SupportScenario.c": "71757018ec9716c4dc24f62a292a214919d3fd5daed3c16e03e56abd208e9f03", + "addons/ai/addon.gproj": "5f559db8f526700db11e6ae763f5245f19b7006fc68c56e4c09fb6f940bdf2a1", + "addons/chat/Missions/ERR_Everon.conf": "76f3ac0d21b585654beac7ddd68e3c8cbdd66dbfe909b17b04838fa813a7c29b", + "addons/chat/Missions/ERR_Everon.conf.meta": "0a23c98bf83873536c65fa17d38dea33a1d7b9e4ab210f90633ff688abcc551f", + "addons/chat/Scripts/Game/ERR/ERR_AdminCommands.c": "86d0ddf7d9872c02c2e1f9972406b536473e0cc69837e8e30d90dfd4fab5511e", + "addons/chat/Scripts/Game/ERR/ERR_NativeMortarProbe.c": "ddb892141500c192c0787b011d57dd8c07dd8c9a3ca5fdc407f6c271897bde0a", + "addons/chat/Scripts/Game/ERR/ERR_NativeRadioProbe.c": "6f86e6815a0f7111b42d9b6a6eb183e1e377ac860c3c2bb30365c6a77c8d1bf8", + "addons/chat/Scripts/Game/ERR/ERR_NativeSmoke.c": "fe89b8e600b13863ebb1c7a32b1cf2d0a9b6daee1dbddcb6c54bfcda10bb4243", + "addons/chat/Scripts/WorkbenchGame/ERR/ERR_ValidateWorldPlugin.c": "81c92d408ce88cc9f98d6053f1d0c863427693ba748f00df9f1bf8079015ef94", + "addons/chat/addon.gproj": "ea1587e0174cf795334d306c71d99b06797fc891427cd57b6cab6e21cf0e4e0e", + "addons/core/Configs/ERR/GameOverScreens.conf": "335d270e667cbdecd78f9c9fedfb29fc19692857cb5169c47000edad79778e31", + "addons/core/Configs/ERR/GameOverScreens.conf.meta": "eb654b745c0b97b41c991694569ef4877a3c2315e0826f9556337cd68690843e", + "addons/core/Prefabs/ERR/Extraction.et": "d95d311de0231cf669440a10ef3d68014b70067e50b8bdfb05db637cfc7ed628", + "addons/core/Prefabs/ERR/Extraction.et.meta": "c2a838633001e2e3a202d39cb33aa744ebcd996017ad032359069641b5d13853", + "addons/core/Prefabs/ERR/GameMode.et": "eb6f1fb1af1422701179e5b5c7a592ebcc9d9b59cdd6e0da8499b410da76abb6", + "addons/core/Prefabs/ERR/GameMode.et.meta": "106769cd34525c9d440057072836cb7401a6752148c40edd7fe61c03bd58328c", + "addons/core/Prefabs/ERR/Patrol.et": "c5685a8bc311cc5563fb3334beec9408d3d7a1069152fddeeb7df4f1b7f9e6ce", + "addons/core/Prefabs/ERR/Patrol.et.meta": "7c5da568fa2fcf0709ee2959253cb068d7c7ed7c2467af3b247a7e70efd96b69", + "addons/core/Prefabs/ERR/Prison.et": "cdf5f9ef11fc4160b5a5776190df6d0ad1ff3ca429f7244e2f35a4e3a7578dfb", + "addons/core/Prefabs/ERR/Prison.et.meta": "2e426ef3de68f4107907854b51e818bc11d84649a01c538e3f18dd9ebec766bb", + "addons/core/Prefabs/ERR/PrisonDoor.et": "fc66be9d36f1f01084de59f1b0a1e8817f9e46547ead33d4fafaac0107446c40", + "addons/core/Prefabs/ERR/PrisonDoor.et.meta": "b8f3db52bf186426026668fbb9d633c3cbd4d438ab301fba880398f6a0e781c2", + "addons/core/Prefabs/ERR/PrisonWall.et": "8009d19365ae72a4749d7ad4fa04662575b06c65c6bf06507d380d57258b5eed", + "addons/core/Prefabs/ERR/PrisonWall.et.meta": "0294bc5dbb56f90f8153d62459bb0a6ad91d76a479812bbec9c7db182fdb58d6", + "addons/core/Prefabs/ERR/Radio.et": "3946b355bf75375c449ed2ce1881bce9c8d9497cdea426c441f89f88a7585cb8", + "addons/core/Prefabs/ERR/Radio.et.meta": "bc91137b68ba550217914fb8892bb44d7e1920e4a1086f3e506623832a44212f", + "addons/core/Prefabs/ERR/SpectatorCamera.et": "b5b87d5b7b707f3745741aebe7c923067c8a74f8fbb2a4711834bab03bb5a812", + "addons/core/Prefabs/ERR/SpectatorCamera.et.meta": "2a16558f93915e31908a674509e9c89976470f78a84a1174a64b94b68b8f77ad", + "addons/core/Scripts/Game/ERR/ERR_Actions.c": "adf93245e6d78c59b9839599d157a0d2b2b93ea93b3d1ae52e2904dd6c288266", + "addons/core/Scripts/Game/ERR/ERR_Actors.c": "b3c5aabb05f7cf35167bc09b5db51a4ffd89a46658805d6eedbfb80eee30273d", + "addons/core/Scripts/Game/ERR/ERR_EscapeGameOverScreenInfo.c": "d305db5ef64f2dae43df16f1be37d78daf58c6ff24e0a9d7d29cb2100731ab88", + "addons/core/Scripts/Game/ERR/ERR_FactionCatalog.c": "ef8b390bd8e83dee8df755981fb1cb5ec16fe967189a22c5b46edfc37c66e21d", + "addons/core/Scripts/Game/ERR/ERR_GameMode.c": "d3122c72c0d6e41d40634287dc28f540363197f7057c5228e2e8122e5b4a2600", + "addons/core/Scripts/Game/ERR/ERR_Location.c": "7e6fa49a458643998ea26b0a9fa499670bbe998fc660301a6186f7dd2977c14a", + "addons/core/Scripts/Game/ERR/ERR_MissionRules.c": "f7abc38ad8fdc375ce7fa63a65f0bade027d22b37e09de5e3f94ba8c3c63cc41", + "addons/core/Scripts/Game/ERR/ERR_Observer.c": "9bb6644e5644af1798d8ab7cbee055f0543160da33f097c15f4d2fcf19ffbf75", + "addons/core/Scripts/Game/ERR/ERR_PlayerGuide.c": "f0050e28133f37be49f277c7e1ae7540fb944a30e89c1a61e158d12ee8704660", + "addons/core/Scripts/Game/ERR/ERR_PlayerRoster.c": "1f9cbed16c8670444f967ff38931d2456748262b94a5d0139c78a45b22d0c61e", + "addons/core/Scripts/Game/ERR/ERR_ScenarioComponent.c": "935a0fde6cd91f2b57626a89732e7f5c708f27980acc24da077d8ddd0505c7e3", + "addons/core/Scripts/Game/ERR/ERR_Settings.c": "349d0d9c5c13bd4dd528681180c78fa612418de2351030a002bab195ce981b7e", + "addons/core/Scripts/Game/ERR/ERR_SpawnLogic.c": "e37222435b72944e294e306f0f78b618e7db7862d80d1bde6a5df801359bc04c", + "addons/core/Scripts/Game/ERR/ERR_Supplies.c": "752e8a56b0b8cde33cf532032cb0a203553017b686faac2e19bee06f7a9c0713", + "addons/core/Worlds/ERR_Everon.ent": "22324bc7eb0d80dec8a1f3bd61a9df9201b72f749f4e751766b0c9d0b7d46b87", + "addons/core/Worlds/ERR_Everon.ent.meta": "19d1903ca72baa326b4724a6791d0da1104a1e53f3f31dc1ca41a856efd68e83", + "addons/core/Worlds/ERR_Everon_Layers/default.layer": "f1a058bd315c7d01d464715ac9f4e18ae3d2432551d094a9afbd4c9c5a2a9416", + "addons/core/addon.gproj": "231274e6b62302f32c65f9ff31de2ce8a9e51e1c8d12c87deeec82ae1f40de46", + "addons/intel/Scripts/Game/ERR/ERR_IntelService.c": "ff8d49d9d662834125f51a55f375918d8c3212e0a1a660234e454bdf7213b7b5", + "addons/intel/addon.gproj": "d0ced242cefb220a5cccd6779d61fda9bc55581701b9f78bcf13c09d92ddbcbe", + "addons/map/Materials/ERRM_MapRenderTarget.emat": "9877c5b175c5f30dd80bea36c711b21ab38219aa7075adf9ae79932e1d4c76bc", + "addons/map/Materials/ERRM_MapRenderTarget.emat.meta": "5ee1a705f8011a44020ca2691f5ccc17d44bf596fef9a36e98d1f267eb58fab0", + "addons/map/Prefabs/Items/Equipment/ERRM_SharedFieldMap.et": "30dee8e9eab459ea32a7d835a9fb89d43df47708057cab829f067b25a24cd581", + "addons/map/Prefabs/Items/Equipment/ERRM_SharedFieldMap.et.meta": "59093e9072c50d99c86da7609c87541016da5bcf92b98d99db4c524e1c8e0e8d", + "addons/map/Scripts/Game/ERR/ERR_DiscoveryMap.c": "ee9be2d313488224b3d52853e3fbe36bb225611d6a69c628b2a6a8efca8fc104", + "addons/map/Scripts/Game/ERR/ERR_ScenarioMap.c": "75fa1d742129ef7f33c005cd48f56db7f49ee7bde3c5428532b0b501b032b0a3", + "addons/map/Scripts/Game/ERRMap/ERRM_SharedMapComponent.c": "fc1a0c7df4fc96da446d7542a45a10fbec1eda1e543ba2f0581cb772277a47c5", + "addons/map/UI/layouts/ERRMap/SharedMapRenderTarget.layout": "49a2da4181b94d42174f58c7f9b6bf2207116c99427d61ff1c212092ac7db4d2", + "addons/map/UI/layouts/ERRMap/SharedMapRenderTarget.layout.meta": "5c846445cc089e2e08899ba703059d4adb805ff30ab5a16409a3cd59718cbd54", + "addons/map/addon.gproj": "1b371e5e01ea9fa46e76570fecb8aaa3a9298e34cba7ccca8a6bdb5ca86eb46a" +} diff --git a/docs/migration-provenance.json b/docs/migration-provenance.json index 763d3a7..c58388b 100644 --- a/docs/migration-provenance.json +++ b/docs/migration-provenance.json @@ -82,5 +82,23 @@ "sha256": "33457ec2ead243640e57dc12c969be0d59923455f89669024e50998f63cca690", "destination": "addons/map/Prefabs/Items/Equipment/ERRM_SharedFieldMap.et.meta", "changes": "Namespaced types, paths and resource identities; explicit shared map item only." + }, + { + "source": "escapists-ai/Scripts/Game/EscapistsAI/EAI_MortarSystem.c", + "sha256": "b355227b2b221147d35e1dacbc07cf650838229b9a6d22cd30cc1e304112b33f", + "destination": "addons/ai/Scripts/Game/ERR/ERR_MortarBattery.c", + "changes": "Only physical battery lifecycle, finite inventory, native activity and projectile accounting; successor creates authored group and gun. Original deployment and scheduler replaced." + }, + { + "source": "escapists-ai/Scripts/Game/EscapistsAI/EAI_MortarFiring.c", + "sha256": "aadd057a1f3f4326bd41500be7a12051a16de9d5925fca2452a46cdfbf0d6d12", + "destination": "addons/ai/Scripts/Game/ERR/ERR_MortarFiring.c", + "changes": "Native ballistic and final loading hooks migrated; successor HQ-delivered snapshots gate firing." + }, + { + "source": "escapists-ai/Scripts/Game/EscapistsAI/EAI_SettlementSafety.c", + "sha256": "6961ad593d20f86c30b557542b4f67fd44d9579037776b07cd95616927eda83d", + "destination": "addons/ai/Scripts/Game/ERR/ERR_SettlementSafety.c", + "changes": "Use vanilla named settlements; original mission location dependency removed." } ] diff --git a/docs/validation.md b/docs/validation.md index 97bdfee..ecba8df 100644 --- a/docs/validation.md +++ b/docs/validation.md @@ -4,7 +4,7 @@ ## Repository checks -`python3 tools/check.py` passes: five-addon isolation, acyclic dependencies, fourteen source resource identities, exact successor/vanilla GUID references, production mission-rule boundaries, physical radio paths and failure handling, settings conversion, helicopter availability policy and mortar salvo policy. The latter two are helper tests, not operational support-controller evidence. +`python3 tools/check.py` passes: five-addon isolation, acyclic dependencies, fifteen source resource identities, exact successor/vanilla GUID references, production mission-rule boundaries, physical radio paths and failure handling, settings conversion, helicopter availability policy and mortar salvo policy. The latter two are helper tests, not operational support-controller evidence. The reference guard verified all 533 original workspace source/resource files against the pre-test snapshot. Existing missions were not edited or saved. Native tests use a separate profile and only the successor projects plus vanilla dependencies. Earlier successful visible runs were measured on the right display. A later launch restored an oversized main Workbench window despite placement rules; those tests were stopped. Automated tests now run on an isolated headless display and create no physical-desktop windows. @@ -61,3 +61,7 @@ Both installed executable version resources report 1.8.0.13 (game Steam build 24 ## Silent complete-loop regression [native-2026-09-19-013224](evidence/native-2026-09-19-013224/report.json) completed two headless escape rounds with 52 assertions and no script/runtime exceptions after the roster, spectator and radio-composition changes. Test audio was independently verified muted on the dedicated silent sink; other audio outputs were unchanged. Seven inherited vehicle schema errors remain. A preceding launch exited before gameplay with a host `double free or corruption` error; its raw diagnostics are retained in `native-2026-09-19-012838-host-crash` and are not counted as a successful run. + +## Physical mortar inventory checkpoint + +[native-2026-09-19-014052](evidence/native-2026-09-19-014052/report.json) completed two muted headless rounds with 30 assertions and no script/VM exceptions. Native inventories held exactly 27 HE shells across three crew plus a separate manpack operator. Deleting the shells did not replenish ammunition; deleting the gun and crew did not spawn replacements. Seven inherited vehicle schema errors remain. Firing, convoy rearming and multiplayer support acceptance are unverified. Further support migration is deferred while completing the base replacement. diff --git a/docs/vanilla-resources.json b/docs/vanilla-resources.json index d96207f..439fadc 100644 --- a/docs/vanilla-resources.json +++ b/docs/vanilla-resources.json @@ -41,5 +41,10 @@ "Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_AR.et": "23ADBBC31B6A3DC6", "Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_AT.et": "1C78331E156A3D65", "Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_SR.et": "333DA6244C7DA34C", - "Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_LAT.et": "BF643BE4ADBDFDD3" + "Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_LAT.et": "BF643BE4ADBDFDD3", + "Prefabs/Weapons/Mortars/2B14/Mortar_2B14.et": "D1FFE458E8AC4BDB", + "Prefabs/Weapons/Ammo/Ammo_Shell_82mm_HE_O832DU.et": "98EC9C526AFBA282", + "Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et": "86E565387A634103", + "Prefabs/Items/Equipment/Radios/Radio_R148.et": "E1A5D4B878AA8980", + "Prefabs/Groups/OPFOR/Group_USSR_Base.et": "8DE0C0830FE0C33D" } diff --git a/tools/headless_workbench.py b/tools/headless_workbench.py index d4518fd..a145c34 100644 --- a/tools/headless_workbench.py +++ b/tools/headless_workbench.py @@ -3,14 +3,14 @@ Requires Linux, gamescope, Proton, and a disposable COPY of a working Tools compat prefix. No desktop rules or existing Wine processes are changed. This is not a dedicated server. """ -import argparse, json, os, shutil, signal, subprocess, time +import argparse, fcntl, json, os, shutil, signal, subprocess, time from pathlib import Path ROOT = Path(__file__).resolve().parents[1] p = argparse.ArgumentParser(description=__doc__) p.add_argument('--steam', type=Path, default=Path.home()/'.local/share/Steam') p.add_argument('--compat', type=Path, required=True, help='Disposable cloned Proton compatdata directory outside Steam') p.add_argument('--profile', type=Path, required=True, help='Separate disposable successor Workbench profile') -p.add_argument('--smoke', choices=['victory', 'lost-helicopter', 'player-death', 'radio-network', 'hq-response'], default='victory') +p.add_argument('--smoke', choices=['victory', 'lost-helicopter', 'player-death', 'radio-network', 'hq-response', 'mortar-inventory'], default='victory') p.add_argument('--rounds', type=int, default=2) p.add_argument('--timeout', type=int, default=360) a = p.parse_args() @@ -19,6 +19,9 @@ if not 1 <= a.rounds <= 10 or not 60 <= a.timeout <= 1800: p.error('Use 1..10 rounds and a 60..1800 second timeout') if compat.is_relative_to(steam) or not (compat/'pfx/system.reg').is_file(): p.error('--compat must be a disposable cloned prefix outside the Steam installation') +prefix_lock = (compat/'.erri-workbench.lock').open('a') +try: fcntl.flock(prefix_lock, fcntl.LOCK_EX | fcntl.LOCK_NB) +except BlockingIOError: p.error('Another test runner owns this disposable Wine prefix') if profile.is_relative_to(ROOT) or profile.is_relative_to(steam): p.error('--profile must be outside source and Steam directories') if not shutil.which('gamescope') or not shutil.which('pactl'): p.error('gamescope and pactl are required') @@ -99,12 +102,19 @@ with (profile/'headless-launch.log').open('w') as output: if child.poll() is not None: result = 'process-exited'; break time.sleep(1) finally: + # Stop Wine in this disposable prefix only. Proton's reaper may create a + # separate process group, so killing Gamescope alone can leave Wine alive. + wine_server = proton.parent/'files/bin/wineserver' + subprocess.run([str(wine_server), '-k'], env=env, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, timeout=10) # Only this fresh process group belongs to the runner and disposable prefix. try: os.killpg(child.pid, signal.SIGTERM) except ProcessLookupError: pass try: child.wait(timeout=10) except subprocess.TimeoutExpired: os.killpg(child.pid, signal.SIGKILL); child.wait() + # Gamescope's reaper can outlive its parent and ignores SIGTERM. + try: os.killpg(child.pid, signal.SIGKILL) + except ProcessLookupError: pass summary = {'result':result, 'session':str(session) if session else None, 'rounds_required':a.rounds, 'display':'headless Gamescope 1280x720/30Hz', 'dedicated_server':False, 'audio':'silent sink and per-test-stream mute'} if session: (session/'runner.json').write_text(json.dumps(summary, indent=2)+'\n') diff --git a/tools/native_command.py b/tools/native_command.py index a1c3d67..7806787 100644 --- a/tools/native_command.py +++ b/tools/native_command.py @@ -7,7 +7,7 @@ p=argparse.ArgumentParser(description=__doc__) p.add_argument('mode',choices=['workbench','server']) p.add_argument('--exe',required=True,type=Path) p.add_argument('--profile',required=True,type=Path) -p.add_argument('--smoke',choices=['victory','lost-helicopter','player-death', 'radio-network', 'hq-response'],help='Opt-in Workbench test; use a disposable profile') +p.add_argument('--smoke',choices=['victory','lost-helicopter','player-death', 'radio-network', 'hq-response', 'mortar-inventory'],help='Opt-in Workbench test; use a disposable profile') p.add_argument('--execute',action='store_true',help='Deliberately execute the command; Workbench opens a window') p.add_argument('--visible-output',help='User-approved spare display; required when executing Workbench') a=p.parse_args()