Add console command to merge two companies

This commit is contained in:
Jonathan G Rennison
2024-05-28 17:58:33 +01:00
parent f2f8692fb2
commit cbea3b8b46
6 changed files with 74 additions and 2 deletions

View File

@@ -931,6 +931,7 @@ void CompanyAdminRemove(CompanyID company_id, CompanyRemoveReason reason)
* - bits 0..15: CompanyCtrlAction * - bits 0..15: CompanyCtrlAction
* - bits 16..23: CompanyID * - bits 16..23: CompanyID
* - bits 24..31: CompanyRemoveReason (with CCA_DELETE) * - bits 24..31: CompanyRemoveReason (with CCA_DELETE)
* - bits 24..31: CompanyID to merge (with CCA_MERGE)
* @param p2 ClientID * @param p2 ClientID
* @param text unused * @param text unused
* @return the cost of this operation or an error * @return the cost of this operation or an error
@@ -1071,6 +1072,38 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32_t p1, uin
break; break;
} }
case CCA_MERGE: {
Company *c = Company::GetIfValid(company_id);
if (c == nullptr) return CMD_ERROR;
CompanyID to_merge_id = (CompanyID)GB(p1, 24, 8);
if (to_merge_id == company_id) return CMD_ERROR;
Company *to_merge = Company::GetIfValid(to_merge_id);
if (to_merge == nullptr) return CMD_ERROR;
if (!(flags & DC_EXEC)) return CommandCost();
SubtractMoneyFromAnyCompany(c, CommandCost(EXPENSES_OTHER, to_merge->current_loan - to_merge->money));
DEBUG(desync, 1, "merge_companies: %s, company_id: %u, merged_company_id: %u", debug_date_dumper().HexDate(), company_id, to_merge_id);
CompanyNewsInformation *cni = new CompanyNewsInformation(to_merge, c);
SetDParam(0, STR_NEWS_COMPANY_MERGER_TITLE);
SetDParam(1, STR_NEWS_MERGER_TAKEOVER_TITLE);
SetDParamStr(2, cni->company_name);
SetDParamStr(3, cni->other_company_name);
AddCompanyNewsItem(STR_MESSAGE_NEWS_FORMAT, cni);
AI::BroadcastNewEvent(new ScriptEventCompanyMerger(to_merge_id, company_id));
Game::NewEvent(new ScriptEventCompanyMerger(to_merge_id, company_id));
ChangeOwnershipOfCompanyItems(to_merge_id, company_id);
PostAcquireCompany(to_merge);
break;
}
default: return CMD_ERROR; default: return CMD_ERROR;
} }

View File

@@ -71,6 +71,7 @@ enum CompanyCtrlAction {
CCA_NEW_AI, ///< Create a new AI company. CCA_NEW_AI, ///< Create a new AI company.
CCA_DELETE, ///< Delete a company. CCA_DELETE, ///< Delete a company.
CCA_SALE, ///< Offer a company for sale. CCA_SALE, ///< Offer a company for sale.
CCA_MERGE, ///< Merge companies.
CCA_END, ///< Sentinel for end. CCA_END, ///< Sentinel for end.
}; };

View File

