From aae7ef73bb11f786683fe1b4cd897938d6b0691a Mon Sep 17 00:00:00 2001 From: rubidium Date: Mon, 2 Aug 2010 23:05:54 +0000 Subject: (svn r20330) -Codechange: unify the removal of unmovables a bit --- src/unmovable_cmd.cpp | 77 +++++++++++++++++++-------------------------------- 1 file changed, 29 insertions(+), 48 deletions(-) diff --git a/src/unmovable_cmd.cpp b/src/unmovable_cmd.cpp index 79e1a9ef5..35bc2f9a8 100644 --- a/src/unmovable_cmd.cpp +++ b/src/unmovable_cmd.cpp @@ -209,32 +209,6 @@ CommandCost CmdBuildUnmovable(TileIndex tile, DoCommandFlag flags, uint32 p1, ui } -/** - * Sell a land area. Actually you only sell one tile, so - * the name is a bit confusing ;p - * @param tile the tile the company is selling - * @param flags for this command type - * @param p1 unused - * @param p2 unused - * @param text unused - * @return the cost of this operation or an error - */ -static CommandCost CmdSellLandArea(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) -{ - if (!IsOwnedLandTile(tile)) return CMD_ERROR; - if (_current_company != OWNER_WATER) { - CommandCost ret = CheckTileOwnership(tile); - if (ret.Failed()) return ret; - } - - CommandCost ret = EnsureNoVehicleOnGround(tile); - if (ret.Failed()) return ret; - - if (flags & DC_EXEC) DoClearSquare(tile); - - return CommandCost(EXPENSES_CONSTRUCTION, -UnmovableSpec::Get(UNMOVABLE_OWNED_LAND)->GetClearCost()); -} - static Foundation GetFoundation_Unmovable(TileIndex tile, Slope tileh); static void DrawTile_Unmovable(TileInfo *ti) @@ -320,44 +294,51 @@ static Foundation GetFoundation_Unmovable(TileIndex tile, Slope tileh) static CommandCost ClearTile_Unmovable(TileIndex tile, DoCommandFlag flags) { - if (IsCompanyHQ(tile)) { - if (_current_company == OWNER_WATER) { - return DestroyCompanyHQ(GetTileOwner(tile), DC_EXEC); - } else { - return_cmd_error(flags & DC_AUTO ? STR_ERROR_COMPANY_HEADQUARTERS_IN : INVALID_STRING_ID); - } - } - - if (IsOwnedLand(tile)) { - return CmdSellLandArea(tile, flags, 0, 0, NULL); - } + UnmovableType type = GetUnmovableType(tile); + const UnmovableSpec *spec = UnmovableSpec::Get(type); /* Water can remove everything! */ if (_current_company != OWNER_WATER) { - if (flags & DC_AUTO) { + if (type != UNMOVABLE_OWNED_LAND && flags & DC_AUTO) { /* No automatic removal by overbuilding stuff. */ - return_cmd_error(STR_ERROR_OBJECT_IN_THE_WAY); - } else if (_game_mode != GM_EDITOR && !_cheats.magic_bulldozer.value) { + return_cmd_error(type == UNMOVABLE_HQ ? STR_ERROR_COMPANY_HEADQUARTERS_IN : STR_ERROR_OBJECT_IN_THE_WAY); + } else if (_game_mode == GM_EDITOR) { + /* No further limitations for the editor. */ + } else if (GetTileOwner(tile) == OWNER_NONE) { + /* Owned by nobody, so we can only remove it with brute force! */ + if (!_cheats.magic_bulldozer.value) return CMD_ERROR; + } else if (CheckTileOwnership(tile).Failed()) { + /* We don't own it!. */ + return_cmd_error(STR_ERROR_OWNED_BY); + } else if (type != UNMOVABLE_OWNED_LAND && !_cheats.magic_bulldozer.value) { /* In the game editor or with cheats we can remove, otherwise we can't. */ return CMD_ERROR; } } - if (IsStatue(tile)) { - if (flags & DC_AUTO) return_cmd_error(STR_ERROR_OBJECT_IN_THE_WAY); + switch (type) { + case UNMOVABLE_HQ: + return DestroyCompanyHQ(GetTileOwner(tile), flags); + + case UNMOVABLE_STATUE: + if (flags & DC_EXEC) { + TownID town = GetStatueTownID(tile); + ClrBit(Town::Get(town)->statues, GetTileOwner(tile)); + SetWindowDirty(WC_TOWN_AUTHORITY, town); + } + break; - if (flags & DC_EXEC) { - TownID town = GetStatueTownID(tile); - ClrBit(Town::Get(town)->statues, GetTileOwner(tile)); - SetWindowDirty(WC_TOWN_AUTHORITY, town); - } + default: + break; } if (flags & DC_EXEC) { DoClearSquare(tile); } - return CommandCost(); + CommandCost cost(EXPENSES_CONSTRUCTION, spec->GetClearCost()); + if (type == UNMOVABLE_OWNED_LAND) cost.MultiplyCost(-1); // They get an income! + return cost; } static void AddAcceptedCargo_Unmovable(TileIndex tile, CargoArray &acceptance, uint32 *always_accepted) -- cgit v1.2.3-70-g09d2