CSkeleton::ESkeletonStates CSkeleton::Blocking() { XMFLOAT3 fVelocity3(0.0f, m_f3Velocity.y, 0.0f); float distToPlayer = DistanceToPlayer(); m_fExitTimer -= DELTA_TIME(); if (m_fExitTimer < 0.0f) { m_fExitTimer = 0.0f; if (distToPlayer < 125.0f) { int chance = rand() % 2; if (chance == 0) return SWINGING; else return BACKING_OUT; } return BACKING_OUT; } //XMFLOAT4X4 world = GetWorldMatrix(); //XMFLOAT4X4 local = GetShieldMatrix(m_nShieldIndex); //XMMATRIX shieldWorld = XMLoadFloat4x4(&world); //XMMATRIX shieldLocal = XMLoadFloat4x4(&local); //shieldWorld = shieldLocal * shieldWorld; //shieldWorld *= XMMatrixTranslation(0.0f, 90.0f, 0.0f); //XMStoreFloat4x4(&GetShieldRenderMesh(m_nShieldIndex)->GetPositionMatrix(), shieldWorld); return BACKING_OUT; }
void EnemyIceBear::Update(const GameContext& gameContext) { if (!m_GameOver) { m_pAnimator = m_pIceBearModel->GetComponent<ModelComponent>()->GetAnimator(); SpawnSicknessCounter -= gameContext.pGameTime->GetElapsed(); float toPlayer = DistanceToPlayer(); float toIglo = DistanceToIglo(); if (toPlayer < m_PlayerCatchRadius && SpawnSicknessCounter < 0.0f) CatchPlayer(gameContext); else if ((toIglo < m_IgloDamagingRadius) && (toPlayer > m_PlayerDetectionRadius) && SpawnSicknessCounter < 0.0f) { DecideDirection(toPlayer, false); Rotate(); DamageIglo(gameContext); } else { DecideDirection(toPlayer, (SpawnSicknessCounter > 0.0f)); Rotate(); Move(gameContext); } } DrawLifeBar(gameContext); }
void CPlayerAI::GetNearestObjects() { nearestObjects.Reset(); MO_CarriedObject * carriedItem = pPlayer->carriedItem; bool fInvincible = pPlayer->invincible || pPlayer->shield || pPlayer->shyguy; short iTeamID = pPlayer->teamID; std::map<int, AttentionObject*>::iterator lim = attentionObjects.end(); for (short i = 0; i < objectcontainer[1].list_end; i++) { CObject * object = objectcontainer[1].list[i]; if (attentionObjects.find(object->iNetworkID) != lim) { //DistanceToObject(object, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); continue; } ObjectType type = object->getObjectType(); switch (type) { case object_moving: { IO_MovingObject * movingobject = (IO_MovingObject*)object; MovingObjectType movingtype = movingobject->getMovingObjectType(); if (carriedItem == movingobject) continue; if (movingobject_shell == movingtype) { CO_Shell * shell = (CO_Shell*)movingobject; if (shell->IsThreat()) { if (fInvincible) continue; DistanceToObject(movingobject, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); } else if (carriedItem) { continue; } else { DistanceToObject(movingobject, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); } } else if (movingobject_throwblock == movingtype || (movingobject_throwbox == movingtype && ((CO_ThrowBox*)movingobject)->HasKillVelocity())) { if (fInvincible) continue; DistanceToObject(movingobject, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); } else if (movingobject_pirhanaplant == movingtype) { MO_PirhanaPlant * plant = (MO_PirhanaPlant*)movingobject; if (plant->state > 0) DistanceToObjectCenter(plant, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); } else if (movingobject_flag == movingtype) { CO_Flag * flag = (CO_Flag*)movingobject; if (flag->GetInBase() && flag->GetTeamID() == iTeamID) continue; if (carriedItem && carriedItem->getMovingObjectType() == movingobject_flag) continue; DistanceToObject(movingobject, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); } else if (movingobject_yoshi == movingtype) { MO_Yoshi * yoshi = (MO_Yoshi*)movingobject; if (!carriedItem || carriedItem->getMovingObjectType() != movingobject_egg) continue; CO_Egg * egg = (CO_Egg*)carriedItem; if (yoshi->getColor() != egg->getColor()) continue; DistanceToObject(movingobject, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); } else if (movingobject_egg == movingtype) { if (carriedItem && carriedItem->getMovingObjectType() == movingobject_egg) continue; DistanceToObject(movingobject, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); } else if (movingobject_throwbox == movingtype) { if (carriedItem) continue; DistanceToObject(movingobject, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); } else if (movingobject_star == movingtype) { if (carriedItem && carriedItem->getMovingObjectType() == movingobject_star) continue; CGM_Star * starmode = (CGM_Star*)game_values.gamemode; CO_Star * star = (CO_Star*)movingobject; if (star->getType() == 1 || starmode->isplayerstar(pPlayer)) { DistanceToObject(star, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); } else { DistanceToObject(star, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); } } else if (movingobject_coin == movingtype || movingobject_phantokey == movingtype) { DistanceToObject(movingobject, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); } else if (movingobject_collectioncard == movingtype) { int iNumHeldCards = pPlayer->score->subscore[0]; int iHeldCards = pPlayer->score->subscore[1]; if (iNumHeldCards == 3) { int iThreeHeldCards = iHeldCards & 63; //If bot is holding all of the same type of card, then ignore all other cards if (iThreeHeldCards == 42 || iThreeHeldCards == 21 || iThreeHeldCards == 0) { DistanceToObject(movingobject, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); break; } int iTwoHeldCards = iHeldCards & 15; if (iTwoHeldCards == 10 || iTwoHeldCards == 5 || iTwoHeldCards == 0) { DistanceToObject(movingobject, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); break; } } else { MO_CollectionCard * card = (MO_CollectionCard*)movingobject; if (iNumHeldCards == 2) { int iTwoHeldCards = iHeldCards & 15; if (iTwoHeldCards == 10 || iTwoHeldCards == 5 || iTwoHeldCards == 0) { int iCardValue = card->getValue(); if (card->getType() == 1 && ((iTwoHeldCards == 10 && iCardValue != 2) || (iTwoHeldCards == 5 && iCardValue != 1) || (iTwoHeldCards == 0 && iCardValue != 0))) { DistanceToObject(movingobject, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); break; } } } else if (iNumHeldCards == 1) { int iHeldCard = iHeldCards & 3; int iCardValue = card->getValue(); if (card->getType() == 1 || iHeldCard != iCardValue) { DistanceToObject(movingobject, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); break; } } } if (iNumHeldCards == 3) DistanceToObject(movingobject, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); else DistanceToObject(movingobject, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); } break; } case object_frenzycard: { DistanceToObject(object, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); break; } case object_pipe_coin: { OMO_PipeCoin * coin = (OMO_PipeCoin*)object; if (coin->GetColor() != 0) { if (coin->GetTeam() == -1 || coin->GetTeam() == pPlayer->teamID) DistanceToObject(coin, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); } else { DistanceToObject(coin, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); } break; } case object_pipe_bonus: { OMO_PipeBonus * bonus = (OMO_PipeBonus*)object; if (bonus->GetType() != 5) { DistanceToObject(bonus, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); } else { DistanceToObject(bonus, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); } break; } case object_pathhazard: case object_orbithazard: { DistanceToObject(object, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); break; } case object_phanto: { OMO_Phanto * phanto = (OMO_Phanto*)object; if (phanto->GetType() == 2 || (carriedItem && carriedItem->getMovingObjectType() == movingobject_phantokey)) { DistanceToObjectCenter(object, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); } break; } case object_flamecannon: { IO_FlameCannon * cannon = (IO_FlameCannon *)object; if (cannon->state > 0) DistanceToObject(cannon, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); break; } default: { DistanceToObject(object, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); break; } } } for (short i = 0; i < objectcontainer[0].list_end; i++) { CObject * object = objectcontainer[0].list[i]; if (attentionObjects.find(object->iNetworkID) != lim) { //DistanceToObject(object, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); continue; } ObjectType type = object->getObjectType(); switch (type) { case object_moving: { IO_MovingObject * movingobject = (IO_MovingObject*)object; MovingObjectType movingtype = movingobject->getMovingObjectType(); if (carriedItem == movingobject) continue; if (movingobject_powerup == movingtype) { DistanceToObject(movingobject, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); } else if ((movingobject_fireball == movingtype && ((MO_Fireball*)movingobject)->iTeamID != iTeamID) || movingobject_poisonpowerup == movingtype) { if (fInvincible) continue; DistanceToObject(movingobject, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); } else if ((movingobject_goomba == movingtype || movingobject_koopa == movingtype) && movingobject->GetState() == 1) { DistanceToObject(movingobject, &nearestObjects.stomp, &nearestObjects.stompdistance, &nearestObjects.stompwrap); } else if (movingobject_sledgebrother == movingtype) { DistanceToObject(movingobject, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); } else if (movingobject_treasurechest == movingtype) { DistanceToObject(movingobject, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); } else if (movingobject_flagbase == movingtype) { MO_FlagBase * flagbase = (MO_FlagBase*)movingobject; if (!carriedItem || carriedItem->getMovingObjectType() != movingobject_flag || flagbase->GetTeamID() != iTeamID) continue; DistanceToObject(movingobject, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); } else { continue; } break; } case object_area: { if (((OMO_Area*)object)->getColorID() == pPlayer->colorID) continue; DistanceToObject(object, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); break; } case object_kingofthehill_area: { DistanceToObjectCenter(object, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); break; } default: { DistanceToObject(object, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); break; } } } for (short i = 0; i < objectcontainer[2].list_end; i++) { CObject * object = objectcontainer[2].list[i]; if (attentionObjects.find(object->iNetworkID) != lim) { //DistanceToObject(object, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); continue; } ObjectType type = object->getObjectType(); switch (type) { case object_moving: { IO_MovingObject * movingobject = (IO_MovingObject*)object; MovingObjectType movingtype = movingobject->getMovingObjectType(); if (carriedItem == movingobject) continue; if (movingobject_cheepcheep == movingtype) { DistanceToObject(movingobject, &nearestObjects.stomp, &nearestObjects.stompdistance, &nearestObjects.stompwrap); } else if (movingobject_bulletbill == movingtype) { if (fInvincible) continue; DistanceToObject(movingobject, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); } else if (movingobject_hammer == movingtype && ((MO_Hammer*)movingobject)->iTeamID != iTeamID) { if (fInvincible) continue; DistanceToObject(movingobject, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); } else if (movingobject_iceblast == movingtype && ((MO_IceBlast*)movingobject)->iTeamID != iTeamID) { if (fInvincible) continue; DistanceToObject(movingobject, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); } else if (movingobject_boomerang == movingtype && ((MO_Boomerang*)movingobject)->iTeamID != iTeamID) { if (fInvincible) continue; DistanceToObject(movingobject, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); } else if (movingobject_bomb == movingtype && ((CO_Bomb*)movingobject)->iTeamID != iTeamID) { if (fInvincible) continue; DistanceToObject(movingobject, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); } else if (movingobject_podobo == movingtype && ((MO_Podobo*)movingobject)->iTeamID != iTeamID) { if (fInvincible) continue; DistanceToObject(movingobject, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); } else if (movingobject_explosion == movingtype && ((MO_Explosion*)movingobject)->iTeamID != iTeamID) { if (fInvincible) continue; DistanceToObjectCenter(movingobject, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); break; } break; } case object_thwomp: case object_bowserfire: { if (fInvincible) continue; DistanceToObjectCenter(object, &nearestObjects.threat, &nearestObjects.threatdistance, &nearestObjects.threatwrap); break; } case object_race_goal: { if (game_values.gamemode->gamemode != game_mode_race) continue; OMO_RaceGoal * racegoal = (OMO_RaceGoal*)object; if (racegoal->getGoalID() != ((CGM_Race*)game_values.gamemode)->getNextGoal(iTeamID)) continue; DistanceToObject(racegoal, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); break; } default: { DistanceToObject(object, &nearestObjects.goal, &nearestObjects.goaldistance, &nearestObjects.goalwrap); break; } } } //Figure out where the other players are for (short iPlayer = 0; iPlayer < list_players_cnt; iPlayer++) { if (iPlayer == pPlayer->localID || list_players[iPlayer]->state != player_ready) continue; //Find players in jail on own team to tag if (game_values.gamemode->gamemode == game_mode_jail) { if (list_players[iPlayer]->jailtimer > 0 && list_players[iPlayer]->teamID == iTeamID) { DistanceToPlayer(list_players[iPlayer], &nearestObjects.teammate, &nearestObjects.teammatedistance, &nearestObjects.teammatewrap); } } if (list_players[iPlayer]->teamID == iTeamID || list_players[iPlayer]->state != player_ready) continue; //If there is a chicken, only focus on stomping him if (game_values.gamemode->chicken) { if (game_values.gamemode->chicken->teamID != iTeamID && game_values.gamemode->chicken != list_players[iPlayer]) continue; } DistanceToPlayer(list_players[iPlayer], &nearestObjects.player, &nearestObjects.playerdistance, &nearestObjects.playerwrap); } }
CSkeleton::ESkeletonStates CSkeleton::Follow() { if (NearlyEqual(GetCurrAnimation()->GetCurrTime(), 0.05f)) { AudioSystemWwise::Get()->PostEvent(AK::EVENTS::PLAYERFOOTSTEP, *GetPosition()); } if (NearlyEqual(GetCurrAnimation()->GetCurrTime(), 0.5f)) { AudioSystemWwise::Get()->PostEvent(AK::EVENTS::PLAYERFOOTSTEP, *GetPosition()); } if (m_bIsGrounded) SetWorldVelocity({ 0, m_f3Velocity.y, 0 }); else SetWorldVelocity({ knockBackVelocity.x, m_f3Velocity.y, knockBackVelocity.z }); // Get the current path vector<XMFLOAT3>& vPath = GetPath(); // path here from group // Get the current velocity //XMVECTOR currentVelocity; XMLoadFloat3(&m_f3vel); if (DistanceToPlayer() < 500.0f) { return MOVING_IN; } // Node that I'm on along the path int nCurrentNode = GetCurNodeOnPath(); if (nCurrentNode < 0 || vPath.empty()) { BuildPathToPlayer(); vPath = GetPath(); if (vPath.size() < 2) { return FOLLOW; } } nCurrentNode = GetCurNodeOnPath(); // Get the current positions XMFLOAT3 curPos = *GetPosition(); XMFLOAT3 targetPos = vPath[nCurrentNode]; // Convert them for math XMVECTOR mathPos = XMLoadFloat3(&curPos); XMVECTOR mathTarget = XMLoadFloat3(&targetPos); // Find the vector between the two points XMVECTOR mathToVec = XMVectorSubtract(mathTarget, mathPos); //XMFLOAT3 toVec; XMStoreFloat3(&toVec, mathToVec); // Normalize the toVector to get the direction XMVECTOR mathVelocity = XMVector3Normalize(mathToVec); // Add the separation factor // mathVelocity += GetParentGroup()->CalculateSeparation(this); mathVelocity *= MOVE_SPEED; XMFLOAT3 realVelocity; XMStoreFloat3(&realVelocity, mathVelocity); realVelocity.y = m_f3Velocity.y; // Get the distance to target - ANY XYZ HOLDS THE LENGTH XMVECTOR mathDistToTarget = XMVector3Length(mathToVec); XMFLOAT3 distToTarget; XMStoreFloat3(&distToTarget, mathDistToTarget); // Offset the current node float nNextNodeDistance = 300.0f; // If i reached the node, move on the next one if (distToTarget.x < nNextNodeDistance && nCurrentNode >= 0) { nCurrentNode--; } Steering().Seek(targetPos); if (m_bIsGrounded) { Steering().Update(false, m_fScale); SetWorldVelocity(realVelocity); } SetNodeOnPath(nCurrentNode); return FOLLOW; }