Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 10226 in orxonox.OLD for branches/ai/src/ai/ai_swarm.cc


Ignore:
Timestamp:
Jan 10, 2007, 6:31:30 PM (17 years ago)
Author:
tfahrni
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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}
Note: See TracChangeset for help on using the changeset viewer.