BWAPI
|
00001 #include "UnitFilter.h" 00002 00003 #include "UnitHelper.h" 00004 00005 UnitFilter::UnitFilter() 00006 : mType(UnitFilterType::None) 00007 , mOperatorType(OperatorType::None) 00008 , mLFilter() 00009 , mRFilter() 00010 , mExpectedValue(true) 00011 , mUnitType(BWAPI::UnitTypes::None) 00012 , mUnitFlags(UnitFilterFlags::None) 00013 { 00014 } 00015 00016 UnitFilter::UnitFilter(BWAPI::UnitType type) 00017 : mType(UnitFilterType::UnitOfType) 00018 , mOperatorType(OperatorType::None) 00019 , mLFilter() 00020 , mRFilter() 00021 , mExpectedValue(true) 00022 , mUnitType(type) 00023 , mUnitFlags(UnitFilterFlags::None) 00024 { 00025 } 00026 00027 UnitFilter::UnitFilter(UnitFilterFlags::type flags) 00028 : mType(UnitFilterType::PassesFlags) 00029 , mOperatorType(OperatorType::None) 00030 , mLFilter() 00031 , mRFilter() 00032 , mExpectedValue(true) 00033 , mUnitType(BWAPI::UnitTypes::None) 00034 , mUnitFlags(flags) 00035 { 00036 } 00037 00038 UnitFilter &UnitFilter::operator!() 00039 { 00040 mExpectedValue = !mExpectedValue; 00041 return *this; 00042 } 00043 00044 bool UnitFilter::operator!=(const UnitFilter& other) const 00045 { 00046 return !operator==(other); 00047 } 00048 00049 bool UnitFilter::operator==(const UnitFilter& other) const 00050 { 00051 if(mType != other.mType) 00052 return false; 00053 else if(mOperatorType != other.mOperatorType) 00054 return false; 00055 else if(*mLFilter != *other.mLFilter) 00056 return false; 00057 else if(*mRFilter != *other.mRFilter) 00058 return false; 00059 else if(mExpectedValue != other.mExpectedValue) 00060 return false; 00061 else if(mUnitType != other.mUnitType) 00062 return false; 00063 else if(mUnitFlags != other.mUnitFlags) 00064 return false; 00065 else 00066 return true; 00067 } 00068 00069 bool UnitFilter::operator<(const UnitFilter& other) const 00070 { 00071 if(mType < other.mType) 00072 return true; 00073 else if(mType != other.mType) 00074 return false; 00075 00076 if(mOperatorType < other.mOperatorType) 00077 return true; 00078 else if(mOperatorType != other.mOperatorType) 00079 return false; 00080 00081 if(*mLFilter < *other.mLFilter) 00082 return true; 00083 else if(*mLFilter != *other.mLFilter) 00084 return false; 00085 00086 if(*mRFilter < *other.mRFilter) 00087 return true; 00088 else if(*mRFilter != *other.mRFilter) 00089 return false; 00090 00091 if(mExpectedValue < other.mExpectedValue) 00092 return true; 00093 else if(mExpectedValue != other.mExpectedValue) 00094 return false; 00095 00096 if(mUnitType < other.mUnitType) 00097 return true; 00098 else if(mUnitType != other.mUnitType) 00099 return false; 00100 00101 if(mUnitFlags < other.mUnitFlags) 00102 return true; 00103 else if(mUnitFlags != other.mUnitFlags) 00104 return false; 00105 00106 return false; 00107 } 00108 00109 bool UnitFilter::filter(const Unit &unit) const 00110 { 00111 switch(mType.underlying()) 00112 { 00113 case UnitFilterType::None: 00114 return mExpectedValue; 00115 case UnitFilterType::UnitOfType: 00116 return (unit->getType() == mUnitType) == mExpectedValue; 00117 case UnitFilterType::PassesFlags: 00118 { 00119 if((mUnitFlags & UnitFilterFlags::IsComplete) != 0 && unit->isCompleted() != mExpectedValue) 00120 return false; 00121 if((mUnitFlags & UnitFilterFlags::HasAddon) != 0 && unit->hasAddon() != mExpectedValue) 00122 return false; 00123 if((mUnitFlags & UnitFilterFlags::IsLifted) != 0 && unit->isLifted() != mExpectedValue) 00124 return false; 00125 if((mUnitFlags & UnitFilterFlags::IsWorker) != 0 && unit->getType().isWorker() != mExpectedValue) 00126 return false; 00127 if((mUnitFlags & UnitFilterFlags::IsArmyUnit) != 0 && UnitHelper::isArmyUnit(unit->getType()) != mExpectedValue) 00128 return false; 00129 if((mUnitFlags & UnitFilterFlags::CanAttackGround) != 0 && unit->canAttackGround() != mExpectedValue) 00130 return false; 00131 if((mUnitFlags & UnitFilterFlags::CanAttackAir) != 0 && unit->canAttackAir() != mExpectedValue) 00132 return false; 00133 if((mUnitFlags & UnitFilterFlags::IsSpellCaster) != 0 && unit->getType().isSpellcaster() != mExpectedValue) 00134 return false; 00135 00136 return true; 00137 } 00138 } 00139 00140 return false; 00141 }