Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 10226 in orxonox.OLD


Ignore:
Timestamp:
Jan 10, 2007, 6:31:30 PM (17 years ago)
Author:
tfahrni
Message:
 
Location:
branches/ai/src
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • branches/ai/src/ai/Makefile.am

    r10135 r10226  
    1111                        ai_team_member.cc \
    1212                        movement_module.cc \
    13                         shooting_module.cc
     13                        shooting_module.cc \
     14                        attack_module.cc
    1415
    1516noinst_HEADERS =        \
     
    2021                        ai_team_member.h \
    2122                        movement_module.h \
    22                         shooting_module.h
     23                        shooting_module.h \
     24                        attack_module.h
  • branches/ai/src/ai/ai_engine.cc

    r10138 r10226  
    2727        std::map<int,AITeam*>::iterator it;
    2828        std::vector<WorldEntity*>* enemyList=new std::vector<WorldEntity*>;
    29        
     29
    3030        for (it=teams.begin(); it!= teams.end(); it++ )
    3131        {
     
    3333                for(ObjectList<NPC2>::const_iterator npc = NPC2::objectList().begin(); npc != NPC2::objectList().end(); ++npc)
    3434                        if((*npc)->getTeam() != it->first)enemyList->push_back(*npc);
    35                
     35
    3636                //add player to enemys (player belongs to team 0)
    3737                if(it->first!=0){
     
    4040                        if(pl != NULL)enemyList->push_back(pl->getPlayable());
    4141                }
    42                
     42
    4343                //process the team
    4444                it->second->setEnemyList(enemyList);
     
    4646                enemyList->clear();
    4747        }
    48        
     48
    4949        delete enemyList;
    5050}
    5151
    52 void AIEngine::addAI(int teamNumber, int swarmNumber, AIModule* aiModule)
     52void AIEngine::addAI(int teamNumber, int swarmNumber, WorldEntity* npc)
    5353{
    5454        std::pair<std::map<int,AITeam*>::iterator,bool> p;
     
    5656        p=teams.insert(std::make_pair(teamNumber,newTeam));
    5757        if(!p.second)delete newTeam;
    58         p.first->second->addAI(swarmNumber, aiModule);
     58        p.first->second->addAI(swarmNumber, npc);
    5959}
    6060
    61 void AIEngine::removeAI(int teamNumber, int swarmNumber, AIModule* aiModule)
     61void AIEngine::removeAI(int teamNumber, int swarmNumber, WorldEntity* npc)
    6262{
    6363        std::map<int,AITeam*>::iterator it = teams.find(swarmNumber);
    6464        if(it==teams.end())return;
    65         it->second->removeAI(swarmNumber,aiModule);
     65        it->second->removeAI(swarmNumber,npc);
    6666        if(it->second->getTeamSize()==0){
    6767                delete it->second;
  • branches/ai/src/ai/ai_engine.h

    r10137 r10226  
    1414
    1515   void tick(float dt);
    16         void addAI(int teamNumber, int swarmNumber, AIModule* aiModule);
    17         void removeAI(int teamNumber, int swarmNumber, AIModule* aiModule);
    18        
     16        void addAI(int teamNumber, int swarmNumber, WorldEntity* npc);
     17        void removeAI(int teamNumber, int swarmNumber, WorldEntity* npc);
     18
    1919 private:
    2020        AIEngine(){}
  • branches/ai/src/ai/ai_module.cc

    r10138 r10226  
    1818#include "ai_module.h"
    1919#include "debug.h"
     20#include "aabb.h"
     21
     22float AIModule::getRadius(WorldEntity* object)
     23{
     24        AABB* aabb = object->getModelAABB();
     25        if( aabb == NULL)return -1;
     26
     27        float a = aabb->halfLength[0];
     28        float b = aabb->halfLength[1];
     29        float c = aabb->halfLength[2];
     30
     31        if(a>b){
     32                return (c>a)?c:a;
     33        }else{
     34                return (c>b)?c:b;
     35        }
     36}
     37
     38void AIModule::getAttributesFrom(AIModule* other)
     39{
     40        this->view = other->getView();
     41        this->movement = other->getMovement();
     42        this->npc = other->getNPC();
     43        this->target = other->getTarget();
     44        this->weight = other->getWeight();
     45        this->speedMax = other->getMaxSpeed();
     46        this->accelerationMax = other->getMaxAcceleration();
     47}
  • branches/ai/src/ai/ai_module.h

    r10177 r10226  
    77class AIModule {
    88 public:
    9    AIModule(){}
     9        AIModule(){}
    1010   virtual ~AIModule(){}
    1111   virtual void process(float dt){}
    1212
    13    void setDifficulty(int newDifficulty);
    14         inline void setEnemyList(std::vector<WorldEntity*>* enemyList){this->enemyList=enemyList;}
    15         inline Vector getPosition(){return myWorldEntity->getAbsCoor();}
    16         inline Vector getMovement(){return movement;}
    1713        inline void setDestination(Vector destination){this->destination=destination;}
    1814        inline void setDestinationMovement(Vector destinationMovement){this->destinationMovement=destinationMovement;}
    1915        inline void setWeight(int weight){this->weight=weight;}
    2016        inline void setTarget(WorldEntity* target){this->target=target;}
     17        inline void setNPC(WorldEntity* npc){this->npc=npc;}
     18
     19        inline Vector getPosition(){return npc->getAbsCoor();}
     20        inline Vector getMovement(){return movement;}
     21        inline Vector getView(){return view;}
     22        inline WorldEntity* getNPC(){return npc;}
     23        inline WorldEntity* getTarget(){return target;}
     24        inline float getWeight(){return weight;}
     25        inline float getMaxAcceleration(){return accelerationMax;}
     26        inline float getMaxSpeed(){return speedMax;}
     27
     28        void getAttributesFrom(AIModule* oldModule);
    2129
    2230 protected:
    23    NPC2* myNPC;
    24         WorldEntity* myWorldEntity;
    25         std::vector<WorldEntity*>* enemyList;
     31        float getRadius(WorldEntity* object);
    2632
    2733        Vector destination;
    2834        Vector destinationMovement;
     35        Vector destinationView;
     36
     37
    2938        Vector movement;
     39        Vector view;
     40
     41        WorldEntity* npc;
     42        WorldEntity* target;
    3043
    3144        float weight;
    3245        float speedMax;
    33 
    34         WorldEntity* target;
     46        float accelerationMax;
    3547};
    3648
  • branches/ai/src/ai/ai_swarm.cc

    r10177 r10226  
    1515#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_AI
    1616#include "ai_swarm.h"
     17#include "ai_module.h"
     18#include "movement_module.h"
     19#include "attack_module.h"
    1720#include "debug.h"
    1821#include <stdio.h>
     22#include "aabb.h"
    1923
    2024AISwarm::AISwarm()
     
    2731void AISwarm::process(float dt)
    2832{
    29         if(tickCount>=randomFreq && movement.len()<60){
     33        std::map<WorldEntity*,AIModule*>::iterator it;
     34
     35        Vector swarmPosition=this->getPosition();
     36        Vector targetPosition=target->getAbsCoor();
     37        float distanceToTarget=(swarmPosition-targetPosition).len();
     38
     39        float aMax=70.0f;
     40        float vMax=1000.0f;
     41        float deltaDistance=30;
     42        float attackDistance=100;
     43
     44
     45
     46        if(distanceToTarget+deltaDistance<=attackDistance && status!=ATTACKING){
     47                for (it= members.begin(); it!= members.end(); it++ ){
     48                        AIModule* oldAI = it->second;
     49                        AIModule* newAI = new AttackModule();
     50                        newAI->getAttributesFrom(oldAI);
     51                        it->second=newAI;
     52                        delete oldAI;
     53                        status=ATTACKING;
     54                }
     55        }else if(distanceToTarget-deltaDistance>=attackDistance && status!=MOVING){
     56                for (it= members.begin(); it!= members.end(); it++ ){
     57                        AIModule* oldAI = it->second;
     58                        AIModule* newAI = new MovementModule();
     59                        newAI->getAttributesFrom(oldAI);
     60                        it->second=newAI;
     61                        delete oldAI;
     62                        status=MOVING;
     63                }
     64        }
     65
     66
     67
     68        if(status!=ATTACKING && tickCount>=randomFreq){
    3069                tickCount=0;
    31                 int x = (rand()%141)+10;                                //10-150
     70                //int x = (rand()%141)+10;                              //10-150
     71                int x = (rand()%241)-120;                       //-120-120
    3272                int z = (rand()%241)-120;                       //-120-120
    3373                randomVector=Vector(x,0,z);
    3474
    35                 std::cout << "change to: ||" << randomVector.x << "   ==" << randomVector.z << "\n";
     75                //std::cout << "change to: ||" << randomVector.x << "   ==" << randomVector.z << "\n";
    3676        }
    3777        tickCount++;
    3878
    3979
    40         std::set<AIModule*>::iterator it;
    41         Vector swarmPosition=this->getPosition();
    42         //std::cout << swarmPosition.x << " " << swarmPosition.z << "\n";
    43 
    44         float aMax=70.0f;
    45         float vMax=1000.0f;
    4680
    4781        Vector correction=(destination+randomVector-swarmPosition)-movement;
     
    5892
    5993
    60         for (it= swarmMembers.begin(); it!= swarmMembers.end(); it++ ){
    61                 (*it)->setDestination(swarmPosition);
    62                 (*it)->setDestinationMovement(movement);
    63                 (*it)->setEnemyList(enemyList);
    64                 (*it)->process(dt);
     94
     95        for (it= members.begin(); it!= members.end(); it++ ){
     96                it->second->setDestination(swarmPosition);
     97                it->second->setDestinationMovement(movement);
     98                it->second->setTarget(target);
     99                it->second->process(dt);
    65100        }
    66101}
    67102
    68103
    69 void AISwarm::addAI(AIModule* aiModule)
     104
     105void AISwarm::addAI(WorldEntity* npc)
    70106{
    71         swarmMembers.insert(aiModule);
     107        std::pair< std::map<WorldEntity*,AIModule*>::iterator , bool > p;
     108        AIModule* newAIModule=new MovementModule(npc);
     109        p=members.insert(std::make_pair(npc,newAIModule));
     110        if(!p.second)delete newAIModule;
    72111}
    73112
    74113
    75 void AISwarm::removeAI(AIModule* aiModule)
     114void AISwarm::removeAI(WorldEntity* npc)
    76115{
    77         std::set<AIModule*>::iterator it=swarmMembers.find(aiModule);
    78         if(it==swarmMembers.end())return;
    79         delete (*it);
     116        std::map<WorldEntity*,AIModule*>::iterator it = members.find(npc);
     117        if(it==members.end())return;            //npc not found
     118        delete it->second;                                      //delete AIModule
     119        members.erase(it);                                      //remove AIModule from members
    80120}
    81121
     
    84124{
    85125        Vector center=Vector(0,0,0);
    86         std::set<AIModule*>::iterator it;
    87         for (it= swarmMembers.begin(); it!= swarmMembers.end(); it++ )
    88                 center=center+(*it)->getPosition();
     126        std::map<WorldEntity*,AIModule*>::iterator it;
     127        for (it= members.begin(); it!= members.end(); it++ )
     128                center=center+it->second->getPosition();
    89129
    90         return center/swarmMembers.size();
     130        return center/members.size();
    91131}
     132
     133float AISwarm::getRadius(WorldEntity* object)
     134{
     135        AABB* aabb = object->getModelAABB();
     136        if( aabb == NULL)return -1;
     137
     138        float a = aabb->halfLength[0];
     139        float b = aabb->halfLength[1];
     140        float c = aabb->halfLength[2];
     141
     142        if(a>b){
     143                return (c>a)?c:a;
     144        }else{
     145                return (c>b)?c:b;
     146        }
     147}
  • branches/ai/src/ai/ai_swarm.h

    r10177 r10226  
    66#include "ai_module.h"
    77
     8
     9
    810class AISwarm{
    911        public:
     
    1113                ~AISwarm(){}
    1214                void process(float dt);
    13                 void addAI(AIModule* newMember);
    14                 void removeAI(AIModule* oldMember);
    15                 inline int getSwarmSize(){return swarmMembers.size();}
    16                 inline void setEnemyList(std::vector<WorldEntity*>* enemyList){this->enemyList=enemyList;}
     15                void addAI(WorldEntity*);
     16                void removeAI(WorldEntity*);
     17
     18                inline int getSwarmSize(){return members.size();}
    1719                inline void setDestination(Vector destination){this->destination=destination;}
     20                inline void setTarget(WorldEntity* target){this->target=target;}
    1821                Vector getPosition();
     22
     23                enum statusType{ATTACKING,MOVING,WAITING};
     24
    1925        private:
     26                float getRadius(WorldEntity* object);
     27
     28
    2029                Vector destination;
    2130                Vector movement;
    22                 std::vector<WorldEntity*>* enemyList;
    23                 std::set<AIModule*> swarmMembers;
     31                WorldEntity* target;
     32                statusType status;
     33
     34                std::map<WorldEntity*,AIModule*> members;
     35
    2436                int tickCount;
    2537                int randomFreq;
  • branches/ai/src/ai/ai_team.cc

    r10177 r10226  
    2121        std::map<int,AISwarm*>::iterator it;
    2222        for (it= swarms.begin(); it!= swarms.end(); it++ ){
    23 
    24                 it->second->setEnemyList(enemyList);
    25                 if(enemyList->size()>0)
     23                if(enemyList->size()>0){
     24                        it->second->setTarget(enemyList->at(0));
    2625                        it->second->setDestination(enemyList->at(0)->getAbsCoor());
     26                }
    2727                it->second->process(dt);
    2828        }
     
    3030
    3131
    32 void AITeam::addAI(int swarmNumber, AIModule* aiModule)
     32void AITeam::addAI(int swarmNumber, WorldEntity* npc)
    3333{
    3434        std::pair<std::map<int,AISwarm*>::iterator,bool> p;
     
    3636        p=swarms.insert(std::make_pair(swarmNumber,newSwarm));
    3737        if(!p.second)delete newSwarm;
    38         p.first->second->addAI(aiModule);
     38        p.first->second->addAI(npc);
    3939}
    4040
    4141
    42 void AITeam::removeAI(int swarmNumber, AIModule* aiModule)
     42void AITeam::removeAI(int swarmNumber, WorldEntity* npc)
    4343{
    4444        std::map<int,AISwarm*>::iterator it = swarms.find(swarmNumber);
    4545        if(it==swarms.end())return;
    46         it->second->removeAI(aiModule);
     46        it->second->removeAI(npc);
    4747        if(it->second->getSwarmSize()==0){
    4848                delete it->second;
  • branches/ai/src/ai/ai_team.h

    r10177 r10226  
    1111        std::vector<WorldEntity*>* getEnemyList();
    1212        void process(float dt);
    13         void addAI(int swarmNumber, AIModule* aiModule);
    14         void removeAI(int swarmNumber, AIModule* aiModule);
     13        void addAI(int swarmNumber, WorldEntity* npc);
     14        void removeAI(int swarmNumber, WorldEntity* npc);
    1515        inline int getTeamSize(){ return swarms.size(); }
    1616        inline void setEnemyList(std::vector<WorldEntity*>* enemyList){this->enemyList=enemyList;}
  • branches/ai/src/ai/movement_module.cc

    r10177 r10226  
    2121#include "player.h"
    2222#include "playable.h"
    23 #include "aabb.h"
    2423#include "npcs/npc_test.h"
    2524
     
    5049
    5150
    52 
    53 float MovementModule::getRadius(WorldEntity* object)
    54 {
    55         AABB* aabb = object->getModelAABB();
    56         if( aabb == NULL)return -1;
    57 
    58         float a = aabb->halfLength[0];
    59         float b = aabb->halfLength[1];
    60         float c = aabb->halfLength[2];
    61 
    62         if(a>b){
    63                 return (c>a)?c:a;
    64         }else{
    65                 return (c>b)?c:b;
    66         }
    67 }
    68 
    69 
    7051void MovementModule::process(float dt)
    7152{
    72         if(myNPC == NULL)return;
     53        if(npc == NULL)return;
    7354
    7455        Vector tmpVector;
     
    7657        Vector npcCollision;
    7758        Vector playerCollision;
    78         bool autoRotate=true;
    79         target=enemyList->at(0);
    8059
    8160        weight=1;
    82         speedMax=1000.0f;
    8361
    8462
     
    9169
    9270        //get information about myself
    93         Vector myPosition = myNPC->getAbsCoor();
    94         float myRadius = getRadius(myNPC);
     71        Vector myPosition = npc->getAbsCoor();
     72        float myRadius = getRadius(npc);
     73
     74
     75        float aMax=maxAccleration;
     76        float vMax=800.0f/myRadius;
    9577
    9678
     
    10688        for(ObjectList<WorldEntity>::const_iterator it = WorldEntity::objectList().begin(); it != WorldEntity::objectList().end(); ++it)
    10789        {
    108                 if(*it==myNPC)continue;
     90                if(*it==npc)continue;
    10991
    11092                tmpVector=myPosition-(*it)->getAbsCoor();
     
    11597
    11698                npcCollision=npcCollision+tmpVector;
    117         }
    118 
    119 
    120         //random movement
    121         //randomFreq=testValue2;
    122         if(++tickCount>=randomFreq && movement.len()<60){
    123                 tickCount=0;
    124                 int x = (rand()%101)-50;                        //-50-50
    125                 int z = (rand()%101)-50;                        //-50-50
    126                 randomVector=Vector(x,0,z);
    127                 randomFreq=(rand()%81)+70;                      //70-150 Ticks
    12899        }
    129100
     
    138109                                                                +       (vectorToDestination-movement)*3;
    139110
    140         if(movement.len()<testValue2){
    141         //if(testValue2){
    142                 correction=correction + randomVector * testValue;
    143                 autoRotate=false;
    144         }
    145 
    146111        correction.y=0;
    147112
     
    149114        //limit accleration
    150115        float correctionLen=correction.len();
    151         if(correctionLen>maxAccleration*dt)correction=correction/correctionLen*maxAccleration*dt;
     116        if(correctionLen>aMax*dt)correction=correction/correctionLen*aMax*dt;
    152117        movement+=correction;
    153118
     
    155120        //limit speed
    156121        float movementLen=movement.len();
    157         if(movementLen>speedMax)movement=movement/movementLen*speedMax;
     122        if(movementLen>vMax)movement=movement/movementLen*vMax;
    158123
    159124
    160125        //move NPC...
    161         myNPC->shiftCoor(movement * dt);
     126        npc->shiftCoor(movement * dt);
    162127
    163128
    164129        //rotate NPC
    165         Vector view;
    166         if(autoRotate){
    167                 view = movement.cross( Vector(0,1,0) ).getNormalized();
    168         }else{
    169                 view = target->getAbsCoor()-myPosition;
    170                 view = view.cross( Vector(0,1,0) ).getNormalized();
    171         }
    172         myNPC->setAbsDirSoft( Quaternion( view, Vector(0,1,0)),3);
     130        view = movement.cross( Vector(0,1,0) ).getNormalized();
     131        npc->setAbsDirSoft( Quaternion( view, Vector(0,1,0)),3);
    173132
    174133}
  • branches/ai/src/ai/movement_module.h

    r10177 r10226  
    1414        public:
    1515                MovementModule();
    16                 inline MovementModule(NPC2* object){ this->myNPC=object; this->myWorldEntity=(WorldEntity*)object;}
     16                inline MovementModule(WorldEntity* object){this->npc=object;}
    1717                virtual ~MovementModule(){}
    1818                virtual void process(float dt);
     
    2929                float myMaxSpeed;
    3030
    31                 float getRadius(WorldEntity* object);
    32 
    3331                static float maxAccleration;
    3432                static float distanceToPlayer;
  • branches/ai/src/world_entities/npcs/npc_test.cc

    r10138 r10226  
    5151        std::cout << "Team Number: " << teamNumber << "\n";
    5252        std::cout << "Swarm Number:" << swarmNumber << "\n";
    53         aiModule=new MovementModule(this);
    54         AIEngine::getInstance()->addAI(teamNumber,swarmNumber,aiModule);
     53        //aiModule=new MovementModule(this);
     54        //AIEngine::getInstance()->addAI(teamNumber,swarmNumber,aiModule);
     55        AIEngine::getInstance()->addAI(teamNumber,swarmNumber,(WorldEntity*)this);
    5556}
    5657
    5758NPC2::~NPC2()
    5859{
    59         AIEngine::getInstance()->removeAI(teamNumber,swarmNumber,aiModule);
     60        AIEngine::getInstance()->removeAI(teamNumber,swarmNumber,(WorldEntity*)this);
    6061}
    6162
Note: See TracChangeset for help on using the changeset viewer.