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; } }
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; } } }