stateResult_t rvMonsterStroggHover::State_Torso_Strafe ( const stateParms_t& parms ) { //fixme: trace first for visibility & obstruction? if ( gameLocal.random.RandomFloat() > 0.5f ) { Evade( false ); } else { Evade( true ); } return SRESULT_DONE; }
Vec2 SteeringForce::Hide(const Vehicle *target, std::vector<Vehicle *> &obstacles) { double DistToClosest = MAXFLOAT; Vec2 BestHidingSpot; std::vector<Vehicle*>::iterator curOb = obstacles.begin(); while (curOb!=obstacles.end()) { if (*curOb!=target && *curOb != m_pVehicle) { //计算这个障碍物的hide地点 Vec2 HidingSpot = GetHidingPosition((*curOb)->getPosition(), (*curOb)->getContentSize().width/2, target->getPosition()); double dist = HidingSpot.distance(m_pVehicle->getPosition()); if (dist <DistToClosest) { DistToClosest = dist; BestHidingSpot = HidingSpot; } } ++curOb; } if (DistToClosest == MAXFLOAT) { return Evade(target); } return Arrive(BestHidingSpot, fast); }
void UpdateAI(uint32 diff) { ReduceCD(diff); if (IAmDead()) return; if (!me->GetVictim()) Evade(); if (clearcast && !me->IsNonMeleeSpellCast(false)) { if (Aura* potency = me->GetAura(ARCANE_POTENCY_BUFF)) { if (potency->GetCharges() == 1) clearcast = false; potency->DropCharge(AURA_REMOVE_BY_EXPIRE); if (me->HasAura(CLEARCASTBUFF)) { me->ModifyPower(POWER_MANA, cost); me->RemoveAurasDueToSpell(CLEARCASTBUFF, me->GetGUID(), 0, AURA_REMOVE_BY_EXPIRE); } } } CheckAuras(); if (wait == 0) wait = GetWait(); else return; BreakCC(diff); if (CCed(me) && (!ICEBLOCK || !me->HasAura(ICEBLOCK))) return;//TODO CheckBlink(diff); CheckPoly(diff); CheckPots(diff); //CureTarget(master, REMOVE_CURSE, diff); //CureTarget(me, REMOVE_CURSE, diff); CureGroup(master, REMOVE_CURSE, diff); FocusMagic(diff); BuffAndHealGroup(master, diff); if (!me->IsInCombat()) DoNonCombatActions(diff); if (!CheckAttackTarget(CLASS_MAGE)) return; CheckPoly2();//this should go AFTER getting opponent Counter(); CheckSpellSteal(diff); DoNormalAttack(diff); }
Vector3 SteeringBehaviors::Calculate() { this->_steeringForce.zero(); Vector3 force; if(On(obstacle_avoidance)) { double weightObstacleAvoidance = 10; force = ObstacleAvoidance(((Agent*)this->_vehicle)->world->obstacles) * weightObstacleAvoidance; if (!AccumulateForce(_steeringForce, force)) return _steeringForce; } if(On(flee)) { force = Flee(_vehicle->target); if (!AccumulateForce(_steeringForce, force)) return _steeringForce; } if(On(seek)) { force = Seek(_vehicle->target); if (!AccumulateForce(_steeringForce, force)) return _steeringForce; } if(On(arrive)) { force = Arrive(_vehicle->target, _deceleration); if (!AccumulateForce(_steeringForce, force)) return _steeringForce; } if(On(pursue)) { force = Pursue(this->evador1); if (!AccumulateForce(_steeringForce, force)) return _steeringForce; } if(On(evade)) { force = Evade(this->pursuer1); if (!AccumulateForce(_steeringForce, force)) return _steeringForce; } if(On(wander)) { force = Wander(); if(!AccumulateForce(_steeringForce, force)) return _steeringForce; } return _steeringForce; };
void UpdateAI(uint32 diff) { ReduceCD(diff); if (IAmDead()) return; if (!me->GetVictim()) Evade(); CheckAuras(); if (wait == 0) wait = GetWait(); else return; if (CCed(me)) return; ////if pet is dead or unreachable //Creature* m_botsPet = me->GetBotsPet(); //if (!m_botsPet || m_botsPet->FindMap() != master->GetMap() || (me->GetDistance2d(m_botsPet) > sWorld->GetMaxVisibleDistanceOnContinents() - 20.f)) // if (master->getLevel() >= 10 && !me->IsInCombat() && !IsCasting() && !me->IsMounted()) // SummonBotsPet(PET_VOIDWALKER); //TODO: implement healthstone if (GetHealthPCT(me) < 50 && Potion_cd <= diff) { temptimer = GC_Timer; if (doCast(me, HEALINGPOTION)) { Potion_cd = POTION_CD; GC_Timer = temptimer; } } if (GetManaPCT(me) < 50 && Potion_cd <= diff) { temptimer = GC_Timer; if (doCast(me, MANAPOTION)) { Potion_cd = POTION_CD; GC_Timer = temptimer; } } if (!me->IsInCombat()) DoNonCombatActions(); if (!CheckAttackTarget(CLASS_WARLOCK)) return; DoNormalAttack(diff); }
void DoAction(const int32 param) { ++uiAddsDeadCounter; if (uiAddsDeadCounter == 7) DoCast(SPELL_FRENZY); if (uiAddsDeadCounter == 8) { if (pInstance) pInstance->SetData(DATA_MAJORDOMO_EVENT, DONE); bDefeat = true; me->setFaction(35); DoScriptText(SAY_DEFEAT, me); me->SetReactState(REACT_DEFENSIVE); Evade(); } }
void Rabbit::Routine(int generation) { if (lastGenActivity != -1 && lastGenActivity == generation) return; lastGenActivity = generation; prevLoc = GetLocation(); Move(); if (!Evade()) // eat and reproduce if it didn't have to evade { Eat(); Reproduce<Rabbit>(); } Grow(); Die(); if (age >= ageToDie || metabolism.HasStarved()) throw std::runtime_error("zombie animal"); }
void AI_Control( WorldStuff *world_stuff, int vehicle_number ) { Player *player; team_type team, enemy_team; short frames_till_traitor_deactivate; short frames_till_unscramble; short scramble_life; short traitor_life; /* Alias pointer to this player */ player = world_stuff->player_array; frames_till_traitor_deactivate = player[vehicle_number].tank.frames_till_traitor_deactivate; frames_till_unscramble = player[vehicle_number].tank.frames_till_unscramble; scramble_life = player[vehicle_number].tank.scramble_life; traitor_life = player[vehicle_number].tank.traitor_life; if( player[vehicle_number].tank.team == RED_TEAM ) { team = RED_TEAM; enemy_team = BLUE_TEAM; } else { team = BLUE_TEAM; enemy_team = RED_TEAM; } if( player[vehicle_number].character.skill_level > 2 && player[vehicle_number].controller != USER_CONTROL ) { if( player[vehicle_number].tank.traitor_active ) if( frames_till_traitor_deactivate < (traitor_life - 40) ) player[vehicle_number].tank.traitor_active = FALSE; /* if( player[vehicle_number].tank.controls_scrambled ) if( frames_till_unscramble < (scramble_life - 40) ) player[vehicle_number].tank.controls_scrambled = FALSE; */ } if( player[vehicle_number].tank.traitor_active ) { player[vehicle_number].tank.team = enemy_team; player[vehicle_number].team = enemy_team; } /* Clear this players input table */ Clear_Input_Table( player[vehicle_number].table ); /* Fill up this players events data structure */ Update_Player_Events( world_stuff, vehicle_number ); /* Figure out what state we are in now */ world_stuff->player_array[vehicle_number].character.state = Find_State( world_stuff, vehicle_number ); if( player[vehicle_number].tank.traitor_active ) { world_stuff->player_array[vehicle_number].character.state = ATTACK; } /* Based on the state of the ai call appropriate control function */ switch( world_stuff->player_array[vehicle_number].character.state ) { case ATTACK: Attack( world_stuff, vehicle_number ); break; case GET_ENERGY: Get_Energy( world_stuff, vehicle_number ); break; case PANIC: Panic( world_stuff, vehicle_number ); break; case BEZERK: Bezerk( world_stuff, vehicle_number ); break; case HIDE: Hide( world_stuff, vehicle_number ); break; case GROUPUP: Group( world_stuff, vehicle_number ); break; case GET_PYLONS: Get_Pylons( world_stuff, vehicle_number ); break; case PROTECT: Protect( world_stuff, vehicle_number ); break; case KILL_RADAR_BASE: Kill_Radar_Base( world_stuff, vehicle_number ); break; case PROTECT_RADAR_BASE: Protect_Radar_Base( world_stuff, vehicle_number ); break; case EVADE: Evade( world_stuff, vehicle_number ); default: break; } /* End case */ if( player[vehicle_number].tank.traitor_active ) { player[vehicle_number].tank.team = team; player[vehicle_number].team = team; } if( player[vehicle_number].tank.vtype == Dragonfly ) Cloak_Override( world_stuff, vehicle_number ); if( player[vehicle_number].tank.vtype == Roach ) Mines( world_stuff, vehicle_number ); if( player_events[vehicle_number].memory.stuck ) Stuck_Override( world_stuff, vehicle_number ); } /* End of AI_Control */
typeMoveList *MyEvasion(typePos *Position, typeMoveList *List, uint64 c2) { uint64 U, T, att, mask; int sq, to, fr, c, king, pi; king = MyKingSq; att = MyKingCheck; sq = BSF(att); pi = Position->sq[sq]; mask = (~OppAttacked) &(((pi == EnumOppP) ? AttK[king] : 0) | Evade(king, sq)) & (~MyOccupied) &c2; BitClear(sq, att); if (att) { sq = BSF(att); pi = Position->sq[sq]; mask = mask &(PieceIsOppPawn(pi) | Evade(king, sq)); sq = king; AddTo(mask, CaptureValue[EnumMyK][c]); List->move = 0; return List; } c2 &= InterPose(king, sq); sq = king; AddTo(mask, CaptureValue[EnumMyK][c]); if (!c2) { List->move = 0; return List; } if (CaptureRight &(c2 & OppOccupied)) { to = BSF(c2 & OppOccupied); c = Position->sq[to]; if (EighthRank(to)) { Add(List, FlagPromQ | FromLeft(to) | to, (0x20 << 24) + CaptureValue[EnumMyP][c]); Add(List, FlagPromN | FromLeft(to) | to, 0); Add(List, FlagPromR | FromLeft(to) | to, 0); Add(List, FlagPromB | FromLeft(to) | to, 0); } else Add(List, FromLeft(to) | to, CaptureValue[EnumMyP][c]); } if (CaptureLeft &(c2 & OppOccupied)) { to = BSF(c2 & OppOccupied); c = Position->sq[to]; if (EighthRank(to)) { Add(List, FlagPromQ | FromRight(to) | to, (0x20 << 24) + CaptureValue[EnumMyP][c]); Add(List, FlagPromN | FromRight(to) | to, 0); Add(List, FlagPromR | FromRight(to) | to, 0); Add(List, FlagPromB | FromRight(to) | to, 0); } else Add(List, FromRight(to) | to, CaptureValue[EnumMyP][c]); } to = Position->Dyn->ep; if (to) { if (CaptureRight & SqSet[to] && SqSet[Backward(to)] & c2) Add(List, FlagEP | FromLeft(to) | to, CaptureValue[EnumMyP][EnumOppP]); if (CaptureLeft & SqSet[to] && SqSet[Backward(to)] & c2) Add(List, FlagEP | FromRight(to) | to, CaptureValue[EnumMyP][EnumOppP]); } T = BitboardMyP & BackShift((c2 & OppOccupied) ^ c2); while (T) { fr = BSF(T); BitClear(fr, T); if (SeventhRank(fr)) { Add(List, FlagPromQ | (fr << 6) | Forward(fr), CaptureValue[EnumMyP][0]); Add(List, FlagPromN | (fr << 6) | Forward(fr), 0); Add(List, FlagPromR | (fr << 6) | Forward(fr), 0); Add(List, FlagPromB | (fr << 6) | Forward(fr), 0); } else Add(List, (fr << 6) | Forward(fr), CaptureValue[EnumMyP][0]); } T = BitboardMyP & BackShift2((c2 & OppOccupied) ^ c2) & SecondRank & BackShift(~Position->OccupiedBW); while (T) { fr = BSF(T); BitClear(fr, T); Add(List, (fr << 6) | Forward2(fr), CaptureValue[EnumMyP][0]); } for (U = BitboardMyN; U; BitClear(sq, U)) { sq = BSF(U); T = AttN[sq] & c2; AddTo(T, CaptureValue[EnumMyN][c]); } for (U = BitboardMyB; U; BitClear(sq, U)) { sq = BSF(U); T = AttB(sq) & c2; AddTo(T, CaptureValue[EnumMyBL][c]); } for (U = BitboardMyR; U; BitClear(sq, U)) { sq = BSF(U); T = AttR(sq) & c2; AddTo(T, CaptureValue[EnumMyR][c]); } for (U = BitboardMyQ; U; BitClear(sq, U)) { sq = BSF(U); T = AttQ(sq) & c2; AddTo(T, CaptureValue[EnumMyQ][c]); } List->move = 0; return List; }
Vec2 SteeringForce::Calculate() { m_vSteeringForce = Vec2::ZERO; Vec2 force; std::vector<Vehicle*> neighbors; if (On(allignment)||On(separation)||On(cohesion)) { if (m_pVehicle->isCellSpaceOn()) { CellSpacePartition<Vehicle*>* cellSpace = GameData::Instance()->getCellSpace(); neighbors = cellSpace->getNeighbors(); }else{ auto data = GameData::Instance()->getEntityVector(); neighbors = tagNeighbors(m_pVehicle,data,SearchRad); } } if (On(wall_avoidance)) { auto data = GameData::Instance()->getWallls(); force = WallAvoidance(data); if (!AccumulateForce(m_vSteeringForce, force)) { return m_vSteeringForce; } } if (On(obstacle_avoidance)) { auto data = GameData::Instance()->getObstacle(); force = ObstacleAvoidance(data); if (!AccumulateForce(m_vSteeringForce, force)) { return m_vSteeringForce; } } if (On(separation)) { force = Separation(neighbors); if (!AccumulateForce(m_vSteeringForce, force)) { return m_vSteeringForce; } } if (On(cohesion)) { force = Cohesion(neighbors); if (!AccumulateForce(m_vSteeringForce, force)) { return m_vSteeringForce; } } if (On(allignment)) { force = Alignment(neighbors); if (!AccumulateForce(m_vSteeringForce, force)) { return m_vSteeringForce; } } if (On(hide)) { CCASSERT(m_pVehicle->getHideTarget()!=nullptr, "不存在躲避目标"); auto data = GameData::Instance()->getEntityVector(); force = Hide(m_pVehicle->getHideTarget(),data); if (!AccumulateForce(m_vSteeringForce, force)) { return m_vSteeringForce; } } if (On(follow_path)) { force = PathFollow(); if (!AccumulateForce(m_vSteeringForce, force)) { return m_vSteeringForce; } } if (On(seek)) { force = Seek(m_pVehicle->getTarget()); if (!AccumulateForce(m_vSteeringForce, force)) { return m_vSteeringForce; } } if (On(flee)) { force = Flee(m_pVehicle->getTarget()); if (!AccumulateForce(m_vSteeringForce, force)) { return m_vSteeringForce; } } if (On(arrive)) { force = Arrive(m_pVehicle->getTarget(), fast); if (!AccumulateForce(m_vSteeringForce, force)) { return m_vSteeringForce; } } if (On(offset_pursuit)) { force = OffsetPursuit(m_pVehicle->getLeader(), m_pVehicle->getOffsetToLeader()); if (!AccumulateForce(m_vSteeringForce, force)) { return m_vSteeringForce; } } if (On(pursuit)) { force = Pursuit(m_pVehicle->getEvaderv()); if (!AccumulateForce(m_vSteeringForce, force)) { return m_vSteeringForce; } } if (On(evade)) { force = Evade(m_pVehicle->getPursuer()); if (!AccumulateForce(m_vSteeringForce, force)) { return m_vSteeringForce; } } if (On(wander)) { force = Wander(); if (!AccumulateForce(m_vSteeringForce, force)) { return m_vSteeringForce; } } if (On(interpose)) { force = Interpose(m_pVehicle->getInterposeA(), m_pVehicle->getInterposeB()); if (!AccumulateForce(m_vSteeringForce, force)) { return m_vSteeringForce; } } return m_vSteeringForce; }