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

43 lines
3.4 KiB
Python

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)