@@ -88,6 +88,7 @@ void Radar::deleteListResources( void )
8888{
8989 deleteList (&m_objectList);
9090 deleteList (&m_localObjectList);
91+ deleteList (&m_localHeroObjectList);
9192
9293#ifdef DEBUG_CRASHING
9394 for ( Object *obj = TheGameLogic->getFirstObject (); obj; obj = obj->getNextObject () )
@@ -197,6 +198,7 @@ Radar::Radar( void )
197198 m_radarWindow = NULL ;
198199 m_objectList = NULL ;
199200 m_localObjectList = NULL ;
201+ m_localHeroObjectList = NULL ;
200202 std::fill (m_radarHidden, m_radarHidden + ARRAY_SIZE (m_radarHidden), false );
201203 std::fill (m_radarForceOn, m_radarForceOn + ARRAY_SIZE (m_radarForceOn), false );
202204 m_terrainAverageZ = 0 .0f ;
@@ -386,13 +388,13 @@ void Radar::newMap( TerrainLogic *terrain )
386388/* * Add an object to the radar list. The object will be sorted in the list to be grouped
387389 * using it's radar priority */
388390// -------------------------------------------------------------------------------------------------
389- RadarObjectType Radar::addObject ( Object *obj )
391+ Bool Radar::addObject ( Object *obj )
390392{
391393
392394 // get the radar priority for this object
393395 RadarPriorityType newPriority = obj->getRadarPriority ();
394396 if ( isPriorityVisible ( newPriority ) == FALSE )
395- return RadarObjectType_None ;
397+ return FALSE ;
396398
397399 // if this object is on the radar, remove it in favor of the new add
398400 RadarObject **list;
@@ -415,26 +417,26 @@ RadarObjectType Radar::addObject( Object *obj )
415417 // set a chunk of radar data in the object
416418 obj->friend_setRadarData ( newObj );
417419
418- RadarObjectType objectType;
419420 //
420421 // we will put this on either the local object list for objects that belong to the
421422 // local player, or on the regular object list for all other objects
422423 //
423424 if ( obj->isLocallyControlled () )
424425 {
425- list = &m_localObjectList;
426- objectType = RadarObjectType_Local;
426+ if ( obj->isHero () )
427+ list = &m_localHeroObjectList;
428+ else
429+ list = &m_localObjectList;
427430 }
428431 else
429432 {
430433 list = &m_objectList;
431- objectType = RadarObjectType_Regular;
432434 }
433435
434436 // link object to master list at the head of it's priority section
435437 linkRadarObject (newObj, list);
436438
437- return objectType ;
439+ return TRUE ;
438440}
439441
440442// -------------------------------------------------------------------------------------------------
@@ -481,24 +483,24 @@ Bool Radar::deleteFromList( Object *obj, RadarObject **list )
481483// -------------------------------------------------------------------------------------------------
482484/* * Remove an object from the radar, the object may reside in any list */
483485// -------------------------------------------------------------------------------------------------
484- RadarObjectType Radar::removeObject ( Object *obj )
486+ Bool Radar::removeObject ( Object *obj )
485487{
486488
487489 // sanity
488490 if ( obj->friend_getRadarData () == NULL )
489- return RadarObjectType_None ;
491+ return FALSE ;
490492
493+ if ( deleteFromList ( obj, &m_localHeroObjectList ) == TRUE )
494+ return TRUE ;
491495 if ( deleteFromList ( obj, &m_localObjectList ) == TRUE )
492- return RadarObjectType_Local ;
496+ return TRUE ;
493497 else if ( deleteFromList ( obj, &m_objectList ) == TRUE )
494- return RadarObjectType_Regular ;
498+ return TRUE ;
495499 else
496500 {
497-
498- // sanity
499501 DEBUG_ASSERTCRASH ( 0 , (" Radar: Tried to remove object '%s' which was not found" ,
500502 obj->getTemplate ()->getName ().str ()) );
501- return RadarObjectType_None ;
503+ return FALSE ;
502504 }
503505
504506}
@@ -723,10 +725,14 @@ Object *Radar::objectUnderRadarPixel( const ICoord2D *pixel )
723725 // to the radar location
724726 //
725727
726- // search the local object list
727- obj = searchListForRadarLocationMatch ( m_localObjectList, &radar );
728+ // search the local hero object list
729+ obj = searchListForRadarLocationMatch ( m_localHeroObjectList, &radar );
730+
731+ // search the local object list if not found
732+ if ( obj == NULL )
733+ obj = searchListForRadarLocationMatch ( m_localObjectList, &radar );
728734
729- // search all other objects if not found
735+ // search all other objects if still not found
730736 if ( obj == NULL )
731737 obj = searchListForRadarLocationMatch ( m_objectList, &radar );
732738
@@ -1366,6 +1372,7 @@ static void xferRadarObjectList( Xfer *xfer, RadarObject **head )
13661372 * Version Info:
13671373 * 1: Initial version
13681374 * 2: TheSuperHackers @tweak Serialize m_radarHidden, m_radarForceOn for each player
1375+ * 3: TheSuperHackers @tweak Serialize m_localHeroObjectList
13691376 */
13701377// ------------------------------------------------------------------------------------------------
13711378void Radar::xfer ( Xfer *xfer )
@@ -1375,13 +1382,13 @@ void Radar::xfer( Xfer *xfer )
13751382#if RETAIL_COMPATIBLE_XFER_SAVE
13761383 XferVersion currentVersion = 1 ;
13771384#else
1378- XferVersion currentVersion = 2 ;
1385+ XferVersion currentVersion = 3 ;
13791386#endif
13801387 XferVersion version = currentVersion;
13811388 xfer->xferVersion ( &version, currentVersion );
13821389
13831390
1384- if (version <= 1 )
1391+ if (version < 2 )
13851392 {
13861393 const Int localPlayerIndex = ThePlayerList->getLocalPlayer ()->getPlayerIndex ();
13871394 Bool value;
@@ -1405,12 +1412,66 @@ void Radar::xfer( Xfer *xfer )
14051412 xfer->xferUser (&m_radarForceOn, sizeof (m_radarForceOn));
14061413 }
14071414
1415+ if (version < 3 )
1416+ {
1417+ if (xfer->getXferMode () == XFER_SAVE)
1418+ {
1419+ // TheSuperHackers @info For legacy xfer compatibility.
1420+ // Transfer all local hero objects to local object list.
1421+ RadarObject **fromList = &m_localHeroObjectList;
1422+ RadarObject **toList = &m_localObjectList;
1423+ while (*fromList != NULL )
1424+ {
1425+ RadarObject* nextObject = (*fromList)->friend_getNext ();
1426+ (*fromList)->friend_setNext (NULL );
1427+ linkRadarObject (*fromList, toList);
1428+ *fromList = nextObject;
1429+ }
1430+ }
1431+ }
1432+ else
1433+ {
1434+ xferRadarObjectList ( xfer, &m_localHeroObjectList );
1435+ }
1436+
14081437 // save our local object list
14091438 xferRadarObjectList ( xfer, &m_localObjectList );
14101439
14111440 // save the regular object list
14121441 xferRadarObjectList ( xfer, &m_objectList );
14131442
1443+ if (version < 3 )
1444+ {
1445+ // TheSuperHackers @info For legacy xfer compatibility.
1446+ // Transfer hero local object(s) back to local hero object list.
1447+ // This needs to be done on both load and save.
1448+ RadarObject **fromList = &m_localObjectList;
1449+ RadarObject **toList = &m_localHeroObjectList;
1450+ RadarObject *currObject;
1451+ RadarObject *prevObject;
1452+ RadarObject *nextObject;
1453+ prevObject = NULL ;
1454+ for (currObject = *fromList; currObject != NULL ; currObject = nextObject)
1455+ {
1456+ nextObject = currObject->friend_getNext ();
1457+ if (currObject->friend_getObject ()->isHero ())
1458+ {
1459+ if (prevObject != NULL )
1460+ {
1461+ prevObject->friend_setNext (nextObject);
1462+ }
1463+ else
1464+ {
1465+ *fromList = nextObject;
1466+ }
1467+ currObject->friend_setNext (NULL );
1468+ linkRadarObject (currObject, toList);
1469+ continue ;
1470+ }
1471+ prevObject = currObject;
1472+ }
1473+ }
1474+
14141475 // save the radar event count and data
14151476 UnsignedShort eventCountVerify = MAX_RADAR_EVENTS;
14161477 UnsignedShort eventCount = eventCountVerify;
0 commit comments