/// Behandelt das Laufen zurück zum Schiff
void nofAttacker::HandleState_SeaAttack_ReturnToShip()
{
    // Ist evtl. unser Heimatgebäude zerstört?
    if(!building)
    {
        // Rumirren
        state = STATE_FIGUREWORK;
        StartWandering();
        Wander();

        // Schiff Bescheid sagen
        CancelAtShip();
        return;
    }

    // Sind wir schon im Schiff?
    if(pos == shipPos)
    {
        // Alle Figuren durchgehen
        for(noBase* figure : gwg->GetFigures(pos))
        {
            if(figure->GetObjId() == ship_obj_id)
            {
                StartReturnViaShip(static_cast<noShip&>(*figure));
                return;
            }
        }

        RTTR_Assert(false);
        ship_obj_id = 0;
        // Kein Schiff gefunden? Das kann eigentlich nich sein!
        // Dann rumirren
        StartWandering();
        state = STATE_FIGUREWORK;
        Wander();
        return;
    }
    unsigned char dir = gwg->FindHumanPath(pos, shipPos, MAX_ATTACKING_RUN_DISTANCE);
    // oder finden wir gar keinen Weg mehr?
    if(dir == 0xFF)
    {
        // Kein Weg gefunden --> Rumirren
        StartWandering();
        state = STATE_FIGUREWORK;
        Wander();

        // Dem Heimatgebäude Bescheid sagen
        building->SoldierLost(this);
        // Und dem Schiff
        CancelAtShip();
    }
    // oder ist alles ok? :)
    else
    {
        // weiterlaufen
        StartWalking(Direction(dir));
    }
}
示例#2
0
void nofActiveSoldier::WalkingHome()
{
    // Is our home military building destroyed?
    if(!building)
    {
        // Start wandering around
        state = STATE_FIGUREWORK;
        StartWandering();
        Wander();

        return;
    }


    // Walking home to our military building

    // Are we already at the flag?
    if(GetPos() == building->GetFlag()->GetPos())
    {
        // Enter via the door
        StartWalking(1);
        return;
    }
    // or are have we come into the building?
    if(GetPos() == building->GetPos())
    {
        // We're there!
        building->AddActiveSoldier(this);
        // Remove myself from the map
        gwg->RemoveFigure(this, pos);
        return;
    }
    unsigned char dir = gwg->FindHumanPath(pos, building->GetFlag()->GetPos(), 100);
    // Or we don't find a route?
    if(dir == 0xFF)
    {
        // Start wandering around then
        StartWandering();
        state = STATE_FIGUREWORK;
        Wander();

        // Inform our home building that we're not coming anymore
        building->SoldierLost(this);
    }
    // All ok?
    else
    {
        // Find all sorts of enemies (attackers, aggressive defenders..) nearby
        if(FindEnemiesNearby())
            // Enemy found -> abort, because nofActiveSoldier handles all things now (inclusive one walking step)
            return;

        // Start walking
        StartWalking(dir);
    }
}
示例#3
0
/// Geht wieder zurück zur Flagge und dann nach Hause
void nofFlagWorker::GoToFlag()
{
    // Zur Flagge zurücklaufen

    // Bin ich an der Fahne?
    if(pos == flag->GetPos())
    {
        // nach Hause gehen
        nobBaseWarehouse* wh = gwg->GetPlayer(player).FindWarehouse(*flag, FW::AcceptsFigure(job_), true, false);
        if(wh)
        {
            GoHome(wh);
            // Vorgaukeln, dass wir ein Stück Straße bereits geschafft haben
            // damit wir mit WalkToGoal weiter bis zum Ziel laufen können
            cur_rs = &emulated_wanderroad;
            rs_pos = 0;
            WalkToGoal();
        }
        else
        {
            // Weg führt nicht mehr zum Lagerhaus, dann rumirren
            StartWandering();
            Wander();
        }


        // Da wir quasi "freiwillig" nach Hause gegangen sind ohne das Abreißen der Flagge, auch manuell wieder
        // "abmelden"
        gwg->GetPlayer(player).RemoveFlagWorker(this);
        state = STATE_FIGUREWORK;
        flag = NULL;
    }
    else
    {
        // Weg suchen
        unsigned char dir = gwg->FindHumanPath(pos, flag->GetPos(), 40);

        // Wenns keinen gibt, rumirren, ansonsten hinlaufen
        if(dir == 0xFF)
        {
            Abrogate();
            StartWandering();
            Wander();
            state = STATE_FIGUREWORK;

            flag = NULL;
        }
        else
        {
            StartWalking(dir);
        }
    }
}
示例#4
0
void noFigure::WanderToFlag()
{
    // Existiert die Flagge überhaupt noch?
    noBase* no = gwg->GetNO(flagPos_);
    if(no->GetObjId() != flag_obj_id)
    {
        // Wenn nicht, wieder normal weiter rumirren
        StartWandering();
        Wander();
        return;
    }

    // Sind wir schon da?
    if(pos == flagPos_)
    {
        // Gibts noch nen Weg zu einem Lagerhaus?

        if(nobBaseWarehouse* wh = gwg->GetPlayer(player).FindWarehouse(
                                      gwg->GetSpecObj<noRoadNode>(pos), FW::Condition_StoreFigure, 0, true, &job_, false))
        {
            // ja, dann können wir ja hingehen
            goal_ = wh;
            cur_rs = 0;
            rs_pos = 0;
            fs = FS_GOHOME;
            wh->AddDependentFigure(this);
            WalkToGoal();
            return;
        }
        else
        {
            // Wenn nicht, wieder normal weiter rumirren
            StartWandering();
            Wander();
            return;
        }
    }

    // Weiter zur Flagge gehen
    // Gibts noch nen Weg dahin bzw. existiert die Flagge noch?
    unsigned char dir = gwg->FindHumanPath(pos, flagPos_, 60, false);
    if(dir != 0xFF)
    {
        // weiter hinlaufen
        StartWalking(dir);
    }
    else
    {
        // Wenn nicht, wieder normal weiter rumirren
        StartWandering();
        Wander();
    }
}
void nofGeologist::GoToNextNode()
{
    // Wenn es keine Flagge mehr gibt, dann gleich rumirren
    if(!flag)
    {
        StartWandering();
        Wander();
        state = STATE_FIGUREWORK;
        return;
    }

    // ersten Punkt suchen
    unsigned char dir = GetNextNode();

    if(dir != INVALID_DIR)
    {
        // Wenn es einen Punkt gibt, dann hingehen
        state = STATE_GEOLOGIST_GOTONEXTNODE;
        StartWalking(Direction::fromInt(dir));
        --signs;
    } else if(node_goal == pos)
    {
        // Already there
        state = STATE_GEOLOGIST_GOTONEXTNODE;
        --signs;
        Walked();
    } else
    {
        // ansonsten zur Flagge zurückgehen
        state = STATE_GOTOFLAG;
        Walked();
    }
}
示例#6
0
/// Wenn ein Kampf gewonnen wurde
void nofDefender::WonFighting()
{
	
	//addon BattlefieldPromotion active? -> increase rank!
	if(GAMECLIENT.GetGGS().isEnabled(ADDON_BATTLEFIELD_PROMOTION))
		IncreaseRank();
    // Angreifer tot
    attacker = 0;

    // Ist evtl. unser Heimatgebäude zerstört?
    if(!building)
    {
        // Rumirren
        state = STATE_FIGUREWORK;
        StartWandering();
        Wander();

        return;
    }

    // Neuen Angreifer rufen
    if( (attacker = building->FindAttackerNearBuilding()) )
    {
        // Ein Angreifer gefunden, dann warten wir auf ihn, bis er kommt
        state = STATE_DEFENDING_WAITING;
    }
    else
    {
        // Kein Angreifer gefunden, dann gehen wir wieder in unser Gebäude
        state = STATE_DEFENDING_WALKINGFROM;
        StartWalking(1);
        // Angreifer auf 0 setzen, er ist ja tot
        attacker = 0;
    }
}
示例#7
0
/// Wenn ein Heimat-Militärgebäude bei Missionseinsätzen zerstört wurde
void nofDefender::HomeDestroyed()
{
    building = 0;

    switch(state)
    {
        case STATE_DEFENDING_WAITING:
        {
            // Hier muss sofort reagiert werden, da man steht
            attacker = NULL;
            // Rumirren
            state = STATE_FIGUREWORK;
            StartWandering();
            Wander();
        } break;
        case STATE_DEFENDING_WALKINGTO:
        case STATE_DEFENDING_WALKINGFROM:
        {
            attacker = NULL;
            // Rumirren
            StartWandering();
            state = STATE_FIGUREWORK;
        } break;
        case STATE_FIGHTING:
        {
            // Die normale Tätigkeit wird erstmal fortgesetzt (Laufen, Kämpfen, wenn er schon an der Fahne ist
            // wird er auch nicht mehr zurückgehen)
        } break;
        default:
            break;
    }
}
示例#8
0
void Agent::Search() //Orange
{
	searching = true;

	int mouseX, mouseY;
	Input::GetSingleton()->GetMouseXY(&mouseX, &mouseY);
	float fDist = GetDistanceFromTarget((float)mouseX, (float)mouseY);

	// Actuation
	Wander(180, 60, 60);

	// Transition
	if (searchTimer > 3)
	{
		searching = false;
		searchTimer = 0;
		SetColour(Colour::Green);
	}
	if (fDist < m_nSightRange)
	{
		searching = false;
		searchTimer = 0;
		SetColour(Colour::Red);
	}
	if (GetHealth() <= 50)
	{
		searching = false;
		searchTimer = 0;
		SetColour(Colour::Blue);
	}
}
示例#9
0
void nofHunter::WalkHome()
{
	// Sind wir zu Hause angekommen? (genauer an der Flagge !!)
	unsigned short flag_x = workplace->GetX()+(workplace->GetY()&1), flag_y = workplace->GetY()+1;
	if(x == flag_x && y == flag_y)
	{
		// Weiteres übernimmt nofBuildingWorker
		WorkingReady();
	}
	// Weg suchen und ob wir überhaupt noch nach Hause kommen (Toleranz bei dem Weg mit einberechnen,
	// damit er nicht einfach rumirrt und wegstirbt, wenn er einmal ein paar Felder zu weit gelaufen ist)
	else if((dir = gwg->FindHumanPath(x,y,flag_x,flag_y,MAX_HUNTING_DISTANCE+MAX_HUNTING_DISTANCE/4)) == 0xFF)
	{
		// Kein Weg führt mehr nach Hause--> Rumirren
		StartWandering();
		Wander();
		// Haus Bescheid sagen
		workplace->WorkerLost();
	}
	else
	{
		// Alles ok, wir können hinlaufen
		StartWalking(dir);
	}
}
/** This program is a simple bumpers test.
 * 
 */
