/**************************************************************
Purpose:
  Switching for standby to primary. When standby RTU receive changing
  state to primary, go to this state for waiting for server polling
  tasks completing copy SWC table.
  Added in 22 March 2004, Yu Wei
***************************************************************/
void GoState5_Switching_StoP(void)
{
//  int nI;
  bool bStateChangeFlag = true;

  if(bStateChangeFlag == true)  //All SPM task completed state changing.
  {
    switch(g_pRTUStatusTable->m_nSwitchFlag)  //040420 Yu Wei
    {
    case COMFIRM_SWITCH:  //Standby RTU received confirm command and switch to primary.
       //printf("GoState5_Switching_StoP CONFIRM_SWITCH\n");
      ChangeStateTo(STATEFLAG_PRIMARY);
      g_pRTUStatusTable->m_bSWCSwitchCompletedFlag = true;//2008
      g_pRTUStatusTable->m_nSwitchFlag = NOT_IN_SWITCH;    //Set switching status.
      break;

    case COMFIRM_SWITCH_ERROR:  //Standby RTU didn't receive confirm command and switch back to standby.
      //printf("GoState5_Switching_StoP CONFIRM_SWITCH_ERROR\n");
      ChangeStateTo(STATEFLAG_STANDBY);
      g_pRTUStatusTable->m_nSwitchFlag = NOT_IN_SWITCH;    //Set switching status.
      break;

    default:
//      printf("GoState5_Switching_StoP default\n");
      break;
    }  //040420 Yu Wei
  }
}
/**************************************************************
Purpose:
  Initialize state machine.

***************************************************************/
void StateInitialize(void)
{
  ChangeStateTo(STATEFLAG_INITIALIZATION);
  g_bRMMServerLinkCheck = true;
  g_bRMMOtherRTULinkCheck = false;
  ActivateTimeOut();
}
Example #3
0
 void PetAI::OnReturnPeace()
 {
     CPet *pet = (CPet*) GetOwner();
     if(!pet->IsDied() && !pet->IsHangUp())
     {
         ChangeStateTo(CShape::STATE_PEACE);
     }
 }
