1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-06 09:09:40 +02:00

- fixed crash on start of some campaigns

- allowed on map factions is now set instead of bit field
This commit is contained in:
Ivan Savenko
2012-09-23 14:32:49 +00:00
parent 00c079f7dc
commit 3fcba4fb5c
10 changed files with 66 additions and 69 deletions

View File

@@ -543,31 +543,38 @@ int CGameInfoCallback::canBuildStructure( const CGTownInstance *t, int ID )
{
ERROR_RET_VAL_IF(!canGetFullInfo(t), "Town is not owned!", -1);
int ret = EBuildingState::ALLOWED;
if(t->builded >= VLC->modh->settings.MAX_BUILDING_PER_TURN)
ret = EBuildingState::CANT_BUILD_TODAY; //building limit
CBuilding * pom = t->town->buildings[ID];
if(!pom)
return EBuildingState::BUILDING_ERROR;
//checking resources
if(!pom->resources.canBeAfforded(getPlayer(t->tempOwner)->resources))
ret = EBuildingState::NO_RESOURCES; //lack of res
if(t->hasBuilt(ID)) //already built
return EBuildingState::ALREADY_PRESENT;
//can we build it?
if(t->forbiddenBuildings.find(ID)!=t->forbiddenBuildings.end())
return EBuildingState::FORBIDDEN; //forbidden
//checking for requirements
std::set<int> reqs = getBuildingRequiments(t, ID);//getting all requirements
bool notAllBuilt = false;
for( std::set<int>::iterator ri = reqs.begin(); ri != reqs.end(); ri++ )
{
if(!t->hasBuilt(*ri))
ret = EBuildingState::PREREQUIRES; //lack of requirements - cannot build
if(!t->hasBuilt(*ri)) //lack of requirements - cannot build
{
if(vstd::contains(t->forbiddenBuildings, *ri)) // not built requirement forbidden - same goes to this build
return EBuildingState::FORBIDDEN;
else
notAllBuilt = true; // no return here - we need to check if any required builds are forbidden
}
}
//can we build it?
if(t->forbiddenBuildings.find(ID)!=t->forbiddenBuildings.end())
ret = EBuildingState::FORBIDDEN; //forbidden
if(t->builded >= VLC->modh->settings.MAX_BUILDING_PER_TURN)
return EBuildingState::CANT_BUILD_TODAY; //building limit
if (notAllBuilt)
return EBuildingState::PREREQUIRES;
if(ID == 13) //capitol
{
@@ -578,8 +585,7 @@ int CGameInfoCallback::canBuildStructure( const CGTownInstance *t, int ID )
{
if(t->hasBuilt(EBuilding::CAPITOL))
{
ret = EBuildingState::HAVE_CAPITAL; //no more than one capitol
break;
return EBuildingState::HAVE_CAPITAL; //no more than one capitol
}
}
}
@@ -589,12 +595,14 @@ int CGameInfoCallback::canBuildStructure( const CGTownInstance *t, int ID )
const TerrainTile *tile = getTile(t->bestLocation(), false);
if(!tile || tile->tertype != TerrainTile::water )
ret = EBuildingState::NO_WATER; //lack of water
return EBuildingState::NO_WATER; //lack of water
}
if(t->hasBuilt(ID)) //already built
ret = EBuildingState::ALREADY_PRESENT;
return ret;
//checking resources
if(!pom->resources.canBeAfforded(getPlayer(t->tempOwner)->resources))
return EBuildingState::NO_RESOURCES; //lack of res
return EBuildingState::ALLOWED;
}
std::set<int> CGameInfoCallback::getBuildingRequiments( const CGTownInstance *t, int ID )