BWAPI
Skynet/Skynet/Behaviour.cpp
Go to the documentation of this file.
00001 #include "Behaviour.h"
00002 
00003 #include "GoalAction.h"
00004 #include "BasicUnitAction.h"
00005 #include "TrainScarabAction.h"
00006 #include "PsiStormAction.h"
00007 #include "MineDragAction.h"
00008 #include "ArconZealotKillUnDetected.h"
00009 #include "ArbiterAction.h"
00010 #include "DetectorAction.h"
00011 
00012 Behaviour::Behaviour(Unit unit)
00013         : mUnit(unit)
00014 {
00015         createDefaultActions();
00016 }
00017 
00018 Behaviour::Behaviour(Unit unit, const std::list<MicroAction> &microActions)
00019         : mUnit(unit)
00020         , mMicroActions(microActions)
00021 {
00022 }
00023 
00024 void Behaviour::addMicroAction(MicroAction action)
00025 {
00026         mMicroActions.push_front(action);
00027 }
00028 
00029 void Behaviour::update(const Goal &squadGoal, const UnitGroup &squadUnitGroup)
00030 {
00031         for each(MicroAction action in mMicroActions)
00032         {
00033                 if(action->update(squadGoal, squadUnitGroup))
00034                         break;
00035         }
00036 
00037         for(std::list<MicroAction>::iterator it = mMicroActions.begin(); it != mMicroActions.end();)
00038         {
00039                 if((*it)->hasEnded())
00040                         mMicroActions.erase(it++);
00041                 else
00042                         ++it;
00043         }
00044 }
00045 
00046 void Behaviour::onDeleted()
00047 {
00048         for each(MicroAction action in mMicroActions)
00049         {
00050                 action->removeUnit(mUnit);
00051         }
00052 
00053         mMicroActions.clear();
00054         mUnit.reset();
00055 }
00056 
00057 void Behaviour::set(Unit unit)
00058 {
00059         mUnit = unit;
00060         createDefaultActions();
00061 }
00062 
00063 void Behaviour::set(Unit unit, const std::list<MicroAction> &microActions)
00064 {
00065         mUnit = unit;
00066         mMicroActions = microActions;
00067 }
00068 
00069 void Behaviour::createDefaultActions()
00070 {
00071         const BWAPI::UnitType &unitType = mUnit->getType();
00072 
00073         std::list<std::set<BWAPI::UnitType>> targetPriorities;
00074 
00075         std::set<BWAPI::UnitType> firstTargets;
00076 
00077         if(unitType != BWAPI::UnitTypes::Protoss_Zealot)
00078                 firstTargets.insert(BWAPI::UnitTypes::Terran_Vulture_Spider_Mine);
00079 
00080         if(unitType == BWAPI::UnitTypes::Protoss_Corsair)
00081                 firstTargets.insert(BWAPI::UnitTypes::Zerg_Scourge);
00082 
00083         if(unitType == BWAPI::UnitTypes::Protoss_Zealot || unitType == BWAPI::UnitTypes::Protoss_Archon)
00084         {
00085                 firstTargets.insert(BWAPI::UnitTypes::Terran_Siege_Tank_Siege_Mode);
00086                 mMicroActions.push_back(MicroAction(new ArconZealotKillUnDetected(mUnit)));
00087         }
00088 
00089         targetPriorities.push_back(firstTargets);
00090 
00091         if(unitType.isDetector())
00092                 mMicroActions.push_back(MicroAction(new DetectorAction(mUnit)));
00093 
00094         if(unitType == BWAPI::UnitTypes::Protoss_Arbiter)
00095                 mMicroActions.push_back(MicroAction(new ArbiterAction(mUnit)));
00096 
00097         if(unitType == BWAPI::UnitTypes::Protoss_Reaver)
00098                 mMicroActions.push_back(MicroAction(new TrainScarabAction(mUnit)));
00099 
00100         if(unitType == BWAPI::UnitTypes::Protoss_High_Templar)
00101                 mMicroActions.push_back(MicroAction(new PsiStormAction(mUnit)));
00102 
00103         if(unitType == BWAPI::UnitTypes::Protoss_Zealot)
00104                 mMicroActions.push_back(MicroAction(new MineDragAction(mUnit)));
00105 
00106         mMicroActions.push_back(MicroAction(new BasicUnitAction(mUnit, targetPriorities)));
00107         mMicroActions.push_back(MicroAction(new GoalAction(mUnit)));
00108 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines