Skip to content

Commit 8821d8c

Browse files
authored
[GEN][ZH] Fix Hero Radar icon garrison issues introduced by #1035 (#1267)
1 parent c1903b6 commit 8821d8c

File tree

8 files changed

+174
-158
lines changed

8 files changed

+174
-158
lines changed

Generals/Code/GameEngine/Include/Common/Radar.h

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,13 @@ enum RadarEventType CPP_11(: Int)
8080

8181
};
8282

83+
enum RadarObjectType CPP_11(: Int)
84+
{
85+
RadarObjectType_None = 0,
86+
RadarObjectType_Regular,
87+
RadarObjectType_Local,
88+
};
89+
8390
// PROTOTYPES /////////////////////////////////////////////////////////////////////////////////////
8491

8592
//-------------------------------------------------------------------------------------------------
@@ -109,6 +116,7 @@ class RadarObject : public MemoryPoolObject,
109116
inline const RadarObject *friend_getNext( void ) const { return m_next; }
110117

111118
Bool isTemporarilyHidden() const;
119+
static Bool isTemporarilyHidden(const Object* obj);
112120

113121
protected:
114122

@@ -178,7 +186,7 @@ class Radar : public Snapshot,
178186
ICoord2D *ul, ICoord2D *lr ); ///< make translation for screen area of radar square to scaled aspect ratio preserving points inside the radar area
179187

180188
// priority inquiry
181-
Bool isPriorityVisible( RadarPriorityType priority ) const; ///< is the priority passed in a "visible" one on the radar
189+
static Bool isPriorityVisible( RadarPriorityType priority ); ///< is the priority passed in a "visible" one on the radar
182190

183191
// radar events
184192
void createEvent( const Coord3D *world, RadarEventType type, Real secondsToLive = 4.0f ); ///< create radar event at location in world
@@ -190,8 +198,8 @@ class Radar : public Snapshot,
190198
Bool tryEvent( RadarEventType event, const Coord3D *pos ); ///< try to make a "stealth" event
191199

192200
// adding and removing objects from the radar
193-
virtual bool addObject( Object *obj ); ///< add object to radar
194-
virtual bool removeObject( Object *obj ); ///< remove object from radar
201+
virtual RadarObjectType addObject( Object *obj ); ///< add object to radar
202+
virtual RadarObjectType removeObject( Object *obj ); ///< remove object from radar
195203

196204
// radar options
197205
void hide( Bool hide ) { m_radarHidden = hide; } ///< hide/unhide the radar
@@ -226,9 +234,6 @@ class Radar : public Snapshot,
226234
virtual void xfer( Xfer *xfer );
227235
virtual void loadPostProcess( void );
228236

229-
virtual void onLocalRadarObjectAdded( const RadarObject* radarObject ) = 0;
230-
virtual void onLocalRadarObjectRemoved( const RadarObject* radarObject ) = 0;
231-
232237
/// internal method for creating a radar event with specific colors
233238
void internalCreateEvent( const Coord3D *world, RadarEventType type, Real secondsToLive,
234239
const RGBAColorInt *color1, const RGBAColorInt *color2 );
@@ -301,8 +306,6 @@ class RadarDummy : public Radar
301306
virtual void draw(Int pixelX, Int pixelY, Int width, Int height) { }
302307
virtual void clearShroud() { }
303308
virtual void setShroudLevel(Int x, Int y, CellShroudStatus setting) { }
304-
virtual void onLocalRadarObjectAdded(const RadarObject*) { }
305-
virtual void onLocalRadarObjectRemoved(const RadarObject*) { }
306309
};
307310

308311
#endif // __RADAR_H_