@@ -1183,6 +1183,35 @@ DEF_CONSOLE_CMD(ConOfferCompanySale)
return true; return true;
} }
DEF_CONSOLE_CMD(ConMergeCompanies)
{
if (argc != 3) {
IConsolePrint(CC_HELP, "Merge two companies together. Usage: 'merge_companies <main-company-id> <to-merge-company-id>'");
IConsolePrint(CC_HELP, "The first company ID <main-company-id> will be left with the combined assets of both companies.");
IConsolePrint(CC_HELP, "The second company ID <to-merge-company-id> will be removed, with all assets transfered to the first company ID.");
IConsolePrint(CC_HELP, "For company-id's, see the list of companies from the dropdown menu. Company 1 is 1, etc.");
return true;
}
CompanyID main_company = (CompanyID)(atoi(argv[1]) - 1);
CompanyID to_merge_company = (CompanyID)(atoi(argv[2]) - 1);
/* Check valid range */
if (!Company::IsValidID(main_company)) {
IConsolePrintF(CC_ERROR, "Main company does not exist. Company-id must be between 1 and %d.", MAX_COMPANIES);
return true;
}
if (!Company::IsValidID(to_merge_company)) {
IConsolePrintF(CC_ERROR, "Company to merge does not exist. Company-id must be between 1 and %d.", MAX_COMPANIES);
return true;
}
DoCommandP(0, CCA_MERGE | (main_company << 16) | (to_merge_company << 24), 0, CMD_COMPANY_CTRL);
IConsolePrint(CC_DEFAULT, "Companies merged.");
return true;
}
DEF_CONSOLE_CMD(ConNetworkClients) DEF_CONSOLE_CMD(ConNetworkClients)
{ {
if (argc == 0) { if (argc == 0) {
@@ -4139,6 +4168,7 @@ void IConsoleStdLibRegister()
IConsole::CmdRegister("reset_company", ConResetCompany, ConHookServerOnly); IConsole::CmdRegister("reset_company", ConResetCompany, ConHookServerOnly);
IConsole::AliasRegister("clean_company", "reset_company %A"); IConsole::AliasRegister("clean_company", "reset_company %A");
IConsole::CmdRegister("offer_company_sale", ConOfferCompanySale, ConHookServerOrNoNetwork); IConsole::CmdRegister("offer_company_sale", ConOfferCompanySale, ConHookServerOrNoNetwork);
IConsole::CmdRegister("merge_companies", ConMergeCompanies, ConHookServerOrNoNetwork);
IConsole::CmdRegister("client_name", ConClientNickChange, ConHookServerOnly); IConsole::CmdRegister("client_name", ConClientNickChange, ConHookServerOnly);
IConsole::CmdRegister("kick", ConKick, ConHookServerOnly); IConsole::CmdRegister("kick", ConKick, ConHookServerOnly);
IConsole::CmdRegister("ban", ConBan, ConHookServerOnly); IConsole::CmdRegister("ban", ConBan, ConHookServerOnly);

View File

@@ -2490,11 +2490,16 @@ static void DoAcquireCompany(Company *c, bool hostile_takeover)
ChangeOwnershipOfCompanyItems(ci, _current_company); ChangeOwnershipOfCompanyItems(ci, _current_company);
PostAcquireCompany(c);
}
void PostAcquireCompany(Company *c)
{
if (c->is_ai) AI::Stop(c->index); if (c->is_ai) AI::Stop(c->index);
c->bankrupt_asked = 0; c->bankrupt_asked = 0;
DeleteCompanyWindows(ci); DeleteCompanyWindows(c->index);
InvalidateWindowClassesData(WC_TRAINS_LIST, 0); InvalidateWindowClassesData(WC_TRAINS_LIST, 0);
InvalidateWindowClassesData(WC_TRACE_RESTRICT_SLOTS, 0); InvalidateWindowClassesData(WC_TRACE_RESTRICT_SLOTS, 0);
InvalidateWindowClassesData(WC_SHIPS_LIST, 0); InvalidateWindowClassesData(WC_SHIPS_LIST, 0);

View File

@@ -60,4 +60,6 @@ int PercentageToScaleQuantityFactor(uint percentage);
void UpdateCargoScalers(); void UpdateCargoScalers();
void PostAcquireCompany(Company *c);
#endif /* ECONOMY_FUNC_H */ #endif /* ECONOMY_FUNC_H */

View File

@@ -1285,7 +1285,8 @@ void NetworkGameLoop()
} else if (strncmp(p, "msg: ", 5) == 0 || strncmp(p, "client: ", 8) == 0 || } else if (strncmp(p, "msg: ", 5) == 0 || strncmp(p, "client: ", 8) == 0 ||
strncmp(p, "load: ", 6) == 0 || strncmp(p, "save: ", 6) == 0 || strncmp(p, "load: ", 6) == 0 || strncmp(p, "save: ", 6) == 0 ||
strncmp(p, "new_company: ", 13) == 0 || strncmp(p, "new_company_ai: ", 16) == 0 || strncmp(p, "new_company: ", 13) == 0 || strncmp(p, "new_company_ai: ", 16) == 0 ||
strncmp(p, "buy_company: ", 13) == 0 || strncmp(p, "delete_company: ", 16) == 0) { strncmp(p, "buy_company: ", 13) == 0 || strncmp(p, "delete_company: ", 16) == 0 ||
strncmp(p, "merge_companies: ", 17) == 0) {
/* A message that is not very important to the log playback, but part of the log. */ /* A message that is not very important to the log playback, but part of the log. */
#ifndef DEBUG_FAILED_DUMP_COMMANDS #ifndef DEBUG_FAILED_DUMP_COMMANDS
} else if (strncmp(p, "cmdf: ", 6) == 0) { } else if (strncmp(p, "cmdf: ", 6) == 0) {