DIFF

GPSReceiver.c

class GPSReceiver : ItemGPS
{

	protected const string DISPLAY_TEXTURE_PATH_FORMAT 	= "dz\\gear\\navigation\\data\\GPS_%1_ca.paa";
	protected const string ANIM_PHASE_DISPLAY_HIDE 		= "DisplayState";
	
	protected const int PHASE_OFF = 1;
	protected const int PHASE_ON = 0;

	protected ref set<string> 		m_DisplayGridSelections;
	protected ref set<string> 		m_DisplayAltSelections;
	protected ref map<int, string> 	m_DisplayNumericSignTextureMap;
	
	//! cache
	protected ref array<int> 		m_OrderedPositionNumbersLast;
	protected ref array<int> 		m_AltitudeNumbersLast;
	
	protected bool 					m_InitGPS;
	
	void GPSReceiver()
	{
		m_OrderedPositionNumbersLast 	= new array<int>;
		m_AltitudeNumbersLast 			= new array<int>;
		
		int i;
		for (i = 0; i < MapNavigationBehaviour.DISPLAY_GRID_POS_MAX_CHARS_COUNT * 2; ++i)
		{
			m_OrderedPositionNumbersLast.Insert(0);
		}
		
		for (i = 0; i < MapNavigationBehaviour.DISPLAY_ALT_MAX_CHARS_COUNT; ++i)
		{
			m_AltitudeNumbersLast.Insert(0);
		}	
		
		m_DisplayGridSelections = new set<string>();
		m_DisplayGridSelections.Insert("grid_1_0");
		m_DisplayGridSelections.Insert("grid_1_1");
		m_DisplayGridSelections.Insert("grid_1_2");
		m_DisplayGridSelections.Insert("grid_2_0");
		m_DisplayGridSelections.Insert("grid_2_1");
		m_DisplayGridSelections.Insert("grid_2_2");
		
		m_DisplayAltSelections = new set<string>();
		m_DisplayAltSelections.Insert("alt_0");
		m_DisplayAltSelections.Insert("alt_1");
		m_DisplayAltSelections.Insert("alt_2");
		m_DisplayAltSelections.Insert("alt_3");
		
		m_DisplayNumericSignTextureMap = new map<int, string>();
		for (i = -1; i < 11; i++)
		{
			
			string texturePath = string.Format(DISPLAY_TEXTURE_PATH_FORMAT, i);
			
			//! translate numerical -1 to `-` texture
			if (i == -1)
			{
				texturePath = string.Format(DISPLAY_TEXTURE_PATH_FORMAT, "dash");
			}

			m_DisplayNumericSignTextureMap.Insert(i, texturePath);
		}
	}
	
	protected void PositionalUpdate()
	{
		UpdateDisplayPosition();
		UpdateDisplayElevation();
		
		if (!m_InitGPS)
			m_InitGPS = true;
	}
	
	override void SetActions()
	{
		super.SetActions();
		
		AddAction(ActionTurnOnWhileInHands);
		AddAction(ActionTurnOffWhileInHands);
	}
	
	override bool IsTurnedOn()
	{
		return GetCompEM() && GetCompEM().IsWorking();
	}
	
	override void OnWorkStart()
	{
		UpdateDisplayState(PHASE_ON);
		
		if (GetHierarchyRoot())
		{
			PlayerBase pb = PlayerBase.Cast(GetHierarchyRoot());
			if (pb)
			{
				pb.MapNavigationItemInPossession(this);
			}
		}
	}
	
	override void OnWorkStop()
	{
		UpdateDisplayState(PHASE_OFF);

		if (GetHierarchyRoot())
		{
			PlayerBase pb = PlayerBase.Cast(GetHierarchyRoot());
			if (pb)
			{
				pb.MapNavigationItemNotInPossession(this);
			}
		}
	}
	
	override void OnWork(float consumed_energy)
	{
		PositionalUpdate();
	}
	
	protected void UpdateDisplayState(int animPhase)
	{
		ResetAnimationPhase(ANIM_PHASE_DISPLAY_HIDE, PHASE_OFF);
		SetAnimationPhaseNow(ANIM_PHASE_DISPLAY_HIDE, animPhase);
	}
		
	protected void UpdateDisplayPosition()
	{
		int selectionIndex;
		string selectionName;
		string textureName;
		array<int> orderedPositionNumbers = MapNavigationBehaviour.OrderedPositionNumbersFromGridCoords(this);
		
		bool isArrayDifferent = orderedPositionNumbers.DifferentAtPosition(m_OrderedPositionNumbersLast) != INDEX_NOT_FOUND;
		if (isArrayDifferent || !m_InitGPS)
		{
			for (int i = 0; i < m_DisplayGridSelections.Count(); ++i)
			{
				selectionName 	= m_DisplayGridSelections.Get(i);
				selectionIndex 	= GetHiddenSelection(selectionName);
				textureName 	= m_DisplayNumericSignTextureMap.Get(orderedPositionNumbers.Get(i));
				SetObjectTexture(selectionIndex, textureName);
			}
			
			m_OrderedPositionNumbersLast = orderedPositionNumbers;
		}
	}
	
	protected void UpdateDisplayElevation()
	{
		int selectionIndex;
		string selectionName;
		array<int> altitudeNumbers = MapNavigationBehaviour.OrderedAltitudeNumbersPosition(this);
		
		bool isArrayDifferent = altitudeNumbers.DifferentAtPosition(m_AltitudeNumbersLast) != INDEX_NOT_FOUND;
		if (isArrayDifferent || !m_InitGPS)
		{
			for (int i = 0; i < m_DisplayAltSelections.Count(); ++i)
			{
				selectionName 	= m_DisplayAltSelections.Get(i);
				selectionIndex 	= GetHiddenSelection(selectionName);
				SetObjectTexture(selectionIndex, m_DisplayNumericSignTextureMap.Get(altitudeNumbers.Get(i)));
			}

			m_AltitudeNumbersLast = altitudeNumbers;
		}
	}
	
	protected int GetHiddenSelection(string selection)
	{	
		int idx = GetHiddenSelectionIndex(selection);

		if (idx != INDEX_NOT_FOUND)
		{
			return idx;
		}
		else
		{
			return 0;
		}
	}

	//================================================================
	// DEBUG
	//================================================================
			
	override void OnDebugSpawn()
	{
		Battery9V.Cast(GetInventory().CreateInInventory("Battery9V"));
	}
	
	//================================================================
	// DEPRECATED BELOW
	//================================================================
	[Obsolete("1.29: Use the overloaded function GPSReceiver::UpdateDisplayState instead")]
	protected void UpdateDisplayState(bool pIsTurnedOn)
	{
		if (pIsTurnedOn)
		{
			UpdateDisplayState(PHASE_ON);
		}
		else
		{
			UpdateDisplayState(PHASE_OFF);
		}
	}
}