From b1f41a0afb460071db2dbbfcb64140488f073382 Mon Sep 17 00:00:00 2001 From: frosch Date: Tue, 12 Nov 2013 17:56:35 +0000 Subject: (svn r25967) -Add: [NoGo] GSTown::TOWN_GROWTH_NORMAL to reset a town growth rate set previously via GSTown::SetGrowthRate. --- src/script/api/ai/ai_town.hpp.sq | 1 + src/script/api/game/game_town.hpp.sq | 1 + src/script/api/game_changelog.hpp | 1 + src/script/api/script_town.cpp | 15 ++++++++++++--- src/script/api/script_town.hpp | 11 +++++++++-- src/script/api/template/template_town.hpp.sq | 2 ++ 6 files changed, 26 insertions(+), 5 deletions(-) (limited to 'src/script') 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 @@ -116,6 +116,13 @@ public: TOWN_SIZE_INVALID = -1, ///< Invalid town size. }; + /** + * 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(HSQUIRRELVM vm, ScriptTown::RoadLayout res) { sq_pushinteger(vm, (int32)res); return 1; } template <> inline ScriptTown::TownSize GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptTown::TownSize)tmp; } template <> inline int Return(HSQUIRRELVM vm, ScriptTown::TownSize res) { sq_pushinteger(vm, (int32)res); return 1; } + template <> inline ScriptTown::TownGrowth GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptTown::TownGrowth)tmp; } + template <> inline int Return(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, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (ScriptTown *)instance; } -- cgit v1.2.3-54-g00ecf