int main(int argc, char **argv)
{
  geometry_msgs::Twist  new_cmd;

  ros::init(argc, argv, "bumper_wander");

  ros::NodeHandle nh;

  ros::Publisher cmd_vel_publisher = nh.advertise<geometry_msgs::Twist>("cmd_vel", 1);

  ros::Subscriber bumpers_subscriber = nh.subscribe( "bumpers", 1, BumpersCallback );

  ros::Subscriber movement_status_subscriber = nh.subscribe( "movement_status", 1, MovementStatusCallback );

  ros::Rate loop_rate(LOOP_RATE);

  while ( ros::ok() )
  {
    new_cmd = Wander();

    EscapeCollision( &new_cmd, m_bump_direction );
    EscapeStasis( &new_cmd, m_stasis_direction );
    
    //ROS_INFO( "Publishing cmd_vel: Speed: %.2f Turn: %.2f", new_cmd.linear.x, new_cmd.angular.z );

    cmd_vel_publisher.publish( new_cmd );

    ros::spinOnce();

    loop_rate.sleep();
  }

  return 0;
}
示例#11
0
/// Wenn ein Kampf gewonnen wurde
void nofAggressiveDefender::WonFighting()
{
	//addon BattlefieldPromotion active? -> increase rank!
	if(GAMECLIENT.GetGGS().isEnabled(ADDON_BATTLEFIELD_PROMOTION))
		IncreaseRank();
    // Angreifer tot
    attacker  = NULL;

    // Ist evtl. unser Heimatgebäude zerstört?
    if(!building)
    {
        // Rumirren
        state = STATE_FIGUREWORK;
        StartWandering();
        Wander();

        // Ziel Bescheid sagen
        if(attacked_goal)
            attacked_goal->UnlinkAggressiveDefender(this);

        return;
    }

    // Angreifer ist tot, nach anderen suchen, die in meiner Nähe sind und mich evtl noch mit denen kloppen
    MissionAggressiveDefendingLookForNewAggressor();
}
示例#12
0
void nofFarmhand::WalkHome()
{
    // Sind wir zu Hause angekommen? (genauer an der Flagge !!)
    if(pos == dest)
    {
        // Weiteres übernimmt nofBuildingWorker
        WorkingReady();
        return;
    }

    unsigned char dir = gwg->FindHumanPath(pos, dest, 40);
    // Weg suchen und ob wir überhaupt noch nach Hause kommen
    if(dir == 0xFF)
    {
        // Kein Weg führt mehr nach Hause--> Rumirren
        StartWandering();
        Wander();
        // Haus Bescheid sagen
        workplace->WorkerLost();
        workplace = 0;
    }
    else
    {
        // Alles ok, wir können hinlaufen
        StartWalking(dir);
    }
}
示例#13
0
void nofGeologist::GoToNextNode()
{
    // Wenn es keine Flagge mehr gibt, dann gleich rumirren
    if(!flag)
    {
        StartWandering();
        Wander();
        state = STATE_FIGUREWORK;
        return;
    }

    // ersten Punkt suchen
    unsigned char dir = GetNextNode();

    if(dir != 0xFF)
    {
        // Wenn es einen Punkt gibt, dann hingehen
        state = STATE_GEOLOGIST_GOTONEXTNODE;
        StartWalking(dir);
        --signs;
    }
    else
    {
        // ansonsten zur Flagge zurückgehen
        state = STATE_GOTOFLAG;
        Walked();
    }
}
/// Wenn ein Kampf gewonnen wurde
void nofAttacker::WonFighting()
{
    // addon BattlefieldPromotion active? -> increase rank!
    if(gwg->GetGGS().isEnabled(AddonId::BATTLEFIELD_PROMOTION))
        IncreaseRank();
    // Ist evtl. unser Heimatgebäude zerstört?
    if(!building && state != STATE_ATTACKING_FIGHTINGVSDEFENDER)
    {
        // Dann dem Ziel Bescheid sagen, falls es existiert (evtl. wurdes zufällig zur selben Zeit zerstört)
        InformTargetsAboutCancelling();

        // Ggf. Schiff Bescheid sagen (Schiffs-Angreifer)
        if(ship_obj_id)
            CancelAtShip();

        // Rumirren
        state = STATE_FIGUREWORK;
        StartWandering();
        Wander();
        return;
    }

    // Ist evtl. unser Ziel-Gebäude zerstört?
    if(!attacked_goal)
    {
        // Nach Hause gehen
        ReturnHomeMissionAttacking();
        return;
    }
    ContinueAtFlag();
}
示例#15
0
void noFigure::HandleEvent(const unsigned int id)
{
    // Bei ID = 0 ists ein Laufevent, bei allen anderen an abgeleitete Klassen weiterleiten
    if(id)
    {
        HandleDerivedEvent(id);
    }
    else
    {
        current_ev = NULL;
        WalkFigure();

        // Alte Richtung und Position für die Berechnung der Sichtbarkeiten merken
        unsigned char old_dir = GetCurMoveDir();

        MapPoint old_pos(pos);

        switch(fs)
        {
            case FS_GOHOME:
            case FS_GOTOGOAL:
            {
                WalkToGoal();
            } break;

            case FS_JOB:
            {
                Walked();
                break;
            }
            case FS_WANDER:
            {
                Wander();
                break;
            }
        }

        // Ggf. Sichtbereich testen
        if(GetVisualRange())
        {

            // Use old position (don't use this->x/y because it might be different now
            // Figure could be in a ship etc.)
            gwg->RecalcMovingVisibilities(old_pos, player, GetVisualRange(), old_dir, NULL);


            std::vector<noBase*> figures = gwg->GetDynamicObjectsFrom(old_pos);

            // Wenn Figur verschwunden ist, muss ihr ehemaliger gesamter Sichtbereich noch einmal
            // neue berechnet werden
            if(!helpers::contains(figures, this))
                CalcVisibilities(old_pos);
        }

    }
}
示例#16
0
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;
};
示例#17
0
/// wenn man gelaufen ist
void nofDefender::Walked()
{
    // Was bestimmtes machen, je nachdem welchen Status wir gerade haben
    switch(state)
    {
        case STATE_DEFENDING_WALKINGTO:
        {
            // Mit Angreifer den Kampf beginnen
            gwg->AddFigure(new noFighting(attacker, this), pos);
            state = STATE_FIGHTING;
            attacker->state = STATE_ATTACKING_FIGHTINGVSDEFENDER;

        } break;
        case STATE_DEFENDING_WALKINGFROM:
        {
            // Ist evtl. unser Heimatgebäude zerstört?
            if(!building)
            {
                // Rumirren
                attacker = 0;
                state = STATE_FIGUREWORK;
                StartWandering();
                Wander();

                return;
            }

            // Zu Hause angekommen

            // Ist evtl. wieder ein Angreifer in der Zwischenzeit an der Fahne angekommen?
            if(attacker)
            {
                // dann umdrehen und wieder rausgehen
                state = STATE_DEFENDING_WALKINGTO;
                StartWalking(4);
            }
            else
            {
                // mich von der Landkarte tilgen
                gwg->RemoveFigure(this, pos);
                // mich zum Gebäude wieder hinzufügen
                building->AddActiveSoldier(this);
                // Gebäude Bescheid sagen, dass es nun keinen Verteidiger mehr gibt
                building->NoDefender();
            }

        } break;
        default:
            break;
    }
}
示例#18
0
void Moose::Hunting()
{
	Wander();
	Search();		// Call this to search for your prey (only works if SetPreyList has been called successfully).

	// Check if the entity found a suitable target.
	if (mCurTarget) 
	{
		SetState(ES_ATTACK);						// Switch its state to attack
		mMoveSpeed = 2.5;							// Increase it's movement speed
		SetAnimationSpeed(100);						// Decreases the animation's time between frames (makes the animation play faster)
		PlayAnimation(ANIMATION_RUNNING, true);		// Plays the running animation (must be set in constructor for this to work)
	}
}
示例#19
0
void Prey::FollowLeader()
{
		if (LeaderInRange())
		{
			Wander();
		}
		else
		{
		//	cout<<"Leader is out of range"<<endl;
			SaveTarget();
			ChaseMode();
			SetFollowerState(FS_CHASELEADER);
		}
}
示例#20
0
/// wenn man gelaufen ist
void nofDefender::Walked()
{
    // Was bestimmtes machen, je nachdem welchen Status wir gerade haben
    switch(state)
    {
        case STATE_DEFENDING_WALKINGTO:
        {
            // Mit Angreifer den Kampf beginnen
            gwg->AddFigure(new noFighting(attacker, this), pos);
            state = STATE_FIGHTING;
            attacker->FightVsDefenderStarted();

        } break;
        case STATE_DEFENDING_WALKINGFROM:
        {
            // Ist evtl. unser Heimatgebäude zerstört?
            if(!building)
            {
                // Rumirren
                attacker = 0;
                state = STATE_FIGUREWORK;
                StartWandering();
                Wander();
                return;
            }

            // Zu Hause angekommen
            // Ist evtl. wieder ein Angreifer in der Zwischenzeit an der Fahne angekommen?
            if(attacker)
            {
                // dann umdrehen und wieder rausgehen
                state = STATE_DEFENDING_WALKINGTO;
                StartWalking(4);
            }
            else
            {
                // mich von der Landkarte tilgen
                gwg->RemoveFigure(this, pos);
                nobBaseMilitary* bld = building;
                // mich zum Gebäude wieder hinzufügen
                RTTR_Assert(bld->GetDefender() == this); // I should be the defender
                bld->AddActiveSoldier(this);
                RTTR_Assert(!bld->GetDefender()); // No defender anymore
            }

        } break;
        default:
            break;
    }
}
示例#21
0
void Moose::Idle()
{
	Wander();		// Moves around based on the values set in the constructor.

	if (mHunger < 50)
	{
		mTargetType = ET_GRASS;
		SetPrey((Entity **)((BaseApp*)mApp)->mGameState->mGrass);
		mWanderStep = 300;
		SetState(ES_HUNTING);
	}

	if (mAge > 20 && mHunger > 50 && !mSterile)
	{
		//Trigger stalking..
		SetPrey((Entity **)((BaseApp *)mApp)->mGameState->mMoose);
		mTargetType = ET_MOOSE;
		mWanderStep = 300;
		SetState(ES_STALKING);
	}

	//collect message from the message board..
	MessageBoardMessages::iterator Pos;
	Message CurMessage = MessageBoard::GetBoard()->CollectMessage(Pos);
	
	if (CurMessage.TargetType == ET_MOOSE)
	{
		//dismiss the message if its a false alarm.
		if (CurMessage.Target->GetAlive() == false || CurMessage.Target->GetType() == ET_CHUCK)
		{
			MessageBoard::GetBoard()->DismissMessage(Pos);
			return;
		}

		//check the distance between this moose and the sender
		float dist = sqrt((GetX() - CurMessage.Poster->GetX()) * (GetX() - CurMessage.Poster->GetX()) + (GetY() - CurMessage.Poster->GetY()) * (GetY() - CurMessage.Poster->GetY()));

		if (dist < 300)
		{
			MessageBoard::GetBoard()->DismissMessage(Pos);
			mTargetType = ET_PREDATOR;
			mCurTarget = CurMessage.Target;
			mMoveSpeed = 2.5;								// Increase it's movement speed
			SetAnimationSpeed(100);						// Decreases the animation's time between frames (makes the animation play faster)
			PlayAnimation(ANIMATION_CHARGING, true);	
			SetState(ES_CHARGING);
		}
	}
}
示例#22
0
void nofBuilder::LostWork()
{
    building_site = NULL;

    if(state == STATE_FIGUREWORK)
        GoHome();
    else
    {
        // Event abmelden
        em->RemoveEvent(current_ev);

        StartWandering();
        Wander();
        state = STATE_FIGUREWORK;
    }
}
示例#23
0
/// Boat carrier paddles to the coast after his road was destroyed
void nofCarrier::WanderOnWater()
{
    // Are we already there?
    if(rs_pos == shore_path->size())
    {
        // Start normal wandering at the land
        state = CARRS_FIGUREWORK;
        StartWandering();
        Wander();
        delete shore_path;
        shore_path = NULL;
    }
    else
    {
        // Continue paddling to the coast
        StartWalking(shore_path->at(rs_pos));
        ++rs_pos;
    }
}
示例#24
0
文件: KAIBase.cpp 项目: 1suming/pap2
void KAIBase::OnWander(void)
{
	int nRetCode = false;
	BOOL bRetCode = FALSE;

	bRetCode = CheckAttacked();
	KG_PROCESS_SUCCESS(bRetCode);

	bRetCode = CheckTargetInAlertRange();
	KG_PROCESS_SUCCESS(bRetCode);

	bRetCode = CheckTargetInAttackRange();
	KG_PROCESS_SUCCESS(bRetCode);

	//闲逛一段距离
	Wander();
Exit1:
	return ;
}
Vector2D B020612E_Steering::CalculatePrioritised()
{
	Vector2D force;

	if (On(STEERING_OBSTACLEAVOIDANCE))
	{
		force = ObstacleAvoidance(ObstacleManager::Instance()->GetObstacles()) * 10.0f;

		if (!AccumulateForce(_pSteeringForce, force))
			return _pSteeringForce;
	}
	if (On(STEERING_FLEE))
	{
		force = Flee(_pTank->GetClick()) * 1.0f;
		
		if (!AccumulateForce(_pSteeringForce, force))
			return _pSteeringForce;
	}
	if (On(STEERING_SEEK))
	{
		force = Seek(_pTank->GetClick()) * 1.0f;

		if (!AccumulateForce(_pSteeringForce, force))
			return _pSteeringForce;
	}
	if (On(STEERING_WANDER))
	{
		force = Wander() * 1.0f;

		if (!AccumulateForce(_pSteeringForce, force))
			return _pSteeringForce;
	}
	if (On(STEERING_ARRIVE))
	{
		force = Arrive(_pTank->GetClick(), _pDeceleration) * 1.0f;

		if (!AccumulateForce(_pSteeringForce, force))
			return _pSteeringForce;
	}

	return _pSteeringForce;
}
Vector2D B020612E_Steering::CalculateWeightedSum()
{
	//if (On(STEERING_OBSTACLEAVOIDANCE))
		//_pSteeringForce += ObstacleAvoidance();
	if (On(STEERING_WANDER))
		_pSteeringForce += Wander() * 1.0f;
	if (On(STEERING_SEEK))
		_pSteeringForce += Seek(_pTank->GetClick()) * 1.0f;
	if (On(STEERING_FLEE))
		_pSteeringForce += Flee(_pTank->GetClick()) * 1.0f;
	if (On(STEERING_ARRIVE))
		_pSteeringForce += Arrive(_pTank->GetClick(), _pDeceleration) * 1.0f;
	if (On(STEERING_PURSUIT))
		_pSteeringForce += Pursuit(_pTank->GetMotion(), _pTank->GetMouseVelocity()) * 1.0f;
	//if (On(STEERING_PATHFOLLOWING))
	//	_pSteeringForce += FollowPath() * 0.5f;

	_pSteeringForce.Truncate(_pTank->GetMaxForce());

	return _pSteeringForce;
}
示例#27
0
void Moose::Stalking()
{
	Wander();
	Search();

	if (mHunger < 50)
	{
		mTargetType = ET_GRASS;
		SetPrey((Entity **)((BaseApp*)mApp)->mGameState->mGrass);
		mWanderStep = 300;
		SetState(ES_HUNTING);
	}

	if (mCurTarget) 
	{
		SetState(ES_MATING);						// Switch its state to attack
		mMoveSpeed = 1.5;								// Increase it's movement speed
		SetAnimationSpeed(100);						// Decreases the animation's time between frames (makes the animation play faster)
		PlayAnimation(ANIMATION_WALKING);
	}
}
示例#28
0
void noFigure::StartWandering(const unsigned burned_wh_id)
{
    fs = FS_WANDER;
    cur_rs = 0;
    goal_ = 0;
    rs_pos = 0;
    this->burned_wh_id = burned_wh_id;
    // eine bestimmte Strecke rumirren und dann eine Flagge suchen
    // 3x rumirren und eine Flagge suchen, wenn dann keine gefunden wurde, stirbt die Figur
    wander_way = WANDER_WAY_MIN + RANDOM.Rand(__FILE__, __LINE__, GetObjId(), WANDER_WAY_MAX - WANDER_WAY_MIN);
    // Soldaten sind härter im Nehmen
    bool is_soldier = (job_ >= JOB_PRIVATE && job_ <= JOB_GENERAL);
    wander_tryings = is_soldier ? WANDER_TRYINGS_SOLDIERS : WANDER_TRYINGS;

    // Wenn wir stehen, zusätzlich noch loslaufen!
    if(waiting_for_free_node)
    {
        waiting_for_free_node = false;
        Wander();
    }
}
示例#29
0
void Boid::PreUpdate()
{
	// find nearest boids
	BoidFriend boids[5];
	int count = 0;
	FindClosest(boids, count, 5);

	// avoid walls
	AvoidWalls();

	// update anger
	if (count != 0)
	{
		float anger = 0.f;
		for (int i = 0; i != count; ++i)
			anger += boids[i].boid->m_Anger;
		anger /= count;

		// slowly adjust towards group anger
		if (anger > m_Anger)
			m_Anger += g_FrameTime * count;
		else
			m_Anger -= g_FrameTime * 0.5f;
	}

	m_Anger += Rand(0.f, 0.05f) * g_FrameTime;
	m_Anger = Clamp(m_Anger, 0.f, 1.f);

	// calculate flocking steering
	AddForce(Flock(boids, count));

	// attack if angry, otherwise flock and wander
	if (m_Anger > 0.5f)
	{
		float t = (m_Anger - 0.5f) * 2.f;
		AddForce(Attack() * t);
	}
	else
		AddForce(Wander());
}
/// Wenn ein Heimat-Militärgebäude bei Missionseinsätzen zerstört wurde
void nofAttacker::HomeDestroyed()
{
    switch(state)
    {
        case STATE_ATTACKING_WAITINGAROUNDBUILDING:
        {
            // Hier muss sofort reagiert werden, da man steht

            // Angreifer muss zusätzlich seinem Ziel Bescheid sagen
            nobBaseMilitary* curGoal = attacked_goal; // attacked_goal gets reset
            InformTargetsAboutCancelling();

            // Ggf. Schiff Bescheid sagen (Schiffs-Angreifer)
            if(ship_obj_id)
                CancelAtShip();

            // Rumirren
            building = nullptr;
            state = STATE_FIGUREWORK;
            StartWandering();
            Wander();

            // und evtl einen Nachrücker für diesen Platz suchen
            curGoal->SendSuccessor(pos, radius);
        }
        break;
        default:
        {
            // Wenn wir gerade auf dem Weg dorthin sind (z.B. an Bord eines Schiffs), Ziel löschen
            if(goal_ == building)
                goal_ = nullptr;

            //  Die normale Tätigkeit wird erstmal fortgesetzt (Laufen, Kämpfen, wenn er schon an der Fahne ist
            // wird er auch nicht mehr zurückgehen)
            building = nullptr;
        }
        break;
    }
}