Combine Workshop addon and fix prison startup
Merge owned systems into one addon while preserving resource identities. Gate player admission on the replicated prison scene, restore the original framed door, and hold enemy AI until escape. Correct scenario branding and author metadata, include publishing assets, and retain regression and native verification evidence.
This commit is contained in:
@@ -1,25 +1,46 @@
|
||||
# Escapists Rereintroduced
|
||||
# Escapists Reintroduced
|
||||
|
||||
Author: **Jakub Jim Žáček**.
|
||||
|
||||
An independently authored replacement for the abandoned Escapists base mission, targeting Everon and up to twelve players. This is a separate repository and **not a completed or release-ready replacement**. The base rewrite is the primary deliverable; companion migration supports it.
|
||||
|
||||
The current base supplies prison spawning, two independent scavenging/clue routes, finite medical and outpost stock, an optional ground vehicle, physical radio documents, named discovery markers, native objectives, a separate radio-defence service, capacity-checked helicopter extraction, identity-based partial results, early helicopter-loss defeat, saved mission time/speed, defeat/restart, identity-based lives and local spectator following. Authored site definitions and an injected vanilla faction/asset catalog own the initial physical population. Core provides administration and startup diagnostics; the optional AI, Intel, Chat and Map addons extend its interfaces. HQ coordinates enemy responses through physical radios and available forces.
|
||||
The current base supplies prison spawning, two independent scavenging/clue routes, finite medical and outpost stock, an optional ground vehicle, physical radio documents, named discovery markers, native objectives, a separate radio-defence service, capacity-checked helicopter extraction, identity-based partial results, early helicopter-loss defeat, saved mission time/speed, defeat/restart, identity-based lives and local spectator following. Authored site definitions and an injected vanilla faction/asset catalog own the initial physical population. Core provides administration and startup diagnostics; the AI, Intel, Chat and Map modules extend its interfaces inside one addon. HQ coordinates enemy responses through physical radios and available forces.
|
||||
|
||||
The [local development playtest handoff](docs/playtest-build.md) contains the earlier `5e74269` checkpoint: five native addon packages, matching source and separate manual launch scripts. It does not contain the newer HQ memory or RHS/WCS/BMP integration. Two scripted Core escape/restart rounds pass616 assertions; packaged Core and full-companion startup both pass. Full human completion and multiplayer remain to be tested.
|
||||
|
||||
The [AI migration checkpoint](docs/ai-migration-progress.md) adds delivered-report memory, bounded trajectory prediction, physical infantry pursuit, status checks, body observations and finite equipment. Native memory and actual-sighting response fixtures pass their assertions, with four retained upstream localization errors. See [current development status](docs/current-status.md) for source-bound checkpoints. The ordinary game loads all five addons and shows the [real prisoner view and starting objective](docs/evidence/game-2026-09-19-125906-integrated-prison/ordinary-prison-view.png). Native tests cover scripted escape/restart, finite mortar support, physical radio delivery, shared-map ownership, and the reusable aircraft controller's vertical flight, airborne cancellation and an isolated 20 m fixed route. Archived five-addon packages pass ordinary Chat startup without loose successor source and compile/prepare the empty mission on an isolated Linux server. The latter retains four installed-asset errors reproduced by a vanilla control.
|
||||
The [AI migration checkpoint](docs/ai-migration-progress.md) adds delivered-report memory, bounded trajectory prediction, physical infantry pursuit, status checks, body observations and finite equipment. Native memory and actual-sighting response fixtures pass their assertions, with four retained upstream localization errors. See [current development status](docs/current-status.md) for source-bound checkpoints. The earlier five-addon checkpoint shows the [real prisoner view and starting objective](docs/evidence/game-2026-09-19-125906-integrated-prison/ordinary-prison-view.png). Native tests cover scripted escape/restart, finite mortar support, physical radio delivery, shared-map ownership, and the reusable aircraft controller's vertical flight, airborne cancellation and an isolated 20 m fixed route. Archived five-addon packages pass ordinary Chat startup without loose successor source and compile/prepare the empty mission on an isolated Linux server. The latter retains four installed-asset errors reproduced by a vanilla control.
|
||||
|
||||
Native game-over now stops successor services and queued preparation before vanilla restart; unknown personal results use neutral wording. Two-round preparation/active-end regressions pass at their archived source checkpoint. Current Core/companion escape/restart and ordinary startup also pass after the guidance and route changes; the ordinary read-only sampler is separate from player-input acceptance.
|
||||
|
||||
Later ordinary input checks demonstrate walking, clean inventory interaction and selecting the original prison lock. Automated held-action testing and experimental AI aircraft work are paused in favor of concrete base gameplay bugs and a playable development build. The complete player-controlled escape, real multiplayer, operational HQ aircraft routes and measured FPS improvement remain unfinished. Native packaging still produces [UI shutdown errors also reproduced by an empty-addon control](docs/native-packaging-control.md); successful packed startup does not qualify that build process. All seventeen first-release acceptance cases remain pending. The [original responsibility inventory](docs/original-feature-coverage.md) tracks the unfinished scope.
|
||||
|
||||
## Projects and scenarios
|
||||
## Workbench project and scenario
|
||||
|
||||
Five Workbench projects live in `addons/core`, `addons/ai`, `addons/intel`, `addons/chat` and `addons/map`:
|
||||
Open **`addons/core/addon.gproj`**, titled **Escapists Reintroduced**. This is the
|
||||
single project to develop, package and eventually publish as one Workshop mod.
|
||||
Use **`Missions/ERR_Everon.conf`** (`{C1E20667DCE324ED}`) for the full scenario.
|
||||
The Core directory and addon GUID `2528466DE220D91C` are retained for continuity.
|
||||
|
||||
- Open `addons/core/addon.gproj` for the independent base scenario, `{AD62322D5213C440}Missions/ERR_Everon_Base.conf`.
|
||||
- Open `addons/chat/addon.gproj` for full companion integration, `{C1E20667DCE324ED}Missions/ERR_Everon.conf`.
|
||||
Scripts are organized under `addons/core/Scripts/Game/ERR/`:
|
||||
|
||||
Both use the newly authored Everon child world. Core depends only on vanilla Arma Reforger. AI and the full Chat scenario additionally require the authorized RHS: Status Quo, WCS Armaments and WCS BMP-1 closure; exact identities and setup are recorded in [external dependencies](docs/external-addons.md). All successor-authored resources are inside this repository. External assets are referenced, not redistributed; original restricted Escapists code, compositions, UI and audio are not included.
|
||||
- `00_Core`: mission, players, settings and administration
|
||||
- `10_AI`: HQ, patrols, logistics and support
|
||||
- `20_Intel`: enemy documents and discovery feedback
|
||||
- `30_Map`: shared field map
|
||||
- `40_Chat`: command integration and full-scenario test fixtures
|
||||
|
||||
The prefixes preserve Enforce script extension order. All modules load together.
|
||||
Resources retain their existing paths and GUIDs within the combined project.
|
||||
|
||||
Register only this project and its external dependencies in Workbench. Remove stale
|
||||
AI/Intel/Map/Chat project entries if you previously added them. RHS: Status Quo,
|
||||
WCS Armaments and WCS BMP-1 (including their dependencies) remain separate,
|
||||
author-supplied mods; see [external dependencies](docs/external-addons.md).
|
||||
Their assets are referenced, never redistributed.
|
||||
|
||||
See the [single-mod migration and current commands](docs/single-mod.md).
|
||||
Earlier five-addon build reports below are historical evidence, not validation of
|
||||
the merged project. Nothing has been published to Workshop.
|
||||
|
||||
See the [player route playtest guide](docs/player-route.md), [player lifecycle](docs/player-lifecycle.md), [manual gameplay gaps](docs/base-gameplay-gaps.md), [release qualification](docs/release-qualification.md), [performance comparison tooling](docs/performance-comparison.md), [configuration and commands](docs/configuration.md), [site authoring](docs/site-authoring.md), [architecture](docs/architecture.md) and [migration priorities](docs/base-replacement.md).
|
||||
|
||||
@@ -35,4 +56,4 @@ For bounded hidden, muted local native tests, see [runtime testing](docs/runtime
|
||||
|
||||
These scripted local fixtures manipulate positions and selected native states. They do not establish manual escape/piloting, real remote reconnects, twelve connected players or improved FPS. Separate regular-game runs establish standalone startup/admission; an isolated native Linux run establishes empty-server preparation, with inherited resource errors reproduced by a vanilla control. [Current status](docs/current-status.md) separates those gaps from demonstrated development behavior. [Validation evidence](docs/validation.md) preserves exact source checkpoints and failed iterations; `docs/acceptance.json` keeps unverified release requirements pending.
|
||||
|
||||
The [development source bundle tool](docs/development-source-bundle.md) previews a deterministic handoff of the five editable projects and writes only an explicitly requested new ZIP. It is **DEVELOPMENT SOURCE BUNDLE**, not a native `.pak` or qualified release; release-mode requests remain blocked by pending acceptance. No release package has been published.
|
||||
The [development source bundle tool](docs/development-source-bundle.md) previews a deterministic handoff of the single editable project and writes only an explicitly requested new ZIP. It is **DEVELOPMENT SOURCE BUNDLE**, not a native `.pak` or qualified release; release-mode requests remain blocked by pending acceptance. No release package has been published.
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
GameProject {
|
||||
ID "ERR_Ai"
|
||||
GUID "5192138CB9D5B911"
|
||||
TITLE "Escapists Rereintroduced - Ai"
|
||||
Dependencies {
|
||||
"58D0FB3206B6F859"
|
||||
"2528466DE220D91C"
|
||||
"595F2BF2F44836FB"
|
||||
"629B2BA37EFFD577"
|
||||
"5E524E4FEECCA92B"
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
GameProject {
|
||||
ID "ERR_Chat"
|
||||
GUID "FA804F411BDDF2C6"
|
||||
TITLE "Escapists Rereintroduced - Chat"
|
||||
Dependencies {
|
||||
"58D0FB3206B6F859"
|
||||
"2528466DE220D91C"
|
||||
"5192138CB9D5B911"
|
||||
"D31039C7C53E348A"
|
||||
"9AAEE9041D79809E"
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
SCR_MissionHeader {
|
||||
World "{B6C516F86302C679}Worlds/ERR_Everon.ent"
|
||||
SystemsConfig "{C50579A2EC48E8EF}Configs/Systems/MissionSystems.conf"
|
||||
m_sName "Rereintroduced: Everon (development)"
|
||||
m_sAuthor "Rereintroduced contributors"
|
||||
m_sName "Escapists Reintroduced — Everon"
|
||||
m_sAuthor "Jakub Jim Žáček"
|
||||
m_sDescription "Independent escape prototype. Development scenario; runtime validation in progress."
|
||||
m_sGameMode "Escape"
|
||||
m_iPlayerCount 12
|
||||
@@ -1,11 +1,11 @@
|
||||
SCR_MissionHeader {
|
||||
World "{B6C516F86302C679}Worlds/ERR_Everon.ent"
|
||||
SystemsConfig "{C50579A2EC48E8EF}Configs/Systems/MissionSystems.conf"
|
||||
m_sName "Rereintroduced: Everon Base (development)"
|
||||
m_sAuthor "Rereintroduced contributors"
|
||||
m_sDescription "Independent base escape mission using vanilla Reforger. Companion addons optional. Development scenario."
|
||||
m_sName "Escapists Reintroduced — Everon"
|
||||
m_sAuthor "Jakub Jim Žáček"
|
||||
m_sDescription "Legacy diagnostic header for the integrated Escapists Reintroduced mod."
|
||||
m_sGameMode "Escape"
|
||||
m_iPlayerCount 12
|
||||
m_eSaveTypes 0
|
||||
m_bShowInScenarioMenu 1
|
||||
m_bShowInScenarioMenu 0
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
SCR_AIGroup : "{000CD338713F2B5A}Prefabs/AI/Groups/Group_Base.et" {
|
||||
ID "781266D87A305AA9"
|
||||
m_faction "USSR"
|
||||
m_bSpawnImmediately 0
|
||||
m_aUnitPrefabSlots {
|
||||
@@ -1,4 +1,5 @@
|
||||
GenericEntity {
|
||||
ID "B7DDF3A8A8C387D1"
|
||||
components {
|
||||
ERR_LocationComponent "{C17CA14398A1CD7E}" { m_Kind 2 }
|
||||
RplComponent "{0BF5BAAA5FBFEECE}" { Streamable Disabled }
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
SCR_FactionManager : "{A242612865F2A48E}Prefabs/MP/Managers/Factions/FactionManager_Base.et" {
|
||||
ID "9D8B772E349A5ED5"
|
||||
Factions {
|
||||
SCR_Faction : "{5C67A1DDE0044806}Configs/ERR/Factions/US.conf" {
|
||||
m_sFactionBackground "{F8AC305446D5D480}UI/Textures/DeployMenu/Loadout-BG/Loadout_US_BG.imageset"
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
GenericEntity {
|
||||
ID "8F6EFB31A8BEAB20"
|
||||
components {
|
||||
MeshObject "{A557F6DC012E5101}" {
|
||||
Object "{268DBDABB3C94AD7}Assets/Props/Military/Sandbags/Sandbag_01_short.xob"
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
ERR_GameMode : "{0F307326459A1395}Prefabs/MP/Modes/GameMode_Base.et" {
|
||||
ID "17B3CC49610F4ADE"
|
||||
components {
|
||||
SCR_GameOverScreenManagerComponent "{56DEC646298AD219}" {
|
||||
m_GameOverScreenConfig SCR_GameOverScreenConfig "{56DEC6462FFDD82D}" : "{F6633922A25F9441}Configs/ERR/GameOverScreens.conf" {}
|
||||
@@ -10,5 +11,5 @@ ERR_GameMode : "{0F307326459A1395}Prefabs/MP/Modes/GameMode_Base.et" {
|
||||
m_SpawnLogic ERR_SpawnLogic "{79AD722B2EFD595F}" {}
|
||||
}
|
||||
}
|
||||
m_bUseSpawnPreload 0
|
||||
m_bUseSpawnPreload 1
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
GenericEntity : "{33B2DFDCD0EBA3DB}Prefabs/Items/Equipment/Kits/RepairKit_01/RepairKit_01_wrench.et" {
|
||||
ID "D4FD26777E598970"
|
||||
components {
|
||||
InventoryItemComponent "{5222EB4D0C73006B}" {
|
||||
Attributes SCR_ItemAttributeCollection "{5222EB4D0A2B466B}" {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
SCR_AIGroup : "{8DE0C0830FE0C33D}Prefabs/Groups/OPFOR/Group_USSR_Base.et" {
|
||||
ID "2550CE58718BC634"
|
||||
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"
|
||||
@@ -1,4 +1,5 @@
|
||||
GenericEntity : "{6D56FED1E55A8F84}Prefabs/Items/Misc/IntelligenceFolder_E_01/IntelligenceFolder_E_01.et" {
|
||||
ID "7F01099866C4E054"
|
||||
components {
|
||||
ERR_DocumentComponent "{E4598D0BE2C251A3}" {}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
SCR_AIGroup : "{E552DABF3636C2AD}Prefabs/Groups/OPFOR/Group_USSR_RifleSquad.et" {
|
||||
ID "B31BA06A7D5A2E37"
|
||||
m_aUnitPrefabSlots {
|
||||
"{5436629450D8387A}Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_SL.et"
|
||||
"{612F43A4D5AE765F}Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_RTO.et"
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
GenericEntity {
|
||||
ID "287E3009E495A14F"
|
||||
components {
|
||||
ERR_LocationComponent "{3B60CBEB3C04333C}" { m_Kind 0 }
|
||||
Hierarchy "{30ADADE77D1EC3B8}" {}
|
||||
@@ -72,7 +73,7 @@ GenericEntity {
|
||||
}
|
||||
GenericEntity : "{A67420C1FB91856E}Prefabs/ERR/PrisonWall.et" {
|
||||
ID "2735B52246DD6213"
|
||||
coords -3 0 -6
|
||||
coords -3.72 0 -6.04
|
||||
angles 0 0 0
|
||||
}
|
||||
GenericEntity : "{A67420C1FB91856E}Prefabs/ERR/PrisonWall.et" {
|
||||
@@ -80,10 +81,14 @@ GenericEntity {
|
||||
coords 3 0 -6
|
||||
angles 0 0 0
|
||||
}
|
||||
GenericEntity : "{A67420C1FB91856E}Prefabs/ERR/PrisonWall.et" {
|
||||
ID "48971F16E1F34412"
|
||||
coords 0.72 0 -6.04
|
||||
angles 0 0 0
|
||||
}
|
||||
GenericEntity : "{C3FDC4DBCD58C2F5}Prefabs/ERR/PrisonDoor.et" {
|
||||
ID "54D8F96ECC743335"
|
||||
scale 1.5
|
||||
coords 0 -0.1 -6
|
||||
coords 0 0 -6
|
||||
angles 0 0 0
|
||||
}
|
||||
DecalEntity : "{4AD6EB80A8B1FA3A}Prefabs/Decals/Dirt/Decal_Dirt_Patch_03.et" {
|
||||
|
||||
@@ -1,17 +1,39 @@
|
||||
GenericEntity : "{34B08027DBDE322A}Prefabs/Structures/BuildingParts/Doors/Door_MetalGate_01_Short_LEFT_EXT_ST_B.et" {
|
||||
GenericEntity : "{87CADB5ADC989993}Prefabs/Structures/BuildingParts/Doors/DoorSet_Base.et" {
|
||||
ID "779BF460CE27BEF7"
|
||||
components {
|
||||
MeshObject "{61B367470698533A}" {
|
||||
Object "{E3BC73BFBC7AA497}Assets/Structures/BuildingsParts/Doors/DoorFrame_door_metal_A_RIGHT_EXT_B.xob"
|
||||
}
|
||||
RplComponent "{82AC07E74327438F}" {}
|
||||
}
|
||||
{
|
||||
GenericEntity : "{67F17696FF278AE0}Prefabs/Structures/BuildingParts/Doors/Door_Metal_A_RIGHT_EXT_COV_B.et" {
|
||||
ID "A14F618EC4C14ECB"
|
||||
components {
|
||||
Hierarchy "{7642683606C70747}" { PivotID "socket_door" }
|
||||
DoorComponent "{221C667A9F7D4B69}" {
|
||||
DoorAction ERR_PrisonDoorAction "{50888D3646A61640}" {
|
||||
ParentContextList { "SCR_DoorUserAction" }
|
||||
}
|
||||
}
|
||||
ActionsManagerComponent "{F32B667C3C823800}" {
|
||||
ActionContexts { UserActionContext "{50888D37F529F720}" { ContextName "SCR_DoorUserAction" Radius 2 } }
|
||||
ActionContexts {
|
||||
UserActionContext "{50888D37F529F720}" {
|
||||
ContextName "SCR_DoorUserAction"
|
||||
Radius 2
|
||||
}
|
||||
}
|
||||
additionalActions {
|
||||
ERR_UnlockPrisonAction "{CA7918FEA177BFB8}" {
|
||||
ParentContextList { "SCR_DoorUserAction" }
|
||||
UIInfo SCR_ActionUIInfo "{F734C81E11AA6BEF}" { Name "Pick prison lock" }
|
||||
UIInfo SCR_ActionUIInfo "{F734C81E11AA6BEF}" {
|
||||
Name "Pick prison lock"
|
||||
m_sIconName "tools"
|
||||
}
|
||||
Duration 4
|
||||
"Sort Priority" -1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
GenericEntity {
|
||||
ID "124B3922375D4E58"
|
||||
components {
|
||||
Hierarchy "{4F20A90EDBD625A4}" {}
|
||||
MeshObject "{4F20A90EDBD625A1}" { Object "{0B96D139FEBCA006}Assets/Structures/Walls/Concrete/ConcreteWall_01_3m.xob" }
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
SCR_ChimeraCharacter : "{836E7E39AAC5888B}Prefabs/Characters/Factions/BLUFOR/US_Army/Character_US_Base.et" {
|
||||
ID "33B18E530DB189C6"
|
||||
components {
|
||||
ActionsManagerComponent "{520EA1D2F659CE02}" {
|
||||
additionalActions {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
GenericEntity {
|
||||
ID "83D9280A866F0092"
|
||||
components {
|
||||
MeshObject "{111C06CB740ED195}" { Object "{77C9FCF3FB1246E9}Assets/Items/Equipment/Radios/Radio_R107M/Radio_R107M_01_item.xob" }
|
||||
RigidBody "{4C174A44D07B91BA}" { ModelGeometry 1 Static 1 }
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
SCR_ManualCamera {
|
||||
ID "634904BCEDA1A285"
|
||||
m_bInputEnabled 0
|
||||
m_bStartAtEntity 1
|
||||
m_aComponents {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
GenericEntity : "{EBBC859CCD94D96D}Prefabs/Props/EmptyStorages/USSR_AmmoBox_empty.et" {
|
||||
ID "53884C37C0729BF6"
|
||||
components {
|
||||
MeshObject "{6530845A09309E37}" {
|
||||
Object "{819ED3266EE5113B}Assets/Props/Military/AmmoBox/EquipmentBoxWooden_01/EquipmentBoxWooden_Weapon_01.xob"
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
GenericEntity {
|
||||
ID "11E225C720271170"
|
||||
components {
|
||||
ERR_LocationComponent "{8E7CFEA92C1811F0}" { m_Kind 4 }
|
||||
RplComponent "{98A4A31435A9CA04}" { Streamable Disabled }
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
Vehicle : "{259EE7B78C51B624}Prefabs/Vehicles/Wheeled/UAZ469/UAZ469.et" {
|
||||
ID "E0C2C9683B1B68D4"
|
||||
components {
|
||||
ERR_VehicleSecurityComponent "{E51E9F624DB28C37}" {
|
||||
m_LockAnchor -0.95 1.05 0.3
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
GenericEntity : "{780AAF0A51AEE61A}Prefabs/Vehicles/Wheeled/UAZ469/VehParts/Seats/UAZ469_seats_rear.et" {
|
||||
ID "32BA78DE126813F5"
|
||||
components {
|
||||
SCR_BaseCompartmentManagerComponent "{2CD4A765A7D52986}" {
|
||||
CompartmentSlots {
|
||||
|
||||
+1
-1
@@ -280,7 +280,7 @@ class ERR_CasualtyLoadingService
|
||||
ERR_CasualtyLoadTicket ticket = Ticket(controller, nonce);
|
||||
if (!ticket || !ticket.Committed || ticket.OwnerReported) return;
|
||||
ticket.OwnerReported = true;
|
||||
if (!accepted) Print("Rereintroduced [casualty]: owner declined loading; observing physical outcome until expiry.");
|
||||
if (!accepted) Print("Reintroduced [casualty]: owner declined loading; observing physical outcome until expiry.");
|
||||
// Neither positive nor negative client acknowledgements release a reserved
|
||||
// seat while an authorized owner command could still be in flight.
|
||||
}
|
||||
+1
-1
@@ -70,7 +70,7 @@ class ERR_DiscoveryService
|
||||
ERR_LocationComponent chosen = eligible.GetRandomElement();
|
||||
if (!chosen.Discover(Math.RandomInt(0, 100), m_Mode.Settings().Get("intelRevealChancePercent"))) continue;
|
||||
m_Spent.Insert(folder);
|
||||
PrintFormat("Rereintroduced [intel]: player %1 recovered folder; location=%2 knowledge=%3", GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(player), chosen.Id(), chosen.Knowledge());
|
||||
PrintFormat("Reintroduced [intel]: player %1 recovered folder; location=%2 knowledge=%3", GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(player), chosen.Id(), chosen.Knowledge());
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
[ComponentEditorProps(category: "Rereintroduced", description: "Physical document identifying one authored objective")]
|
||||
[ComponentEditorProps(category: "Reintroduced", description: "Physical document identifying one authored objective")]
|
||||
class ERR_DocumentComponentClass : ScriptComponentClass {}
|
||||
class ERR_DocumentComponent : ScriptComponent
|
||||
{
|
||||
+1
-1
@@ -108,7 +108,7 @@ class ERR_EnvironmentService
|
||||
m_DateCode = dateCode;
|
||||
m_Profile = profile;
|
||||
m_Started = true;
|
||||
PrintFormat("Rereintroduced [environment]: date=%1 weather=%2", Date(dateCode), ProfileName(profile));
|
||||
PrintFormat("Reintroduced [environment]: date=%1 weather=%2", Date(dateCode), ProfileName(profile));
|
||||
return true;
|
||||
}
|
||||
bool Started() { return m_Started && !m_Stopped; }
|
||||
+2
-2
@@ -41,7 +41,7 @@ class ERR_ExtractionPlacement
|
||||
protected ERR_PrepareResult Fail(string reason)
|
||||
{
|
||||
m_Failure = reason; m_Result = ERR_PrepareResult.FAILED;
|
||||
Print("Rereintroduced [extraction placement]: " + reason, LogLevel.ERROR);
|
||||
Print("Reintroduced [extraction placement]: " + reason, LogLevel.ERROR);
|
||||
return m_Result;
|
||||
}
|
||||
protected void Diagnostic(bool ready)
|
||||
@@ -98,7 +98,7 @@ class ERR_ExtractionPlacement
|
||||
if (Stable(m_StableSince, m_LastObservation, now))
|
||||
{
|
||||
if (!QualificationAllowed(m_Result == ERR_PrepareResult.READY, now, m_Deadline)) return Fail("initial aircraft stable qualification missed the 30-second preparation deadline");
|
||||
if (m_Result != ERR_PrepareResult.READY) Print("Rereintroduced [extraction placement]: native supported aircraft stable for one second, fuel present, exactly one initial wake");
|
||||
if (m_Result != ERR_PrepareResult.READY) Print("Reintroduced [extraction placement]: native supported aircraft stable for one second, fuel present, exactly one initial wake");
|
||||
m_Result = ERR_PrepareResult.READY;
|
||||
m_LastObservation = now;
|
||||
return m_Result;
|
||||
+1
-1
@@ -106,7 +106,7 @@ class ERR_ForceLedger
|
||||
// formation cannot replace its casualties with a fresh full-strength unit.
|
||||
if (m_Records.Count() >= 128 || m_Sources.Count() >= 128)
|
||||
{
|
||||
if (!m_CapLogged) Print("Rereintroduced [ledger]: 128-formation registration cap reached.");
|
||||
if (!m_CapLogged) Print("Reintroduced [ledger]: 128-formation registration cap reached.");
|
||||
m_CapLogged = true;
|
||||
return null;
|
||||
}
|
||||
+15
-6
@@ -153,7 +153,7 @@ class ERR_GameMode : SCR_BaseGameMode
|
||||
if (!Replication.IsServer() || m_Phase != ERR_Phase.PREPARING || !m_PreparationError.IsEmpty()) return;
|
||||
m_PreparationError = detail;
|
||||
Replication.BumpMe();
|
||||
Print("Rereintroduced: scenario preparation failed; spawning remains disabled: " + detail, LogLevel.ERROR);
|
||||
Print("Reintroduced: scenario preparation failed; spawning remains disabled: " + detail, LogLevel.ERROR);
|
||||
StopServices();
|
||||
ERR_SiteService sites = Sites();
|
||||
if (sites) sites.Rollback();
|
||||
@@ -184,7 +184,7 @@ class ERR_GameMode : SCR_BaseGameMode
|
||||
{
|
||||
if (existing.Id() == location.Id())
|
||||
{
|
||||
Print("Rereintroduced: duplicate location ID " + location.Id(), LogLevel.ERROR);
|
||||
Print("Reintroduced: duplicate location ID " + location.Id(), LogLevel.ERROR);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -222,7 +222,7 @@ class ERR_GameMode : SCR_BaseGameMode
|
||||
{
|
||||
m_ForceSerial++;
|
||||
ERR_ForceRecord record = m_Forces.Register("formation-" + m_ForceSerial.ToString(), ERR_ForceKind.GARRISON, group.GetOrigin(), strength, null, group, GetGame().GetWorld().GetWorldTime());
|
||||
if (!record) { Print("Rereintroduced: force ledger refused physical formation", LogLevel.ERROR); return; }
|
||||
if (!record) { Print("Reintroduced: force ledger refused physical formation", LogLevel.ERROR); return; }
|
||||
}
|
||||
}
|
||||
if (m_Command) m_Command.RegisterGroup(group);
|
||||
@@ -259,10 +259,19 @@ class ERR_GameMode : SCR_BaseGameMode
|
||||
if (!Replication.IsServer() || !m_PreparationError.IsEmpty() || !ERR_MissionRules.CanTransition(m_Phase, phase)) return false;
|
||||
ERR_Phase previous = m_Phase;
|
||||
m_Phase = phase;
|
||||
if (previous == ERR_Phase.PRISON && phase == ERR_Phase.RADIO_SEARCH)
|
||||
{
|
||||
// Dormant patrols must not catch up the time spent waiting in prison.
|
||||
for (int i = 0; i < m_Forces.Count(); i++)
|
||||
{
|
||||
ERR_ForceRecord force = m_Forces.At(i);
|
||||
if (force) force.LastSimulatedAt = GetWorld().GetWorldTime();
|
||||
}
|
||||
}
|
||||
RefreshRadioFeedback();
|
||||
if (ERR_MissionRules.Terminal(phase)) PublishEscapeResults();
|
||||
Replication.BumpMe();
|
||||
PrintFormat("Rereintroduced [mission]: phase %1 -> %2", previous, phase);
|
||||
PrintFormat("Reintroduced [mission]: phase %1 -> %2", previous, phase);
|
||||
m_OnPhaseChanged.Invoke(previous, phase);
|
||||
if (ERR_MissionRules.Terminal(phase))
|
||||
{
|
||||
@@ -451,7 +460,7 @@ class ERR_GameMode : SCR_BaseGameMode
|
||||
if (m_Command) m_Command.Maintain(now);
|
||||
// Maintenance can finish or stop the round; do not resume tactical work.
|
||||
if (!Active()) return;
|
||||
TickForces(now);
|
||||
if (m_Phase >= ERR_Phase.RADIO_SEARCH) TickForces(now);
|
||||
if (GetGame().GetPlayerManager().GetPlayerCount() == 0)
|
||||
{
|
||||
m_NoSurvivorsSince = -1;
|
||||
@@ -476,7 +485,7 @@ class ERR_GameMode : SCR_BaseGameMode
|
||||
SCR_PlayerController controller = SCR_PlayerController.Cast(GetGame().GetPlayerManager().GetPlayerController(id));
|
||||
if (controller) controller.ERR_UpdateObserverServer();
|
||||
}
|
||||
if (m_Command) m_Command.Tick(now);
|
||||
if (m_Command && m_Phase >= ERR_Phase.RADIO_SEARCH) m_Command.Tick(now);
|
||||
m_OnTick.Invoke(now);
|
||||
}
|
||||
|
||||
+1
-1
@@ -67,7 +67,7 @@ class ERR_LocalAdmission
|
||||
m_Selected = true;
|
||||
if (m_Key.IsNull()) { m_Key = UUID.GenV4(); m_LocalKey = true; }
|
||||
if (m_Key.IsNull()) { m_Failed = true; return UUID.NULL_UUID; }
|
||||
if (m_LocalKey) Print("Rereintroduced [admission]: sole offline controller uses a generated local-round roster key; backend identity and permissions unchanged.");
|
||||
if (m_LocalKey) Print("Reintroduced [admission]: sole offline controller uses a generated local-round roster key; backend identity and permissions unchanged.");
|
||||
return m_Key;
|
||||
}
|
||||
bool Validate()
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
enum ERR_LocationKind { PRISON, RADIO, EXTRACTION, OUTPOST, DEPOT }
|
||||
|
||||
[ComponentEditorProps(category: "Rereintroduced", description: "Server-owned location with replicated discovery state")]
|
||||
[ComponentEditorProps(category: "Reintroduced", description: "Server-owned location with replicated discovery state")]
|
||||
class ERR_LocationComponentClass : ScriptComponentClass {}
|
||||
class ERR_LocationComponent : ScriptComponent
|
||||
{
|
||||
+12
-2
@@ -99,11 +99,21 @@ class ERR_NativePrisonBreachProbe
|
||||
if (gate) door = BaseDoorComponent.Cast(gate.FindComponent(BaseDoorComponent));
|
||||
if (!Check(door && !escape.GateLost() && Math.AbsFloat(door.GetNormalizedDoorState()) < 0.01 && !door.IsOpening() && m_Mode.Phase() == ERR_Phase.PRISON && m_Transitions == 0, "direct AI/player PerformAction cannot open locked native gate or advance progression")) return -1;
|
||||
SCR_DestructionMultiPhaseComponent damage = SCR_DestructionMultiPhaseComponent.Cast(gate.FindComponent(SCR_DestructionMultiPhaseComponent));
|
||||
if (!Check(damage && damage.GetDefaultHitZone(), "actual gate has its inherited multiphase destruction component and hit zone")) return -1;
|
||||
if (damage)
|
||||
{
|
||||
if (!Check(damage.GetDefaultHitZone() != null, "destructible gate has its native hit zone")) return -1;
|
||||
PrintFormat("ERR PRISON BREACH DAMAGE: health=%1 enabled=%2 threshold=%3", damage.GetHealth(), damage.IsDamageHandlingEnabled(), damage.GetTotalDestructionThreshold());
|
||||
vector hit[3]; hit[0] = gate.GetOrigin(); hit[1] = "0 0 1"; hit[2] = "0 0 -1";
|
||||
SCR_DamageContext context = new SCR_DamageContext(EDamageType.TRUE, 100000, hit, gate, damage.GetDefaultHitZone(), Instigator.CreateInstigator(m_Player), null, -1, -1);
|
||||
damage.HandleDamage(context);
|
||||
}
|
||||
else
|
||||
{
|
||||
// The original framed metal door is not destructible. Exercise actual
|
||||
// entity loss explicitly; this is not evidence of a damage-driven breach.
|
||||
Print("ERR PRISON BREACH: deleting non-destructible original metal door for gate-loss fixture");
|
||||
SCR_EntityHelper.DeleteEntityAndChildren(gate);
|
||||
}
|
||||
m_Step = 2; m_Wait = now + 1500;
|
||||
return 0;
|
||||
}
|
||||
@@ -116,7 +126,7 @@ class ERR_NativePrisonBreachProbe
|
||||
bool refusedLate = !late.Registered() && !late.GateLost();
|
||||
late.Stop();
|
||||
if (!Check(refusedLate, "fresh registration after native gate loss stays unregistered and cannot grant escape")) return -1;
|
||||
if (!Check(m_Mode.Phase() == ERR_Phase.PRISON && m_Transitions == 0, "native gate destruction alone cannot advance the round")) return -1;
|
||||
if (!Check(m_Mode.Phase() == ERR_Phase.PRISON && m_Transitions == 0, "native gate loss alone cannot advance the round")) return -1;
|
||||
Move("1.5 0 -60");
|
||||
m_Step = 3; m_Wait = now + 2500;
|
||||
return 0;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user