Add rate limit for object construction
This commit is contained in:
@@ -304,11 +304,13 @@ CommandCost CmdBuildObject(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
||||
}
|
||||
|
||||
int hq_score = 0;
|
||||
int build_object_size = 0;
|
||||
Company *c = nullptr;
|
||||
switch (type) {
|
||||
case OBJECT_TRANSMITTER:
|
||||
case OBJECT_LIGHTHOUSE:
|
||||
if (!IsTileFlat(tile)) return_cmd_error(STR_ERROR_FLAT_LAND_REQUIRED);
|
||||
build_object_size = 1;
|
||||
break;
|
||||
|
||||
case OBJECT_OWNED_LAND:
|
||||
@@ -344,8 +346,18 @@ CommandCost CmdBuildObject(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
||||
/* This may never be constructed using this method. */
|
||||
return CMD_ERROR;
|
||||
|
||||
default: // i.e. NewGRF provided.
|
||||
default: { // i.e. NewGRF provided.
|
||||
const ObjectSpec *spec = ObjectSpec::Get(type);
|
||||
build_object_size = GB(spec->size, 0, 4) * GB(spec->size, 4, 4);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (build_object_size > 0) {
|
||||
c = Company::GetIfValid(_current_company);
|
||||
if (c != nullptr && (int)GB(c->build_object_limit, 16, 16) < build_object_size) {
|
||||
return_cmd_error(STR_ERROR_BUILD_OBJECT_LIMIT_REACHED);
|
||||
}
|
||||
}
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
@@ -355,6 +367,7 @@ CommandCost CmdBuildObject(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
||||
if (type == OBJECT_HQ) UpdateCompanyHQ(tile, hq_score);
|
||||
|
||||
if (type == OBJECT_OWNED_LAND && c != nullptr) c->purchase_land_limit -= 1 << 16;
|
||||
if (build_object_size > 0 && c != nullptr) c->build_object_limit -= build_object_size << 16;
|
||||
}
|
||||
|
||||
cost.AddCost(ObjectSpec::Get(type)->GetBuildCost() * size_x * size_y);
|
||||
|
||||
Reference in New Issue
Block a user