Add company rate limit for land area purchasing

pull/73/head
Jonathan G Rennison 6 years ago
parent 479a9e31e9
commit 46b1ea81e4

@ -86,6 +86,7 @@ struct CompanyProperties {
uint32 terraform_limit; ///< Amount of tileheights we can (still) terraform (times 65536).
uint32 clear_limit; ///< Amount of tiles we can (still) clear (times 65536).
uint32 tree_limit; ///< Amount of trees we can (still) plant (times 65536).
uint32 purchase_land_limit; ///< Amount of tiles we can (still) purchase (times 65536).
/**
* If \c true, the company is (also) controlled by the computer (a NoAI program).
@ -104,7 +105,7 @@ struct CompanyProperties {
face(0), money(0), money_fraction(0), current_loan(0), colour(0), block_preview(0),
location_of_HQ(0), last_build_coordinate(0), share_owners(), inaugurated_year(0),
months_of_bankruptcy(0), bankrupt_asked(0), bankrupt_timeout(0), bankrupt_value(0),
terraform_limit(0), clear_limit(0), tree_limit(0), is_ai(false) {}
terraform_limit(0), clear_limit(0), tree_limit(0), purchase_land_limit(0), is_ai(false) {}
~CompanyProperties()
{

@ -67,6 +67,7 @@ Company::Company(uint16 name_1, bool is_ai)
this->terraform_limit = _settings_game.construction.terraform_frame_burst << 16;
this->clear_limit = _settings_game.construction.clear_frame_burst << 16;
this->tree_limit = _settings_game.construction.tree_frame_burst << 16;
this->purchase_land_limit = _settings_game.construction.purchase_land_frame_burst << 16;
for (uint j = 0; j < 4; j++) this->share_owners[j] = COMPANY_SPECTATOR;
InvalidateWindowData(WC_PERFORMANCE_DETAIL, 0, INVALID_COMPANY);
@ -273,6 +274,7 @@ void UpdateLandscapingLimits()
c->terraform_limit = min(c->terraform_limit + _settings_game.construction.terraform_per_64k_frames, (uint32)_settings_game.construction.terraform_frame_burst << 16);
c->clear_limit = min(c->clear_limit + _settings_game.construction.clear_per_64k_frames, (uint32)_settings_game.construction.clear_frame_burst << 16);
c->tree_limit = min(c->tree_limit + _settings_game.construction.tree_per_64k_frames, (uint32)_settings_game.construction.tree_frame_burst << 16);
c->purchase_land_limit = min(c->purchase_land_limit + _settings_game.construction.purchase_land_per_64k_frames, (uint32)_settings_game.construction.purchase_land_frame_burst << 16);
}
}

@ -5284,6 +5284,7 @@ STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Object i
STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... company headquarters in the way
STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}Can't purchase this land area...
STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... you already own it!
STR_ERROR_PURCHASE_LAND_LIMIT_REACHED :{WHITE}... land area purchasing limit reached
# Group related errors
STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Can't create group...

@ -305,6 +305,7 @@ CommandCost CmdBuildObject(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
}
int hq_score = 0;
Company *c = nullptr;
switch (type) {
case OBJECT_TRANSMITTER:
case OBJECT_LIGHTHOUSE:
@ -317,6 +318,10 @@ CommandCost CmdBuildObject(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
IsObjectType(tile, OBJECT_OWNED_LAND)) {
return_cmd_error(STR_ERROR_YOU_ALREADY_OWN_IT);
}
c = Company::GetIfValid(_current_company);
if (c != NULL && (int)GB(c->purchase_land_limit, 16, 16) < 1) {
return_cmd_error(STR_ERROR_PURCHASE_LAND_LIMIT_REACHED);
}
break;
case OBJECT_HQ: {
@ -349,6 +354,8 @@ CommandCost CmdBuildObject(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
/* Make sure the HQ starts at the right size. */
if (type == OBJECT_HQ) UpdateCompanyHQ(tile, hq_score);
if (type == OBJECT_OWNED_LAND && c != NULL) c->purchase_land_limit -= 1 << 16;
}
cost.AddCost(ObjectSpec::Get(type)->GetBuildCost() * size_x * size_y);

