From 7f84857c1886b7035251a39ff704d10e8791cabf Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Thu, 17 Jul 2025 12:38:16 +0200 Subject: [PATCH 1/4] Made takeoff order deterministic. --- .../GameLogic/Module/ParkingPlaceBehavior.h | 19 ++++++----- .../Object/Behavior/ParkingPlaceBehavior.cpp | 34 +++++++++++++++++-- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/ParkingPlaceBehavior.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/ParkingPlaceBehavior.h index 8def59d5eb..90ee058669 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/ParkingPlaceBehavior.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/ParkingPlaceBehavior.h @@ -140,6 +140,7 @@ class ParkingPlaceBehavior : public UpdateModule, virtual Bool reserveSpace(ObjectID id, Real parkingOffset, PPInfo* info); virtual void releaseSpace(ObjectID id); virtual Bool reserveRunway(ObjectID id, Bool forLanding); + Bool deferUnsequencedRunwayReservationForTakeoff(UnsignedInt index, Bool forLanding); virtual void releaseRunway(ObjectID id); virtual void calcPPInfo( ObjectID id, PPInfo *info ); virtual Int getRunwayCount() const { return m_runways.size(); } @@ -158,15 +159,16 @@ class ParkingPlaceBehavior : public UpdateModule, struct ParkingPlaceInfo { - Coord3D m_hangarStart; - Real m_hangarStartOrient; - Coord3D m_location; - Coord3D m_prep; - Real m_orientation; - Int m_runway; + Coord3D m_hangarStart; + Real m_hangarStartOrient; + Coord3D m_location; + Coord3D m_prep; + Real m_orientation; + Int m_runway; ExitDoorType m_door; - ObjectID m_objectInSpace; - Bool m_reservedForExit; + ObjectID m_objectInSpace; + Bool m_reservedForExit; + Bool m_deferredRunwayReservationForTakeoff; ParkingPlaceInfo() { @@ -179,6 +181,7 @@ class ParkingPlaceBehavior : public UpdateModule, m_door = DOOR_NONE_AVAILABLE; m_objectInSpace = INVALID_ID; m_reservedForExit = false; + m_deferredRunwayReservationForTakeoff = false; } }; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/ParkingPlaceBehavior.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/ParkingPlaceBehavior.cpp index 9c74e34e46..ea57884000 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/ParkingPlaceBehavior.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/ParkingPlaceBehavior.cpp @@ -159,6 +159,7 @@ void ParkingPlaceBehavior::purgeDead() { it->m_objectInSpace = INVALID_ID; it->m_reservedForExit = false; + it->m_deferredRunwayReservationForTakeoff = false; if (pu) pu->setHoldDoorOpen(it->m_door, false); } @@ -468,6 +469,28 @@ void ParkingPlaceBehavior::transferRunwayReservationToNextInLineForTakeoff(Objec } } +//------------------------------------------------------------------------------------------------- +Bool ParkingPlaceBehavior::deferUnsequencedRunwayReservationForTakeoff(UnsignedInt index, Bool forLanding) +{ + CONSTEXPR const UnsignedInt INDEX_A = 2, INDEX_B = 3; + + if (index == INDEX_A || index == INDEX_B) + { + Bool& deferred = m_spaces[index].m_deferredRunwayReservationForTakeoff; + if (forLanding) + { + deferred = false; + } + else if (!deferred) + { + deferred = true; + return true; + } + } + + return false; +} + //------------------------------------------------------------------------------------------------- Bool ParkingPlaceBehavior::reserveRunway(ObjectID id, Bool forLanding) { @@ -475,11 +498,16 @@ Bool ParkingPlaceBehavior::reserveRunway(ObjectID id, Bool forLanding) purgeDead(); Int runway = -1; - for (std::vector::iterator it = m_spaces.begin(); it != m_spaces.end(); ++it) + for (UnsignedInt i = 0; i < m_spaces.size(); ++i) { - if (it->m_objectInSpace == id) + if (m_spaces[i].m_objectInSpace == id) { - runway = it->m_runway; +#if !RETAIL_COMPATIBLE_CRC + if (deferUnsequencedRunwayReservationForTakeoff(i, forLanding)) + return false; +#endif + + runway = m_spaces[i].m_runway; break; } } From 4002e1f4cda3149d8811b9ec487b669c7aef9f09 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Sat, 19 Jul 2025 12:37:20 +0200 Subject: [PATCH 2/4] Removed constexpr indices. --- .../Source/GameLogic/Object/Behavior/ParkingPlaceBehavior.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/ParkingPlaceBehavior.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/ParkingPlaceBehavior.cpp index ea57884000..16b44ec756 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/ParkingPlaceBehavior.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/ParkingPlaceBehavior.cpp @@ -472,9 +472,7 @@ void ParkingPlaceBehavior::transferRunwayReservationToNextInLineForTakeoff(Objec //------------------------------------------------------------------------------------------------- Bool ParkingPlaceBehavior::deferUnsequencedRunwayReservationForTakeoff(UnsignedInt index, Bool forLanding) { - CONSTEXPR const UnsignedInt INDEX_A = 2, INDEX_B = 3; - - if (index == INDEX_A || index == INDEX_B) + if (index == 2 || index == 3) { Bool& deferred = m_spaces[index].m_deferredRunwayReservationForTakeoff; if (forLanding) From ceea523d4eb018157e02236c2f094a764eeecbbd Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Sat, 19 Jul 2025 12:39:09 +0200 Subject: [PATCH 3/4] Renamed 'index' to 'spaceIndex'. --- .../Include/GameLogic/Module/ParkingPlaceBehavior.h | 2 +- .../GameLogic/Object/Behavior/ParkingPlaceBehavior.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/ParkingPlaceBehavior.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/ParkingPlaceBehavior.h index 90ee058669..737454d88c 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/ParkingPlaceBehavior.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/ParkingPlaceBehavior.h @@ -140,7 +140,7 @@ class ParkingPlaceBehavior : public UpdateModule, virtual Bool reserveSpace(ObjectID id, Real parkingOffset, PPInfo* info); virtual void releaseSpace(ObjectID id); virtual Bool reserveRunway(ObjectID id, Bool forLanding); - Bool deferUnsequencedRunwayReservationForTakeoff(UnsignedInt index, Bool forLanding); + Bool deferUnsequencedRunwayReservationForTakeoff(UnsignedInt spaceIndex, Bool forLanding); virtual void releaseRunway(ObjectID id); virtual void calcPPInfo( ObjectID id, PPInfo *info ); virtual Int getRunwayCount() const { return m_runways.size(); } diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/ParkingPlaceBehavior.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/ParkingPlaceBehavior.cpp index 16b44ec756..f33e680e62 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/ParkingPlaceBehavior.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/ParkingPlaceBehavior.cpp @@ -470,11 +470,11 @@ void ParkingPlaceBehavior::transferRunwayReservationToNextInLineForTakeoff(Objec } //------------------------------------------------------------------------------------------------- -Bool ParkingPlaceBehavior::deferUnsequencedRunwayReservationForTakeoff(UnsignedInt index, Bool forLanding) +Bool ParkingPlaceBehavior::deferUnsequencedRunwayReservationForTakeoff(UnsignedInt spaceIndex, Bool forLanding) { - if (index == 2 || index == 3) + if (spaceIndex == 2 || spaceIndex == 3) { - Bool& deferred = m_spaces[index].m_deferredRunwayReservationForTakeoff; + Bool& deferred = m_spaces[spaceIndex].m_deferredRunwayReservationForTakeoff; if (forLanding) { deferred = false; From a5bb8622790abd4fe3e223c345c1af916b3877a4 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Sat, 19 Jul 2025 12:43:10 +0200 Subject: [PATCH 4/4] Fixed indentation for member variables. --- .../GameLogic/Module/ParkingPlaceBehavior.h | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/ParkingPlaceBehavior.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/ParkingPlaceBehavior.h index 737454d88c..287364994b 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/ParkingPlaceBehavior.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/ParkingPlaceBehavior.h @@ -159,16 +159,16 @@ class ParkingPlaceBehavior : public UpdateModule, struct ParkingPlaceInfo { - Coord3D m_hangarStart; - Real m_hangarStartOrient; - Coord3D m_location; - Coord3D m_prep; - Real m_orientation; - Int m_runway; - ExitDoorType m_door; - ObjectID m_objectInSpace; - Bool m_reservedForExit; - Bool m_deferredRunwayReservationForTakeoff; + Coord3D m_hangarStart; + Real m_hangarStartOrient; + Coord3D m_location; + Coord3D m_prep; + Real m_orientation; + Int m_runway; + ExitDoorType m_door; + ObjectID m_objectInSpace; + Bool m_reservedForExit; + Bool m_deferredRunwayReservationForTakeoff; ParkingPlaceInfo() {