StaminaSoundHandler.c
class SoundHandlerBaseclass StaminaSoundHandlerBaseclass StaminaSoundHandlerServerclass StaminaSoundHandlerClientenum eStaminaZonesenum eStaminaTendencyenum eStaminaState
const float TICK_INTERVAL = 1;
const float STAMINA_SOUND_TR1 = 0.55;
const float STAMINA_SOUND_TR2 = 0.25;
enum eStaminaZones
{
ZONE0,
ZONE1,
ZONE2,
}
enum eStaminaTendency
{
UP,
DOWN,
}
enum eStaminaState
{
ZONE0_UP = 1,
ZONE0_DOWN,
ZONE1_UP,
ZONE1_DOWN,
ZONE2_UP,
ZONE2_DOWN,
//count bellow, add above
COUNT
}
class SoundHandlerBase
{
eSoundHandlers m_Id;
PlayerBase m_Player;
void Update();
eSoundHandlers GetID()
{
return m_Id;
}
void SoundHandlerBase(PlayerBase player)
{
m_Player = player;
Init();
}
void Init();
}
class StaminaSoundHandlerBase extends SoundHandlerBase
{
override void Init()
{
m_Id = eSoundHandlers.STAMINA;
}
eStaminaState GetStaminaState(eStaminaTendency tendency, eStaminaZones zone)
{
eStaminaState stamina_state;
zone = Math.Clamp(zone, eStaminaZones.ZONE0, eStaminaZones.ZONE2);
if(zone == eStaminaZones.ZONE1 && tendency == eStaminaTendency.DOWN)
{
stamina_state = eStaminaState.ZONE1_DOWN;
}
if(zone == eStaminaZones.ZONE1 && tendency == eStaminaTendency.UP)
{
stamina_state = eStaminaState.ZONE1_UP;
}
if(zone == eStaminaZones.ZONE2 && tendency == eStaminaTendency.DOWN)
{
stamina_state = eStaminaState.ZONE2_DOWN;
}
if(zone == eStaminaZones.ZONE2 && tendency == eStaminaTendency.UP)
{
stamina_state = eStaminaState.ZONE2_UP;
}
if(zone == eStaminaZones.ZONE0 && tendency == eStaminaTendency.UP)
{
stamina_state = eStaminaState.ZONE0_UP;
}
if(zone == eStaminaZones.ZONE0 && tendency == eStaminaTendency.DOWN)
{
stamina_state = eStaminaState.ZONE0_DOWN;
}
return stamina_state;
}
}
//---------------------------
// Server
//---------------------------
class StaminaSoundHandlerServer extends StaminaSoundHandlerBase
{
float m_Stamina;
StaminaHandler m_StaminaHandler;
float m_StaminaLastValue;
int m_StaminaZoneOffset;
void SetStaminaZoneOffset(int zone_offset)
{
m_StaminaZoneOffset = zone_offset;
}
// ! Called from command handler
override void Update()
{
m_Stamina = m_Player.GetStaminaHandler().GetStamina();
float stamina_delta = m_StaminaLastValue - m_Stamina;
eStaminaTendency stamina_tendency;
eStaminaZones stamina_zone;
//if( stamina_delta == 0 ) return;
if( stamina_delta > 0 )
{
stamina_tendency = eStaminaTendency.DOWN;
}
if( stamina_delta <= 0 )
{
stamina_tendency = eStaminaTendency.UP;
}
m_StaminaLastValue = m_Stamina;
stamina_zone = GetZone(m_Stamina);
m_Player.SetStaminaState( GetStaminaState(stamina_tendency, stamina_zone + m_StaminaZoneOffset) );
//EPlayerSoundEventID sound_event_id = GetPlayerSoundEventID();
/*
//PrintString("stamina delta " +stamina_delta.ToString());
//PrintString("stamina zone " +m_StaminaZone.ToString());
//PrintString("stamina tendency " +m_StaminaTendency.ToString());
*/
//PrintString(" sound event id " +sound_event_id.ToString());
//if( sound_event_id !=0 ) m_Player.SendSoundEvent(sound_event_id);
}
eStaminaZones GetZone(float stamina)
{
float stamina_normalized = Math.InverseLerp(0, m_Player.GetStaminaHandler().GetStaminaCap(), stamina);
stamina_normalized = Math.Clamp(stamina_normalized,0,1);
//PrintString(" stamina_normalized " +stamina_normalized.ToString());
eStaminaZones stamina_zone = eStaminaZones.ZONE0;
if( stamina_normalized < STAMINA_SOUND_TR1)
{
stamina_zone = eStaminaZones.ZONE1;
}
if( stamina_normalized < STAMINA_SOUND_TR2)
{
stamina_zone = eStaminaZones.ZONE2;
}
return stamina_zone;
}
}
//---------------------------
// Client
//---------------------------
class StaminaSoundHandlerClient extends StaminaSoundHandlerBase
{
float m_PostponeTime = -1;
float m_LastTick;
bool m_UpdateTimerRunning;
bool m_StaminaUpEndPlayed = true;
ref Timer m_ClientCharacterTick = new Timer;
ref Timer m_ClientCharacterDistanceCheck = new Timer;
void PostponeStamina(float time)
{
m_PostponeTime = g_Game.GetTime() + time;
}
override void Update()
{
if( g_Game.GetTime() < m_PostponeTime || m_Player.GetPlayerSoundEventHandler().m_CurrentState )
{
return;
}
//Print(Math.RandomFloat01());
eStaminaState stamina_state = m_Player.GetStaminaState();
switch(stamina_state)
{
case eStaminaState.ZONE1_DOWN:
if(m_Player.PlaySoundEvent(EPlayerSoundEventID.STAMINA_DOWN_LIGHT))
{
m_StaminaUpEndPlayed = false;
}
break;
case eStaminaState.ZONE1_UP:
if(m_Player.PlaySoundEvent(EPlayerSoundEventID.STAMINA_UP_LIGHT))
{
m_StaminaUpEndPlayed = false;
}
break;
case eStaminaState.ZONE2_DOWN:
if(m_Player.PlaySoundEvent(EPlayerSoundEventID.STAMINA_DOWN_HEAVY))
{
m_StaminaUpEndPlayed = false;
}
break;
case eStaminaState.ZONE2_UP:
if(m_Player.PlaySoundEvent(EPlayerSoundEventID.STAMINA_UP_HEAVY))
{
m_StaminaUpEndPlayed = false;
}
break;
case eStaminaState.ZONE0_UP:
if(!m_StaminaUpEndPlayed && m_Player.PlaySoundEvent(EPlayerSoundEventID.STAMINA_UP_END))
{
m_StaminaUpEndPlayed = true;
}
else
{
m_Player.PlaySoundEvent(EPlayerSoundEventID.STAMINA_NORMAL_DUMMY);
}
break;
case eStaminaState.ZONE0_DOWN:
m_Player.PlaySoundEvent(EPlayerSoundEventID.STAMINA_NORMAL_DUMMY);
break;
}
}
}