Generals/Code/GameEngine/Source/Common/System/Radar.cpp

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,6 @@ void Radar::deleteListResources( void )
7171
while( m_localObjectList )
7272
{
7373

74-
onLocalRadarObjectRemoved( m_localObjectList );
75-
7674
// get next object
7775
nextObject = m_localObjectList->friend_getNext();
7876

@@ -138,8 +136,15 @@ RadarObject::~RadarObject( void )
138136
//-------------------------------------------------------------------------------------------------
139137
Bool RadarObject::isTemporarilyHidden() const
140138
{
141-
Drawable* draw = m_object->getDrawable();
142-
if (draw->getStealthLook() == STEALTHLOOK_INVISIBLE || draw->isDrawableEffectivelyHidden())
139+
return isTemporarilyHidden(m_object);
140+
}
141+
142+
//-------------------------------------------------------------------------------------------------
143+
//-------------------------------------------------------------------------------------------------
144+
Bool RadarObject::isTemporarilyHidden(const Object* obj)
145+
{
146+
Drawable* draw = obj->getDrawable();
147+
if (draw == NULL || draw->getStealthLook() == STEALTHLOOK_INVISIBLE || draw->isDrawableEffectivelyHidden())
143148
return true;
144149

145150
return false;
@@ -391,13 +396,13 @@ void Radar::newMap( TerrainLogic *terrain )
391396
/** Add an object to the radar list. The object will be sorted in the list to be grouped
392397
* using it's radar priority */
393398
//-------------------------------------------------------------------------------------------------
394-
bool Radar::addObject( Object *obj )
399+
RadarObjectType Radar::addObject( Object *obj )
395400
{
396401

397402
// get the radar priority for this object
398403
RadarPriorityType newPriority = obj->getRadarPriority();
399404
if( isPriorityVisible( newPriority ) == FALSE )
400-
return false;
405+
return RadarObjectType_None;
401406

402407
// if this object is on the radar, remove it in favor of the new add
403408
RadarObject **list;
@@ -463,14 +468,21 @@ bool Radar::addObject( Object *obj )
463468
// set a chunk of radar data in the object
464469
obj->friend_setRadarData( newObj );
465470

471+
RadarObjectType objectType;
466472
//
467473
// we will put this on either the local object list for objects that belong to the
468474
// local player, or on the regular object list for all other objects
469475
//
470476
if( obj->isLocallyControlled() )
477+
{
471478
list = &m_localObjectList;
479+
objectType = RadarObjectType_Local;
480+
}
472481
else
482+
{
473483
list = &m_objectList;
484+
objectType = RadarObjectType_Regular;
485+
}
474486

475487
// link object to master list at the head of it's priority section
476488
if( *list == NULL )
@@ -541,12 +553,7 @@ bool Radar::addObject( Object *obj )
541553

542554
} // end else
543555

544-
if (list == &m_localObjectList)
545-
{
546-
onLocalRadarObjectAdded(newObj);
547-
}
548-
549-
return true;
556+
return objectType;
550557
} // end addObject
551558

552559
//-------------------------------------------------------------------------------------------------
@@ -562,10 +569,6 @@ Bool Radar::deleteFromList( Object *obj, RadarObject **list )
562569

563570
if( radarObject->friend_getObject() == obj )
564571
{
565-
if (list == &m_localObjectList)
566-
{
567-
onLocalRadarObjectRemoved( radarObject );
568-
}
569572

570573
// unlink the object from list
571574
if( prevObject == NULL )
@@ -597,24 +600,24 @@ Bool Radar::deleteFromList( Object *obj, RadarObject **list )
597600
//-------------------------------------------------------------------------------------------------
598601
/** Remove an object from the radar, the object may reside in any list */
599602
//-------------------------------------------------------------------------------------------------
600-
bool Radar::removeObject( Object *obj )
603+
RadarObjectType Radar::removeObject( Object *obj )
601604
{
602605

603606
// sanity
604607
if( obj->friend_getRadarData() == NULL )
605-
return false;
608+
return RadarObjectType_None;
606609

607610
if( deleteFromList( obj, &m_localObjectList ) == TRUE )
608-
return true;
611+
return RadarObjectType_Local;
609612
else if( deleteFromList( obj, &m_objectList ) == TRUE )
610-
return true;
613+
return RadarObjectType_Regular;
611614
else
612615
{
613616

614617
// sanity
615618
DEBUG_ASSERTCRASH( 0, ("Radar: Tried to remove object '%s' which was not found",
616619
obj->getTemplate()->getName().str()) );
617-
return false;
620+
return RadarObjectType_None;
618621
} // end else
619622

620623
} // end removeObject
@@ -1555,7 +1558,7 @@ void Radar::loadPostProcess( void )
15551558
// ------------------------------------------------------------------------------------------------
15561559
/** Is the priority type passed in a "visible" one that can show up on the radar */
15571560
// ------------------------------------------------------------------------------------------------
1558-
Bool Radar::isPriorityVisible( RadarPriorityType priority ) const
1561+
Bool Radar::isPriorityVisible( RadarPriorityType priority )
15591562
{
15601563

15611564
switch( priority )

Generals/Code/GameEngineDevice/Include/W3DDevice/Common/W3DRadar.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,12 @@ class W3DRadar : public Radar
6161
virtual void update( void ); ///< subsystem update
6262
virtual void reset( void ); ///< subsystem reset
6363

64+
virtual RadarObjectType addObject( Object *obj ); ///< add object to radar
65+
virtual RadarObjectType removeObject( Object *obj ); ///< remove object from radar
66+
6467
virtual void newMap( TerrainLogic *terrain ); ///< reset radar for new map
6568

66-
void draw( Int pixelX, Int pixelY, Int width, Int height ); ///< draw the radar
69+
virtual void draw( Int pixelX, Int pixelY, Int width, Int height ); ///< draw the radar
6770

6871
virtual void clearShroud();
6972
virtual void setShroudLevel(Int x, Int y, CellShroudStatus setting);
@@ -72,11 +75,6 @@ class W3DRadar : public Radar
7275

7376
protected:
7477

75-
virtual void onLocalRadarObjectAdded( const RadarObject* radarObject );
76-
virtual void onLocalRadarObjectRemoved( const RadarObject* radarObject );
77-
78-
void rebuildCachedHeroObjectList();
79-
8078
void drawSingleBeaconEvent( Int pixelX, Int pixelY, Int width, Int height, Int index );
8179
void drawSingleGenericEvent( Int pixelX, Int pixelY, Int width, Int height, Int index );
8280

@@ -87,7 +85,7 @@ class W3DRadar : public Radar
8785
void drawViewBox( Int pixelX, Int pixelY, Int width, Int height ); ///< draw view box
8886
void buildTerrainTexture( TerrainLogic *terrain ); ///< create the terrain texture of the radar
8987
void drawIcons( Int pixelX, Int pixelY, Int width, Int height ); ///< draw all of the radar icons
90-
void renderObjectList( const RadarObject *listHead, TextureClass *texture ); ///< render an object list to the texture
88+
void renderObjectList( const RadarObject *listHead, TextureClass *texture, Bool calcHero = FALSE ); ///< render an object list to the texture
9189
void interpolateColorForHeight( RGBColor *color,
9290
Real height,
9391
Real hiZ,

Generals/Code/GameEngineDevice/Source/W3DDevice/Common/System/W3DRadar.cpp

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,7 @@ void W3DRadar::drawIcons( Int pixelX, Int pixelY, Int width, Int height )
614614
//-------------------------------------------------------------------------------------------------
615615
/** Render an object list into the texture passed in */
616616
//-------------------------------------------------------------------------------------------------
617-
void W3DRadar::renderObjectList( const RadarObject *listHead, TextureClass *texture )
617+
void W3DRadar::renderObjectList( const RadarObject *listHead, TextureClass *texture, Bool calcHero )
618618
{
619619

620620
// sanity
@@ -632,6 +632,12 @@ void W3DRadar::renderObjectList( const RadarObject *listHead, TextureClass *text
632632
if (player)
633633
playerIndex=player->getPlayerIndex();
634634

635+
if( calcHero )
636+
{
637+
// clear all entries from the cached hero object list
638+
m_cachedHeroObjectList.clear();
639+
}
640+
635641
for( const RadarObject *rObj = listHead; rObj; rObj = rObj->friend_getNext() )
636642
{
637643

@@ -641,6 +647,11 @@ void W3DRadar::renderObjectList( const RadarObject *listHead, TextureClass *text
641647
// get object
642648
const Object *obj = rObj->friend_getObject();
643649

650+
// cache hero objects for drawing in icon layer
651+
if( calcHero && obj->isHero() )
652+
{
653+
m_cachedHeroObjectList.push_back(obj);
654+
}
644655
Bool skip = FALSE;
645656

646657
// check for shrouded status
@@ -856,11 +867,6 @@ W3DRadar::~W3DRadar( void )
856867
void W3DRadar::xfer( Xfer *xfer )
857868
{
858869
Radar::xfer(xfer);
859-
860-
if (xfer->getXferMode() == XFER_LOAD)
861-
{
862-
rebuildCachedHeroObjectList();
863-
}
864870
}
865871

866872
//-------------------------------------------------------------------------------------------------
@@ -963,6 +969,8 @@ void W3DRadar::reset( void )
963969
// extending functionality, call base class
964970
Radar::reset();
965971

972+
m_cachedHeroObjectList.clear();
973+
966974
// clear our texture data, but do not delete the resources
967975
SurfaceClass *surface;
968976

@@ -997,6 +1005,37 @@ void W3DRadar::update( void )
9971005

9981006
} // end update
9991007

1008+
//-------------------------------------------------------------------------------------------------
1009+
//-------------------------------------------------------------------------------------------------
1010+
RadarObjectType W3DRadar::addObject( Object* obj )
1011+
{
1012+
RadarObjectType addedType = Radar::addObject(obj);
1013+
1014+
if (addedType == RadarObjectType_Local)
1015+
{
1016+
if (obj->isHero() && !RadarObject::isTemporarilyHidden(obj))
1017+
{
1018+
m_cachedHeroObjectList.push_back(obj);
1019+
}
1020+
}
1021+
1022+
return addedType;
1023+
}
1024+
1025+
//-------------------------------------------------------------------------------------------------
1026+
//-------------------------------------------------------------------------------------------------
1027+
RadarObjectType W3DRadar::removeObject( Object* obj )
1028+
{
1029+
RadarObjectType removedType = Radar::removeObject(obj);
1030+
1031+
if (removedType == RadarObjectType_Local)
1032+
{
1033+
stl::find_and_erase_unordered(m_cachedHeroObjectList, obj);
1034+
}
1035+
1036+
return removedType;
1037+
}
1038+
10001039
//-------------------------------------------------------------------------------------------------
10011040
/** Reset the radar for the new map data being given to it */
10021041
//-------------------------------------------------------------------------------------------------
@@ -1412,7 +1451,7 @@ void W3DRadar::draw( Int pixelX, Int pixelY, Int width, Int height )
14121451

14131452
// rebuild the object overlay
14141453
renderObjectList( getObjectList(), m_overlayTexture );
1415-
renderObjectList( getLocalObjectList(), m_overlayTexture );
1454+
renderObjectList( getLocalObjectList(), m_overlayTexture, TRUE );
14161455

14171456
} // end if
14181457

@@ -1462,41 +1501,6 @@ void W3DRadar::refreshTerrain( TerrainLogic *terrain )
14621501

14631502
} // end refreshTerrain
14641503

1465-
//-------------------------------------------------------------------------------------------------
1466-
//-------------------------------------------------------------------------------------------------
1467-
void W3DRadar::onLocalRadarObjectAdded( const RadarObject* radarObject )
1468-
{
1469-
const Object* obj = radarObject->friend_getObject();
1470-
if (obj->isHero())
1471-
{
1472-
m_cachedHeroObjectList.push_back(obj);
1473-
}
1474-
}
1475-
1476-
//-------------------------------------------------------------------------------------------------
1477-
//-------------------------------------------------------------------------------------------------
1478-
void W3DRadar::onLocalRadarObjectRemoved( const RadarObject* radarObject )
1479-
{
1480-
const Object* obj = radarObject->friend_getObject();
1481-
if (obj->isHero())
1482-
{
1483-
stl::find_and_erase_unordered(m_cachedHeroObjectList, obj);
1484-
}
1485-
}
1486-
1487-
//-------------------------------------------------------------------------------------------------
1488-
//-------------------------------------------------------------------------------------------------
1489-
void W3DRadar::rebuildCachedHeroObjectList()
1490-
{
1491-
m_cachedHeroObjectList.clear();
1492-
const RadarObject* radarObject = getLocalObjectList();
1493-
1494-
while (radarObject != NULL)
1495-
{
1496-
onLocalRadarObjectAdded(radarObject);
1497-
radarObject = radarObject->friend_getNext();
1498-
}
1499-
}
15001504

15011505

15021506

0 commit comments

Comments
 (0)