from pathlib import Path p=Path('/tmp/erri-launcher-resupply-1140');f=p/'addons/core/Scripts/Game/ERR/10_AI/ERR_InfantryAmmoTransfer.c';s=f.read_text();(p/'before-refusal.c').write_text(s) s=s.replace(' protected BaseInventoryStorageComponent m_Storage;', ' protected BaseInventoryStorageComponent m_Storage;\n protected InventoryStorageSlot m_OriginalSlot;\n protected BaseInventoryStorageComponent m_OriginalStorage;') s=s.replace(' protected bool ReturnProof()',''' // Terminal negative callback is settled only with exact unchanged source // custody. Native false without a callback still retains all uncertainty. protected bool RefusedAtSource() { if (!m_Submitted || m_Acknowledgement != -1 || !m_Magazine || !m_Donor || !m_Recipient) return false; if (!m_OriginalSlot || !m_OriginalStorage) return false; if (InventoryStorageManagerComponent.Cast(m_Donor.FindComponent(InventoryStorageManagerComponent)) != m_Source) return false; if (InventoryStorageManagerComponent.Cast(m_Recipient.FindComponent(InventoryStorageManagerComponent)) != m_Destination) return false; if (Ownership(m_Source) != 1 || Ownership(m_Destination) != 0) return false; if (!ManagedStorage(m_Source, m_OriginalStorage, m_Donor)) return false; InventoryItemComponent item = InventoryItemComponent.Cast(m_Magazine.FindComponent(InventoryItemComponent)); if (!item || item.GetParentSlot() != m_OriginalSlot) return false; return m_OriginalSlot.GetStorage() == m_OriginalStorage && m_OriginalSlot.GetAttachedEntity() == m_Magazine; } protected bool ReturnProof()''') s=s.replace('return m_Magazine && !PhysicalProof();', 'return m_Magazine && !PhysicalProof() && !RefusedAtSource();') s=s.replace(' m_Callback = new ERR_InfantryAmmoCallback(); m_Callback.Transfer = this;', ''' if (m_LauncherMagazine) { m_OriginalSlot = item.GetParentSlot(); m_OriginalStorage = m_OriginalSlot.GetStorage(); if (m_OriginalSlot.GetAttachedEntity() != m_Magazine) return Fail("launcher source slot lacks reciprocal item proof"); } m_Callback = new ERR_InfantryAmmoCallback(); m_Callback.Transfer = this;''');f.write_text(s) f=p/'tests/test_infantry_ammo_transfer.py';s=f.read_text();(p/'before-refusal-test.py').write_text(s) s=s.replace("'m_Storage','m_Callback'", "'m_Storage','m_OriginalSlot','m_Callback'") s=s.replace('bool|int|Vehicle|IEntity|SCR_AIGroup|ERR_ForceRecord|InventoryStorageManagerComponent|', 'bool|int|Vehicle|IEntity|SCR_AIGroup|ERR_ForceRecord|InventoryStorageSlot|InventoryStorageManagerComponent|') s=s.replace('fromSlot.storage=&sourceStorage;', 'fromSlot.storage=&sourceStorage;fromSlot.attached=&magEntity;') s=s.replace('int main(){', '''int main(){ // Failed callback settles only exact original unchanged custody; unknown never does. {LauncherFixture f;f.source.callback=2;f.c.Transfer(0);assert(f.c.m_Move->Submitted()&&!f.c.m_Move->Unresolved()&&f.c.m_Spent.Count()==1);f.c.Transfer(1000);assert(f.source.calls==1&&f.c.m_Spent.Count()==1);} for(int bad=0;bad<7;bad++){LauncherFixture f;f.c.Transfer(0);assert(f.c.m_Move->Unresolved()); if(bad!=0)f.source.last->OnFailed(); if(bad==1)f.item.slot=nullptr; if(bad==2)f.fromSlot.attached=nullptr; if(bad==3)f.sourceStorage.owner=&f.foreign; if(bad==4)f.destination.items.Insert(&f.magEntity); if(bad==5)f.truck.inventory=&f.destination; if(bad==6)f.source.items.RemoveItem(&f.magEntity); assert(f.c.m_Move->Unresolved());f.c.m_Move->Stop();assert(f.c.m_Move->Unresolved());} ''',1);f.write_text(s)