@ -3555,6 +3555,12 @@ bool AfterLoadGame()
}
}
if (SlXvIsFeatureMissing(XSLFI_BUY_LAND_RATE_LIMIT)) {
/* Introduced land purchasing limit. */
Company *c;
FOR_ALL_COMPANIES(c) c->purchase_land_limit = _settings_game.construction.purchase_land_frame_burst << 16;
}
/* Road stops is 'only' updating some caches */
AfterLoadRoadStops();
AfterLoadLabelMaps();

@ -295,6 +295,7 @@ static const SaveLoad _company_desc[] = {
SLE_CONDVAR(CompanyProperties, terraform_limit, SLE_UINT32, 156, SL_MAX_VERSION),
SLE_CONDVAR(CompanyProperties, clear_limit, SLE_UINT32, 156, SL_MAX_VERSION),
SLE_CONDVAR(CompanyProperties, tree_limit, SLE_UINT32, 175, SL_MAX_VERSION),
SLE_CONDVAR_X(CompanyProperties, purchase_land_limit, SLE_UINT32, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_BUY_LAND_RATE_LIMIT)),
SLE_END()
};

@ -88,6 +88,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = {
{ XSLFI_WHOLE_MAP_CHUNK, XSCF_NULL, 2, 2, "whole_map_chunk", NULL, NULL, "WMAP" },
{ XSLFI_ST_LAST_VEH_TYPE, XSCF_NULL, 1, 1, "station_last_veh_type", NULL, NULL, NULL },
{ XSLFI_SELL_AT_DEPOT_ORDER, XSCF_NULL, 1, 1, "sell_at_depot_order", NULL, NULL, NULL },
{ XSLFI_BUY_LAND_RATE_LIMIT, XSCF_NULL, 1, 1, "buy_land_rate_limit", NULL, NULL, NULL },
{ XSLFI_NULL, XSCF_NULL, 0, 0, NULL, NULL, NULL, NULL },// This is the end marker
};

@ -62,6 +62,7 @@ enum SlXvFeatureIndex {
XSLFI_WHOLE_MAP_CHUNK, ///< Whole map chunk
XSLFI_ST_LAST_VEH_TYPE, ///< Per-cargo station last vehicle type
XSLFI_SELL_AT_DEPOT_ORDER, ///< Sell vehicle on arrival at depot orders
XSLFI_BUY_LAND_RATE_LIMIT, ///< Buy land rate limit
XSLFI_RIFF_HEADER_60_BIT, ///< Size field in RIFF chunk header is 60 bit
XSLFI_HEIGHT_8_BIT, ///< Map tile height is 8 bit instead of 4 bit, but savegame version may be before this became true in trunk

@ -385,6 +385,8 @@ struct ConstructionSettings {
uint16 clear_frame_burst; ///< how many tiles may, over a short period, be cleared?
uint32 tree_per_64k_frames; ///< how many trees may, over a long period, be planted per 65536 frames?
uint16 tree_frame_burst; ///< how many trees may, over a short period, be planted?
uint32 purchase_land_per_64k_frames; ///< how many tiles may, over a long period, be purchased per 65536 frames?
uint16 purchase_land_frame_burst; ///< how many tiles may, over a short period, be purchased?
uint8 tree_growth_rate; ///< tree growth rate
};

@ -553,6 +553,30 @@ max = 1 << 30
interval = 1
cat = SC_EXPERT
[SDT_VAR]
base = GameSettings
var = construction.purchase_land_per_64k_frames
type = SLE_UINT32
from = 0
def = 16 << 16
min = 0
max = 1 << 30
interval = 1
cat = SC_EXPERT
patxname = ""buy_land_rate_limit.construction.purchase_land_per_64k_frames""
[SDT_VAR]
base = GameSettings
var = construction.purchase_land_frame_burst
type = SLE_UINT16
from = 0
def = 1024
min = 0
max = 1 << 30
interval = 1
cat = SC_EXPERT
patxname = ""buy_land_rate_limit.construction.purchase_land_frame_burst""
[SDT_BOOL]
base = GameSettings
var = construction.autoslope

Loading…
Cancel
Save