BWAPI
Skynet/Skynet/ReservedLocation.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines