@@ -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 ;
@@ -380,13 +382,13 @@ void Radar::newMap( TerrainLogic *terrain )
380382/* * Add an object to the radar list. The object will be sorted in the list to be grouped
381383 * using it's radar priority */
382384// -------------------------------------------------------------------------------------------------
383- RadarObjectType Radar::addObject ( Object *obj )
385+ Bool Radar::addObject ( Object *obj )
384386{
385387
386388 // get the radar priority for this object
387389 RadarPriorityType newPriority = obj->getRadarPriority ();
388390 if ( isPriorityVisible ( newPriority ) == FALSE )
389- return RadarObjectType_None ;
391+ return FALSE ;
390392
391393 // if this object is on the radar, remove it in favor of the new add
392394 RadarObject **list;
@@ -409,26 +411,26 @@ RadarObjectType Radar::addObject( Object *obj )
409411 // set a chunk of radar data in the object
410412 obj->friend_setRadarData ( newObj );
411413
412- RadarObjectType objectType;
413414 //
414415 // we will put this on either the local object list for objects that belong to the
415416 // local player, or on the regular object list for all other objects
416417 //
417418 if ( obj->isLocallyControlled () )
418419 {
419- list = &m_localObjectList;
420- objectType = RadarObjectType_Local;
420+ if ( obj->isHero () )
421+ list = &m_localHeroObjectList;
422+ else
423+ list = &m_localObjectList;
421424 }
422425 else
423426 {
424427 list = &m_objectList;
425- objectType = RadarObjectType_Regular;
426428 }
427429
428430 // link object to master list at the head of it's priority section
429431 linkRadarObject (newObj, list);
430432
431- return objectType ;
433+ return TRUE ;
432434}
433435
434436// -------------------------------------------------------------------------------------------------
@@ -475,24 +477,24 @@ Bool Radar::deleteFromList( Object *obj, RadarObject **list )
475477// -------------------------------------------------------------------------------------------------
476478/* * Remove an object from the radar, the object may reside in any list */
477479// -------------------------------------------------------------------------------------------------
478- RadarObjectType Radar::removeObject ( Object *obj )
480+ Bool Radar::removeObject ( Object *obj )
479481{
480482
481483 // sanity
482484 if ( obj->friend_getRadarData () == NULL )
483- return RadarObjectType_None ;
485+ return FALSE ;
484486
487+ if ( deleteFromList ( obj, &m_localHeroObjectList ) == TRUE )
488+ return TRUE ;
485489 if ( deleteFromList ( obj, &m_localObjectList ) == TRUE )
486- return RadarObjectType_Local ;
490+ return TRUE ;
487491 else if ( deleteFromList ( obj, &m_objectList ) == TRUE )
488- return RadarObjectType_Regular ;
492+ return TRUE ;
489493 else
490494 {
491-
492- // sanity
493495 DEBUG_ASSERTCRASH ( 0 , (" Radar: Tried to remove object '%s' which was not found" ,
494496 obj->getTemplate ()->getName ().str ()) );
495- return RadarObjectType_None ;
497+ return FALSE ;
496498 }
497499
498500}
@@ -717,10 +719,14 @@ Object *Radar::objectUnderRadarPixel( const ICoord2D *pixel )
717719 // to the radar location
718720 //
719721
720- // search the local object list
721- obj = searchListForRadarLocationMatch ( m_localObjectList, &radar );
722+ // search the local hero object list
723+ obj = searchListForRadarLocationMatch ( m_localHeroObjectList, &radar );
724+
725+ // search the local object list if not found
726+ if ( obj == NULL )
727+ obj = searchListForRadarLocationMatch ( m_localObjectList, &radar );
722728
723- // search all other objects if not found
729+ // search all other objects if still not found
724730 if ( obj == NULL )
725731 obj = searchListForRadarLocationMatch ( m_objectList, &radar );
726732
@@ -1360,6 +1366,7 @@ static void xferRadarObjectList( Xfer *xfer, RadarObject **head )
13601366 * Version Info:
13611367 * 1: Initial version
13621368 * 2: TheSuperHackers @tweak Serialize m_radarHidden, m_radarForceOn for each player
1369+ * 3: TheSuperHackers @tweak Serialize m_localHeroObjectList
13631370 */
13641371// ------------------------------------------------------------------------------------------------
13651372void Radar::xfer ( Xfer *xfer )
@@ -1369,13 +1376,13 @@ void Radar::xfer( Xfer *xfer )
13691376#if RETAIL_COMPATIBLE_XFER_SAVE
13701377 XferVersion currentVersion = 1 ;
13711378#else
1372- XferVersion currentVersion = 2 ;
1379+ XferVersion currentVersion = 3 ;
13731380#endif
13741381 XferVersion version = currentVersion;
13751382 xfer->xferVersion ( &version, currentVersion );
13761383
13771384
1378- if (version <= 1 )
1385+ if (version < 2 )
13791386 {
13801387 const Int localPlayerIndex = ThePlayerList->getLocalPlayer ()->getPlayerIndex ();
13811388 Bool value;
@@ -1399,12 +1406,66 @@ void Radar::xfer( Xfer *xfer )
13991406 xfer->xferUser (&m_radarForceOn, sizeof (m_radarForceOn));
14001407 }
14011408
1409+ if (version < 3 )
1410+ {
1411+ if (xfer->getXferMode () == XFER_SAVE)
1412+ {
1413+ // TheSuperHackers @info For legacy xfer compatibility.
1414+ // Transfer all local hero objects to local object list.
1415+ RadarObject **fromList = &m_localHeroObjectList;
1416+ RadarObject **toList = &m_localObjectList;
1417+ while (*fromList != NULL )
1418+ {
1419+ RadarObject* nextObject = (*fromList)->friend_getNext ();
1420+ (*fromList)->friend_setNext (NULL );
1421+ linkRadarObject (*fromList, toList);
1422+ *fromList = nextObject;
1423+ }
1424+ }
1425+ }
1426+ else
1427+ {
1428+ xferRadarObjectList ( xfer, &m_localHeroObjectList );
1429+ }
1430+
14021431 // save our local object list
14031432 xferRadarObjectList ( xfer, &m_localObjectList );
14041433
14051434 // save the regular object list
14061435 xferRadarObjectList ( xfer, &m_objectList );
14071436
1437+ if (version < 3 )
1438+ {
1439+ // TheSuperHackers @info For legacy xfer compatibility.
1440+ // Transfer hero local object(s) back to local hero object list.
1441+ // This needs to be done on both load and save.
1442+ RadarObject **fromList = &m_localObjectList;
1443+ RadarObject **toList = &m_localHeroObjectList;
1444+ RadarObject *currObject;
1445+ RadarObject *prevObject;
1446+ RadarObject *nextObject;
1447+ prevObject = NULL ;
1448+ for (currObject = *fromList; currObject != NULL ; currObject = nextObject)
1449+ {
1450+ nextObject = currObject->friend_getNext ();
1451+ if (currObject->friend_getObject ()->isHero ())
1452+ {
1453+ if (prevObject != NULL )
1454+ {
1455+ prevObject->friend_setNext (nextObject);
1456+ }
1457+ else
1458+ {
1459+ *fromList = nextObject;
1460+ }
1461+ currObject->friend_setNext (NULL );
1462+ linkRadarObject (currObject, toList);
1463+ continue ;
1464+ }
1465+ prevObject = currObject;
1466+ }
1467+ }
1468+
14081469 // save the radar event count and data
14091470 UnsignedShort eventCountVerify = MAX_RADAR_EVENTS;
14101471 UnsignedShort eventCount = eventCountVerify;
0 commit comments