Capture current mission, AI, map and administration development
Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
--- a/addons/core/Scripts/Game/ERR/10_AI/ERR_EngineerMine.c
|
||||
+++ b/addons/core/Scripts/Game/ERR/10_AI/ERR_EngineerMine.c
|
||||
@@ -82,6 +82,8 @@
|
||||
if (!m_Assignment || m_Unit.Assignment != m_Assignment || !m_Task.RoadIntercept || m_Task.ReleaseOnly) return false;
|
||||
if (m_Task.Investigation() || !m_Task.SecuritySite.IsEmpty() || m_Unit.PendingTask || m_Unit.PendingOrder) return false;
|
||||
if (m_Unit.ReservedForSupport || m_Unit.LogisticsReservation > 0 || m_Group.IsSlave() || m_Group.GetPlayerCount(true) > 0) return false;
|
||||
+ SCR_AIGroupUtilityComponent groupUtility = m_Group.GetGroupUtilityComponent();
|
||||
+ if (!groupUtility || !groupUtility.IsPositionAllowed(m_Position)) return false;
|
||||
if (!m_Mode.EnemyFaction() || m_Group.GetFaction() != m_Mode.EnemyFaction() || !m_Unit.StatusSampler) return false;
|
||||
if (vector.Distance(m_Task.Destination, m_Rally) > 0.01 || !m_Mode.Forces() || !m_Record) return false;
|
||||
if (m_Mode.Forces().FindGroup(m_Group) != m_Record || m_Record.Group != m_Group || !m_Record.Physical || m_Record.Eliminated) return false;
|
||||
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"finding": "Engineer mine individual movement bypasses the native group movement envelope",
|
||||
"status": "source demonstrated and independently reproduced by actual-method baseline runtime failure; corrected source green",
|
||||
"trigger": "An original on-foot mine carrier at an accepted HQ road-interception post is selected for a geometrically valid mine position outside its current group utility IsPositionAllowed envelope. Existing Begin calls Owned then issues priority1000 individual movement; Owned never checks that envelope. A current native Defend waypoint with radius30 and mine position50m away is a concrete rejected-native-envelope/admitted-controller case.",
|
||||
"owned_reference": {
|
||||
"path": "/home/jakub/devel/escapists/escapists-ai/Scripts/Game/EscapistsAI/EAI_HQRoadblocks.c",
|
||||
"lines": "374-392",
|
||||
"behavior": "Before starting its mine task, original calls engineer group utility.IsPositionAllowed(point). Original engineers were a separate group with GetOut waypoint; defending crew used a different group."
|
||||
},
|
||||
"sdk": {
|
||||
"path": "/tmp/erri-vanilla-stock/scripts/Game/AI/Components/SCR_AIGroupUtilityComponent.c",
|
||||
"lines": "917-935",
|
||||
"meaning": "Current SCR_DefendWaypoint allows strictly inside its 3D completion radius; other waypoints use strictly less than max autonomous distance from group center of mass. This is not a generic forbidden zone or navmesh predicate.",
|
||||
"installed_binding": "/tmp/erri-mine-zones-review-0558/sdk-bindings.json"
|
||||
},
|
||||
"production_fix": {
|
||||
"file": "addons/core/Scripts/Game/ERR/10_AI/ERR_EngineerMine.c",
|
||||
"method": "Owned",
|
||||
"change": "Require current group utility and IsPositionAllowed(m_Position).",
|
||||
"coverage": "Begin already calls Owned before exact item tombstone and first movement; Tick calls it before preparation/removal/placement, and final arming calls it again. Denial takes existing Stop path. No new movement, retry, callback policy, item refund or radius mutation."
|
||||
},
|
||||
"limits": [
|
||||
"The native Defend waypoint radius is30m, so current25-60m candidate band only admits25..<30m in3D. No radius widening or alternate candidate retry is introduced; geometrically selected sites outside envelope conservatively refuse.",
|
||||
"Existing HQ EngineerMineAttempted remains spent on a refused group attempt; item tombstone is not inserted on initial envelope refusal.",
|
||||
"No native behavior qualification or compiler tests run by this author; peer owns focused actual-method tests."
|
||||
],
|
||||
"artifacts": {
|
||||
"patch": "/tmp/erri-base-review-0558/fix.patch",
|
||||
"manifest": "/tmp/erri-base-review-0558/source-manifest.json",
|
||||
"test_proposal": "/tmp/erri-mine-zones-tests-0558"
|
||||
},
|
||||
"provenance": {
|
||||
"/home/jakub/devel/escapists/escapists-ai/Scripts/Game/EscapistsAI/EAI_HQRoadblocks.c": "128776f0b448162ee36cfc71b2a38d2cd06d6d6e4679253f215896aa3fcabb98",
|
||||
"/tmp/erri-vanilla-stock/scripts/Game/AI/Components/SCR_AIGroupUtilityComponent.c": "d808ed61832e55001f49a5be87b6117341ebfa12a972a839de8c5a8ecd6590eb",
|
||||
"/home/jakub/devel/escapistsrereintroduced/addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c": "5d66c53baf8762e76ae59e28721edaa348014af6d988d42891d9a84a6cf44969"
|
||||
},
|
||||
"preservation": {
|
||||
"original_read_only": true,
|
||||
"successor_read_only": true,
|
||||
"native_launched": false,
|
||||
"compiler_launched": false
|
||||
},
|
||||
"validation": {
|
||||
"source_review": "/tmp/erri-mine-zones-review-0558/review.json",
|
||||
"actual_method_tests": "/tmp/erri-mine-zones-tests-0558/review.json",
|
||||
"green": "/tmp/erri-mine-zones-tests-0558/green.log",
|
||||
"baseline_runtime_red": "/tmp/erri-mine-zones-tests-0558/baseline-red.log",
|
||||
"begin_only_guard_mutation_runtime_red": "/tmp/erri-mine-zones-tests-0558/continuation-mutation-red.log",
|
||||
"test_sha256": "244ab49155000e5939a6c9d9e8f01fe8b14115119d548ba423ceffdd33ca9946",
|
||||
"execution": "Executed by independent test peer, not this author; peer reports baseline and mutation compiled then assertion-failed, corrected green."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"complete": true,
|
||||
"finding": "No demonstrated new player-facing Intel/map discovery defect or clearly missing owned behavior in this bounded comparison.",
|
||||
"patch_proposed": false,
|
||||
"comparisons": [
|
||||
{
|
||||
"owned": "EI_IntelService.ApplyRecoveredIntel: first clue identification chance; previous Intel clue guarantees identification",
|
||||
"successor": "DiscoveryService selects knowledge<2; MissionRules.Discovery returns2 for prior knowledge>=1, otherwise chance selects1/2."
|
||||
},
|
||||
{
|
||||
"owned": "Intel excludes prison/start area and helicopter pickup; alreadyidentified sites excluded",
|
||||
"successor": "Generic-folder candidates exclude PRISON/EXTRACTION and knowledge>=2; authored objective documents resolve explicit target. Normal radio/extraction disclosure remains mission-owned."
|
||||
},
|
||||
{
|
||||
"owned": "EI_MapDiscoveryUI hides undiscovered sites; question mark for unidentified and type icon whenidentified",
|
||||
"successor": "ERR_DiscoveryMap requires knowledge>=1, rough question icon/generic label and stable500m grid center, exact location/icon/label at2. This is intentional secrecy improvement, not missing parity."
|
||||
},
|
||||
{
|
||||
"owned": "Team discovery feedback uses generic unknown label and specific type only onidentify",
|
||||
"successor": "ERR_IntelDiscoveryFeedback preserves these messages, coalesces same-scan updates and uses shared reliable per-round sequence. Local phase guidance owns startup briefing rather than original global hint suppression."
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"No native usability/remote replication qualification inferred.",
|
||||
"Alreadyfixed reroll/custody/mapownership and concurrent general lifecycle review deliberately not repeated.",
|
||||
"Existing actual-method test files located for these boundaries but no compiler/test execution authorized or performed."
|
||||
],
|
||||
"evidence_sha256": {
|
||||
"/home/jakub/devel/escapistsrereintroduced/addons/core/Scripts/Game/ERR/00_Core/ERR_DiscoveryService.c": "34458b3a4f7062375c9c5b5599308e9cea67fc4a316420836f6694ca2c646ffc",
|
||||
"/home/jakub/devel/escapistsrereintroduced/addons/core/Scripts/Game/ERR/00_Core/ERR_MissionRules.c": "f7abc38ad8fdc375ce7fa63a65f0bade027d22b37e09de5e3f94ba8c3c63cc41",
|
||||
"/home/jakub/devel/escapistsrereintroduced/addons/core/Scripts/Game/ERR/00_Core/ERR_DiscoveryMap.c": "dd350bdda1bdf427ab8cefab623fe60cce5332b062d1a29686fe52f73e9e83f1",
|
||||
"/home/jakub/devel/escapistsrereintroduced/addons/core/Scripts/Game/ERR/00_Core/ERR_Location.c": "5b0b058130ccac02bdc1dcd6474d51a6f45da4dd52ed6c37906692fca3f194b1",
|
||||
"/home/jakub/devel/escapistsrereintroduced/addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelDiscoveryFeedback.c": "62f2c408383f410782d9d41fa50acd6bd8cf66eeb80d2b79f91852b9d2cf8d97",
|
||||
"/home/jakub/devel/escapists/escapists-intel/Scripts/Game/EscapistsIntel/EI_IntelService.c": "0009786c543c2758dcd55d3d6936feca5641dd4c4b2ff820564a38815e4cca57",
|
||||
"/home/jakub/devel/escapists/escapists-intel/Scripts/Game/EscapistsIntel/EI_MapDiscoveryUI.c": "d3f44ecc2dc29d34e3ba6feda271d68bf795ed3a1c37b15a54f0e460d8a997bd",
|
||||
"/home/jakub/devel/escapists/escapists-intel/Scripts/Game/EscapistsIntel/EI_PlayerBriefing.c": "1aa7d8c7abf24542cf3b6488dc430fb65278dc4ba2e729b623d487ed65f464de"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"verdict": "no_demonstrated_new_defect",
|
||||
"scope": "Bounded read-only review of account-scoped partial escape, reconnect handoff, all-incapacitated and all-dead defeat against current documented requirements. No speculative fix or repeated broad admission rewrite.",
|
||||
"findings": [
|
||||
{
|
||||
"source": "ERR_ExtractionService.Tick / GameMode.ServerTick",
|
||||
"evidence": "Extraction samples living original participant bodies in the exact helicopter, including unconscious and reserved disconnected bodies, freezes UUID results, resolves before subsequent defeat work, and ServerTick rechecks Active immediately afterwards. No demonstrated partial-escape versus defeat ordering error."
|
||||
},
|
||||
{
|
||||
"source": "ERR_PlayerRoster.HasSurvivor / ERR_RecoveryService.Tick",
|
||||
"evidence": "Reserved living bodies prevent all-dead defeat; only conscious reserved bodies count as potential rescuers. Incapacitated reserved bodies still require treatment/improvement/viable native recovery. Empty-server state resets the stalled timer; connected stalled teams retain the documented 30-second grace."
|
||||
},
|
||||
{
|
||||
"source": "ERR_SpawnLogic.OnPlayerAuditSuccess_S / ObserveAfterLoss / OnPlayerDisconnected_S",
|
||||
"evidence": "Audit binds account identity, republishes personal escape result, resolves native reconnection before new admission. Delayed loss checks exact controller, identity, and absence of a living controlled body; disconnect removes pending admission and connection binding while retaining the round account/life."
|
||||
},
|
||||
{
|
||||
"source": "ERR_PlayerMedical.ERR_CanRecoverNaturally / docs/recovery.md",
|
||||
"evidence": "Bleeding, absent/zero-rate regeneration and fully healed zones do not count as natural recovery; blood or permitted resilience regeneration can defer defeat through native delay. This agrees with the documented recovery rule."
|
||||
}
|
||||
],
|
||||
"existing_coverage_read": [
|
||||
"test_recovery_policy.py evaluates survivor/reservation classifications and 30-second/empty-server policy",
|
||||
"test_progression_identity.py checks canonical actor restoration and preserves unconscious carried intel",
|
||||
"test_escape_result_wording.py checks personal outcome and late refresh rather than stale transient end IDs",
|
||||
"test_native_end_lifecycle.py exercises successor end cleanup while preserving native end data"
|
||||
],
|
||||
"limits": [
|
||||
"No tests or compilers executed in this review.",
|
||||
"No native launches, process inspection/manipulation, multiplayer/JIP/reconnect or manual-play qualification.",
|
||||
"Existing acceptance ledger still marks remote and twelve-player scenarios unqualified; lack of native proof is not itself a demonstrated source defect."
|
||||
],
|
||||
"patch": null,
|
||||
"regression_proposal": null,
|
||||
"writes": [
|
||||
"/tmp/erri-base-review-0558/lifecycle.json"
|
||||
],
|
||||
"source_sha256": {
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_GameMode.c": "89a29c03ba225acbbb9fa3c58a721aced91a77bc0c77046d697005a6d7c48bb9",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerRoster.c": "c038dac0f749bd29ebc35a4e952904b41a34417ba738904d5efcd1833a263e0b",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_RecoveryService.c": "86f9a7769e3ccb19fc61127fe2fee2ad0dd825487a5cd59f334de8b9741c93cf",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_ExtractionService.c": "91357099b4e0401196b67d48963be54be30e56bdba57cdac67dc20b8ebb883e9",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerMedical.c": "270454d50235bc28df9bba4fde2689934578874c4eca9560afb9f0f6324d7215",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpawnLogic.c": "47a39c951be71bfcf1cc50526d507d0f9d8ef2fc09408697b6fe6b0dc5a529e2",
|
||||
"docs/player-lifecycle.md": "35fd066a50ddb2bcc78d4a448811e0763263cb0605161ccf43713b5e4a5f9cf0",
|
||||
"docs/recovery.md": "026b513982530b8d65a6a1459e8707cd4abaf56450abc00f8449cf01fc660d0d",
|
||||
"docs/acceptance.json": "b58e56be792c7ac2cb792a70e0b560989e59b1607fe9533f6f852e2171df9408",
|
||||
"tests/test_recovery_policy.py": "adc4966ab92f0849d08636d93da5bd02b9162d1ad7369b325a1a357903abaa55",
|
||||
"tests/test_progression_identity.py": "2fb3725aa735e00b20ba7a4ac45f8e087d4346c58a176bee091bab0a9755c1df",
|
||||
"tests/test_escape_result_wording.py": "7b3613cccd4f24d3ef4665dfc1854cfc958a69018a59f9b8090617f0185a82a8",
|
||||
"tests/test_native_end_lifecycle.py": "8b187723c9039e68e3e590c812c91dcffe1e5917d4e450ed798dc177888fda7a",
|
||||
"tests/test_player_medical.py": "e4b3140a3afc0161db53f261e5480e51f1ca09f85657e25b0efb7dbba3336e3f",
|
||||
"tests/test_spectator_recovery.py": "8bb59c51df003e24532ad9476af4c8ff3b7f4276dca25e8162b91eb77c7b67c2"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"files": {
|
||||
"addons/core/Scripts/Game/ERR/10_AI/ERR_EngineerMine.c": {
|
||||
"before_working_sha256": "e0098577626e719283cf4b40936e7ec038076c4bab9269fbad0b5ad3292e01e3",
|
||||
"before_index_sha256": "e0098577626e719283cf4b40936e7ec038076c4bab9269fbad0b5ad3292e01e3",
|
||||
"proposed_sha256": "fe05cb6e813155d76fd497788aa92c9dd8c7cf4ec43e017172a8a70e16c00b80"
|
||||
}
|
||||
},
|
||||
"patch_sha256": "692af3fbb9e3ea121cb53e7d9739be1a278215e8c89bfa501730d183bc9ff2d9"
|
||||
}
|
||||
Reference in New Issue
Block a user