diff options
-rw-r--r-- | bin/game/compat_1.2.nut | 8 | ||||
-rw-r--r-- | bin/game/compat_1.3.nut | 8 | ||||
-rw-r--r-- | src/script/api/ai/ai_town.hpp.sq | 1 | ||||
-rw-r--r-- | src/script/api/game/game_town.hpp.sq | 1 | ||||
-rw-r--r-- | src/script/api/game_changelog.hpp | 1 | ||||
-rw-r--r-- | src/script/api/script_town.cpp | 15 | ||||
-rw-r--r-- | src/script/api/script_town.hpp | 11 | ||||
-rw-r--r-- | src/script/api/template/template_town.hpp.sq | 2 |
8 files changed, 42 insertions, 5 deletions
diff --git a/bin/game/compat_1.2.nut b/bin/game/compat_1.2.nut index f9a63e698..6126809c8 100644 --- a/bin/game/compat_1.2.nut +++ b/bin/game/compat_1.2.nut @@ -8,3 +8,11 @@ */ GSLog.Info("1.2 API compatability in effect."); + +GSTown._SetGrowthRate <- GSTown.SetGrowthRate; +GSTown.SetGrowthRate <- function(town_id, days_between_town_growth) +{ + /* Growth rate 0 caused resetting the custom growth rate. While this was undocumented, it was used nevertheless (ofc). */ + if (days_between_town_growth == 0) days_between_town_growth = GSTown.TOWN_GROWTH_NORMAL; + return GSTown._SetGrowthRate(town_id, days_between_town_growth); +} diff --git a/bin/game/compat_1.3.nut b/bin/game/compat_1.3.nut index 656794c89..d58a34685 100644 --- a/bin/game/compat_1.3.nut +++ b/bin/game/compat_1.3.nut @@ -8,3 +8,11 @@ */ GSLog.Info("1.3 API compatability in effect."); + +GSTown._SetGrowthRate <- GSTown.SetGrowthRate; +GSTown.SetGrowthRate <- function(town_id, days_between_town_growth) +{ + /* Growth rate 0 caused resetting the custom growth rate. While this was undocumented, it was used nevertheless (ofc). */ + if (days_between_town_growth == 0) days_between_town_growth = GSTown.TOWN_GROWTH_NORMAL; + return GSTown._SetGrowthRate(town_id, days_between_town_growth); +} diff --git a/src/script/api/ai/ai_town.hpp.sq b/src/script/api/ai/ai_town.hpp.sq index d626424ed..c8ef39ed4 100644 --- a/src/script/api/ai/ai_town.hpp.sq +++ b/src/script/api/ai/ai_town.hpp.sq @@ -48,6 +48,7 @@ void SQAITown_Register(Squirrel *engine) SQAITown.DefSQConst(engine, ScriptTown::TOWN_SIZE_MEDIUM, "TOWN_SIZE_MEDIUM"); SQAITown.DefSQConst(engine, ScriptTown::TOWN_SIZE_LARGE, "TOWN_SIZE_LARGE"); SQAITown.DefSQConst(engine, ScriptTown::TOWN_SIZE_INVALID, "TOWN_SIZE_INVALID"); + SQAITown.DefSQConst(engine, ScriptTown::TOWN_GROWTH_NORMAL, "TOWN_GROWTH_NORMAL"); SQAITown.DefSQStaticMethod(engine, &ScriptTown::GetTownCount, "GetTownCount", 1, "."); SQAITown.DefSQStaticMethod(engine, &ScriptTown::IsValidTown, "IsValidTown", 2, ".i"); diff --git a/src/script/api/game/game_town.hpp.sq b/src/script/api/game/game_town.hpp.sq index af5b15944..7c07a0cd9 100644 --- a/src/script/api/game/game_town.hpp.sq +++ b/src/script/api/game/game_town.hpp.sq @@ -48,6 +48,7 @@ void SQGSTown_Register(Squirrel *engine) SQGSTown.DefSQConst(engine, ScriptTown::TOWN_SIZE_MEDIUM, "TOWN_SIZE_MEDIUM"); SQGSTown.DefSQConst(engine, ScriptTown::TOWN_SIZE_LARGE, "TOWN_SIZE_LARGE"); SQGSTown.DefSQConst(engine, ScriptTown::TOWN_SIZE_INVALID, "TOWN_SIZE_INVALID"); + SQGSTown.DefSQConst(engine, ScriptTown::TOWN_GROWTH_NORMAL, "TOWN_GROWTH_NORMAL"); SQGSTown.DefSQStaticMethod(engine, &ScriptTown::GetTownCount, "GetTownCount", 1, "."); SQGSTown.DefSQStaticMethod(engine, &ScriptTown::IsValidTown, "IsValidTown", 2, ".i"); diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index 59893a19a..53b116200 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -30,6 +30,7 @@ * \li GSTile::GetTerrainType * \li GSTown::FoundTown * \li GSTown::SetName + * \li GSTown::TOWN_GROWTH_NORMAL * * Other changes: * \li GSGoal::New can now create up to 64000 concurrent goals. The old limit was 256 goals. diff --git a/src/script/api/script_town.cpp b/src/script/api/script_town.cpp index 9926d2277..b37d7bd1e 100644 --- a/src/script/api/script_town.cpp +++ b/src/script/api/script_town.cpp @@ -156,10 +156,19 @@ /* static */ bool ScriptTown::SetGrowthRate(TownID town_id, uint32 days_between_town_growth) { - days_between_town_growth = days_between_town_growth * DAY_TICKS / TOWN_GROWTH_TICKS; - EnforcePrecondition(false, IsValidTown(town_id)); - EnforcePrecondition(false, days_between_town_growth < TOWN_GROW_RATE_CUSTOM); + + switch (days_between_town_growth) { + case TOWN_GROWTH_NORMAL: + days_between_town_growth = 0; + break; + + default: + days_between_town_growth = days_between_town_growth * DAY_TICKS / TOWN_GROWTH_TICKS; + EnforcePrecondition(false, days_between_town_growth < TOWN_GROW_RATE_CUSTOM); + if (days_between_town_growth == 0) days_between_town_growth = 1; // as fast as possible + break; + } return ScriptObject::DoCommand(::Town::Get(town_id)->xy, town_id, days_between_town_growth, CMD_TOWN_GROWTH_RATE); } diff --git a/src/script/api/script_town.hpp b/src/script/api/script_town.hpp index e91af80cc..7c8ad3f20 100644 --- a/src/script/api/script_town.hpp +++ b/src/script/api/script_town.hpp @@ -117,6 +117,13 @@ public: }; /** + * Special values for SetGrowthRate. + */ + enum TownGrowth { + TOWN_GROWTH_NORMAL = 0x10000, ///< Use default town growth algorithm instead of custom growth rate. + }; + + /** * Gets the number of towns. * @return The number of towns. */ @@ -249,9 +256,9 @@ public: /** * Set the amount of days between town growth. * @param town_id The index of the town. - * @param days_between_town_growth The amount of days between town growth. + * @param days_between_town_growth The amount of days between town growth, or TOWN_GROWTH_NORMAL. * @pre IsValidTown(town_id). - * @pre days_between_town_growth <= 30000. + * @pre days_between_town_growth <= 30000 || days_between_town_growth == TOWN_GROWTH_NORMAL. * @return True if the action succeeded. * @note Even when setting a growth rate, towns only grow when the conditions for growth (SetCargoCoal) are met, * and the game settings (economy.town_growth_rate) allow town growth at all. diff --git a/src/script/api/template/template_town.hpp.sq b/src/script/api/template/template_town.hpp.sq index 3c48d9835..0ec1c285d 100644 --- a/src/script/api/template/template_town.hpp.sq +++ b/src/script/api/template/template_town.hpp.sq @@ -21,6 +21,8 @@ namespace SQConvert { template <> inline int Return<ScriptTown::RoadLayout>(HSQUIRRELVM vm, ScriptTown::RoadLayout res) { sq_pushinteger(vm, (int32)res); return 1; } template <> inline ScriptTown::TownSize GetParam(ForceType<ScriptTown::TownSize>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptTown::TownSize)tmp; } template <> inline int Return<ScriptTown::TownSize>(HSQUIRRELVM vm, ScriptTown::TownSize res) { sq_pushinteger(vm, (int32)res); return 1; } + template <> inline ScriptTown::TownGrowth GetParam(ForceType<ScriptTown::TownGrowth>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptTown::TownGrowth)tmp; } + template <> inline int Return<ScriptTown::TownGrowth>(HSQUIRRELVM vm, ScriptTown::TownGrowth res) { sq_pushinteger(vm, (int32)res); return 1; } /* Allow ScriptTown to be used as Squirrel parameter */ template <> inline ScriptTown *GetParam(ForceType<ScriptTown *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (ScriptTown *)instance; } |