BWAPI
|
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> µActions) 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> µActions) 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 }