Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Nov 12, 2015, 9:30:14 AM (8 years ago)
Author:
gania
Message:

Sometimes there are too many rotations

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/AI_HS15/src/orxonox/controllers/CommonController.cc

    r10793 r10796  
    358358        }
    359359    }
     360    float CommonController::randomInRange(float a, float b)
     361    {
     362        float random = rnd(1.0f);
     363        float diff = b - a;
     364        float r = random * diff;
     365        return a + r;
     366    }
     367    void CommonController::attack()
     368    {
     369        if ( !this->getControllableEntity() )
     370            return;
     371        if ( this->target_ )
     372        {
     373            this->positionOfTarget_ = getPredictedPosition(
     374                this->getControllableEntity()->getWorldPosition(),
     375                hardcoded_projectile_speed,
     376                this->target_->getWorldPosition(),
     377                this->target_->getVelocity()
     378                );
     379            Vector3 diffVector = this->positionOfTarget_ - this->getControllableEntity()->getWorldPosition();
     380            float diffLength = diffVector.length();
     381            if (diffLength < 100)
     382            {
     383                Vector3* targetPosition;
     384                targetPosition = new Vector3 (
     385                    //randomInRange(200, 300),
     386                    0,
     387                    //randomInRange(-300, -200),
     388                    0,
     389                    randomInRange(-300, -400)
     390                    );
     391                Quaternion rotationToTarget = (this->getControllableEntity()->getOrientation() * WorldEntity::FRONT).getRotationTo(diffVector);
     392                Vector3 target = rotationToTarget * (*targetPosition);
     393                moveToPoint(
     394                    target,
     395                    randomInRange(45, 180)
     396                    );
     397                executingMoveToPoint_ = true;
     398                return;
     399            }
     400            this->bShooting_ = true;
     401            this->positionOfTarget_ = getPredictedPosition(
     402                this->getControllableEntity()->getWorldPosition(),
     403                hardcoded_projectile_speed,
     404                this->target_->getWorldPosition(),
     405                this->target_->getVelocity()
     406                );
     407            this->targetPosition_ = positionOfTarget_;
     408
     409        }   
     410        else
     411        {
     412            this->chooseManeuverType();
     413        }
     414    }
     415    void CommonController::scissors()
     416    {
     417        if ( !this->getControllableEntity() )
     418            return;
     419        if ( this->target_ )
     420        {
     421            this->positionOfTarget_ = getPredictedPosition(
     422                this->getControllableEntity()->getWorldPosition(),
     423                hardcoded_projectile_speed,
     424                this->target_->getWorldPosition(),
     425                this->target_->getVelocity()
     426                );
     427            Vector3 diffVector = this->positionOfTarget_ - this->getControllableEntity()->getWorldPosition();
     428            float diffLength = diffVector.length();
     429            Vector3 opponentForwardVector = this->target_->getOrientation() * WorldEntity::FRONT;
     430            float opponentDotProduct = diffVector.dotProduct(opponentForwardVector);           
     431           
     432            int f = (int) rnd(100.0f);
     433            f = (f % 2 == 0 ? 1 : -1);
     434
     435            if(!this->executingMoveToPoint_)
     436            {
     437                Vector3* targetPosition;
     438                if ( diffLength < 100 )
     439                {
     440                    targetPosition = new Vector3 (
     441                        //f * randomInRange(200, 300),
     442                        0,
     443                        //f * randomInRange(-300, -200),
     444                        0,
     445                        //randomInRange(-300, -400)
     446                        0
     447                        );
     448                }
     449                else
     450                {
     451                    if ( opponentDotProduct < 0 )
     452                    {
     453                        targetPosition = new Vector3 (
     454                        //f * randomInRange(200, 300),
     455                        0,
     456                        //f * randomInRange(-300, -200),
     457                        0,
     458                        //randomInRange(-300, -400)
     459                        -300
     460                        );
     461                    }
     462                    else
     463                    {
     464                        targetPosition = new Vector3 (
     465                        //f * randomInRange(200, 300),
     466                        0,
     467                        //f * randomInRange(-300, -200),
     468                        0,
     469                        //randomInRange(-300, -400)
     470                        300
     471                        );
     472                    }
     473                }
     474                Quaternion rotationToTarget = (this->getControllableEntity()->getOrientation() * WorldEntity::FRONT).getRotationTo(diffVector);
     475                Vector3 target = rotationToTarget * (*targetPosition);
     476                moveToPoint(
     477                    target,
     478                    randomInRange(45, 180)
     479                    );
     480                executingMoveToPoint_ = true; 
     481            }
     482        }
     483       
     484        else
     485        {
     486            this->chooseManeuverType();
     487        }
     488    }
     489    void CommonController::gunsD()
     490    {
     491        if ( !this->getControllableEntity() )
     492            return;
     493        if ( this->target_ )
     494        {
     495            this->positionOfTarget_ = getPredictedPosition(
     496                this->getControllableEntity()->getWorldPosition(),
     497                hardcoded_projectile_speed,
     498                this->target_->getWorldPosition(),
     499                this->target_->getVelocity()
     500                );
     501            Vector3 diffVector = this->positionOfTarget_ - this->getControllableEntity()->getWorldPosition();
     502            float diffLength = diffVector.length();
     503            if(!this->executingMoveToPoint_)
     504            {
     505                Vector3* targetPosition;
     506                if ( diffLength < 200 )
     507                {
     508                    targetPosition = new Vector3 (
     509                        //f * randomInRange(200, 300),
     510                        0,
     511                        //f * randomInRange(-300, -200),
     512                        0,
     513                        //randomInRange(-300, -400)
     514                        0
     515                        );
     516                }
     517                else if ( diffLength < 500 )
     518                {
     519                    targetPosition = new Vector3 (
     520                        //randomInRange(100, 200),
     521                        0,
     522                        //randomInRange(-200, -100),
     523                        0,
     524                        //randomInRange(-400, -600)
     525                        500
     526                        );
     527                }
     528                else
     529                {
     530                    targetPosition = new Vector3 (
     531                        //randomInRange(200, 300),
     532                        0,
     533                        //randomInRange(-300, -200),
     534                        0,
     535                        //randomInRange(-400, -600)
     536                        500
     537                        );
     538                }
     539                Quaternion rotationToTarget = (this->getControllableEntity()->getOrientation() * WorldEntity::FRONT).getRotationTo(diffVector);
     540                Vector3 target = rotationToTarget * (*targetPosition);
     541                moveToPoint(
     542                    target,
     543                    randomInRange(45, 180)
     544                    );
     545                executingMoveToPoint_ = true; 
     546            }
     547        }
     548        else
     549        {
     550            this->chooseManeuverType();
     551        }
     552    }
    360553    //to be called in action
    361554    //PRE: relativeTargetPosition is desired position relative to the spaceship,
Note: See TracChangeset for help on using the changeset viewer.