allow distance rules to specify owner of units
This commit is contained in:
parent
0a6739b153
commit
180de1f00d
3 changed files with 32 additions and 27 deletions
src
|
@ -408,6 +408,7 @@ public:
|
|||
int Distance; /// distance to build (circle)
|
||||
DistanceTypeType DistanceType;
|
||||
std::string RestrictTypeName;
|
||||
std::string RestrictTypeOwner;
|
||||
CUnitType *RestrictType;
|
||||
};
|
||||
|
||||
|
|
|
@ -134,43 +134,45 @@ bool CBuildRestrictionDistance::Check(const CUnit *builder, const CUnitType &typ
|
|||
std::vector<CUnit *> table;
|
||||
Select(pos1, pos2, table);
|
||||
|
||||
switch (this->DistanceType) {
|
||||
case GreaterThan :
|
||||
case GreaterThanEqual :
|
||||
for (size_t i = 0; i != table.size(); ++i) {
|
||||
if (builder != table[i] && this->RestrictType == table[i]->Type &&
|
||||
MapDistanceBetweenTypes(type, pos, *table[i]->Type, table[i]->tilePos) <= distance) {
|
||||
for (size_t i = 0; i != table.size(); ++i) {
|
||||
if (builder != table[i] &&
|
||||
// unit has RestrictType or no RestrictType was set, but a RestrictTypeOwner
|
||||
(this->RestrictType == table[i]->Type || !this->RestrictType && this->RestrictTypeOwner.size() > 0) &&
|
||||
// RestrictTypeOwner is not set or unit belongs to a suitable player
|
||||
(this->RestrictTypeOwner.size() == 0 ||
|
||||
!this->RestrictTypeOwner.compare("self") && ThisPlayer == table[i]->Player ||
|
||||
!this->RestrictTypeOwner.compare("allied") && (ThisPlayer == table[i]->Player || ThisPlayer->IsAllied(*table[i]->Player)) ||
|
||||
!this->RestrictTypeOwner.compare("enemy") && ThisPlayer->IsEnemy(*table[i]->Player))) {
|
||||
|
||||
switch (this->DistanceType) {
|
||||
case GreaterThan :
|
||||
case GreaterThanEqual :
|
||||
if (MapDistanceBetweenTypes(type, pos, *table[i]->Type, table[i]->tilePos) <= distance) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
case LessThan :
|
||||
case LessThanEqual :
|
||||
for (size_t i = 0; i != table.size(); ++i) {
|
||||
if (builder != table[i] && this->RestrictType == table[i]->Type &&
|
||||
MapDistanceBetweenTypes(type, pos, *table[i]->Type, table[i]->tilePos) <= distance) {
|
||||
break;
|
||||
case LessThan :
|
||||
case LessThanEqual :
|
||||
if (MapDistanceBetweenTypes(type, pos, *table[i]->Type, table[i]->tilePos) <= distance) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case Equal :
|
||||
for (size_t i = 0; i != table.size(); ++i) {
|
||||
if (builder != table[i] && this->RestrictType == table[i]->Type &&
|
||||
MapDistanceBetweenTypes(type, pos, *table[i]->Type, table[i]->tilePos) == distance) {
|
||||
break;
|
||||
case Equal :
|
||||
if (MapDistanceBetweenTypes(type, pos, *table[i]->Type, table[i]->tilePos) == distance) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case NotEqual :
|
||||
for (size_t i = 0; i != table.size(); ++i) {
|
||||
if (builder != table[i] && this->RestrictType == table[i]->Type &&
|
||||
MapDistanceBetweenTypes(type, pos, *table[i]->Type, table[i]->tilePos) == distance) {
|
||||
break;
|
||||
case NotEqual :
|
||||
if (MapDistanceBetweenTypes(type, pos, *table[i]->Type, table[i]->tilePos) == distance) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return (this->DistanceType == GreaterThan ||
|
||||
this->DistanceType == GreaterThanEqual ||
|
||||
this->DistanceType == NotEqual);
|
||||
}
|
||||
|
||||
inline bool CBuildRestrictionAddOn::functor::operator()(const CUnit *const unit) const
|
||||
|
|
|
@ -254,6 +254,8 @@ static void ParseBuildingRules(lua_State *l, std::vector<CBuildRestriction *> &b
|
|||
}
|
||||
} else if (!strcmp(value, "Type")) {
|
||||
b->RestrictTypeName = LuaToString(l, -1);
|
||||
} else if (!strcmp(value, "Owner")) {
|
||||
b->RestrictTypeOwner = LuaToString(l, -1);
|
||||
} else {
|
||||
LuaError(l, "Unsupported BuildingRules distance tag: %s" _C_ value);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue