@@ -81,6 +81,7 @@ void Radar::deleteListResources( void )
8181{
8282 deleteList (&m_objectList);
8383 deleteList (&m_localObjectList);
84+ deleteList (&m_localHeroObjectList);
8485
8586#ifdef DEBUG_CRASHING
8687 for ( Object *obj = TheGameLogic->getFirstObject (); obj; obj = obj->getNextObject () )
@@ -191,6 +192,7 @@ Radar::Radar( void )
191192 m_radarWindow = NULL ;
192193 m_objectList = NULL ;
193194 m_localObjectList = NULL ;
195+ m_localHeroObjectList = NULL ;
194196 std::fill (m_radarHidden, m_radarHidden + ARRAY_SIZE (m_radarHidden), false );
195197 std::fill (m_radarForceOn, m_radarForceOn + ARRAY_SIZE (m_radarForceOn), false );
196198 m_terrainAverageZ = 0 .0f ;
@@ -379,13 +381,13 @@ void Radar::newMap( TerrainLogic *terrain )
379381/* * Add an object to the radar list. The object will be sorted in the list to be grouped
380382 * using it's radar priority */
381383// -------------------------------------------------------------------------------------------------
382- RadarObjectType Radar::addObject ( Object *obj )
384+ Bool Radar::addObject ( Object *obj )
383385{
384386
385387 // get the radar priority for this object
386388 RadarPriorityType newPriority = obj->getRadarPriority ();
387389 if ( isPriorityVisible ( newPriority ) == FALSE )
388- return RadarObjectType_None ;
390+ return FALSE ;
389391
390392 // if this object is on the radar, remove it in favor of the new add
391393 RadarObject **list;
@@ -408,26 +410,26 @@ RadarObjectType Radar::addObject( Object *obj )
408410 // set a chunk of radar data in the object
409411 obj->friend_setRadarData ( newObj );
410412
411- RadarObjectType objectType;
412413 //
413414 // we will put this on either the local object list for objects that belong to the
414415 // local player, or on the regular object list for all other objects
415416 //
416417 if ( obj->isLocallyControlled () )
417418 {
418- list = &m_localObjectList;
419- objectType = RadarObjectType_Local;
419+ if ( obj->isHero () )
420+ list = &m_localHeroObjectList;
421+ else
422+ list = &m_localObjectList;
420423 }
421424 else
422425 {
423426 list = &m_objectList;
424- objectType = RadarObjectType_Regular;
425427 }
426428
427429 // link object to master list at the head of it's priority section
428430 linkRadarObject (newObj, list);
429431
430- return objectType ;
432+ return TRUE ;
431433}
432434
433435// -------------------------------------------------------------------------------------------------
@@ -474,24 +476,24 @@ Bool Radar::deleteFromList( Object *obj, RadarObject **list )
474476// -------------------------------------------------------------------------------------------------
475477/* * Remove an object from the radar, the object may reside in any list */
476478// -------------------------------------------------------------------------------------------------
477- RadarObjectType Radar::removeObject ( Object *obj )
479+ Bool Radar::removeObject ( Object *obj )
478480{
479481
480482 // sanity
481483 if ( obj->friend_getRadarData () == NULL )
482- return RadarObjectType_None ;
484+ return FALSE ;
483485
486+ if ( deleteFromList ( obj, &m_localHeroObjectList ) == TRUE )
487+ return TRUE ;
484488 if ( deleteFromList ( obj, &m_localObjectList ) == TRUE )
485- return RadarObjectType_Local ;
489+ return TRUE ;
486490 else if ( deleteFromList ( obj, &m_objectList ) == TRUE )
487- return RadarObjectType_Regular ;
491+ return TRUE ;
488492 else
489493 {
490-
491- // sanity
492494 DEBUG_ASSERTCRASH ( 0 , (" Radar: Tried to remove object '%s' which was not found" ,
493495 obj->getTemplate ()->getName ().str ()) );
494- return RadarObjectType_None ;
496+ return FALSE ;
495497 }
496498
497499}
@@ -716,10 +718,14 @@ Object *Radar::objectUnderRadarPixel( const ICoord2D *pixel )
716718 // to the radar location
717719 //
718720
719- // search the local object list
720- obj = searchListForRadarLocationMatch ( m_localObjectList, &radar );
721+ // search the local hero object list
722+ obj = searchListForRadarLocationMatch ( m_localHeroObjectList, &radar );
723+
724+ // search the local object list if not found
725+ if ( obj == NULL )
726+ obj = searchListForRadarLocationMatch ( m_localObjectList, &radar );
721727
722- // search all other objects if not found
728+ // search all other objects if still not found
723729 if ( obj == NULL )
724730 obj = searchListForRadarLocationMatch ( m_objectList, &radar );
725731
@@ -1359,6 +1365,7 @@ static void xferRadarObjectList( Xfer *xfer, RadarObject **head )
13591365 * Version Info:
13601366 * 1: Initial version
13611367 * 2: TheSuperHackers @tweak Serialize m_radarHidden, m_radarForceOn for each player
1368+ * 3: TheSuperHackers @tweak Serialize m_localHeroObjectList
13621369 */
13631370// ------------------------------------------------------------------------------------------------
13641371void Radar::xfer ( Xfer *xfer )
@@ -1368,13 +1375,13 @@ void Radar::xfer( Xfer *xfer )
13681375#if RETAIL_COMPATIBLE_XFER_SAVE
13691376 XferVersion currentVersion = 1 ;
13701377#else
1371- XferVersion currentVersion = 2 ;
1378+ XferVersion currentVersion = 3 ;
13721379#endif
13731380 XferVersion version = currentVersion;
13741381 xfer->xferVersion ( &version, currentVersion );
13751382
13761383
1377- if (version <= 1 )
1384+ if (version < 2 )
13781385 {
13791386 const Int localPlayerIndex = ThePlayerList->getLocalPlayer ()->getPlayerIndex ();
13801387 Bool value;
@@ -1398,12 +1405,66 @@ void Radar::xfer( Xfer *xfer )
13981405 xfer->xferUser (&m_radarForceOn, sizeof (m_radarForceOn));
13991406 }
14001407
1408+ if (version < 3 )
1409+ {
1410+ if (xfer->getXferMode () == XFER_SAVE)
1411+ {
1412+ // TheSuperHackers @info For legacy xfer compatibility.
1413+ // Transfer all local hero objects to local object list.
1414+ RadarObject **fromList = &m_localHeroObjectList;
1415+ RadarObject **toList = &m_localObjectList;
1416+ while (*fromList != NULL )
1417+ {
1418+ RadarObject* nextObject = (*fromList)->friend_getNext ();
1419+ (*fromList)->friend_setNext (NULL );
1420+ linkRadarObject (*fromList, toList);
1421+ *fromList = nextObject;
1422+ }
1423+ }
1424+ }
1425+ else
1426+ {
1427+ xferRadarObjectList ( xfer, &m_localHeroObjectList );
1428+ }
1429+
14011430 // save our local object list
14021431 xferRadarObjectList ( xfer, &m_localObjectList );
14031432
14041433 // save the regular object list
14051434 xferRadarObjectList ( xfer, &m_objectList );
14061435
1436+ if (version < 3 )
1437+ {
1438+ // TheSuperHackers @info For legacy xfer compatibility.
1439+ // Transfer hero local object(s) back to local hero object list.
1440+ // This needs to be done on both load and save.
1441+ RadarObject **fromList = &m_localObjectList;
1442+ RadarObject **toList = &m_localHeroObjectList;
1443+ RadarObject *currObject;
1444+ RadarObject *prevObject;
1445+ RadarObject *nextObject;
1446+ prevObject = NULL ;
1447+ for (currObject = *fromList; currObject != NULL ; currObject = nextObject)
1448+ {
1449+ nextObject = currObject->friend_getNext ();
1450+ if (currObject->friend_getObject ()->isHero ())
1451+ {
1452+ if (prevObject != NULL )
1453+ {
1454+ prevObject->friend_setNext (nextObject);
1455+ }
1456+ else
1457+ {
1458+ *fromList = nextObject;
1459+ }
1460+ currObject->friend_setNext (NULL );
1461+ linkRadarObject (currObject, toList);
1462+ continue ;
1463+ }
1464+ prevObject = currObject;
1465+ }
1466+ }
1467+
14071468 // save the radar event count and data
14081469 UnsignedShort eventCountVerify = MAX_RADAR_EVENTS;
14091470 UnsignedShort eventCount = eventCountVerify;
0 commit comments