BWAPI
|
00001 #include "ReservedLocation.h" 00002 00003 #include <algorithm> 00004 #include <limits> 00005 00006 #include "BuildingPlacer.h" 00007 #include "UnitPredictor.h" 00008 00009 ReservedLocationClass::ReservedLocationClass(BWAPI::UnitType type, BuildingLocation location) 00010 : mType(ReservationType::BuildingPosition) 00011 , mUnitType(type) 00012 , mLocation(location) 00013 , mTilePosition(BWAPI::TilePositions::None) 00014 , mPosition(BWAPI::Positions::None) 00015 , mUnit() 00016 , mNextCalculationAttempt(0) 00017 , mBase() 00018 , mUnitPrediction() 00019 , mForcedCompleted(false) 00020 , mStartTime(std::numeric_limits<int>::max()) 00021 { 00022 } 00023 00024 ReservedLocationClass::ReservedLocationClass(Unit unit) 00025 : mType(ReservationType::LandingPosition) 00026 , mUnitType(unit->getType()) 00027 , mLocation(BuildingLocation::None) 00028 , mTilePosition(BWAPI::TilePositions::None) 00029 , mPosition(BWAPI::Positions::None) 00030 , mUnit(unit) 00031 , mNextCalculationAttempt(0) 00032 , mBase() 00033 , mUnitPrediction() 00034 , mForcedCompleted(false) 00035 , mStartTime(std::numeric_limits<int>::max()) 00036 { 00037 } 00038 00039 void ReservedLocationClass::setTilePosition(TilePosition position) 00040 { 00041 mTilePosition = position; 00042 if(position != BWAPI::TilePositions::None) 00043 mPosition = Position(position.x()*32+(mUnitType.tileWidth()*16), position.y()*32+(mUnitType.tileHeight()*16)); 00044 else 00045 mPosition = BWAPI::Positions::None; 00046 00047 if(mUnitPrediction) 00048 { 00049 if(mPosition == BWAPI::Positions::None) 00050 { 00051 UnitPredictor::Instance().deletePrediction(mUnitPrediction); 00052 mUnitPrediction = StaticUnits::nullunit; 00053 } 00054 else 00055 mUnitPrediction->setPosition(mPosition); 00056 } 00057 else if(mPosition != BWAPI::Positions::None) 00058 { 00059 mUnitPrediction = UnitPredictor::Instance().createPrediction(mPosition, mUnitType, mStartTime); 00060 UnitPredictor::Instance().savePrediction(mUnitPrediction); 00061 } 00062 } 00063 00064 bool ReservedLocationClass::update() 00065 { 00066 bool isFinished = mUnitPrediction && mUnitPrediction->exists(); 00067 if(shouldFree()) 00068 { 00069 BuildingPlacer::Instance().free(shared_from_this()); 00070 setTilePosition(BWAPI::TilePositions::None); 00071 } 00072 00073 if(isFinished || mForcedCompleted) 00074 return true; 00075 00076 if(mTilePosition == BWAPI::TilePositions::None && mNextCalculationAttempt <= BWAPI::Broodwar->getFrameCount()) 00077 { 00078 std::pair<TilePosition, Base> locationPair; 00079 if(mType == ReservationType::BuildingPosition) 00080 locationPair = BuildingPlacer::Instance().buildingLocationToTile(mLocation, mUnitType); 00081 else if(mType == ReservationType::LandingPosition) 00082 locationPair = BuildingPlacer::Instance().getlandingLocation(mUnit); 00083 00084 if(locationPair.first == BWAPI::TilePositions::None || BuildingPlacer::Instance().isLocationBuildable(locationPair.first, mUnitType, true)) 00085 { 00086 setTilePosition(locationPair.first); 00087 mBase = locationPair.second; 00088 00089 if(mTilePosition == BWAPI::TilePositions::None) 00090 mNextCalculationAttempt = BWAPI::Broodwar->getFrameCount() + 24; 00091 else 00092 BuildingPlacer::Instance().reserve(shared_from_this()); 00093 } 00094 } 00095 00096 return false; 00097 } 00098 00099 bool ReservedLocationClass::shouldFree() 00100 { 00101 if(mTilePosition != BWAPI::TilePositions::None) 00102 { 00103 if(mForcedCompleted || (mUnitPrediction && mUnitPrediction->exists())) 00104 return true; 00105 00106 if(!BuildingPlacer::Instance().isLocationBuildable(mTilePosition, mUnitType, true)) 00107 return true; 00108 00109 if(mLocation == BuildingLocation::Base) 00110 { 00111 const std::vector<Base> &bases = BuildingPlacer::Instance().baseToBuildAtOrder(mUnitType); 00112 if(std::find(bases.begin(), bases.end(), mBase) == bases.end()) 00113 return true; 00114 } 00115 } 00116 00117 return false; 00118 } 00119 00120 void ReservedLocationClass::setStartTime(int time) 00121 { 00122 mStartTime = time; 00123 00124 if(mUnitPrediction) 00125 mUnitPrediction->setBuildTime(time); 00126 }