diff --git a/Core/GameEngine/Include/Common/GameDefines.h b/Core/GameEngine/Include/Common/GameDefines.h index 1bf9f096fcf..3c575b68c67 100644 --- a/Core/GameEngine/Include/Common/GameDefines.h +++ b/Core/GameEngine/Include/Common/GameDefines.h @@ -64,7 +64,7 @@ #endif #ifndef PRESERVE_RADAR_WARNING_SUPPRESSION -#define PRESERVE_RADAR_WARNING_SUPPRESSION (1) +#define PRESERVE_RADAR_WARNING_SUPPRESSION (0) // Per-object cooldown in tryUnderAttackEvent supersedes this map-wide suppression. #endif #ifndef PRESERVE_STRUCTURE_STEALTH_DURING_REPAIR diff --git a/Core/GameEngine/Include/Common/Radar.h b/Core/GameEngine/Include/Common/Radar.h index 5e170c261fc..d5882676b9d 100644 --- a/Core/GameEngine/Include/Common/Radar.h +++ b/Core/GameEngine/Include/Common/Radar.h @@ -117,6 +117,7 @@ class RadarObject : public MemoryPoolObject, Object *m_object; ///< the object RadarObject *m_next; ///< next radar object Color m_color; ///< color to draw for this object on the radar + UnsignedInt m_lastUnderAttackAlarmFrame; ///< last logic frame this object's under-attack alarm fired }; diff --git a/Core/GameEngine/Source/Common/System/Radar.cpp b/Core/GameEngine/Source/Common/System/Radar.cpp index 313b8f36e47..b665cabab1e 100644 --- a/Core/GameEngine/Source/Common/System/Radar.cpp +++ b/Core/GameEngine/Source/Common/System/Radar.cpp @@ -100,6 +100,7 @@ RadarObject::RadarObject() m_object = nullptr; m_next = nullptr; m_color = GameMakeColor( 255, 255, 255, 255 ); + m_lastUnderAttackAlarmFrame = 0xFFFFFFFF; } @@ -1046,9 +1047,21 @@ void Radar::tryUnderAttackEvent( const Object *obj ) if( obj == nullptr ) return; + // Per-object cooldown: each unit can alarm at most once per suppression window. + // This prevents a single object (e.g. a supply plane) from re-triggering the alarm + // every time the global event window expires. + const UnsignedInt framesBetweenAlarms = LOGICFRAMES_PER_SECOND * 10; + UnsignedInt currentFrame = TheGameLogic->getFrame(); + RadarObject *radarData = obj->friend_getRadarData(); + if( radarData && currentFrame - radarData->m_lastUnderAttackAlarmFrame < framesBetweenAlarms ) + return; + // try to create the event Bool eventCreated = tryEvent( RADAR_EVENT_UNDER_ATTACK, obj->getPosition() ); + if( eventCreated && radarData ) + radarData->m_lastUnderAttackAlarmFrame = currentFrame; + // if event created, do some more feedback if( eventCreated ) {