Exemplo n.º 1
0
/*
=============
FormatCheck
=============
   This is called when we hit a \ in the string.  It checks for \b+, \b-, \i+, 
\i-, \c(int int int) and \a(int int int int).  It is very picky about things so
if there is anything wrong with the passed string it will return 0, an error.  
If everything is parsed without problem it will return an enum from font.h that
represents what was just read in.  
*/
GLint GLFont::FormatCheck(char **where, GLubyte *clr)
{
   if (**where != '\\')
      return 0;

   GLint res = 0;
   char *start = *where;
   char curr;

   if (!*++(*where))
   {
      *where = start;
      return 0;
   }

   curr = **where;

   if (curr == 'b' || curr == 'i')
   {
      GLboolean b = curr == 'b';
      res = IsToggle(where);

      if (res == toggleOn)
         return b ? formatBoldOn : formatItalicOn;
      else if (res == toggleOff)
         return b ? formatBoldOff : formatItalicOff;
   }
   else if ((curr == 'c' || curr == 'a') &&
    ParseColor(clr, where, curr == 'c' ? 3 : 4))
      return curr == 'c' ? formatColor : formatColorA;

   *where = start;

   return 0;
}
Exemplo n.º 2
0
//------------------------------------------------------------------------
bool CIronSight::StartZoom(bool stayZoomed, bool fullZoomout, int zoomStep)
{
	if(m_pWeapon->IsBusy() || (IsToggle() && IsZoomingInOrOut()))
		return false;

	CActor *pActor = m_pWeapon->GetOwnerActor();
	CScreenEffects *pSE = pActor?pActor->GetScreenEffects():NULL;

	if(pSE)
	{
		pSE->EnableBlends(false, CScreenEffects::eSFX_GID_ZoomIn);
		pSE->EnableBlends(false, CScreenEffects::eSFX_GID_ZoomOut);
		pSE->EnableBlends(false, CScreenEffects::eSFX_GID_HitReaction);
	}

	if(!m_zoomed || stayZoomed)
	{
		EnterZoom(m_pShared->zoomParams.zoom_in_time, m_pShared->zoomParams.layer.c_str(), true, zoomStep);
		m_currentStep = zoomStep;

		m_pWeapon->AssistAiming(m_pShared->zoomParams.stages[m_currentStep-1], true);
	}
	else
	{
		int currentStep = m_currentStep;
		int nextStep = currentStep+1;

		if(nextStep > m_pShared->zoomParams.stages.size())
		{
			if(!stayZoomed)
			{
				if(fullZoomout)
				{
					StopZoom();
				}
				else
				{
					float oFoV = GetZoomFoVScale(currentStep);
					m_currentStep = 0;
					float tFoV = GetZoomFoVScale(m_currentStep);
					ZoomIn(m_pShared->zoomParams.stage_time, oFoV, tFoV, true);
					return true;
				}
			}
		}
		else
		{
			float oFoV = GetZoomFoVScale(currentStep);
			float tFoV = GetZoomFoVScale(nextStep);

			ZoomIn(m_pShared->zoomParams.stage_time, oFoV, tFoV, true);

			m_currentStep = nextStep;

			m_pWeapon->AssistAiming(m_pShared->zoomParams.stages[m_currentStep-1], true);
			return true;
		}
	}

	return false;
}
hsBool plActivatorConditionalObject::MsgReceive(plMessage* msg)
{
    plActivatorMsg* pDetectorMsg = plActivatorMsg::ConvertNoRef(msg);
    if (pDetectorMsg)
    {
        if (pDetectorMsg->fTriggerType == plActivatorMsg::kVolumeEnter || pDetectorMsg->fTriggerType == plActivatorMsg::kVolumeExit)
            return plConditionalObject::MsgReceive(msg);

        for (int i = 0; i < fActivators.Count(); i++)
        {
            if (pDetectorMsg && pDetectorMsg->GetSender() == fActivators[i])
            {
                if (pDetectorMsg->fTriggerType == plActivatorMsg::kUnPickedTrigger ||
                    pDetectorMsg->fTriggerType == plActivatorMsg::kExitUnTrigger   ||
                    pDetectorMsg->fTriggerType == plActivatorMsg::kEnterUnTrigger  ||
                    pDetectorMsg->fTriggerType == plActivatorMsg::kCollideUnTrigger )
                    
                {
                    // is this a toggle activator?
                    if (IsToggle())
                        return true;

                    // are we in a triggered state?
                    if (fLogicMod->HasFlag(plLogicModBase::kTriggered))
                    {
                        if (pDetectorMsg->fTriggerType == plActivatorMsg::kUnPickedTrigger)
                            fLogicMod->GetNotify()->AddPickEvent(pDetectorMsg->fHitterObj, pDetectorMsg->fPickedObj, false, pDetectorMsg->fHitPoint);

                        if ((pDetectorMsg->fTriggerType == plActivatorMsg::kCollideExit) ||
                            (pDetectorMsg->fTriggerType == plActivatorMsg::kVolumeExit)  )
                            fLogicMod->GetNotify()->AddCollisionEvent(true, pDetectorMsg->fHitterObj, pDetectorMsg->fHiteeObj);
                    
                        if ((pDetectorMsg->fTriggerType == plActivatorMsg::kCollideEnter) ||
                            (pDetectorMsg->fTriggerType == plActivatorMsg::kVolumeEnter) )
                            fLogicMod->GetNotify()->AddCollisionEvent(false, pDetectorMsg->fHitterObj, pDetectorMsg->fHiteeObj);

                        fLogicMod->RequestUnTrigger();
                    }
                }
                else
                {
                    // are we a toggle that has been triggered?
                    // are we in a triggered state?
                    if (fLogicMod->HasFlag(plLogicModBase::kTriggered) && IsToggle())
                    {
                        if (pDetectorMsg->fTriggerType == plActivatorMsg::kUnPickedTrigger)
                            fLogicMod->GetNotify()->AddPickEvent(pDetectorMsg->fHitterObj, pDetectorMsg->fPickedObj, false, pDetectorMsg->fHitPoint);

                        if ((pDetectorMsg->fTriggerType == plActivatorMsg::kCollideExit) ||
                            (pDetectorMsg->fTriggerType == plActivatorMsg::kVolumeExit)  )
                            fLogicMod->GetNotify()->AddCollisionEvent(true, pDetectorMsg->fHitterObj, pDetectorMsg->fHiteeObj);
                    
                        if ((pDetectorMsg->fTriggerType == plActivatorMsg::kCollideEnter) ||
                            (pDetectorMsg->fTriggerType == plActivatorMsg::kVolumeEnter) )
                            fLogicMod->GetNotify()->AddCollisionEvent(false, pDetectorMsg->fHitterObj, pDetectorMsg->fHiteeObj);

                        fLogicMod->RequestUnTrigger();
                        return true;
                    }


                    if (!fLogicMod->VerifyConditions( pDetectorMsg ))
                        return false;
                    // this is used as part of a picked detector sometimes...
                    if (pDetectorMsg->fTriggerType == plActivatorMsg::kPickedTrigger)
                        fLogicMod->GetNotify()->AddPickEvent(pDetectorMsg->fHitterObj, pDetectorMsg->fPickedObj, true, pDetectorMsg->fHitPoint);

                    if ((pDetectorMsg->fTriggerType == plActivatorMsg::kCollideExit) ||
                        (pDetectorMsg->fTriggerType == plActivatorMsg::kVolumeExit)  )
                    {
                        fLogicMod->GetNotify()->AddCollisionEvent(false, pDetectorMsg->fHitterObj, pDetectorMsg->fHiteeObj);
                    }
                    if ((pDetectorMsg->fTriggerType == plActivatorMsg::kCollideEnter) ||
                        (pDetectorMsg->fTriggerType == plActivatorMsg::kVolumeEnter) )
                    {
                        fLogicMod->GetNotify()->AddCollisionEvent(true, pDetectorMsg->fHitterObj, pDetectorMsg->fHiteeObj);
                    }
                    SetSatisfied(true);
                    //hsBool netRequest = msg->HasBCastFlag(plMessage::kNetNonLocal);
                    //fLogicMod->RequestTrigger(netRequest);
                    fLogicMod->RequestTrigger(false);
                }
                return true;
            }
        }
    }
    return plConditionalObject::MsgReceive(msg);
}
hsBool plFacingConditionalObject::Verify(plMessage* msg)
{
    plActivatorMsg* pActivateMsg = plActivatorMsg::ConvertNoRef(msg);
    if (pActivateMsg && pActivateMsg->fHitterObj)
    {   
        plSceneObject* pPlayer = plSceneObject::ConvertNoRef(pActivateMsg->fHitterObj->ObjectIsLoaded());
        if (pPlayer)
        {
            hsVector3 playerView = pPlayer->GetCoordinateInterface()->GetLocalToWorld().GetAxis(hsMatrix44::kView);
            hsVector3 ourView;
            if (fDirectional)
                ourView = fLogicMod->GetTarget()->GetCoordinateInterface()->GetLocalToWorld().GetAxis(hsMatrix44::kView);
            else
            {
                hsVector3 v(fLogicMod->GetTarget()->GetCoordinateInterface()->GetLocalToWorld().GetTranslate() - pPlayer->GetCoordinateInterface()->GetLocalToWorld().GetTranslate());
                ourView = v;
                ourView.Normalize();
            }
            float dot = playerView * ourView;
            if (dot >= fTolerance)
            {
                fLogicMod->GetNotify()->AddFacingEvent( pActivateMsg->fHitterObj, fLogicMod->GetTarget()->GetKey(), dot, true);
                return true;            
            }
            else
            {
                return false;
            }
        }
    }
    plFakeOutMsg* pFakeMsg = plFakeOutMsg::ConvertNoRef(msg);
    if (pFakeMsg && plNetClientApp::GetInstance()->GetLocalPlayerKey())
    {
        // sanity check
        if (!fLogicMod->GetTarget()->GetCoordinateInterface())
            return false;

        plSceneObject* pPlayer = plSceneObject::ConvertNoRef(plNetClientApp::GetInstance()->GetLocalPlayerKey()->ObjectIsLoaded());
        if (pPlayer)
        {
            hsVector3 playerView = pPlayer->GetCoordinateInterface()->GetLocalToWorld().GetAxis(hsMatrix44::kView);
            hsVector3 ourView;
            if (fDirectional)
                ourView = fLogicMod->GetTarget()->GetCoordinateInterface()->GetLocalToWorld().GetAxis(hsMatrix44::kView);
            else
            {
                hsVector3 v(fLogicMod->GetTarget()->GetCoordinateInterface()->GetLocalToWorld().GetTranslate() - pPlayer->GetCoordinateInterface()->GetLocalToWorld().GetTranslate());
                ourView = v;
                ourView.fZ = playerView.fZ;
                ourView.Normalize();
            }
            float dot = playerView * ourView;
            if (dot >= fTolerance)
            {
                return true;            
            }
            else
            {
                if (!IsToggle())
                {
                    fLogicMod->GetNotify()->AddFacingEvent( pPlayer->GetKey(), fLogicMod->GetTarget()->GetKey(), dot, false);
                    fLogicMod->RequestUnTrigger();
                    return false;
                }
            }
        }
    }
    return false;
}
hsBool plObjectInBoxConditionalObject::MsgReceive(plMessage* msg)
{
    plActivatorMsg* pActivateMsg = plActivatorMsg::ConvertNoRef(msg);
    if (pActivateMsg)
    {
        if (pActivateMsg->fTriggerType == plActivatorMsg::kVolumeEnter)
        {
            fInside.Append(pActivateMsg->fHitterObj);
            return true;
        }
        else
        if (pActivateMsg->fTriggerType == plActivatorMsg::kVolumeExit)
        {
            for (int i = 0; i < fInside.Count(); i++)
            {
                if (fInside[i] == pActivateMsg->fHitterObj)
                {
                    fInside.Remove(i);
                    if (pActivateMsg->fHitterObj == fCurrentTrigger && fCurrentTrigger && fLogicMod->HasFlag(plLogicModBase::kTriggered) && !IsToggle())
                    {
                        fCurrentTrigger = nil;
                        fLogicMod->GetNotify()->AddContainerEvent( pActivateMsg->fHiteeObj, pActivateMsg->fHitterObj, false );
                        fLogicMod->RequestUnTrigger();
                    }
                }
            }
            return true;
        }

        return false;
    }
    return plConditionalObject::MsgReceive(msg);
}