/*****************************************************8*************************
Purpose:
  Check if all SWC module change to switching state and primary
  RTU send all SWC tables to standby RTU.
  This routine is added to reduce GoState4_Switching_PtoS()'s complexity.
  Added in 20 April 2004, Yu Wei

History

  Name         Date       Remark
  ----         ----       ------
  Bryan Chong  15-Oct-09  Fix exit error when check m_bSWCSwitchCompletedFlag
                          for uninitialized SWC object, null pointer.
                          Also do not need to check for the last NTP at the
                          last of the SWC list
  Bryan Chong  29-Nov-11  Exclude NTP Client from the SWC checking list
*******************************************************************************/
void CheckPrimarySwitchCompleted(void)
{
  int nI;

  bool bSwitchCompletedFlag = true;  //Flag to check if the switching completed.

  if( g_pRTUStatusTable->m_bSWCSwitchCompletedFlag == false)  //040323 Yu Wei
  {
    for(nI=0; nI<g_tRTUConfig.nSWCNumber; nI++)
    {
      if((g_tRTUConfig.nSwcEnabled[nI] == false) ||
         (g_apSWCObject[nI]->m_nSWCID == 19))
        continue;

      if(g_apSWCObject[nI]->m_nSWCCurrentStateFlag !=
         STATEFLAG_SWITCHING_PTOS)
      {
        bSwitchCompletedFlag = false;
        #if ((defined CFG_DEBUG_MSG) && (CFG_DEBUG_RMMLINK_SWITCH))
        printf("[RMM] CheckPrimarySwitchCompleted, waiting for %s to switch "
               "from Pri to Stdby, currently at state %d\n",
               g_apSWCObject[nI]->m_acSWCName, g_apSWCObject[nI]->m_nSWCCurrentStateFlag);
        #endif // ((defined CFG_DEBUG_MSG) && (CFG_DEBUG_RMMLINK_SWITCH))
     //   g_apSWCObject[nI]->m_nSWCCurrentStateFlag =STATEFLAG_SWITCHING_PTOS;
        break;    //040323 Yu Wei
      }
    }

    //All SWC have changed state to STATEFLAG_SWITCHING_PTOS  040323 Yu Wei
    if( bSwitchCompletedFlag == true)
    {
      g_pRTUStatusTable->m_bSWCSwitchCompletedFlag = true;
      g_pRTUStatusTable->m_bStartSendSWCTableFlag = true;
      #if ((defined CFG_DEBUG_MSG) && (CFG_DEBUG_RMMLINK_SWITCH))
      printf("[RMM] CheckPrimarySwitchCompleted, switching completed\n");
      #endif // ((defined CFG_DEBUG_MSG) && (CFG_DEBUG_RMMLINK_SWITCH))
    }
  }
  else
  {
    g_pRTUStatusTable->m_bSendSWCTableCompletedFlag = false;
    g_pRTUStatusTable->m_bSWCSwitchCompletedFlag = false;
    g_pRTUStatusTable->m_bStartSendSWCTableFlag = false;

    if((g_tRTUStatus.abOtherLinkStatus[0] == false) &&
       (g_tRTUStatus.abOtherLinkStatus[1] == false))
    {
      ChangeStateTo(STATEFLAG_STANDBY);
      if(g_pRTUStatusTable->m_bServerSwitchFlag == true)
        g_pRTUStatusTable->m_bServerSwitchFlag = false;
    }
    else if(g_pRTUStatusTable->m_bServerSwitchFlag == true)    //040524 Yu Wei
    {
      g_pCRTULink->SetWriteCommand(CMD_COMFIRM_SWITCH, STATEFLAG_STANDBY);
      g_pCRTULink->m_nWriteCommandResult = SEND_COMMPLETE_START;
      g_pRTUStatusTable->m_nSwitchFlag = COMFIRM_SWITCH;    //Set switching status.

      g_pRTUStatusTable->m_bServerSwitchFlag = false;

    }                              //040524 Yu Wei
    else
    {
      #if ((defined CFG_DEBUG_MSG) && CFG_DEBUG_RMMLINKCHK)
      printf("[RMM] CheckPrimarySwitchCompleted, pri RTU tx cmd to other RTU "
             "to switch to pri RTU\n");
      #endif // ((defined CFG_DEBUG_MSG) && CFG_DEBUG_RMMLINKCHK)
      g_pCRTULink->SetWriteCommand(CMD_START_SWITCH, STATEFLAG_PRIMARY); //040420 Yu Wei
      g_pCRTULink->m_nWriteCommandResult = SEND_COMMPLETE_START;
      g_pRTUStatusTable->m_nSwitchFlag = START_SWITCH;    //Set switching status. 040420 Yu Wei

      //g_pRTUStatusTable->m_bOtherRTUSwitchFlag = true;    //Other RTU start to switch. //040420 Yu Wei
    }
  }
}
/**************************************************************
Purpose:
  Switching state from primary to standby. //040420 Yu Wei

***************************************************************/
void GoState4_Switching_PtoS(void)
{

  //bool bSwitchCompletedFlag = true;
  //Flag to check if the switching completed.
  #if ((defined CFG_DEBUG_MSG) && (CFG_DEBUG_RMM || CFG_DEBUG_RMMLINKCHK))
  printf("[RMM] GoState4_Switching_PtoS, switching pri to standby 0x%04x\n",
         g_pCRTULink->m_nWriteCommandResult);
  #endif // ((defined CFG_DEBUG_MSG) && (CFG_DEBUG_RMM || CFG_DEBUG_RMMLINKCHK))
  switch(g_pCRTULink->m_nWriteCommandResult)
  {
  case SEND_COMMPLETE_NULL:
    CheckPrimarySwitchCompleted();
    break;

  case SEND_COMMPLETE_OK:
    //g_pCRTULink->m_bChangeToStandbyFlag = true;    //040325 Yu Wei
    switch(g_pRTUStatusTable->m_nSwitchFlag)  //040420 Yu Wei
    {
    case START_SWITCH:  //Standby reply switching command properly.
      g_pCRTULink->SetWriteCommand(CMD_COMFIRM_SWITCH, STATEFLAG_PRIMARY);
      g_pCRTULink->m_nWriteCommandResult = SEND_COMMPLETE_START;
      g_pRTUStatusTable->m_nSwitchFlag = COMFIRM_SWITCH;    //Set switching status.
      break;

    case COMFIRM_SWITCH:  //Standby reply confirm switching command properly.
      ChangeStateTo(STATEFLAG_STANDBY);  //Send command OK, change to standby state.
      g_pCRTULink->m_nWriteCommandResult = SEND_COMMPLETE_NULL;
      g_pRTUStatusTable->m_nSwitchFlag = NOT_IN_SWITCH;    //Set switching status.
      break;

    default:
      break;
    }      //040420 Yu Wei
    break;

  case SEND_COMMPLETE_ERROR:
    switch(g_pRTUStatusTable->m_nSwitchFlag)  //040420 Yu Wei
    {
    case START_SWITCH:  //Standby didn't reply switching command properly.
              //Standby will not receive confirm command and it will change to standby.
      ChangeStateTo(STATEFLAG_PRIMARY);  //Send command ERROR, return to primary state.
      g_pCRTULink->m_nWriteCommandResult = SEND_COMMPLETE_NULL;
      g_pRTUStatusTable->m_nSwitchFlag = NOT_IN_SWITCH;    //Set switching status.
      break;

    case COMFIRM_SWITCH://Standby didn't reply confirm switching command properly.
              //Maybe standby receive confirm command and it will change to primary.
      ChangeStateTo(STATEFLAG_STANDBY);
      g_pCRTULink->m_nWriteCommandResult = SEND_COMMPLETE_NULL;
      g_pRTUStatusTable->m_nSwitchFlag = NOT_IN_SWITCH;    //Set switching status.
      break;

    default:
      break;
    }      //040420 Yu Wei
    break;

  case SEND_COMMPLETE_START:
    break;

  default:
    g_pCRTULink->m_nWriteCommandResult = SEND_COMMPLETE_NULL;
    break;
  }
}
/*******************************************************************************
Purpose:
  This routine manage system initialization state by checking on the LAN link
  status between RTU and server; and LAN link between two RTUs

Input:
  None

Return:
  None

History
    Name           Date          Remark
    ----           ----          ------
  Yu, Wei        12-Aug-2004   Initial revision

*******************************************************************************/
void GoState3_Initialization(void)
{

  if(g_bRMMServerLinkCheck == true)  //Check server link.
  {
    clock_gettime(CLOCK_REALTIME, &g_pRTUStatusTable->m_tStartTime);
    if(g_tRTUStatus.unRTUServerLinkStatus == LINK_FAULTY)
    {
      #if ((defined CFG_PRN_WARN) && CFG_PRN_WARN_RMM_STATE)
      printf("WARN [RMM] GoState3_Initialization, server link faulty\n");
      #endif // ((defined CFG_PRN_WARN) && CFG_PRN_WARN_RMMLINK)

      if(CheckTimeOut(g_tRTUConfig.nInitLANCheckTimeout) == true)
      {
        //Timeout. Confirm the link down.
        g_bRMMServerLinkCheck = false;
        //Check link status between RTU.
        g_bRMMOtherRTULinkCheck = true;
        ActivateTimeOut();
      }
    }else{
      #if ((defined CFG_DEBUG_MSG) && CFG_DEBUG_RMM_STATE)
      printf("[RMM] GoState3_Initialization, server link healthy, change state "
             "to STATEFLAG_STANDBY\n");
      #endif // ((defined CFG_PRN_WARN) && (CFG_DEBUG_RMM))
      //Server link is OK, goto standby state.
      g_bRTUInitLinkCheck = false;
      ChangeStateTo(STATEFLAG_STANDBY);
    }
  }

  if(g_bRMMOtherRTULinkCheck == true)
  {
    if((CheckTimeOut(SOCKET_CONNECT_TIMEOUT *2 -
                     g_tRTUConfig.nInitLANCheckTimeout) == true) ||
       (g_tRTUConfig.nInitLANCheckTimeout >= SOCKET_CONNECT_TIMEOUT*2) ||
       (g_tRTUStatus.abOtherLinkStatus[0] == true) ||
       (g_tRTUStatus.abOtherLinkStatus[1] == true))
    {
      //Check LAN 2 link
      if(g_tRTUStatus.abOtherLinkStatus[0] == false)
      {
        //Check LAN 1 link
        if(g_tRTUStatus.abOtherLinkStatus[1] == false)
        {
          #if ((defined CFG_PRN_WARN) && CFG_PRN_WARN_RMM_STATE)
          printf("WARN [RMM] GoState3_Initialization, both RTU-RTU LAN links "
                 "down, change to STATEFLAG_STANDBY\n");
          #endif // ((defined CFG_PRN_WARN) && CFG_PRN_WARN_RMMLINK)
          //Two link are down. Set to standby state.
          g_bRTUInitLinkCheck = false;
          ChangeStateTo(STATEFLAG_STANDBY);
        }else{
          //Link2 between RTU is OK
          //Stop check RTU link.
          g_bRMMOtherRTULinkCheck = false;
        }
      }
      else
      {
        #if ((defined CFG_PRN_WARN) && CFG_PRN_WARN_RMM_STATE)
        printf("WARN [RMM] GoState3_Initialization, at least one RTU-RTU LAN "
               "link is healthy other is down\n");
        #endif // ((defined CFG_PRN_WARN) && (CFG_DEBUG_RMM))
        //Link1 between RTU is OK
        //Stop check RTU link.
        g_bRMMOtherRTULinkCheck = false;
      }
    }// //Stop check RTU link.

    if(g_bRMMOtherRTULinkCheck == false)
    {
      // check the role of other RTU. If other RTU is on standby, set RTU to
      // primary; otherwise, set RTU to standby
      if(g_pRTUStatusTable->m_nOtherRTUStateFlag == STATEFLAG_PRIMARY)
      {
        #if ((defined CFG_DEBUG_MSG) && CFG_DEBUG_RMM_STATE)
        printf("[RMM] GoState3_Initialization, other RTU is on Primary "
               "set local RTU to standby\n");
        #endif // ((defined CFG_DEBUG_MSG) && CFG_DEBUG_RMM_STATE)
        g_bRTUInitLinkCheck = false;
        ChangeStateTo(STATEFLAG_STANDBY);
      }else if(g_pRTUStatusTable->m_nOtherRTUStateFlag == STATEFLAG_STANDBY){
        #if ((defined CFG_DEBUG_MSG) && CFG_DEBUG_RMM_STATE)
        printf("[RMM] GoState3_Initialization, other RTU is on Standby "
               "set local RTU to Primary\n");
        #endif // ((defined CFG_DEBUG_MSG) && CFG_DEBUG_RMM_STATE)
        g_pRTUStatusTable->m_bSWCSwitchCompletedFlag = true ;//2008
        ChangeStateTo(STATEFLAG_PRIMARY);
      }else{
        #if ((defined CFG_PRN_WARN) && (CFG_PRN_WARN_RMM_STATE))
        printf("WARN [RMM] GoState3_Initialization, cannot determine other RTU "
               "role set local RTU to Standby\n");
        #endif // ((defined CFG_PRN_WARN) && (CFG_DEBUG_RMM))
        g_bRTUInitLinkCheck = false;
        ChangeStateTo(STATEFLAG_STANDBY);
      }
    }// if(g_bRMMOtherRTULinkCheck == false)
  }// if(g_bRMMOtherRTULinkCheck == true)
}// GoState3_Initialization
/*******************************************************************************
Purpose:
  Primary state.

History

    Name          Date          Remark
    ----          ----          ------
  Bryan Chong   28-Jun-2010   Update to include timeout for server
                              which is correspondent to LAN1_TIME_OUT

*******************************************************************************/
void GoState1_Primary(void)
{
  //If link between RTU is not down, auto switching will implement.
  if((g_tRTUStatus.abOtherLinkStatus[0] == true) ||
     (g_tRTUStatus.abOtherLinkStatus[1] == true))
  {
    //SWC link down processing completed or not in SWC link down status.
    //When primary RTU link down, m_bSWCLinkDownProcessFlag  will set to true,
    //When standby RTU completed link check, the flag will set to false.
    if(g_pRTUStatusTable->m_bSWCLinkDownProcessFlag == false)
    {

      if(g_tRTUStatus.unRTUServerLinkStatus !=
         g_pRTUStatusTable->m_unOtherRTUServerLinkStatus)
      {
        //RTU1 and RTU2 server link is same. (All are Link OK or Link down)
        if(g_tRTUStatus.unRTUServerLinkStatus == LINK_FAULTY)
        {
          #if ((defined CFG_DEBUG_MSG) && \
               (CFG_DEBUG_RMM || CFG_DEBUG_RMMLINKCHK))
          printf("[RMM] GoState1_Primary, PtoS, due to server link faulty\n");
          #endif // ((defined CFG_DEBUG_MSG) && (CFG_DEBUG_RMMLINK)
          ChangeStateTo(STATEFLAG_SWITCHING_PTOS);  //040322 Yu Wei
        }
      }
      else if(g_bRTUInitLinkCheck == false)
      {
        if(g_pRTUStatusTable->m_unSWCWeight <
           g_pRTUStatusTable->m_unOtherSWCWeight)
        {
          #if ((defined CFG_DEBUG_MSG) && \
               (CFG_DEBUG_RMM || CFG_DEBUG_RMMLINKCHK))
          printf("[RMM] GoState1_Primary, PtoS,\n"
                 "  local RTU notation, %d, > other RTU, %d\n",
                 g_pRTUStatusTable->m_unSWCWeight,
                 g_pRTUStatusTable->m_unOtherSWCWeight);
          #endif // ((defined CFG_DEBUG_MSG) && (CFG_DEBUG_RMMLINK)
          ChangeStateTo(STATEFLAG_SWITCHING_PTOS);  //040322 Yu Wei
          g_nWeightDoubleCheck = 0;
        }
        else
        {
          if (g_nWeightDoubleCheck != 0)
            g_nWeightDoubleCheck = 0;

          StandbyRTUImproveCheck();
        }
      }
    }
    else
    {
      //primary RTU link down , standby RTU has'n completed link check
      g_pRTUStatusTable->CheckSWCLinkStop();
    }

    g_pRTUStatusTable->m_unOtherRTUServerLinkStatusPrev =
      g_pRTUStatusTable->m_unOtherRTUServerLinkStatus;
    g_pRTUStatusTable->m_unOtherSWCWeightPrev =
      g_pRTUStatusTable->m_unOtherSWCWeight;

    ActivateTimeOut();
  }
  else if((g_tRTUStatus.unRTUServerLinkStatus == LINK_FAULTY) &&
          (CheckTimeOut(SOCKET_CONNECT_TIMEOUT*1.5) == true)) //kvmrt 20131028 Su
  {
    #if ((defined CFG_PRN_WARN) && CFG_PRN_WARN_RMMLINK)
    printf("[RMM] GoState1_Primary, PtoS, due to server link faulty and\n"
           "  SOCKET_CONNECT_TIMEOUT %d sec\n", SOCKET_CONNECT_TIMEOUT);
    #endif // ((defined CFG_PRN_WARN) && CFG_PRN_WARN_RMMLINK)
    ChangeStateTo(STATEFLAG_SWITCHING_PTOS);  //040322 Yu Wei
  }
  else if(g_pRTUStatusTable->m_bSWCLinkDownProcessFlag == true)
  {
    g_pRTUStatusTable->SetSWCLinkStart();
  }
}// GoState1_Primary
Example #8
0
bool PlayerASM::HandleEvent(DE::Handle hEvt)
{
	if (!m_bInTrasition)
	{
		DE::Event* pEvt = (DE::Event*) hEvt.Raw();
		float forwardDot, rightDot;
		DE::Vector3 vForward = DE::Vector3::UnitZ;
		DE::Vector3 vRight = DE::Vector3::UnitX;
		switch (pEvt->m_ID)
		{
		case GameEventID::Player_Walk_PLAYING_Event:
			forwardDot = vForward.Dot(((Player_Walk_PLAYING_Event*)pEvt)->m_vDir);
			rightDot = vRight.Dot(((Player_Walk_PLAYING_Event*)pEvt)->m_vDir);
			if (((Player_Walk_PLAYING_Event*)pEvt)->m_bRun)
			{
				ChangeStateTo("RUN");
			}
			else
			{
				ChangeStateTo("WALK");
			}
			if (forwardDot >= 0.0f)
			{
				if (rightDot >= 0.0f)
				{
					if (m_pCurrState->m_BlendTree->m_fBlendFactor < 0.0f)
					{
						m_pCurrState->m_BlendTree->m_fBlendFactor = 1.0f - forwardDot;
					}
					else
					{
						m_pCurrState->m_BlendTree->m_fBlendFactor = DE::MathHelper::Lerpf(m_pCurrState->m_BlendTree->m_fBlendFactor, 1.0f - forwardDot, m_fDeltaTime);
					}
				}
				else
				{
					if (m_pCurrState->m_BlendTree->m_fBlendFactor < 0.0f)
					{
						m_pCurrState->m_BlendTree->m_fBlendFactor = 3.0f + forwardDot;
					}
					else
					{
						m_pCurrState->m_BlendTree->m_fBlendFactor = DE::MathHelper::Lerpf(m_pCurrState->m_BlendTree->m_fBlendFactor, 3.0f + forwardDot, m_fDeltaTime);
					}
				}
			}
			else
			{
				if (rightDot >= 0.0f)
				{
					if (m_pCurrState->m_BlendTree->m_fBlendFactor < 0.0f)
					{
						m_pCurrState->m_BlendTree->m_fBlendFactor = 2.0f - rightDot;
					}
					else
					{
						m_pCurrState->m_BlendTree->m_fBlendFactor = DE::MathHelper::Lerpf(m_pCurrState->m_BlendTree->m_fBlendFactor, 2.0f - rightDot, m_fDeltaTime);
					}
				}
				else
				{
					if (m_pCurrState->m_BlendTree->m_fBlendFactor < 0.0f)
					{
						m_pCurrState->m_BlendTree->m_fBlendFactor = 2.0f + forwardDot;
					}
					else
					{
						m_pCurrState->m_BlendTree->m_fBlendFactor = DE::MathHelper::Lerpf(m_pCurrState->m_BlendTree->m_fBlendFactor, 2.0f + forwardDot, m_fDeltaTime);
					}
				}
			}
			return true;
		case GameEventID::Player_Walk_END_Event:
			ChangeStateTo("IDLE");
			return true;
		case GameEventID::Player_Attack_1_START_Event:
			ChangeStateTo("ATTACK");
			return true;
		case GameEventID::Player_Attack_2_START_Event:
			((Player*)m_pOwner)->m_bHitBoss = false;
			ChangeStateTo("ATTACK2");
			return true;
		case GameEventID::Player_Attack_3_START_Event:
			((Player*)m_pOwner)->m_bHitBoss = false;
			ChangeStateTo("ATTACK3");
			return true;
		case GameEventID::Player_Dodge_START_Event:
			ChangeStateTo("DODGE");
			if (((Player_Dodge_START_Event*)pEvt)->m_vDir.GetZ() == 1.0f)
			{
				m_pCurrState->m_BlendTree->m_fBlendFactor = 2.0f;
			}
			else if (((Player_Dodge_START_Event*)pEvt)->m_vDir.GetZ() == -1.0f)
			{
				m_pCurrState->m_BlendTree->m_fBlendFactor = 3.0f;
			}
			else if (((Player_Dodge_START_Event*)pEvt)->m_vDir.GetX() > 0)
			{
				m_pCurrState->m_BlendTree->m_fBlendFactor = 1.0f;
			}
			else
			{
				m_pCurrState->m_BlendTree->m_fBlendFactor = 0.0f;
			}
			return true;
		case GameEventID::Player_Impact_START_Event:
			((Player*)m_pOwner)->SetState(Player::IMPACTING);
			ChangeStateTo("IMPACT");
			return true;
		case DE::EngineEventID::Animation_END_Event:
			if (strcmp(m_pCurrState->m_sName, "ATTACK") == 0)
			{
				((Player*)m_pOwner)->SetState(Player::LOCOMOTION);
				m_pOwner->GetComponent<PlayerMC>()->m_ComboSequence[0] = false;
				m_pOwner->GetComponent<PlayerMC>()->m_fComboTime = 0.0f;
				ChangeStateTo(m_pPrevState->m_sName);
				return true;
			}
			else if (strcmp(m_pCurrState->m_sName, "ATTACK2") == 0)
			{
				((Player*)m_pOwner)->SetState(Player::LOCOMOTION);
				m_pOwner->GetComponent<PlayerMC>()->m_ComboSequence[1] = false;
				m_pOwner->GetComponent<PlayerMC>()->m_fComboTime = 0.0f;
				ChangeStateTo("IDLE");
				return true;
			}
			else if (strcmp(m_pCurrState->m_sName, "ATTACK3") == 0)
			{
				((Player*)m_pOwner)->SetState(Player::LOCOMOTION);
				m_pOwner->GetComponent<PlayerMC>()->m_ComboSequence[2] = false;
				m_pOwner->GetComponent<PlayerMC>()->m_fComboTime = 0.0f;
				ChangeStateTo("IDLE");
			}
			else if (strcmp(m_pCurrState->m_sName, "DODGE") == 0)
			{
				((Player*)m_pOwner)->SetState(Player::LOCOMOTION);
				ChangeStateTo(m_pPrevState->m_sName);
				return true;
			}
			else if (strcmp(m_pCurrState->m_sName, "IMPACT") == 0)
			{
				((Player*)m_pOwner)->SetState(Player::LOCOMOTION);
				ChangeStateTo("IDLE");
				return true;
			}
			return true;
		}
	}
	if (strcmp(m_pCurrState->m_sName, "IMPACT") == 0)
	{
		return true;
	}
	return false;
}
Example #9
0
void ChoosePowerState::Init()
{
	std::vector<FreePositions> dummyVar;
	List<EnemyWithStates> dummyList;

	Entity dummyEnt = _builder->EntityC().Create();
	_allPowers.push_back(new LockOnStrike(_builder, dummyEnt, &dummyList));
	_allPowers.push_back(new RandomBlink(_builder, dummyEnt, dummyVar));
	_allPowers.push_back(new CharmPower(_builder, dummyEnt, &dummyList));
	_allPowers.push_back(new TimeStopper(_builder, dummyEnt, &dummyList));
	_allPowers.push_back(new RegenPower(_builder, nullptr, dummyEnt));
	_allPowers.push_back(new LifeDrain(_builder, dummyEnt, &dummyList, nullptr));

	size_t firstPower = rand() % _allPowers.size();
	size_t secondPower = (firstPower + 1) % _allPowers.size();

	auto options = System::GetOptions();
	float pctX = options->GetScreenResolutionWidth() / 100.0f;
	float pctY = options->GetScreenResolutionHeight() / 100.0f;
	float midX = options->GetScreenResolutionWidth() / 2.0f;
	float midY = options->GetScreenResolutionHeight() / 2.0f;


	_choice2 = _builder->CreateOverlay(XMFLOAT3(midX - 30.0f * pctX, midY - 20.0f * pctY, 0.0f), 28.0f * pctX, 40.0f * pctY, "Assets/Textures/menuthing.png");
	_choice1 = _builder->CreateOverlay(XMFLOAT3(midX + 2.0f * pctX, midY - 20.0f * pctY, 0.0f), 28.0f * pctX, 40.0f * pctY, "Assets/Textures/menuthing.png");
	_choice2Text = _builder->CreateLabel(XMFLOAT3(midX + 4.0f * pctX, midY - 18.0f * pctY, 0.0f), _allPowers[firstPower]->GetDescription(40),20, XMFLOAT4(0.8f, 0.8f, 0.5f, 1.0f), 1.0f, 1.0f, "");
	_choice1Text = _builder->CreateLabel(XMFLOAT3(midX - 29.0f * pctX, midY - 18.0f * pctY, 0.0f), _allPowers[secondPower]->GetDescription(40), 20, XMFLOAT4(0.8f, 0.8f, 0.5f, 1.0f), 1.0f, 1.0f, "");



	_powerLabel = _builder->CreateLabel(XMFLOAT3(midX - 30.0f * pctX, midY - 10.0f * pctY - 20.0f * pctY, 0.0f), "Choose your powers", 35, XMFLOAT4(0.8f, 0.8f, 0.4f, 1.0f), 60.0f * pctX, 8.0f * pctY, "");

	GameState* gstate = (GameState*)this->_savedState;
	auto i = System::GetInput();
	i->HideCursor(false);
	i->LockMouseToCenter(false);
	_builder->Event()->BindEvent(_choice1, EventManager::EventType::LeftClick, [this, i, firstPower, gstate]() {
		_powerToGive = _allPowers[firstPower]->GetType();
		i->LockMouseToCenter(true);
		_controller->ReleaseEntity(_choice1);
		_controller->ReleaseEntity(_choice2);
		_controller->ReleaseEntity(_powerLabel);
		_controller->ReleaseEntity(_choice1Text);
		_controller->ReleaseEntity(_choice2Text);
		i->HideCursor(true);
		gstate->ProgressNoNextLevel(_powerToGive);
		System::GetAudio()->PlaySoundEffect(L"choosepower.wav", 1.0f);
		ChangeStateTo(StateChange(gstate, false, true, false));

	});
	_builder->Event()->BindEvent(_choice2, EventManager::EventType::LeftClick, [this, i, secondPower, gstate]() {
		_powerToGive = _allPowers[secondPower]->GetType();
		i->LockMouseToCenter(true);
		i->LockMouseToWindow(true);
		_controller->ReleaseEntity(_choice1);
		_controller->ReleaseEntity(_choice2);
		_controller->ReleaseEntity(_powerLabel);
		_controller->ReleaseEntity(_choice1Text);
		_controller->ReleaseEntity(_choice2Text);
		i->HideCursor(true);
		gstate->ProgressNoNextLevel(_powerToGive);
		System::GetAudio()->PlaySoundEffect(L"choosepower.wav", 1.0f);
		ChangeStateTo(StateChange(gstate, false, true, false));
	});


	_camera = _builder->CreateCamera(XMVectorSet(0.0f, 0.0f, 0.0f, 1.0f));
	_builder->Transform()->SetDirection(_camera, XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f));
	_backgroundObject = _builder->CreateObject(XMVectorSet(0.0f, 0.0f, 3.0f, 1.0f),
		XMVectorSet(0, 0, 0, 0),
		XMVectorSet(32.0f, 32.0f, 1.0f, 0.0f),
		"Assets/Models/cube.arf",
		"Assets/Textures/Dungeon/0/Wall_Dif.png",
		"Assets/Textures/Dungeon/0/Wall_NM.png",
		"Assets/Textures/Dungeon/0/Wall_Disp.png",
		"Assets/Textures/Dungeon/0/Wall_Roughness.png",
		"Assets/Textures/Dungeon/0/Wall_Glossiness.png");
	_builder->Material()->SetMaterialProperty(_backgroundObject, "ParallaxScaling", 0.04f, "Shaders/GBuffer.hlsl");
	_builder->Material()->SetMaterialProperty(_backgroundObject, "ParallaxBias", -0.03f, "Shaders/GBuffer.hlsl");
	_builder->Material()->SetMaterialProperty(_backgroundObject, "TexCoordScaleU", 32.0f, "Shaders/GBuffer.hlsl");
	_builder->Material()->SetMaterialProperty(_backgroundObject, "TexCoordScaleV", 32.0f, "Shaders/GBuffer.hlsl");
	_light = _builder->EntityC().Create();
	_builder->Light()->BindPointLight(_light, XMFLOAT3(3.0f, 3.0f, 1.0f), 10.0f, XMFLOAT3(1.0f, 1.0f, 1.0f), 4.0f);

}
Example #10
0
void PauseState::Init()
{
    auto i = System::GetInput();
    auto o = System::GetOptions();
    float width = (float)o->GetScreenResolutionWidth();
    float height = (float)o->GetScreenResolutionHeight();
    auto c = _controller;
    auto a = System::GetInstance()->GetAudio();
    float widthPercentOfDefault = (1.0f / 1920.0f) * width;
    float heightPercentOfDefault = (1.0f / 1080.0f) * height;
    float fontSize = 40 ;

    XMFLOAT4 TextColor = XMFLOAT4(41.0f / 255.0f, 127.0f / 255.0f, 185.0f / 255.0f, 1.0f);

    // Radiant text
    Entity text  = _builder->CreateLabel(
                       XMFLOAT3(width / 2.0f - 110.0f, 25.0f, 0.0f),
                       "Game Paused",
                       fontSize,
                       TextColor,
                       250.0f,
                       45.0f,
                       "");
    _builder->Transform()->SetPosition(text, XMFLOAT3(width / 2.0f - _builder->Text()->GetLength(text) / 2.0f, 25.0f, 0.0f));

    // Resume button
    Entity b1 = _builder->CreateButton(
                    XMFLOAT3(width / 2.0f - 110.0f, height/4.0f, 0.0f),
                    "Resume Game",
                    fontSize,
                    TextColor,
                    "",
                    []()
    {

    });

    _builder->Transform()->SetPosition(b1, XMFLOAT3(width / 2.0f - _builder->Text()->GetLength(b1) / 2.0f, height / 1.5f, 0.0f));

    //Main menu button
    Entity b5 = _builder->CreateButton(
                    XMFLOAT3(width / 2.0f - 110.0f, height / 4.0f, 0.0f),
                    "Main Menu",
                    fontSize,
                    TextColor,
                    "",
                    [i, a]()
    {
        a->PlaySoundEffect(L"menuclick.wav", 1);
        ChangeStateTo(StateChange(new MenuState()));
    });

    _builder->Transform()->SetPosition(b5, XMFLOAT3(width / 2.0f - _builder->Text()->GetLength(b5) / 2.0f, height / 1.5f + 55.0f, 0.0f));

    // Exit button
    Entity b2 = _builder->CreateButton(
                    XMFLOAT3(width / 2.0f - 110.0f, height / 4.0f + 55.0f, 0.0f),
                    "Exit to desktop",
                    fontSize,
                    TextColor,
                    "",
    [a]() {
        a->PlaySoundEffect(L"menuclick.wav", 1);
        ExitApplication;
    });
    _builder->Transform()->SetPosition(b2, XMFLOAT3(width / 2.0f - _builder->Text()->GetLength(b2)/2.0f, height / 1.5f + 110.0f, 0.0f));

    _controller->BindEvent(b1, EventManager::EventType::LeftClick,
                           [i, a, this, text, b1, b2, b5]()
    {
        _controller->ReleaseEntity(text);
        _controller->ReleaseEntity(b1);
        _controller->ReleaseEntity(b2);
        _controller->ReleaseEntity(b5);
        i->LockMouseToCenter(true);
        i->LockMouseToWindow(true);
        i->HideCursor(true);
        i->MouseUp(VK_LBUTTON);
        a->PlaySoundEffect(L"menuclick.wav", 1);
        ChangeStateTo(StateChange(_savedState,false,true,true));
        _savedState = nullptr;
    });
    _controller->BindEvent(b1, EventManager::EventType::Update, [i, a, this, text, b1, b2, b5]()
    {
        if (i->IsKeyPushed(VK_ESCAPE))
        {
            _controller->ReleaseEntity(text);
            _controller->ReleaseEntity(b1);
            _controller->ReleaseEntity(b2);
            _controller->ReleaseEntity(b5);
            i->LockMouseToCenter(true);
            i->LockMouseToWindow(true);
            i->HideCursor(true);
            i->MouseUp(VK_LBUTTON);
            a->PlaySoundEffect(L"menuclick.wav", 1);
            ChangeStateTo(StateChange(_savedState, false, true, true));
            _savedState = nullptr;
        }
    });

}
Example #11
0
void GameOverState::Init()
{
	auto o = System::GetOptions();
	float width = (float)o->GetScreenResolutionWidth();
	float height = (float)o->GetScreenResolutionHeight();
	auto i = System::GetInput();
	auto c = _controller;
	auto a = System::GetInstance()->GetAudio();
	a->PlayBGMusic(L"mamb.wav", 0.5f);
	XMFLOAT4 TextColor = XMFLOAT4(41.0f / 255.0f, 127.0f / 255.0f, 185.0f / 255.0f, 1.0f);
	XMFLOAT4 ScoreTextColor = XMFLOAT4(17.0f / 255.0f, 166.0f / 255.0f, 67.0f / 255.0f, 1.0f);

	//==========================
	//====	High Score Text	====
	//==========================

	float widthPercentOfDefault = (1.0f / 1920.0f) * width;
	float heightPercentOfDefault = (1.0f / 1080.0f) * height;

	Entity scoreOverlay = _builder->CreateOverlay(XMFLOAT3(0.0f, 0.0f, 0.0f), 550.0f*widthPercentOfDefault, 350.0f*heightPercentOfDefault, "Assets/Textures/GameOverOverlay.png");

	float fontSize = 40 * widthPercentOfDefault;

	//High Score
	Entity textHighScore = _builder->CreateLabel(XMFLOAT3(0.0f, 0.0f, 0.0f),
		"Statistics",
		fontSize,
		ScoreTextColor,
		125.0f,
		25.0f,
		"");
	_builder->Text()->ChangeFontSize(textHighScore, (uint)(fontSize*1.5f));
	_builder->Transform()->SetPosition(textHighScore, XMFLOAT3(550.0f*widthPercentOfDefault / 2 - _builder->Text()->GetLength(textHighScore) / 2, 0.0f, 0.0f));
	_builder->Transform()->BindChild(scoreOverlay, textHighScore);

	//Light High Score
	Entity totalLightHighScoreText = _builder->CreateLabel(XMFLOAT3(0.0f, 0.0f, 0.0f),
		"Light Collected:",
		fontSize,
		ScoreTextColor,
		125.0f,
		25.0f,
		"");
	_builder->Text()->ChangeFontSize(totalLightHighScoreText, (uint)(fontSize*0.55f));
	_builder->Transform()->SetPosition(totalLightHighScoreText, XMFLOAT3(0.0f, fontSize*1.5f + fontSize * 0 + 10.0f * 1 * heightPercentOfDefault, 0.0f));
	_builder->Transform()->BindChild(scoreOverlay, totalLightHighScoreText);

	Entity totalLightCollectedText = _builder->CreateLabel(XMFLOAT3(0.0f, 0.0f, 0.0f),
		std::to_string(_thePlayer->GetTotalLightCollected()),
		fontSize,
		ScoreTextColor,
		125.0f,
		25.0f,
		"");
	_builder->Text()->ChangeFontSize(totalLightCollectedText, (uint)(fontSize*0.55f));
	_builder->Transform()->SetPosition(totalLightCollectedText, XMFLOAT3(560.0f*widthPercentOfDefault / 2, fontSize*1.5f + fontSize * 0 + 10.0f * 1 * heightPercentOfDefault, 0.0f));
	_builder->Transform()->BindChild(scoreOverlay, totalLightCollectedText);


	//Shots Fired
	Entity totalShotsFiredHighScoreText = _builder->CreateLabel(XMFLOAT3(0.0f, 0.0f, 0.0f),
		"Shots Fired:",
		fontSize,
		ScoreTextColor,
		125.0f,
		25.0f,
		"");
	_builder->Text()->ChangeFontSize(totalShotsFiredHighScoreText, (uint)(fontSize*0.55f));
	_builder->Transform()->SetPosition(totalShotsFiredHighScoreText, XMFLOAT3(0.0f, fontSize*1.5f + fontSize * 1 + 10.0f * 2 * heightPercentOfDefault, 0.0f));
	_builder->Transform()->BindChild(scoreOverlay, totalShotsFiredHighScoreText);

	Entity totalShotsFiredText = _builder->CreateLabel(XMFLOAT3(0.0f, 0.0f, 0.0f),
		std::to_string(_thePlayer->GetShotsFired()),
		fontSize,
		ScoreTextColor,
		125.0f,
		25.0f,
		"");
	_builder->Text()->ChangeFontSize(totalShotsFiredText, (uint)(fontSize*0.55f));
	_builder->Transform()->SetPosition(totalShotsFiredText, XMFLOAT3(560.0f*widthPercentOfDefault / 2, fontSize*1.5f + fontSize * 1 + 10.0f * 2 * heightPercentOfDefault, 0.0f));
	_builder->Transform()->BindChild(scoreOverlay, totalShotsFiredText);


	//Shots Connected
	Entity totalShotsConnectedHighScoreText = _builder->CreateLabel(XMFLOAT3(0.0f, 0.0f, 0.0f),
		"Shots Hitting:",
		fontSize,
		ScoreTextColor,
		125.0f,
		25.0f,
		"");
	_builder->Text()->ChangeFontSize(totalShotsConnectedHighScoreText, (uint)(fontSize*0.55f));
	_builder->Transform()->SetPosition(totalShotsConnectedHighScoreText, XMFLOAT3(0.0f, fontSize*1.5f + fontSize * 2 + 10.0f * 3 * heightPercentOfDefault, 0.0f));
	_builder->Transform()->BindChild(scoreOverlay, totalShotsConnectedHighScoreText);

	Entity totalShotsConnectedText = _builder->CreateLabel(XMFLOAT3(0.0f, 0.0f, 0.0f),
		std::to_string(_thePlayer->GetShotsConnected()),
		fontSize,
		ScoreTextColor,
		125.0f,
		25.0f,
		"");
	_builder->Text()->ChangeFontSize(totalShotsConnectedText, (uint)(fontSize*0.55f));
	_builder->Transform()->SetPosition(totalShotsConnectedText, XMFLOAT3(560.0f*widthPercentOfDefault / 2, fontSize*1.5f + fontSize * 2 + 10.0f * 3 * heightPercentOfDefault, 0.0f));
	_builder->Transform()->BindChild(scoreOverlay, totalShotsConnectedText);


	//Hit Chance
	Entity totalHitChanceHighScoreText = _builder->CreateLabel(XMFLOAT3(0.0f, 0.0f, 0.0f),
		"Hit Percent:",
		fontSize,
		ScoreTextColor,
		125.0f,
		25.0f,
		"");
	_builder->Text()->ChangeFontSize(totalHitChanceHighScoreText, (uint)(fontSize*0.55f));
	_builder->Transform()->SetPosition(totalHitChanceHighScoreText, XMFLOAT3(0.0f, fontSize*1.5f + fontSize * 3 + 10.0f * 4 * heightPercentOfDefault, 0.0f));
	_builder->Transform()->BindChild(scoreOverlay, totalHitChanceHighScoreText);
	float value = _thePlayer->GetHitPercent();
	int intValue = static_cast<int>(value);
	Entity totalHitPercentText = _builder->CreateLabel(XMFLOAT3(0.0f, 0.0f, 0.0f),
		std::to_string(intValue) + "." + std::to_string(static_cast<int>((value-(float)intValue)*100))+ "%",
		fontSize,
		ScoreTextColor,
		125.0f,
		25.0f,
		"");
	_builder->Text()->ChangeFontSize(totalHitPercentText, (uint)(fontSize*0.55f));
	_builder->Transform()->SetPosition(totalHitPercentText, XMFLOAT3(560.0f*widthPercentOfDefault / 2, fontSize*1.5f + fontSize * 3 + 10.0f * 4 * heightPercentOfDefault, 0.0f));
	_builder->Transform()->BindChild(scoreOverlay, totalHitPercentText);


	//Enemies Defeated
	Entity totalEnemiesDefeatedScoreText = _builder->CreateLabel(XMFLOAT3(0.0f, 0.0f, 0.0f),
		"Enemies Defeated:",
		fontSize,
		ScoreTextColor,
		125.0f,
		25.0f,
		"");
	_builder->Text()->ChangeFontSize(totalEnemiesDefeatedScoreText, (uint)(fontSize*0.55f));
	_builder->Transform()->SetPosition(totalEnemiesDefeatedScoreText, XMFLOAT3(0.0f, fontSize*1.5f + fontSize * 4 + 10.0f * 5 * heightPercentOfDefault, 0.0f));
	_builder->Transform()->BindChild(scoreOverlay, totalEnemiesDefeatedScoreText);

	Entity totalEnemiesDefeatedText = _builder->CreateLabel(XMFLOAT3(0.0f, 0.0f, 0.0f),
		std::to_string(_thePlayer->GetEnemiesDefeated()),
		fontSize,
		ScoreTextColor,
		125.0f,
		25.0f,
		"");
	_builder->Text()->ChangeFontSize(totalEnemiesDefeatedText, (uint)(fontSize*0.75f));
	_builder->Transform()->SetPosition(totalEnemiesDefeatedText, XMFLOAT3(560.0f*widthPercentOfDefault / 2, fontSize*1.5f + fontSize * 4 + 10.0f * 5 * heightPercentOfDefault, 0.0f));
	_builder->Transform()->BindChild(scoreOverlay, totalEnemiesDefeatedText);



	//Set the overlay, and all it's childrens', positions.
	_builder->Transform()->SetPosition(scoreOverlay, XMFLOAT3(width - 550.0f*widthPercentOfDefault, height - 350.0f*heightPercentOfDefault, 0.0f));


	//==========================
	//====		Buttons		====
	//==========================


	// Start game button
	Entity b1 = _builder->CreateButton(
		XMFLOAT3(50.0f, height - 230.0f, 0.0f),
		"New Game",
		fontSize,
		TextColor,
		"",
		[i, a]()
	{
		a->PlaySoundEffect(L"menuclick.wav", 1);
		ChangeStateTo(StateChange(new GameState()));
	});

	//Options button
	Entity b5 = _builder->CreateButton(
		XMFLOAT3(50.0f, height - 180.0f, 0.0f),
		"Main Menu",
		fontSize,
		TextColor,
		"",
		[i, a]()
	{
		a->PlaySoundEffect(L"menuclick.wav", 1);
		ChangeStateTo(StateChange(new MenuState));
	});


	// Exit button
	Entity b2 = _builder->CreateButton(
		XMFLOAT3(50.0f, height - 130.0f, 0.0f),
		"Exit",
		fontSize,
		TextColor,
		"",
		[a]() {
		a->PlaySoundEffect(L"menuclick.wav", 1);
		ExitApplication;
	});

	//==========================
	//====	Background		====
	//==========================

	// Game Over text
	_builder->CreateLabel(
		XMFLOAT3(width / 2.0f - 100.0f, 25.0f, 0.0f),
		"Game Over",
		fontSize,
		TextColor,
		250.0f,
		45.0f,
		"");

	_altar = _builder->CreateObject(
		XMVectorSet(1.5f, 0.0f, 1.0f, 1.0f),
		XMVectorSet(0.0f, 0.0f, 0.0f, 0.0f),
		XMVectorSet(0.5f, 0.5f, 0.5f, 0.0f),
		"Assets/Models/Altar.arf",
		"Assets/Textures/Altar_Albedo.png",
		"Assets/Textures/Altar_NM.png",
		"Assets/Textures/default_displacement.png",
		"Assets/Textures/Altar_Roughness.png");
	_builder->Material()->SetMaterialProperty(_altar, "ParallaxBias", -0.05f, "Shaders/GBuffer.hlsl");
	_builder->Material()->SetMaterialProperty(_altar, "ParallaxScaling", 0.12f, "Shaders/GBuffer.hlsl");


	_builder->Bounding()->CreateBoundingSphere(_altar, 2.0f);

	_altarCenterLight = _builder->EntityC().Create();
	_builder->Light()->BindPointLight(_altarCenterLight, XMFLOAT3(0.0f, 0.0f, 0.0f), 3.0f, XMFLOAT3(0.0f, 0.25f, 0.35f), 10.0f);
	_builder->Light()->ChangeLightBlobRange(_altarCenterLight, 1.0f);
	_builder->Transform()->CreateTransform(_altarCenterLight);
	_builder->Transform()->SetPosition(_altarCenterLight, XMFLOAT3(0.0f, 1.4f, 0.0f));
	_builder->Transform()->BindChild(_altar, _altarCenterLight);

	for (int i = 0; i < _numAltarBolts; ++i)
	{
		_altarBolts[i] = _builder->EntityC().Create();
		_builder->Light()->BindPointLight(_altarBolts[i], XMFLOAT3(0.0f, 0.0f, 0.0f), 1.0f, XMFLOAT3(0.35f, 1.0f, 0.25f), 5.0f);
		_builder->Light()->ChangeLightBlobRange(_altarBolts[i], 0.3f);
		_builder->Lightning()->CreateLightningBolt(_altarBolts[i], _altarCenterLight);
		_builder->Lightning()->SetScale(_altarBolts[i], XMFLOAT2(0.4f, 0.4f));
		_builder->Transform()->CreateTransform(_altarBolts[i]);
		_builder->Transform()->BindChild(_altarCenterLight, _altarBolts[i]);

		float angle = XM_2PI / _numAltarBolts;
		_builder->Transform()->SetPosition(_altarBolts[i], XMFLOAT3(1.5f * sinf(i * angle), 0.0f, 1.5f * cosf(i * angle)));

		_altarBoltAngle[i] = i * angle;
	}

	_builder->Transform()->SetPosition(_altar, XMFLOAT3(0.0f, 0.0f, 0.0f));


	_controller->BindEventHandler(_altar, EventManager::Type::Object);
	_controller->BindEvent(_altar, EventManager::EventType::Update,
		[this]()
	{
		_builder->Transform()->RotateYaw(_altarCenterLight, _gameTimer.DeltaTime() * 25.0f);
		static float animDeltaTime = 0;
		animDeltaTime += _gameTimer.DeltaTime();
		bool resetAnimTime = false;
		for (int i = 0; i < _numAltarBolts; ++i)
		{
			_altarBoltAngle[i] += _gameTimer.DeltaTime() * XM_PIDIV2 + _gameTimer.DeltaTime()*XM_PI * (i / 6);
			if (_altarBoltAngle[i] >= XM_2PI)
				_altarBoltAngle[i] -= XM_2PI;

			XMVECTOR pos = _builder->Transform()->GetPosition(_altarBolts[i]);
			_builder->Transform()->SetPosition(_altarBolts[i], XMVectorSetY(pos, 0.8f * sinf(_altarBoltAngle[i])));

			if (animDeltaTime >= 0.02f)
			{
				resetAnimTime = true;
				_builder->Lightning()->Animate(_altarBolts[i]);
			}
		}

		if (resetAnimTime)
			animDeltaTime -= 0.02f;

	});

	Entity camera = _builder->CreateCamera(XMVectorSet(0.0f, 1.0f, -3.0f, 0.0f));
	_builder->Transform()->SetRotation(camera, XMFLOAT3(0.0f, 0.0f, 0.0f));



	//==========================
	//====		Update		====
	//==========================

	_controller->BindEvent(b2, EventManager::EventType::Update, [i, this]()
	{
		if (i->IsKeyPushed(VK_ESCAPE))
		{
			ExitApplication;
		}
		if (i->IsKeyPushed('1'))
		{
			ChangeStateTo(StateChange(new GameState()));
		}
		if (i->IsKeyPushed('2'))
		{
			ChangeStateTo(StateChange(new MenuState()));
		}
	}
	);

}