Esempio n. 1
0
void CZombie::GoMuriendo()
{
/*REMURIENDO:
update: animacion de morir
Done : borrar del vector
*/
  switch(m_faseEstado)
  {
    case INIT:
      EscondePunyos();
      CORE->GetSoundManager()->PlaySound("zombieDeath");
      m_faseEstado = UPDATE;
      GetInstance()->GetAnimatedInstanceModel()->ExecuteActionBlocked(MURIENDO, 0.3f);
      GetUserData()->SetCurrentAction( MURIENDO );
    break;
    case UPDATE:
      //fin animacion de morir
      if((GetUserData()->GetIsActionFinalized() == MURIENDO)&&(m_iStepMuerto == 0))
      {
        m_iStepMuerto = 1;
        GetUserData()->SetIsActionFinalized(INACTIVO);
        /*SetState( MUERTO );*/
      } 
      if(m_iStepMuerto == 1)
      {
        //quita el controller
        DestruyeZombie(2);
				//render humo
				PosicionaPieDerecho();
				Vect3f l_v3Pos = GetPosicionPieDerecho();
				HumoMuerte(l_v3Pos);
				//lanzar item
				RandomItem(l_v3Pos);
        m_iStepMuerto = 2;
        LOGGER->AddNewLog(ELL_INFORMATION, "test - Debe soltar 1 cerebro");
      }
      if((m_iStepMuerto == 2)&&(GoMuerto(CORE->GetTimer()->GetElapsedTime())))
      {
        //borrar del mapa mundial, borra todoz
        DestruyeZombie(0);
      }
    break;
    case DONE:
    break;
  }
}
Esempio n. 2
0
void CTollgateDrop::CalculateDropItem(BossItemMissedCounter* countData, bool singleDrop /* = false */, bool bMopUpOperation /* = false */)
{
	///下面开始加上扫荡会固定掉落的物品
	if (bMopUpOperation)
	{
		try
		{
			for (int i = 0; i < m_propItem->size(); ++i)
			{
				auto findResult = m_commonDropItemIdList.find((*m_propItem)[i]);
				if (findResult == m_commonDropItemIdList.end())
					m_commonDropItemIdList.insert(make_pair((*m_propItem)[i], (*m_propItemNum)[i]));
				else
					findResult->second += (*m_propItemNum)[i];
			}
		}
		catch (const std::exception& oor)
		{
			rfalse("扫荡固定掉落物品计算发生错误");
		}
	}

	///下面开始计算BOSS会掉落的物品
	int bossItemDropRandom = CRandom::RandRange(1, 100);
	if (m_iBossItem1 != 0)
	{
		///判断是否掉落BOSS物品1
		if (bossItemDropRandom <= m_iBossItemDropPercent1 || (countData != nullptr && countData->AddItem1RefenceCount()))
		{
			if (countData != nullptr)
				countData->ResetItem1Counter();
			auto findResult = m_bossDropItemIdList.find(m_iBossItem1);
			if (findResult == m_bossDropItemIdList.end())
				m_bossDropItemIdList.insert(make_pair(m_iBossItem1, m_iBossItemNumber1));
			else
				++findResult->second;
		}
	}
	bossItemDropRandom = CRandom::RandRange(1, 100);
	if (m_iBossItem2 != 0)
	{
		if (bossItemDropRandom <= m_iBossItemDropPercent2 || (countData != nullptr && countData->AddItem2RefenceCount()))
		{
			///判断是否掉落BOSS物品2
			if (countData != nullptr)
				countData->ResetItem2Counter();
			auto findResult = m_bossDropItemIdList.find(m_iBossItem2);
			if (findResult == m_bossDropItemIdList.end())
				m_bossDropItemIdList.insert(make_pair(m_iBossItem2, m_iBossItemNumber2));
			else
				++findResult->second;
		}
	}
	bossItemDropRandom = CRandom::RandRange(1, 100);
	if (m_iBossItem3 != 0)
	{
		if (bossItemDropRandom <= m_iBossItemDropPercent3 || (countData != nullptr && countData->AddItem3RefenceCount()))
		{
			///判断是否掉落BOSS物品3
			if (countData != nullptr)
				countData->ResetItem3Counter();
			auto findResult = m_bossDropItemIdList.find(m_iBossItem3);
			if (findResult == m_bossDropItemIdList.end())
				m_bossDropItemIdList.insert(make_pair(m_iBossItem3, m_iBossItemNumber3));
			else
				++findResult->second;
		}
	}

	if (m_whiteItemList == nullptr && m_greenItemList == nullptr && m_blueItemList == nullptr && m_purpleItemList == nullptr)
	{
		return;
	}

	///随机普通物品掉落的个数,范围为[m_iMinNumber, m_iMaxNumber]
	int dropNum = CRandom::RandRange(m_iMinNumber, m_iMaxNumber);
	///如果普通物品的掉落数为0,则不计算普通物品的掉了 直接返回
	if (dropNum <= 0)
		return;

	int whiteItemNum = 0;
	int greenItemNum = 0;
	int blueItemNum = 0;
	int purpleItemNum = 0;
	int randomWhiteIndex = -1;
	int randomGreenIndex = -1;
	int randomBlueIndex = -1;
	int randomPurpleIndex = -1;
	int dropedItemNum = 0;
	while (true)
	{
		if (dropedItemNum >= dropNum)
			break;

		int commonItemRandom = 0;
		int baseWeight = m_iWhiteItemWeight + m_iGreenItemWeight + m_iBlueItemWeight + m_iPurpleItemWeight;
		commonItemRandom = CRandom::RandRange(1, baseWeight);
		///白色物品的掉落随机
		if (m_whiteItemList != nullptr && commonItemRandom <= m_iWhiteItemWeight)
		{
			whiteItemNum = m_whiteItemList->size();
			if (whiteItemNum > 0)
			{
				RandomItem(dropNum, whiteItemNum, m_whiteItemList, randomWhiteIndex, dropedItemNum, singleDrop);
				continue;
			}
		}
		else if (m_greenItemList != nullptr && commonItemRandom <= m_iWhiteItemWeight + m_iGreenItemWeight)///绿色物品的掉落随机
		{
			greenItemNum = m_greenItemList->size();
			if (greenItemNum > 0)
			{
				RandomItem(dropNum, greenItemNum, m_greenItemList, randomGreenIndex, dropedItemNum, singleDrop);
				continue;
			}
		}
		else if (m_blueItemList != nullptr && commonItemRandom <= m_iWhiteItemWeight + m_iGreenItemWeight + m_iBlueItemWeight)///蓝色物品的掉落随机
		{
			blueItemNum = m_blueItemList->size();
			if (blueItemNum > 0)
			{
				RandomItem(dropNum, blueItemNum, m_blueItemList, randomBlueIndex, dropedItemNum, singleDrop);
				continue;
			}
		}
		else if (m_purpleItemList != nullptr && commonItemRandom <= baseWeight)///紫色物品的掉落随机
		{
			purpleItemNum = m_purpleItemList->size();
			if (purpleItemNum > 0)
			{
				RandomItem(dropNum, purpleItemNum, m_purpleItemList, randomPurpleIndex, dropedItemNum, singleDrop);
				continue;
			}
		}

		if (m_iPurpleItemWeight == 0 && m_iBlueItemWeight == 0 && m_iGreenItemWeight == 0 && m_iWhiteItemWeight == 0)
		{
			rfalse("关卡掉落计算失败");
			return;
		}
	}
}