From 74ffe8647f81803fc5d2a460856f4e9f8d84cad1 Mon Sep 17 00:00:00 2001 From: rubidium Date: Tue, 5 Jan 2010 17:11:56 +0000 Subject: (svn r18732) -Codechange: move the company related commands of misc_cmd.cpp to company_cmd.cpp --- src/company_cmd.cpp | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) (limited to 'src/company_cmd.cpp') diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 92e3c0d96..be4912ff2 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -32,6 +32,8 @@ #include "rail.h" #include "core/pool_func.hpp" #include "settings_func.h" +#include "vehicle_base.h" +#include "vehicle_func.h" #include "table/strings.h" @@ -855,3 +857,202 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 return CommandCost(); } + +/** Change the company manager's face. + * @param tile unused + * @param flags operation to perform + * @param p1 unused + * @param p2 face bitmasked + * @param text unused + * @return the cost of this operation or an error + */ +CommandCost CmdSetCompanyManagerFace(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) +{ + CompanyManagerFace cmf = (CompanyManagerFace)p2; + + if (!IsValidCompanyManagerFace(cmf)) return CMD_ERROR; + + if (flags & DC_EXEC) { + Company::Get(_current_company)->face = cmf; + MarkWholeScreenDirty(); + } + return CommandCost(); +} + +/** Change the company's company-colour + * @param tile unused + * @param flags operation to perform + * @param p1 bitstuffed: + * p1 bits 0-7 scheme to set + * p1 bits 8-9 set in use state or first/second colour + * @param p2 new colour for vehicles, property, etc. + * @param text unused + * @return the cost of this operation or an error + */ +CommandCost CmdSetCompanyColour(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) +{ + if (p2 >= 16) return CMD_ERROR; // max 16 colours + + Colours colour = (Colours)p2; + + LiveryScheme scheme = (LiveryScheme)GB(p1, 0, 8); + byte state = GB(p1, 8, 2); + + if (scheme >= LS_END || state >= 3) return CMD_ERROR; + + Company *c = Company::Get(_current_company); + + /* Ensure no two companies have the same primary colour */ + if (scheme == LS_DEFAULT && state == 0) { + const Company *cc; + FOR_ALL_COMPANIES(cc) { + if (cc != c && cc->colour == colour) return CMD_ERROR; + } + } + + if (flags & DC_EXEC) { + switch (state) { + case 0: + c->livery[scheme].colour1 = colour; + + /* If setting the first colour of the default scheme, adjust the + * original and cached company colours too. */ + if (scheme == LS_DEFAULT) { + _company_colours[_current_company] = colour; + c->colour = colour; + } + break; + + case 1: + c->livery[scheme].colour2 = colour; + break; + + case 2: + c->livery[scheme].in_use = colour != 0; + + /* Now handle setting the default scheme's in_use flag. + * This is different to the other schemes, as it signifies if any + * scheme is active at all. If this flag is not set, then no + * processing of vehicle types occurs at all, and only the default + * colours will be used. */ + + /* If enabling a scheme, set the default scheme to be in use too */ + if (colour != 0) { + c->livery[LS_DEFAULT].in_use = true; + break; + } + + /* Else loop through all schemes to see if any are left enabled. + * If not, disable the default scheme too. */ + c->livery[LS_DEFAULT].in_use = false; + for (scheme = LS_DEFAULT; scheme < LS_END; scheme++) { + if (c->livery[scheme].in_use) { + c->livery[LS_DEFAULT].in_use = true; + break; + } + } + break; + + default: + break; + } + ResetVehicleColourMap(); + MarkWholeScreenDirty(); + + /* Company colour data is indirectly cached. */ + Vehicle *v; + FOR_ALL_VEHICLES(v) { + if (v->owner == _current_company) v->InvalidateNewGRFCache(); + } + } + return CommandCost(); +} + +static bool IsUniqueCompanyName(const char *name) +{ + const Company *c; + + FOR_ALL_COMPANIES(c) { + if (c->name != NULL && strcmp(c->name, name) == 0) return false; + } + + return true; +} + +/** Change the name of the company. + * @param tile unused + * @param flags operation to perform + * @param p1 unused + * @param p2 unused + * @param text the new name or an empty string when resetting to the default + * @return the cost of this operation or an error + */ +CommandCost CmdRenameCompany(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) +{ + bool reset = StrEmpty(text); + + if (!reset) { + if (strlen(text) >= MAX_LENGTH_COMPANY_NAME_BYTES) return CMD_ERROR; + if (!IsUniqueCompanyName(text)) return_cmd_error(STR_ERROR_NAME_MUST_BE_UNIQUE); + } + + if (flags & DC_EXEC) { + Company *c = Company::Get(_current_company); + free(c->name); + c->name = reset ? NULL : strdup(text); + MarkWholeScreenDirty(); + } + + return CommandCost(); +} + +static bool IsUniquePresidentName(const char *name) +{ + const Company *c; + + FOR_ALL_COMPANIES(c) { + if (c->president_name != NULL && strcmp(c->president_name, name) == 0) return false; + } + + return true; +} + +/** Change the name of the president. + * @param tile unused + * @param flags operation to perform + * @param p1 unused + * @param p2 unused + * @param text the new name or an empty string when resetting to the default + * @return the cost of this operation or an error + */ +CommandCost CmdRenamePresident(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) +{ + bool reset = StrEmpty(text); + + if (!reset) { + if (strlen(text) >= MAX_LENGTH_PRESIDENT_NAME_BYTES) return CMD_ERROR; + if (!IsUniquePresidentName(text)) return_cmd_error(STR_ERROR_NAME_MUST_BE_UNIQUE); + } + + if (flags & DC_EXEC) { + Company *c = Company::Get(_current_company); + free(c->president_name); + + if (reset) { + c->president_name = NULL; + } else { + c->president_name = strdup(text); + + if (c->name_1 == STR_SV_UNNAMED && c->name == NULL) { + char buf[80]; + + snprintf(buf, lengthof(buf), "%s Transport", text); + DoCommand(0, 0, 0, DC_EXEC, CMD_RENAME_COMPANY, buf); + } + } + + MarkWholeScreenDirty(); + } + + return CommandCost(); +} -- cgit v1.2.3-54-g00ecf