diff --git a/src/script/api/script_town.cpp b/src/script/api/script_town.cpp --- a/src/script/api/script_town.cpp +++ b/src/script/api/script_town.cpp @@ -22,9 +22,9 @@ #include "../../safeguards.h" -/* static */ int32 ScriptTown::GetTownCount() +/* static */ SQInteger ScriptTown::GetTownCount() { - return (int32)::Town::GetNumItems(); + return ::Town::GetNumItems(); } /* static */ bool ScriptTown::IsValidTown(TownID town_id) @@ -63,14 +63,14 @@ return ScriptObject::Command::Do(town_id, text != nullptr ? text->GetEncodedText() : std::string{}); } -/* static */ int32 ScriptTown::GetPopulation(TownID town_id) +/* static */ SQInteger ScriptTown::GetPopulation(TownID town_id) { if (!IsValidTown(town_id)) return -1; const Town *t = ::Town::Get(town_id); return t->cache.population; } -/* static */ int32 ScriptTown::GetHouseCount(TownID town_id) +/* static */ SQInteger ScriptTown::GetHouseCount(TownID town_id) { if (!IsValidTown(town_id)) return -1; const Town *t = ::Town::Get(town_id); @@ -84,7 +84,7 @@ return t->xy; } -/* static */ int32 ScriptTown::GetLastMonthProduction(TownID town_id, CargoID cargo_id) +/* static */ SQInteger ScriptTown::GetLastMonthProduction(TownID town_id, CargoID cargo_id) { if (!IsValidTown(town_id)) return -1; if (!ScriptCargo::IsValidCargo(cargo_id)) return -1; @@ -94,7 +94,7 @@ return t->supplied[cargo_id].old_max; } -/* static */ int32 ScriptTown::GetLastMonthSupplied(TownID town_id, CargoID cargo_id) +/* static */ SQInteger ScriptTown::GetLastMonthSupplied(TownID town_id, CargoID cargo_id) { if (!IsValidTown(town_id)) return -1; if (!ScriptCargo::IsValidCargo(cargo_id)) return -1; @@ -104,7 +104,7 @@ return t->supplied[cargo_id].old_act; } -/* static */ int32 ScriptTown::GetLastMonthTransportedPercentage(TownID town_id, CargoID cargo_id) +/* static */ SQInteger ScriptTown::GetLastMonthTransportedPercentage(TownID town_id, CargoID cargo_id) { if (!IsValidTown(town_id)) return -1; if (!ScriptCargo::IsValidCargo(cargo_id)) return -1; @@ -113,7 +113,7 @@ return ::ToPercent8(t->GetPercentTransported(cargo_id)); } -/* static */ int32 ScriptTown::GetLastMonthReceived(TownID town_id, ScriptCargo::TownEffect towneffect_id) +/* static */ SQInteger ScriptTown::GetLastMonthReceived(TownID town_id, ScriptCargo::TownEffect towneffect_id) { if (!IsValidTown(town_id)) return -1; if (!ScriptCargo::IsValidTownEffect(towneffect_id)) return -1; @@ -123,18 +123,20 @@ return t->received[towneffect_id].old_act; } -/* static */ bool ScriptTown::SetCargoGoal(TownID town_id, ScriptCargo::TownEffect towneffect_id, uint32 goal) +/* static */ bool ScriptTown::SetCargoGoal(TownID town_id, ScriptCargo::TownEffect towneffect_id, SQInteger goal) { EnforcePrecondition(false, IsValidTown(town_id)); EnforcePrecondition(false, ScriptCargo::IsValidTownEffect(towneffect_id)); + goal = Clamp(goal, 0, UINT32_MAX); + return ScriptObject::Command::Do(town_id, (::TownEffect)towneffect_id, goal); } -/* static */ uint32 ScriptTown::GetCargoGoal(TownID town_id, ScriptCargo::TownEffect towneffect_id) +/* static */ SQInteger ScriptTown::GetCargoGoal(TownID town_id, ScriptCargo::TownEffect towneffect_id) { - if (!IsValidTown(town_id)) return UINT32_MAX; - if (!ScriptCargo::IsValidTownEffect(towneffect_id)) return UINT32_MAX; + if (!IsValidTown(town_id)) return -1; + if (!ScriptCargo::IsValidTownEffect(towneffect_id)) return -1; const Town *t = ::Town::Get(town_id); @@ -151,7 +153,7 @@ } } -/* static */ bool ScriptTown::SetGrowthRate(TownID town_id, uint32 days_between_town_growth) +/* static */ bool ScriptTown::SetGrowthRate(TownID town_id, SQInteger days_between_town_growth) { EnforcePrecondition(false, IsValidTown(town_id)); uint16 growth_rate; @@ -167,14 +169,14 @@ default: EnforcePrecondition(false, (days_between_town_growth * DAY_TICKS / TOWN_GROWTH_TICKS) <= MAX_TOWN_GROWTH_TICKS); /* Don't use growth_rate 0 as it means GROWTH_NORMAL */ - growth_rate = std::max(days_between_town_growth * DAY_TICKS, 2u) - 1; + growth_rate = std::max(days_between_town_growth * DAY_TICKS, 2u) - 1; break; } return ScriptObject::Command::Do(town_id, growth_rate); } -/* static */ int32 ScriptTown::GetGrowthRate(TownID town_id) +/* static */ SQInteger ScriptTown::GetGrowthRate(TownID town_id) { if (!IsValidTown(town_id)) return -1; @@ -185,12 +187,12 @@ return RoundDivSU(t->growth_rate + 1, DAY_TICKS); } -/* static */ int32 ScriptTown::GetDistanceManhattanToTile(TownID town_id, TileIndex tile) +/* static */ SQInteger ScriptTown::GetDistanceManhattanToTile(TownID town_id, TileIndex tile) { return ScriptMap::DistanceManhattan(tile, GetLocation(town_id)); } -/* static */ int32 ScriptTown::GetDistanceSquareToTile(TownID town_id, TileIndex tile) +/* static */ SQInteger ScriptTown::GetDistanceSquareToTile(TownID town_id, TileIndex tile) { return ScriptMap::DistanceSquare(tile, GetLocation(town_id)); } @@ -218,14 +220,14 @@ return ::Town::Get(town_id)->larger_town; } -/* static */ int ScriptTown::GetRoadReworkDuration(TownID town_id) +/* static */ SQInteger ScriptTown::GetRoadReworkDuration(TownID town_id) { if (!IsValidTown(town_id)) return -1; return ::Town::Get(town_id)->road_build_months; } -/* static */ int ScriptTown::GetFundBuildingsDuration(TownID town_id) +/* static */ SQInteger ScriptTown::GetFundBuildingsDuration(TownID town_id) { if (!IsValidTown(town_id)) return -1; @@ -240,7 +242,7 @@ return (ScriptCompany::CompanyID)(int8)::Town::Get(town_id)->exclusivity; } -/* static */ int32 ScriptTown::GetExclusiveRightsDuration(TownID town_id) +/* static */ SQInteger ScriptTown::GetExclusiveRightsDuration(TownID town_id) { if (!IsValidTown(town_id)) return -1; @@ -264,12 +266,14 @@ return ScriptObject::Command::Do(town_id, town_action); } -/* static */ bool ScriptTown::ExpandTown(TownID town_id, int houses) +/* static */ bool ScriptTown::ExpandTown(TownID town_id, SQInteger houses) { EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY); EnforcePrecondition(false, IsValidTown(town_id)); EnforcePrecondition(false, houses > 0); + houses = std::min(houses, UINT32_MAX); + return ScriptObject::Command::Do(town_id, houses); } @@ -330,7 +334,7 @@ } } -/* static */ int ScriptTown::GetDetailedRating(TownID town_id, ScriptCompany::CompanyID company_id) +/* static */ SQInteger ScriptTown::GetDetailedRating(TownID town_id, ScriptCompany::CompanyID company_id) { if (!IsValidTown(town_id)) return TOWN_RATING_INVALID; ScriptCompany::CompanyID company = ScriptCompany::ResolveCompanyID(company_id); @@ -340,7 +344,7 @@ return t->ratings[company]; } -/* static */ bool ScriptTown::ChangeRating(TownID town_id, ScriptCompany::CompanyID company_id, int delta) +/* static */ bool ScriptTown::ChangeRating(TownID town_id, ScriptCompany::CompanyID company_id, SQInteger delta) { EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY); EnforcePrecondition(false, IsValidTown(town_id)); @@ -354,7 +358,7 @@ return ScriptObject::Command::Do(town_id, (::CompanyID)company_id, new_rating); } -/* static */ int ScriptTown::GetAllowedNoise(TownID town_id) +/* static */ SQInteger ScriptTown::GetAllowedNoise(TownID town_id) { if (!IsValidTown(town_id)) return -1; diff --git a/src/script/api/script_town.hpp b/src/script/api/script_town.hpp --- a/src/script/api/script_town.hpp +++ b/src/script/api/script_town.hpp @@ -127,7 +127,7 @@ public: * Gets the number of towns. * @return The number of towns. */ - static int32 GetTownCount(); + static SQInteger GetTownCount(); /** * Checks whether the given town index is valid. @@ -170,7 +170,7 @@ public: * @pre IsValidTown(town_id). * @return The number of inhabitants. */ - static int32 GetPopulation(TownID town_id); + static SQInteger GetPopulation(TownID town_id); /** * Gets the number of houses in the town. @@ -178,7 +178,7 @@ public: * @pre IsValidTown(town_id). * @return The number of houses. */ - static int32 GetHouseCount(TownID town_id); + static SQInteger GetHouseCount(TownID town_id); /** * Gets the location of the town. @@ -196,7 +196,7 @@ public: * @pre ScriptCargo::IsValidCargo(cargo_id). * @return The last month's production of the given cargo for this town. */ - static int32 GetLastMonthProduction(TownID town_id, CargoID cargo_id); + static SQInteger GetLastMonthProduction(TownID town_id, CargoID cargo_id); /** * Get the total amount of cargo supplied from a town last month. @@ -206,7 +206,7 @@ public: * @pre ScriptCargo::IsValidCargo(cargo_id). * @return The amount of cargo supplied for transport from this town last month. */ - static int32 GetLastMonthSupplied(TownID town_id, CargoID cargo_id); + static SQInteger GetLastMonthSupplied(TownID town_id, CargoID cargo_id); /** * Get the percentage of transported production of the given cargo at a town. @@ -216,7 +216,7 @@ public: * @pre ScriptCargo::IsValidCargo(cargo_id). * @return The percentage of given cargo transported from this town last month. */ - static int32 GetLastMonthTransportedPercentage(TownID town_id, CargoID cargo_id); + static SQInteger GetLastMonthTransportedPercentage(TownID town_id, CargoID cargo_id); /** * Get the total amount of cargo effects received by a town last month. @@ -226,19 +226,20 @@ public: * @pre ScriptCargo::IsValidTownEffect(cargo_id). * @return The amount of cargo received by this town last month for this cargo effect. */ - static int32 GetLastMonthReceived(TownID town_id, ScriptCargo::TownEffect towneffect_id); + static SQInteger GetLastMonthReceived(TownID town_id, ScriptCargo::TownEffect towneffect_id); /** * Set the goal of a cargo for this town. * @param town_id The index of the town. * @param towneffect_id The index of the towneffect. * @param goal The new goal. + * The value will be clamped to 0 .. MAX(uint32). * @pre IsValidTown(town_id). * @pre ScriptCargo::IsValidTownEffect(towneffect_id). * @return True if the action succeeded. * @api -ai */ - static bool SetCargoGoal(TownID town_id, ScriptCargo::TownEffect towneffect_id, uint32 goal); + static bool SetCargoGoal(TownID town_id, ScriptCargo::TownEffect towneffect_id, SQInteger goal); /** * Get the amount of cargo that needs to be delivered (per TownEffect) for a @@ -251,7 +252,7 @@ public: * @note Goals can change over time. For example with a changing snowline, or * with a growing town. */ - static uint32 GetCargoGoal(TownID town_id, ScriptCargo::TownEffect towneffect_id); + static SQInteger GetCargoGoal(TownID town_id, ScriptCargo::TownEffect towneffect_id); /** * Set the amount of days between town growth. @@ -265,7 +266,7 @@ public: * @note When changing the growth rate, the relative progress is preserved and scaled to the new rate. * @api -ai */ - static bool SetGrowthRate(TownID town_id, uint32 days_between_town_growth); + static bool SetGrowthRate(TownID town_id, SQInteger days_between_town_growth); /** * Get the amount of days between town growth. @@ -274,7 +275,7 @@ public: * @return Amount of days between town growth, or TOWN_GROWTH_NONE. * @note This function does not indicate when it will grow next. It only tells you the time between growths. */ - static int32 GetGrowthRate(TownID town_id); + static SQInteger GetGrowthRate(TownID town_id); /** * Get the manhattan distance from the tile to the ScriptTown::GetLocation() @@ -284,7 +285,7 @@ public: * @pre IsValidTown(town_id). * @return The distance between town and tile. */ - static int32 GetDistanceManhattanToTile(TownID town_id, TileIndex tile); + static SQInteger GetDistanceManhattanToTile(TownID town_id, TileIndex tile); /** * Get the square distance from the tile to the ScriptTown::GetLocation() @@ -294,7 +295,7 @@ public: * @pre IsValidTown(town_id). * @return The distance between town and tile. */ - static int32 GetDistanceSquareToTile(TownID town_id, TileIndex tile); + static SQInteger GetDistanceSquareToTile(TownID town_id, TileIndex tile); /** * Find out if this tile is within the rating influence of a town. @@ -331,7 +332,7 @@ public: * @return The number of months the road reworks are still going to take. * The value 0 means that there are currently no road reworks. */ - static int GetRoadReworkDuration(TownID town_id); + static SQInteger GetRoadReworkDuration(TownID town_id); /** * Find out how long new buildings are still being funded in a town. @@ -340,7 +341,7 @@ public: * @return The number of months building construction is still funded. * The value 0 means that there is currently no funding. */ - static int GetFundBuildingsDuration(TownID town_id); + static SQInteger GetFundBuildingsDuration(TownID town_id); /** * Find out which company currently has the exclusive rights of this town. @@ -361,7 +362,7 @@ public: * The value 0 means that there are currently no exclusive rights * given out to anyone. */ - static int32 GetExclusiveRightsDuration(TownID town_id); + static SQInteger GetExclusiveRightsDuration(TownID town_id); /** * Find out if an action can currently be performed on the town. @@ -388,12 +389,13 @@ public: * Expand the town. * @param town_id The town to expand. * @param houses The amount of houses to grow the town with. + * The value will be clamped to 0 .. MAX(uint32). * @pre IsValidTown(town_id). * @pre houses > 0. * @return True if the action succeeded. * @api -ai */ - static bool ExpandTown(TownID town_id, int houses); + static bool ExpandTown(TownID town_id, SQInteger houses); /** * Found a new town. @@ -433,7 +435,7 @@ public: * @return The rating as a number between -1000 (worst) and 1000 (best). * @api -ai */ - static int GetDetailedRating(TownID town_id, ScriptCompany::CompanyID company_id); + static SQInteger GetDetailedRating(TownID town_id, ScriptCompany::CompanyID company_id); /** * Change the rating of a company within a town. @@ -446,7 +448,7 @@ public: * @pre no company mode in scope * @api -ai */ - static bool ChangeRating(TownID town_id, ScriptCompany::CompanyID company_id, int delta); + static bool ChangeRating(TownID town_id, ScriptCompany::CompanyID company_id, SQInteger delta); /** * Get the maximum level of noise that still can be added by airports @@ -454,7 +456,7 @@ public: * @param town_id The town to get the allowed noise from. * @return The noise that still can be added. */ - static int GetAllowedNoise(TownID town_id); + static SQInteger GetAllowedNoise(TownID town_id); /** * Get the road layout for a town.