From 3e5a87a52cc8355a2a5c2831c60643bf30d41a3a Mon Sep 17 00:00:00 2001 From: rubidium Date: Mon, 11 Jan 2010 20:21:56 +0000 Subject: (svn r18783) -Codechange: make CheckCompanyHasMoney set an error on the CommandCost it tests when you don't have enough money instead of setting a global variable. --- src/command.cpp | 9 +++++---- src/command_type.h | 11 +++++++++++ src/company_cmd.cpp | 4 ++-- src/functions.h | 2 +- src/vehicle_cmd.cpp | 2 +- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/command.cpp b/src/command.cpp index 430be00c6..2dbd53d65 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -424,14 +424,12 @@ CommandCost DoCommand(TileIndex tile, uint32 p1, uint32 p2, DoCommandFlag flags, res = proc(tile, flags & ~DC_EXEC, p1, p2, text); SetTownRatingTestMode(false); if (CmdFailed(res)) { - res.SetGlobalErrorMessage(); goto error; } if (_docommand_recursive == 1 && !(flags & DC_QUERY_COST) && !(flags & DC_BANKRUPT) && - res.GetCost() != 0 && !CheckCompanyHasMoney(res)) { goto error; } @@ -446,8 +444,8 @@ CommandCost DoCommand(TileIndex tile, uint32 p1, uint32 p2, DoCommandFlag flags, * themselves to the cost object at some point */ res = proc(tile, flags, p1, p2, text); if (CmdFailed(res)) { - res.SetGlobalErrorMessage(); error: + res.SetGlobalErrorMessage(); _docommand_recursive--; return CMD_ERROR; } @@ -579,7 +577,10 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallbac goto show_error; } /* no money? Only check if notest is off */ - if (!notest && res.GetCost() != 0 && !CheckCompanyHasMoney(res)) goto show_error; + if (!notest && res.GetCost() != 0 && !CheckCompanyHasMoney(res)) { + res.SetGlobalErrorMessage(); + goto show_error; + } } #ifdef ENABLE_NETWORK diff --git a/src/command_type.h b/src/command_type.h index 0bff05003..42e622025 100644 --- a/src/command_type.h +++ b/src/command_type.h @@ -107,6 +107,17 @@ public: if (this->message != INVALID_STRING_ID) _error_message = this->message; } + /** + * Makes this CommandCost behave like an error command. + * @param mesasge the error message. + */ + void MakeError(StringID message) + { + assert(message != INVALID_STRING_ID); + this->success = false; + this->message = message; + } + /** * Returns the error message of a command * @return the error message, if succeeded INVALID_STRING_ID diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index be4912ff2..2150b43ab 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -156,13 +156,13 @@ void InvalidateCompanyWindows(const Company *company) SetWindowDirty(WC_FINANCES, cid); } -bool CheckCompanyHasMoney(CommandCost cost) +bool CheckCompanyHasMoney(CommandCost &cost) { if (cost.GetCost() > 0) { const Company *c = Company::GetIfValid(_current_company); if (c != NULL && cost.GetCost() > c->money) { SetDParam(0, cost.GetCost()); - _error_message = STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY; + cost.MakeError(STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY); return false; } } diff --git a/src/functions.h b/src/functions.h index 64684886d..559f94846 100644 --- a/src/functions.h +++ b/src/functions.h @@ -23,7 +23,7 @@ void DrawClearLandFence(const TileInfo *ti); void TileLoopClearHelper(TileIndex tile); /* company_cmd.cpp */ -bool CheckCompanyHasMoney(CommandCost cost); +bool CheckCompanyHasMoney(CommandCost &cost); void SubtractMoneyFromCompany(CommandCost cost); void SubtractMoneyFromCompanyFract(CompanyID company, CommandCost cost); bool CheckOwnership(Owner owner, TileIndex tile = 0); diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index a28436654..9345b8a32 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -588,7 +588,7 @@ CommandCost CmdCloneVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, uint /* The vehicle has already been bought, so now it must be sold again. */ DoCommand(w_front->tile, w_front->index, 1, flags, GetCmdSellVeh(w_front)); } - return CMD_ERROR; + return total_cost; } return total_cost; -- cgit v1.2.3-54-g00ecf