From 3927ec08c64e2dcaf544fc162a9d814280092e82 Mon Sep 17 00:00:00 2001 From: Yourself Date: Mon, 6 Jul 2020 14:03:40 -0700 Subject: [PATCH 1/2] Feature: GSMarine.BuildRiver function --- src/command.cpp | 2 +- src/script/api/ai/ai_marine.hpp.sq | 1 + src/script/api/game/game_marine.hpp.sq | 1 + src/script/api/script_marine.cpp | 7 +++++++ src/script/api/script_marine.hpp | 12 ++++++++++++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/command.cpp b/src/command.cpp index eac407846f8..28b9f0f119a 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -385,7 +385,7 @@ static const Command _command_proc_table[] = { DEF_CMD(CmdMoneyCheatAdmin, CMD_SERVER_NS, CMDT_CHEAT ), // CMD_MONEY_CHEAT_ADMIN DEF_CMD(CmdChangeBankBalance, CMD_DEITY, CMDT_MONEY_MANAGEMENT ), // CMD_CHANGE_BANK_BALANCE DEF_CMD(CmdCheatSetting, CMD_SERVER, CMDT_CHEAT ), // CMD_CHEAT_SETTING - DEF_CMD(CmdBuildCanal, CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_CANAL + DEF_CMD(CmdBuildCanal, CMD_DEITY | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_CANAL DEF_CMD(CmdCreateSubsidy, CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_CREATE_SUBSIDY DEF_CMD(CmdCompanyCtrl, CMD_SPECTATOR | CMD_CLIENT_ID | CMD_NO_EST, CMDT_SERVER_SETTING ), // CMD_COMPANY_CTRL DEF_CMD(CmdCustomNewsItem, CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_CUSTOM_NEWS_ITEM diff --git a/src/script/api/ai/ai_marine.hpp.sq b/src/script/api/ai/ai_marine.hpp.sq index d23fe09992a..f1acb6275e5 100644 --- a/src/script/api/ai/ai_marine.hpp.sq +++ b/src/script/api/ai/ai_marine.hpp.sq @@ -40,6 +40,7 @@ void SQAIMarine_Register(Squirrel *engine) SQAIMarine.DefSQStaticMethod(engine, &ScriptMarine::BuildBuoy, "BuildBuoy", 2, ".i"); SQAIMarine.DefSQStaticMethod(engine, &ScriptMarine::BuildLock, "BuildLock", 2, ".i"); SQAIMarine.DefSQStaticMethod(engine, &ScriptMarine::BuildCanal, "BuildCanal", 2, ".i"); + SQAIMarine.DefSQStaticMethod(engine, &ScriptMarine::BuildRiver, "BuildRiver", 2, ".i"); SQAIMarine.DefSQStaticMethod(engine, &ScriptMarine::RemoveWaterDepot, "RemoveWaterDepot", 2, ".i"); SQAIMarine.DefSQStaticMethod(engine, &ScriptMarine::RemoveDock, "RemoveDock", 2, ".i"); SQAIMarine.DefSQStaticMethod(engine, &ScriptMarine::RemoveBuoy, "RemoveBuoy", 2, ".i"); diff --git a/src/script/api/game/game_marine.hpp.sq b/src/script/api/game/game_marine.hpp.sq index 4029f78db15..7116f990031 100644 --- a/src/script/api/game/game_marine.hpp.sq +++ b/src/script/api/game/game_marine.hpp.sq @@ -40,6 +40,7 @@ void SQGSMarine_Register(Squirrel *engine) SQGSMarine.DefSQStaticMethod(engine, &ScriptMarine::BuildBuoy, "BuildBuoy", 2, ".i"); SQGSMarine.DefSQStaticMethod(engine, &ScriptMarine::BuildLock, "BuildLock", 2, ".i"); SQGSMarine.DefSQStaticMethod(engine, &ScriptMarine::BuildCanal, "BuildCanal", 2, ".i"); + SQGSMarine.DefSQStaticMethod(engine, &ScriptMarine::BuildRiver, "BuildRiver", 2, ".i"); SQGSMarine.DefSQStaticMethod(engine, &ScriptMarine::RemoveWaterDepot, "RemoveWaterDepot", 2, ".i"); SQGSMarine.DefSQStaticMethod(engine, &ScriptMarine::RemoveDock, "RemoveDock", 2, ".i"); SQGSMarine.DefSQStaticMethod(engine, &ScriptMarine::RemoveBuoy, "RemoveBuoy", 2, ".i"); diff --git a/src/script/api/script_marine.cpp b/src/script/api/script_marine.cpp index c63add8faae..41ace35d79c 100644 --- a/src/script/api/script_marine.cpp +++ b/src/script/api/script_marine.cpp @@ -116,6 +116,13 @@ return ScriptObject::DoCommand(tile, tile, WATER_CLASS_CANAL, CMD_BUILD_CANAL); } +/* static */ bool ScriptMarine::BuildRiver(TileIndex tile) +{ + EnforcePrecondition(false, ::IsValidTile(tile)); + + return ScriptObject::DoCommand(tile, tile, WATER_CLASS_RIVER, CMD_BUILD_CANAL); +} + /* static */ bool ScriptMarine::RemoveWaterDepot(TileIndex tile) { EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY); diff --git a/src/script/api/script_marine.hpp b/src/script/api/script_marine.hpp index 324ed8f3e97..f427912eca6 100644 --- a/src/script/api/script_marine.hpp +++ b/src/script/api/script_marine.hpp @@ -158,6 +158,18 @@ class ScriptMarine : public ScriptObject { */ static bool BuildCanal(TileIndex tile); + /** + * Builds a river on tile. + * @param tile The tile where the canal will be build. + * @pre ScriptMap::IsValidTile(tile). + * @exception ScriptError::ERR_AREA_NOT_CLEAR + * @exception ScriptError::ERR_LAND_SLOPED_WRONG + * @exception ScriptError::ERR_OWNED_BY_ANOTHER_COMPANY + * @exception ScriptError::ERR_ALREADY_BUILT + * @return Whether the river has been/can be build or not. + */ + static bool BuildRiver(TileIndex tile); + /** * Removes a water depot. * @param tile Any tile of the water depot. From 1330a9f59fd2284a67f772b1ee01bde09322891d Mon Sep 17 00:00:00 2001 From: Yourself Date: Mon, 6 Jul 2020 17:09:04 -0700 Subject: [PATCH 2/2] Fix: allow deity company to always build river --- src/water_cmd.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 08211098751..1a237fa2832 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -455,7 +455,9 @@ CommandCost CmdBuildCanal(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 if (_game_mode != GM_EDITOR) { if (HasBit(p2, 2)) return CMD_ERROR; if (wc == WATER_CLASS_RIVER) { - if (!_settings_game.construction.enable_build_river) return CMD_ERROR; + if (!_settings_game.construction.enable_build_river && _current_company != OWNER_DEITY) { + return CMD_ERROR; + } } else if (wc != WATER_CLASS_CANAL) { return CMD_ERROR; }