diff --git a/src/company_base.h b/src/company_base.h index 8d3499a17b..ace1f584bb 100644 --- a/src/company_base.h +++ b/src/company_base.h @@ -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() { diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 50504af1ad..9ea75e0705 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -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); } } diff --git a/src/lang/english.txt b/src/lang/english.txt index 5557e34d53..005c3f5ed7 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -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... diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index 3ced5f3cdd..244faec5e6 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -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); diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 0e46d6f7b1..56315e8f50 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -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(); diff --git a/src/saveload/company_sl.cpp b/src/saveload/company_sl.cpp index 8f6682b637..0458d391f3 100644 --- a/src/saveload/company_sl.cpp +++ b/src/saveload/company_sl.cpp @@ -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() }; diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 37ac2030ec..2054a59c02 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -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 }; diff --git a/src/saveload/extended_ver_sl.h b/src/saveload/extended_ver_sl.h index 0c10a9859e..02e91e7133 100644 --- a/src/saveload/extended_ver_sl.h +++ b/src/saveload/extended_ver_sl.h @@ -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 diff --git a/src/settings_type.h b/src/settings_type.h index b18307f4c5..ad87b91b97 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -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 }; diff --git a/src/table/settings.ini b/src/table/settings.ini index 785de1e197..eda00a3c36 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -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