OpenTTD
company_cmd.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
10 #include "stdafx.h"
11 #include "company_base.h"
12 #include "company_func.h"
13 #include "company_gui.h"
14 #include "town.h"
15 #include "news_func.h"
16 #include "cmd_helper.h"
17 #include "command_func.h"
18 #include "network/network.h"
19 #include "network/network_func.h"
20 #include "network/network_base.h"
21 #include "network/network_admin.h"
22 #include "ai/ai.hpp"
23 #include "company_manager_face.h"
24 #include "window_func.h"
25 #include "strings_func.h"
26 #include "date_func.h"
27 #include "sound_func.h"
28 #include "rail.h"
29 #include "core/pool_func.hpp"
30 #include "settings_func.h"
31 #include "vehicle_base.h"
32 #include "vehicle_func.h"
33 #include "smallmap_gui.h"
34 #include "game/game.hpp"
35 #include "goal_base.h"
36 #include "story_base.h"
37 
38 #include "table/strings.h"
39 
40 #include "safeguards.h"
41 
43 
50 
51 CompanyPool _company_pool("Company");
53 
54 
59 Company::Company(uint16 name_1, bool is_ai)
60 {
61  this->name_1 = name_1;
62  this->location_of_HQ = INVALID_TILE;
63  this->is_ai = is_ai;
64  this->terraform_limit = _settings_game.construction.terraform_frame_burst << 16;
65  this->clear_limit = _settings_game.construction.clear_frame_burst << 16;
66  this->tree_limit = _settings_game.construction.tree_frame_burst << 16;
67 
68  for (uint j = 0; j < 4; j++) this->share_owners[j] = COMPANY_SPECTATOR;
70 }
71 
74 {
75  if (CleaningPool()) return;
76 
78 }
79 
85 {
86  InvalidateWindowData(WC_GRAPH_LEGEND, 0, (int)index);
90  /* If the currently shown error message has this company in it, then close it. */
92 }
93 
100 void SetLocalCompany(CompanyID new_company)
101 {
102  /* company could also be COMPANY_SPECTATOR or OWNER_NONE */
103  assert(Company::IsValidID(new_company) || new_company == COMPANY_SPECTATOR || new_company == OWNER_NONE);
104 
105  /* If actually changing to another company, several windows need closing */
106  bool switching_company = _local_company != new_company;
107 
108  /* Delete the chat window, if you were team chatting. */
110 
111  assert(IsLocalCompany());
112 
113  _current_company = _local_company = new_company;
114 
115  /* Delete any construction windows... */
116  if (switching_company) DeleteConstructionWindows();
117 
118  /* ... and redraw the whole screen. */
121 }
122 
129 {
130  if (!Company::IsValidID(company)) return (TextColour)_colour_gradient[COLOUR_WHITE][4] | TC_IS_PALETTE_COLOUR;
132 }
133 
140 void DrawCompanyIcon(CompanyID c, int x, int y)
141 {
142  DrawSprite(SPR_COMPANY_ICON, COMPANY_SPRITE_COLOUR(c), x, y);
143 }
144 
152 {
153  if (!AreCompanyManagerFaceBitsValid(cmf, CMFV_GEN_ETHN, GE_WM)) return false;
154 
156  bool has_moustache = !HasBit(ge, GENDER_FEMALE) && GetCompanyManagerFaceBits(cmf, CMFV_HAS_MOUSTACHE, ge) != 0;
157  bool has_tie_earring = !HasBit(ge, GENDER_FEMALE) || GetCompanyManagerFaceBits(cmf, CMFV_HAS_TIE_EARRING, ge) != 0;
158  bool has_glasses = GetCompanyManagerFaceBits(cmf, CMFV_HAS_GLASSES, ge) != 0;
159 
160  if (!AreCompanyManagerFaceBitsValid(cmf, CMFV_EYE_COLOUR, ge)) return false;
161  for (CompanyManagerFaceVariable cmfv = CMFV_CHEEKS; cmfv < CMFV_END; cmfv++) {
162  switch (cmfv) {
163  case CMFV_MOUSTACHE: if (!has_moustache) continue; break;
164  case CMFV_LIPS:
165  case CMFV_NOSE: if (has_moustache) continue; break;
166  case CMFV_TIE_EARRING: if (!has_tie_earring) continue; break;
167  case CMFV_GLASSES: if (!has_glasses) continue; break;
168  default: break;
169  }
170  if (!AreCompanyManagerFaceBitsValid(cmf, cmfv, ge)) return false;
171  }
172 
173  return true;
174 }
175 
180 void InvalidateCompanyWindows(const Company *company)
181 {
182  CompanyID cid = company->index;
183 
186 }
187 
194 {
195  if (cost.GetCost() > 0) {
197  if (c != nullptr && cost.GetCost() > c->money) {
198  SetDParam(0, cost.GetCost());
199  cost.MakeError(STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY);
200  return false;
201  }
202  }
203  return true;
204 }
205 
212 {
213  if (cost.GetCost() == 0) return;
214  assert(cost.GetExpensesType() != INVALID_EXPENSES);
215 
216  c->money -= cost.GetCost();
217  c->yearly_expenses[0][cost.GetExpensesType()] += cost.GetCost();
218 
219  if (HasBit(1 << EXPENSES_TRAIN_INC |
220  1 << EXPENSES_ROADVEH_INC |
221  1 << EXPENSES_AIRCRAFT_INC |
222  1 << EXPENSES_SHIP_INC, cost.GetExpensesType())) {
223  c->cur_economy.income -= cost.GetCost();
224  } else if (HasBit(1 << EXPENSES_TRAIN_RUN |
225  1 << EXPENSES_ROADVEH_RUN |
226  1 << EXPENSES_AIRCRAFT_RUN |
227  1 << EXPENSES_SHIP_RUN |
228  1 << EXPENSES_PROPERTY |
229  1 << EXPENSES_LOAN_INT, cost.GetExpensesType())) {
230  c->cur_economy.expenses -= cost.GetCost();
231  }
232 
234 }
235 
241 {
243  if (c != nullptr) SubtractMoneyFromAnyCompany(c, cost);
244 }
245 
252 {
253  Company *c = Company::Get(company);
254  byte m = c->money_fraction;
255  Money cost = cst.GetCost();
256 
257  c->money_fraction = m - (byte)cost;
258  cost >>= 8;
259  if (c->money_fraction > m) cost++;
260  if (cost != 0) SubtractMoneyFromAnyCompany(c, CommandCost(cst.GetExpensesType(), cost));
261 }
262 
265 {
266  for (Company *c : Company::Iterate()) {
267  c->terraform_limit = min(c->terraform_limit + _settings_game.construction.terraform_per_64k_frames, (uint32)_settings_game.construction.terraform_frame_burst << 16);
268  c->clear_limit = min(c->clear_limit + _settings_game.construction.clear_per_64k_frames, (uint32)_settings_game.construction.clear_frame_burst << 16);
269  c->tree_limit = min(c->tree_limit + _settings_game.construction.tree_per_64k_frames, (uint32)_settings_game.construction.tree_frame_burst << 16);
270  }
271 }
272 
279 void GetNameOfOwner(Owner owner, TileIndex tile)
280 {
281  SetDParam(2, owner);
282 
283  if (owner != OWNER_TOWN) {
284  if (!Company::IsValidID(owner)) {
285  SetDParam(0, STR_COMPANY_SOMEONE);
286  } else {
287  SetDParam(0, STR_COMPANY_NAME);
288  SetDParam(1, owner);
289  }
290  } else {
291  assert(tile != 0);
292  const Town *t = ClosestTownFromTile(tile, UINT_MAX);
293 
294  SetDParam(0, STR_TOWN_NAME);
295  SetDParam(1, t->index);
296  }
297 }
298 
299 
309 {
310  assert(owner < OWNER_END);
311  assert(owner != OWNER_TOWN || tile != 0);
312 
313  if (owner == _current_company) return CommandCost();
314 
315  GetNameOfOwner(owner, tile);
316  return_cmd_error(STR_ERROR_OWNED_BY);
317 }
318 
327 {
328  Owner owner = GetTileOwner(tile);
329 
330  assert(owner < OWNER_END);
331 
332  if (owner == _current_company) return CommandCost();
333 
334  /* no need to get the name of the owner unless we're the local company (saves some time) */
335  if (IsLocalCompany()) GetNameOfOwner(owner, tile);
336  return_cmd_error(STR_ERROR_OWNED_BY);
337 }
338 
344 {
345  /* Reserve space for extra unicode character. We need to do this to be able
346  * to detect too long company name. */
347  char buffer[(MAX_LENGTH_COMPANY_NAME_CHARS + 1) * MAX_CHAR_LENGTH];
348 
349  if (c->name_1 != STR_SV_UNNAMED) return;
350  if (c->last_build_coordinate == 0) return;
351 
353 
354  StringID str;
355  uint32 strp;
356  if (t->name == nullptr && IsInsideMM(t->townnametype, SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_LAST + 1)) {
357  str = t->townnametype - SPECSTR_TOWNNAME_START + SPECSTR_COMPANY_NAME_START;
358  strp = t->townnameparts;
359 
360 verify_name:;
361  /* No companies must have this name already */
362  for (const Company *cc : Company::Iterate()) {
363  if (cc->name_1 == str && cc->name_2 == strp) goto bad_town_name;
364  }
365 
366  GetString(buffer, str, lastof(buffer));
367  if (Utf8StringLength(buffer) >= MAX_LENGTH_COMPANY_NAME_CHARS) goto bad_town_name;
368 
369 set_name:;
370  c->name_1 = str;
371  c->name_2 = strp;
372 
374 
375  if (c->is_ai) {
376  CompanyNewsInformation *cni = MallocT<CompanyNewsInformation>(1);
377  cni->FillData(c);
378  SetDParam(0, STR_NEWS_COMPANY_LAUNCH_TITLE);
379  SetDParam(1, STR_NEWS_COMPANY_LAUNCH_DESCRIPTION);
380  SetDParamStr(2, cni->company_name);
381  SetDParam(3, t->index);
382  AddNewsItem(STR_MESSAGE_NEWS_FORMAT, NT_COMPANY_INFO, NF_COMPANY, NR_TILE, c->last_build_coordinate, NR_NONE, UINT32_MAX, cni);
383  }
384  return;
385  }
386 bad_town_name:;
387 
388  if (c->president_name_1 == SPECSTR_PRESIDENT_NAME) {
389  str = SPECSTR_ANDCO_NAME;
390  strp = c->president_name_2;
391  goto set_name;
392  } else {
393  str = SPECSTR_ANDCO_NAME;
394  strp = Random();
395  goto verify_name;
396  }
397 }
398 
400 static const byte _colour_sort[COLOUR_END] = {2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2, 2, 3, 1, 1, 1};
402 static const Colours _similar_colour[COLOUR_END][2] = {
403  { COLOUR_BLUE, COLOUR_LIGHT_BLUE }, // COLOUR_DARK_BLUE
404  { COLOUR_GREEN, COLOUR_DARK_GREEN }, // COLOUR_PALE_GREEN
405  { INVALID_COLOUR, INVALID_COLOUR }, // COLOUR_PINK
406  { COLOUR_ORANGE, INVALID_COLOUR }, // COLOUR_YELLOW
407  { INVALID_COLOUR, INVALID_COLOUR }, // COLOUR_RED
408  { COLOUR_DARK_BLUE, COLOUR_BLUE }, // COLOUR_LIGHT_BLUE
409  { COLOUR_PALE_GREEN, COLOUR_DARK_GREEN }, // COLOUR_GREEN
410  { COLOUR_PALE_GREEN, COLOUR_GREEN }, // COLOUR_DARK_GREEN
411  { COLOUR_DARK_BLUE, COLOUR_LIGHT_BLUE }, // COLOUR_BLUE
412  { COLOUR_BROWN, COLOUR_ORANGE }, // COLOUR_CREAM
413  { COLOUR_PURPLE, INVALID_COLOUR }, // COLOUR_MAUVE
414  { COLOUR_MAUVE, INVALID_COLOUR }, // COLOUR_PURPLE
415  { COLOUR_YELLOW, COLOUR_CREAM }, // COLOUR_ORANGE
416  { COLOUR_CREAM, INVALID_COLOUR }, // COLOUR_BROWN
417  { COLOUR_WHITE, INVALID_COLOUR }, // COLOUR_GREY
418  { COLOUR_GREY, INVALID_COLOUR }, // COLOUR_WHITE
419 };
420 
425 static Colours GenerateCompanyColour()
426 {
427  Colours colours[COLOUR_END];
428 
429  /* Initialize array */
430  for (uint i = 0; i < COLOUR_END; i++) colours[i] = (Colours)i;
431 
432  /* And randomize it */
433  for (uint i = 0; i < 100; i++) {
434  uint r = Random();
435  Swap(colours[GB(r, 0, 4)], colours[GB(r, 4, 4)]);
436  }
437 
438  /* Bubble sort it according to the values in table 1 */
439  for (uint i = 0; i < COLOUR_END; i++) {
440  for (uint j = 1; j < COLOUR_END; j++) {
441  if (_colour_sort[colours[j - 1]] < _colour_sort[colours[j]]) {
442  Swap(colours[j - 1], colours[j]);
443  }
444  }
445  }
446 
447  /* Move the colours that look similar to each company's colour to the side */
448  for (const Company *c : Company::Iterate()) {
449  Colours pcolour = (Colours)c->colour;
450 
451  for (uint i = 0; i < COLOUR_END; i++) {
452  if (colours[i] == pcolour) {
453  colours[i] = INVALID_COLOUR;
454  break;
455  }
456  }
457 
458  for (uint j = 0; j < 2; j++) {
459  Colours similar = _similar_colour[pcolour][j];
460  if (similar == INVALID_COLOUR) break;
461 
462  for (uint i = 1; i < COLOUR_END; i++) {
463  if (colours[i - 1] == similar) Swap(colours[i - 1], colours[i]);
464  }
465  }
466  }
467 
468  /* Return the first available colour */
469  for (uint i = 0; i < COLOUR_END; i++) {
470  if (colours[i] != INVALID_COLOUR) return colours[i];
471  }
472 
473  NOT_REACHED();
474 }
475 
481 {
482  for (;;) {
483 restart:;
484  c->president_name_2 = Random();
485  c->president_name_1 = SPECSTR_PRESIDENT_NAME;
486 
487  /* Reserve space for extra unicode character. We need to do this to be able
488  * to detect too long president name. */
490  SetDParam(0, c->index);
491  GetString(buffer, STR_PRESIDENT_NAME, lastof(buffer));
492  if (Utf8StringLength(buffer) >= MAX_LENGTH_PRESIDENT_NAME_CHARS) continue;
493 
494  for (const Company *cc : Company::Iterate()) {
495  if (c != cc) {
496  /* Reserve extra space so even overlength president names can be compared. */
497  char buffer2[(MAX_LENGTH_PRESIDENT_NAME_CHARS + 1) * MAX_CHAR_LENGTH];
498  SetDParam(0, cc->index);
499  GetString(buffer2, STR_PRESIDENT_NAME, lastof(buffer2));
500  if (strcmp(buffer2, buffer) == 0) goto restart;
501  }
502  }
503  return;
504  }
505 }
506 
513 {
514  for (LiveryScheme scheme = LS_BEGIN; scheme < LS_END; scheme++) {
515  c->livery[scheme].in_use = 0;
516  c->livery[scheme].colour1 = c->colour;
517  c->livery[scheme].colour2 = c->colour;
518  }
519 
520  for (Group *g : Group::Iterate()) {
521  if (g->owner == c->index) {
522  g->livery.in_use = 0;
523  g->livery.colour1 = c->colour;
524  g->livery.colour2 = c->colour;
525  }
526  }
527 }
528 
537 {
538  if (!Company::CanAllocateItem()) return nullptr;
539 
540  /* we have to generate colour before this company is valid */
541  Colours colour = GenerateCompanyColour();
542 
543  Company *c;
544  if (company == INVALID_COMPANY) {
545  c = new Company(STR_SV_UNNAMED, is_ai);
546  } else {
547  if (Company::IsValidID(company)) return nullptr;
548  c = new (company) Company(STR_SV_UNNAMED, is_ai);
549  }
550 
551  c->colour = colour;
552 
554  _company_colours[c->index] = (Colours)c->colour;
555 
556  c->money = c->current_loan = (100000ll * _economy.inflation_prices >> 16) / 50000 * 50000;
557 
558  c->share_owners[0] = c->share_owners[1] = c->share_owners[2] = c->share_owners[3] = INVALID_OWNER;
559 
563  RandomCompanyManagerFaceBits(c->face, (GenderEthnicity)Random(), false, false); // create a random company manager face
564 
567 
569 
576 
577  if (is_ai && (!_networking || _network_server)) AI::StartNew(c->index);
578 
579  AI::BroadcastNewEvent(new ScriptEventCompanyNew(c->index), c->index);
580  Game::NewEvent(new ScriptEventCompanyNew(c->index));
581 
582  return c;
583 }
584 
587 {
589 }
590 
592 static bool MaybeStartNewCompany()
593 {
595 
596  /* count number of competitors */
597  uint n = 0;
598  for (const Company *c : Company::Iterate()) {
599  if (c->is_ai) n++;
600  }
601 
603  /* Send a command to all clients to start up a new AI.
604  * Works fine for Multiplayer and Singleplayer */
605  return DoCommandP(0, CCA_NEW_AI | INVALID_COMPANY << 16, 0, CMD_COMPANY_CTRL);
606  }
607 
608  return false;
609 }
610 
613 {
615 }
616 
624 {
625  const Company *c1 = Company::Get(cbig);
626  const Company *c2 = Company::Get(csmall);
627 
628  /* Do the combined vehicle counts stay within the limits? */
633 }
634 
645 {
646  /* Amount of time out for each company to take over a company;
647  * Timeout is a quarter (3 months of 30 days) divided over the
648  * number of companies. The minimum number of days in a quarter
649  * is 90: 31 in January, 28 in February and 31 in March.
650  * Note that the company going bankrupt can't buy itself. */
651  static const int TAKE_OVER_TIMEOUT = 3 * 30 * DAY_TICKS / (MAX_COMPANIES - 1);
652 
653  assert(c->bankrupt_asked != 0);
654 
655  /* We're currently asking some company to buy 'us' */
656  if (c->bankrupt_timeout != 0) {
658  if (c->bankrupt_timeout > 0) return;
659  c->bankrupt_timeout = 0;
660 
661  return;
662  }
663 
664  /* Did we ask everyone for bankruptcy? If so, bail out. */
665  if (c->bankrupt_asked == MAX_UVALUE(CompanyMask)) return;
666 
667  Company *best = nullptr;
668  int32 best_performance = -1;
669 
670  /* Ask the company with the highest performance history first */
671  for (Company *c2 : Company::Iterate()) {
672  if (c2->bankrupt_asked == 0 && // Don't ask companies going bankrupt themselves
673  !HasBit(c->bankrupt_asked, c2->index) &&
674  best_performance < c2->old_economy[1].performance_history &&
675  MayCompanyTakeOver(c2->index, c->index)) {
676  best_performance = c2->old_economy[1].performance_history;
677  best = c2;
678  }
679  }
680 
681  /* Asked all companies? */
682  if (best_performance == -1) {
683  c->bankrupt_asked = MAX_UVALUE(CompanyMask);
684  return;
685  }
686 
687  SetBit(c->bankrupt_asked, best->index);
688 
689  c->bankrupt_timeout = TAKE_OVER_TIMEOUT;
690  if (best->is_ai) {
691  AI::NewEvent(best->index, new ScriptEventCompanyAskMerger(c->index, ClampToI32(c->bankrupt_value)));
692  } else if (IsInteractiveCompany(best->index)) {
694  }
695 }
696 
699 {
700  if (_game_mode == GM_EDITOR) return;
701 
703  if (c != nullptr) {
704  if (c->name_1 != 0) GenerateCompanyName(c);
706  }
707 
708  if (_next_competitor_start == 0) {
709  /* AI::GetStartNextTime() can return 0. */
711  }
712 
713  if (_game_mode != GM_MENU && AI::CanStartNew() && --_next_competitor_start == 0) {
714  /* Allow multiple AIs to possibly start in the same tick. */
715  do {
716  if (!MaybeStartNewCompany()) break;
717 
718  /* In networking mode, we can only send a command to start but it
719  * didn't execute yet, so we cannot loop. */
720  if (_networking) break;
721  } while (AI::GetStartNextTime() == 0);
722  }
723 
725 }
726 
732 {
733  /* Copy statistics */
734  for (Company *c : Company::Iterate()) {
735  memmove(&c->yearly_expenses[1], &c->yearly_expenses[0], sizeof(c->yearly_expenses) - sizeof(c->yearly_expenses[0]));
736  memset(&c->yearly_expenses[0], 0, sizeof(c->yearly_expenses[0]));
737  SetWindowDirty(WC_FINANCES, c->index);
738  }
739 
744  if (_settings_client.sound.new_year) SndPlayFx(SND_01_BAD_YEAR);
745  } else {
746  if (_settings_client.sound.new_year) SndPlayFx(SND_00_GOOD_YEAR);
747  }
748  }
749 }
750 
757 {
758  SetDParam(0, c->index);
759  GetString(this->company_name, STR_COMPANY_NAME, lastof(this->company_name));
760 
761  if (other == nullptr) {
762  *this->other_company_name = '\0';
763  } else {
764  SetDParam(0, other->index);
765  GetString(this->other_company_name, STR_COMPANY_NAME, lastof(this->other_company_name));
766  c = other;
767  }
768 
769  SetDParam(0, c->index);
770  GetString(this->president_name, STR_PRESIDENT_NAME_MANAGER, lastof(this->president_name));
771 
772  this->colour = c->colour;
773  this->face = c->face;
774 
775 }
776 
781 void CompanyAdminUpdate(const Company *company)
782 {
784 }
785 
792 {
794 }
795 
808 CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
809 {
811  CompanyID company_id = (CompanyID)GB(p1, 16, 8);
812 
813  switch ((CompanyCtrlAction)GB(p1, 0, 16)) {
814  case CCA_NEW: { // Create a new company
815  /* This command is only executed in a multiplayer game */
816  if (!_networking) return CMD_ERROR;
817 
818  /* Has the network client a correct ClientIndex? */
819  if (!(flags & DC_EXEC)) return CommandCost();
820 
821  ClientID client_id = (ClientID)p2;
823 #ifndef DEBUG_DUMP_COMMANDS
824  /* When replaying the client ID is not a valid client; there
825  * are actually no clients at all. However, the company has to
826  * be created, otherwise we cannot rerun the game properly.
827  * So only allow a nullptr client info in that case. */
828  if (ci == nullptr) return CommandCost();
829 #endif /* NOT DEBUG_DUMP_COMMANDS */
830 
831  /* Delete multiplayer progress bar */
833 
834  Company *c = DoStartupNewCompany(false);
835 
836  /* A new company could not be created, revert to being a spectator */
837  if (c == nullptr) {
838  if (_network_server) {
841  }
842  break;
843  }
844 
845  /* This is the client (or non-dedicated server) who wants a new company */
846  if (client_id == _network_own_client_id) {
851  }
852 
853  /* Now that we have a new company, broadcast our company settings to
854  * all clients so everything is in sync */
856 
858  }
859 
861  break;
862  }
863 
864  case CCA_NEW_AI: { // Make a new AI company
865  if (!(flags & DC_EXEC)) return CommandCost();
866 
867  if (company_id != INVALID_COMPANY && (company_id >= MAX_COMPANIES || Company::IsValidID(company_id))) return CMD_ERROR;
868  Company *c = DoStartupNewCompany(true, company_id);
869  if (c != nullptr) NetworkServerNewCompany(c, nullptr);
870  break;
871  }
872 
873  case CCA_DELETE: { // Delete a company
874  CompanyRemoveReason reason = (CompanyRemoveReason)GB(p1, 24, 8);
875  if (reason >= CRR_END) return CMD_ERROR;
876 
877  Company *c = Company::GetIfValid(company_id);
878  if (c == nullptr) return CMD_ERROR;
879 
880  if (!(flags & DC_EXEC)) return CommandCost();
881 
882  /* Delete any open window of the company */
884  CompanyNewsInformation *cni = MallocT<CompanyNewsInformation>(1);
885  cni->FillData(c);
886 
887  /* Show the bankrupt news */
888  SetDParam(0, STR_NEWS_COMPANY_BANKRUPT_TITLE);
889  SetDParam(1, STR_NEWS_COMPANY_BANKRUPT_DESCRIPTION);
890  SetDParamStr(2, cni->company_name);
891  AddCompanyNewsItem(STR_MESSAGE_NEWS_FORMAT, cni);
892 
893  /* Remove the company */
895  if (c->is_ai) AI::Stop(c->index);
896 
897  CompanyID c_index = c->index;
898  delete c;
899  AI::BroadcastNewEvent(new ScriptEventCompanyBankrupt(c_index));
900  Game::NewEvent(new ScriptEventCompanyBankrupt(c_index));
901  CompanyAdminRemove(c_index, (CompanyRemoveReason)reason);
902 
904  break;
905  }
906 
907  default: return CMD_ERROR;
908  }
909 
913 
914  return CommandCost();
915 }
916 
926 CommandCost CmdSetCompanyManagerFace(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
927 {
929 
930  if (!IsValidCompanyManagerFace(cmf)) return CMD_ERROR;
931 
932  if (flags & DC_EXEC) {
933  Company::Get(_current_company)->face = cmf;
935  }
936  return CommandCost();
937 }
938 
950 CommandCost CmdSetCompanyColour(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
951 {
952  Colours colour = Extract<Colours, 0, 8>(p2);
953  LiveryScheme scheme = Extract<LiveryScheme, 0, 8>(p1);
954  bool second = HasBit(p1, 8);
955 
956  if (scheme >= LS_END || (colour >= COLOUR_END && colour != INVALID_COLOUR)) return CMD_ERROR;
957 
958  /* Default scheme can't be reset to invalid. */
959  if (scheme == LS_DEFAULT && colour == INVALID_COLOUR) return CMD_ERROR;
960 
962 
963  /* Ensure no two companies have the same primary colour */
964  if (scheme == LS_DEFAULT && !second) {
965  for (const Company *cc : Company::Iterate()) {
966  if (cc != c && cc->colour == colour) return CMD_ERROR;
967  }
968  }
969 
970  if (flags & DC_EXEC) {
971  if (!second) {
972  if (scheme != LS_DEFAULT) SB(c->livery[scheme].in_use, 0, 1, colour != INVALID_COLOUR);
973  if (colour == INVALID_COLOUR) colour = (Colours)c->livery[LS_DEFAULT].colour1;
974  c->livery[scheme].colour1 = colour;
975 
976  /* If setting the first colour of the default scheme, adjust the
977  * original and cached company colours too. */
978  if (scheme == LS_DEFAULT) {
979  for (int i = 1; i < LS_END; i++) {
980  if (!HasBit(c->livery[i].in_use, 0)) c->livery[i].colour1 = colour;
981  }
983  c->colour = colour;
985  }
986  } else {
987  if (scheme != LS_DEFAULT) SB(c->livery[scheme].in_use, 1, 1, colour != INVALID_COLOUR);
988  if (colour == INVALID_COLOUR) colour = (Colours)c->livery[LS_DEFAULT].colour2;
989  c->livery[scheme].colour2 = colour;
990 
991  if (scheme == LS_DEFAULT) {
992  for (int i = 1; i < LS_END; i++) {
993  if (!HasBit(c->livery[i].in_use, 1)) c->livery[i].colour2 = colour;
994  }
995  }
996  }
997 
998  if (c->livery[scheme].in_use != 0) {
999  /* If enabling a scheme, set the default scheme to be in use too */
1000  c->livery[LS_DEFAULT].in_use = 1;
1001  } else {
1002  /* Else loop through all schemes to see if any are left enabled.
1003  * If not, disable the default scheme too. */
1004  c->livery[LS_DEFAULT].in_use = 0;
1005  for (scheme = LS_DEFAULT; scheme < LS_END; scheme++) {
1006  if (c->livery[scheme].in_use != 0) {
1007  c->livery[LS_DEFAULT].in_use = 1;
1008  break;
1009  }
1010  }
1011  }
1012 
1013  ResetVehicleColourMap();
1015 
1016  /* All graph related to companies use the company colour. */
1023  /* The smallmap owner view also stores the company colours. */
1024  BuildOwnerLegend();
1026 
1027  /* Company colour data is indirectly cached. */
1028  for (Vehicle *v : Vehicle::Iterate()) {
1029  if (v->owner == _current_company) v->InvalidateNewGRFCache();
1030  }
1031 
1032  extern void UpdateObjectColours(const Company *c);
1034  }
1035  return CommandCost();
1036 }
1037 
1043 static bool IsUniqueCompanyName(const char *name)
1044 {
1045  for (const Company *c : Company::Iterate()) {
1046  if (c->name != nullptr && strcmp(c->name, name) == 0) return false;
1047  }
1048 
1049  return true;
1050 }
1051 
1061 CommandCost CmdRenameCompany(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
1062 {
1063  bool reset = StrEmpty(text);
1064 
1065  if (!reset) {
1067  if (!IsUniqueCompanyName(text)) return_cmd_error(STR_ERROR_NAME_MUST_BE_UNIQUE);
1068  }
1069 
1070  if (flags & DC_EXEC) {
1072  free(c->name);
1073  c->name = reset ? nullptr : stredup(text);
1075  CompanyAdminUpdate(c);
1076  }
1077 
1078  return CommandCost();
1079 }
1080 
1086 static bool IsUniquePresidentName(const char *name)
1087 {
1088  for (const Company *c : Company::Iterate()) {
1089  if (c->president_name != nullptr && strcmp(c->president_name, name) == 0) return false;
1090  }
1091 
1092  return true;
1093 }
1094 
1104 CommandCost CmdRenamePresident(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
1105 {
1106  bool reset = StrEmpty(text);
1107 
1108  if (!reset) {
1110  if (!IsUniquePresidentName(text)) return_cmd_error(STR_ERROR_NAME_MUST_BE_UNIQUE);
1111  }
1112 
1113  if (flags & DC_EXEC) {
1115  free(c->president_name);
1116 
1117  if (reset) {
1118  c->president_name = nullptr;
1119  } else {
1120  c->president_name = stredup(text);
1121 
1122  if (c->name_1 == STR_SV_UNNAMED && c->name == nullptr) {
1123  char buf[80];
1124 
1125  seprintf(buf, lastof(buf), "%s Transport", text);
1126  DoCommand(0, 0, 0, DC_EXEC, CMD_RENAME_COMPANY, buf);
1127  }
1128  }
1129 
1131  CompanyAdminUpdate(c);
1132  }
1133 
1134  return CommandCost();
1135 }
1136 
1144 {
1145  const VehicleDefaultSettings *vds = (c == nullptr) ? &_settings_client.company.vehicle : &c->settings.vehicle;
1146  switch (type) {
1147  default: NOT_REACHED();
1148  case VEH_TRAIN: return vds->servint_trains;
1149  case VEH_ROAD: return vds->servint_roadveh;
1150  case VEH_AIRCRAFT: return vds->servint_aircraft;
1151  case VEH_SHIP: return vds->servint_ships;
1152  }
1153 }
1154 
1160 {
1161  uint32 total = 0;
1162  for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) {
1163  if (RoadTypeIsRoad(rt)) total += this->road[rt];
1164  }
1165  return total;
1166 }
1167 
1173 {
1174  uint32 total = 0;
1175  for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) {
1176  if (RoadTypeIsTram(rt)) total += this->road[rt];
1177  }
1178  return total;
1179 }
static void PostDestructor(size_t index)
Invalidating some stuff after removing item from the pool.
Definition: company_cmd.cpp:84
void InvalidateCompanyWindows(const Company *company)
Refresh all windows owned by a company.
Functions related to OTTD&#39;s strings.
void UpdateLandscapingLimits()
Update the landscaping limits per company.
Owner
Enum for all companies/owners.
Definition: company_type.h:18
VehicleSettings vehicle
options for vehicles
uint32 tree_per_64k_frames
how many trees may, over a long period, be planted per 65536 frames?
static void Swap(T &a, T &b)
Type safe swap operation.
Definition: math_func.hpp:275
void NetworkAdminCompanyUpdate(const Company *company)
Notify the admin network of company updates.
static bool IsLocalCompany()
Is the current company the local company?
Definition: company_func.h:43
int CompanyServiceInterval(const Company *c, VehicleType type)
Get the service interval for the given company and vehicle type.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition: settings.cpp:79
static void NewEvent(class ScriptEvent *event)
Queue a new event for a Game Script.
Definition: game_core.cpp:141
used in multiplayer to create a new companies etc.
Definition: command_type.h:278
Definition of stuff that is very close to a company, like the company struct itself.
static void StartNew(CompanyID company, bool rerandomise_ai=true)
Start a new AI company.
Definition: ai_core.cpp:36
static Titem * GetIfValid(size_t index)
Returns Titem with given index.
Definition: pool_type.hpp:302
bool _networking
are we in networking mode?
Definition: network.cpp:52
Default settings for vehicles.
Container for all information known about a client.
Definition: network_base.h:23
char * name
Name of the company if the user changed it.
Definition: company_base.h:57
LiveryScheme
List of different livery schemes.
Definition: livery.h:20
Invalid expense type.
Definition: economy_type.h:163
AdminCompanyRemoveReason
Reasons for removing a company - communicated to admins.
Definition: tcp_admin.h:101
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
Definition: window.cpp:3215
TextColour GetDrawStringCompanyColour(CompanyID company)
Get the colour for DrawString-subroutines which matches the colour of the company.
void InitializeCompanies()
Initialize the pool of companies.
void BuildOwnerLegend()
Completes the array for the owned property legend.
An invalid owner.
Definition: company_type.h:29
Client list; Window numbers:
Definition: window_type.h:472
Train vehicle type.
Definition: vehicle_type.h:24
static Titem * Get(size_t index)
Returns Titem with given index.
Definition: pool_type.hpp:291
int32 performance_history
Company score (scale 0-1000)
Definition: company_base.h:25
Functions related to dates.
int CDECL seprintf(char *str, const char *last, const char *format,...)
Safer implementation of snprintf; same as snprintf except:
Definition: string.cpp:407
byte money_fraction
Fraction of money of the company, too small to represent in money.
Definition: company_base.h:66
CompanyManagerFace _company_manager_face
for company manager face storage in openttd.cfg
Definition: company_cmd.cpp:47
CommandCost CmdSetCompanyManagerFace(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
Change the company manager&#39;s face.
void ClearEnginesHiddenFlagOfCompany(CompanyID cid)
Clear the &#39;hidden&#39; flag for all engines of a new company.
Definition: engine.cpp:844
Year inaugurated_year
Year of starting the company.
Definition: company_base.h:78
static bool IsUniqueCompanyName(const char *name)
Is the given name in use as name of a company?
void DeleteConstructionWindows()
Delete all windows that are used for construction of vehicle etc.
Definition: window.cpp:3425
static T SetBit(T &x, const uint8 y)
Set a bit in a variable.
This bit set means a female, otherwise male.
ExpensesType GetExpensesType() const
The expense type of the cost.
Definition: command_type.h:91
byte _colour_gradient[COLOUR_END][8]
All 16 colour gradients 8 colours per gradient from darkest (0) to lightest (7)
Definition: gfx.cpp:52
static const CommandCost CMD_ERROR
Define a default return value for a failed command.
Definition: command_func.h:23
Ship vehicle type.
Definition: vehicle_type.h:26
ClientID client_id
Client identifier (same as ClientState->client_id)
Definition: network_base.h:24
uint64 inflation_prices
Cumulated inflation of prices since game start; 16 bit fractional part.
Definition: economy_type.h:27
Rail specific functions.
A town owns the tile, or a town is expanding.
Definition: company_type.h:24
bool CheckCompanyHasMoney(CommandCost &cost)
Verify whether the company can pay the bill.
RoadTypes GetCompanyRoadTypes(CompanyID company, bool introduces)
Get the road types the given company can build.
Definition: road.cpp:188
Used for iterations.
Definition: road_type.h:26
Popup for the client list; Window numbers:
Definition: window_type.h:478
VehicleType
Available vehicle types.
Definition: vehicle_type.h:21
Sign list; Window numbers:
Definition: window_type.h:271
void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
Change the ownership of all the items of a company.
Definition: economy.cpp:282
CompanyMask bankrupt_asked
which companies were asked about buying it?
Definition: company_base.h:81
uint _cur_company_tick_index
used to generate a name for one company that doesn&#39;t have a name yet per tick
Definition: company_cmd.cpp:49
Functions related to vehicles.
void DrawCompanyIcon(CompanyID c, int x, int y)
Draw the icon of a company.
Vehicle data structure.
Definition: vehicle_base.h:210
CompanyPool _company_pool("Company")
Pool of companies.
UnitID max_aircraft
max planes in game per company
uint32 GetTramTotal() const
Get total sum of all owned tram bits.
void NetworkUpdateClientInfo(ClientID client_id)
Send updated client info of a particular client.
CommandCost CheckTileOwnership(TileIndex tile)
Check whether the current owner owns the stuff on the given tile.
DifficultySettings difficulty
settings related to the difficulty
static void BroadcastNewEvent(ScriptEvent *event, CompanyID skip_company=MAX_COMPANIES)
Broadcast a new event to all active AIs.
Definition: ai_core.cpp:259
Tindex index
Index of this pool item.
Definition: pool_type.hpp:189
char * president_name
Name of the president if the user changed it.
Definition: company_base.h:61
static const int DAY_TICKS
1 day is 74 ticks; _date_fract used to be uint16 and incremented by 885.
Definition: date_type.h:28
Company value graph; Window numbers:
Definition: window_type.h:546
bool new_year
Play sound on new year, summarising the performance during the last year.
Helper functions to extract data from command parameters.
static const uint MAX_LENGTH_PRESIDENT_NAME_CHARS
The maximum length of a president name in characters including &#39;\0&#39;.
Definition: company_type.h:39
#define lastof(x)
Get the last element of an fixed size array.
Definition: depend.cpp:48
static int GetStartNextTime()
Get the number of days before the next AI should start.
Definition: ai_core.cpp:307
Data that needs to be stored for company news messages.
Definition: news_type.h:148
uint16 tree_frame_burst
how many trees may, over a short period, be planted?
Money GetCost() const
The costs as made up to this moment.
Definition: command_type.h:82
Base core network types and some helper functions to access them.
uint32 name_2
Parameter of name_1.
Definition: company_base.h:55
static bool IsValidCompanyManagerFace(CompanyManagerFace cmf)
Checks whether a company manager&#39;s face is a valid encoding.
A male of Caucasian origin (white)
Common return value for all commands.
Definition: command_type.h:23
ClientID
&#39;Unique&#39; identifier to be given to clients
Definition: network_type.h:39
RoadType
The different roadtypes we support.
Definition: road_type.h:22
static T max(const T a, const T b)
Returns the maximum of two values.
Definition: math_func.hpp:24
Year _cur_year
Current year, starting at 0.
Definition: date.cpp:24
CompanySettings settings
settings specific for each company
Definition: company_base.h:127
void DeleteCompanyWindows(CompanyID company)
Delete all windows of a company.
Definition: window.cpp:1197
static T SB(T &x, const uint8 s, const uint8 n, const U d)
Set n bits in x starting at bit s to d.
void MakeError(StringID message)
Makes this CommandCost behave like an error command.
Definition: command_type.h:100
uint16 servint_ships
service interval for ships
Income from ships.
Definition: economy_type.h:159
char company_name[64]
The name of the company.
Definition: news_type.h:149
Running costs aircraft.
Definition: economy_type.h:153
Income graph; Window numbers:
Definition: window_type.h:522
Money expenses
The amount of expenses.
Definition: company_base.h:23
static bool IsInsideMM(const T x, const size_t min, const size_t max)
Checks if a value is in an interval.
Definition: math_func.hpp:264
void InvalidateWindowClassesData(WindowClass cls, int data, bool gui_scope)
Mark window data of all windows of a given class as invalid (in need of re-computing) Note that by de...
Definition: window.cpp:3334
Town * ClosestTownFromTile(TileIndex tile, uint threshold)
Return the town closest (in distance or ownership) to a given tile, within a given threshold...
Definition: town_cmd.cpp:3488
void SetDParamStr(uint n, const char *str)
This function is used to "bind" a C string to a OpenTTD dparam slot.
Definition: strings.cpp:279
uint32 clear_per_64k_frames
how many tiles may, over a long period, be cleared per 65536 frames?
CommandCost CmdRenameCompany(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
Change the name of the company.
Some methods of Pool are placed here in order to reduce compilation time and binary size...
NetworkSettings network
settings related to the network
static const int MAX_CHAR_LENGTH
Max. length of UTF-8 encoded unicode character.
Definition: strings_type.h:18
uint32 CompanyManagerFace
Company manager face bits, info see in company_manager_face.h.
Definition: company_type.h:51
The tile has no ownership.
Definition: company_type.h:25
void SetDefaultCompanySettings(CompanyID cid)
Set the company settings for a new company to their default values.
Definition: settings.cpp:1986
CompanyID client_playas
As which company is this client playing (CompanyID)
Definition: network_base.h:27
void SubtractMoneyFromCompanyFract(CompanyID company, CommandCost cst)
Subtract money from a company, including the money fraction.
~Company()
Destructor.
Definition: company_cmd.cpp:73
byte num_valid_stat_ent
Number of valid statistical entries in old_economy.
Definition: company_base.h:98
bool MayCompanyTakeOver(CompanyID cbig, CompanyID csmall)
May company cbig buy company csmall?
void GetNameOfOwner(Owner owner, TileIndex tile)
Set the right DParams to get the name of an owner.
CommandCost DoCommand(const CommandContainer *container, DoCommandFlag flags)
Shorthand for calling the long DoCommand with a container.
Definition: command.cpp:441
Error message; Window numbers:
Definition: window_type.h:103
The client is spectating.
Definition: company_type.h:35
CompanySettings company
default values for per-company settings
SoundSettings sound
sound effect settings
UnitID max_roadveh
max trucks in game per company
Chatbox; Window numbers:
Definition: window_type.h:491
VehicleDefaultSettings vehicle
default settings for vehicles
static const byte _colour_sort[COLOUR_END]
Sorting weights for the company colours.
Small map; Window numbers:
Definition: window_type.h:97
static Owner GetTileOwner(TileIndex tile)
Returns the owner of a tile.
Definition: tile_map.h:178
void SyncCompanySettings()
Sync all company settings in a multiplayer game.
Definition: settings.cpp:1999
static void HandleBankruptcyTakeover(Company *c)
Handle the bankruptcy take over of a company.
DoCommandFlag
List of flags for a command.
Definition: command_type.h:342
Money current_loan
Amount of money borrowed from the bank.
Definition: company_base.h:67
CommandCost CmdSetCompanyColour(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
Change the company&#39;s company-colour.
static void SubtractMoneyFromAnyCompany(Company *c, CommandCost cost)
Deduct costs of a command from the money of a company.
Create a new AI company.
Definition: company_type.h:66
Functions related to setting/changing the settings.
Linkgraph legend; Window numbers:
Definition: window_type.h:674
ClientID _network_own_client_id
Our client identifier.
Definition: network.cpp:59
ClientSettings _settings_client
The current settings for this game.
Definition: settings.cpp:78
Interest payments over the loan.
Definition: economy_type.h:160
Definition of base types and functions in a cross-platform compatible way.
uint32 GetRoadTotal() const
Get total sum of all owned road bits.
static const uint MAX_LENGTH_COMPANY_NAME_CHARS
The maximum length of a company name in characters including &#39;\0&#39;.
Definition: company_type.h:40
Reference tile. Scroll to tile when clicking on the news.
Definition: news_type.h:51
A number of safeguards to prevent using unsafe methods.
void SetLocalCompany(CompanyID new_company)
Sets the local company and updates the settings that are set on a per-company basis to reflect the co...
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
Definition: gfx_type.h:245
static Colours GenerateCompanyColour()
Generate a company colour.
static void RandomCompanyManagerFaceBits(CompanyManagerFace &cmf, GenderEthnicity ge, bool adv, bool interactive=true)
Make a random new face.
void CompanyAdminRemove(CompanyID company_id, CompanyRemoveReason reason)
Called whenever a company is removed in order to notify admins.
Operating profit graph; Window numbers:
Definition: window_type.h:528
Company league window; Window numbers:
Definition: window_type.h:552
Empty reference.
Definition: news_type.h:50
Finances of a company; Window numbers:
Definition: window_type.h:516
char * stredup(const char *s, const char *last)
Create a duplicate of the given string.
Definition: string.cpp:136
GUI Functions related to companies.
uint32 terraform_per_64k_frames
how many tile heights may, over a long period, be terraformed per 65536 frames?
GroupStatistics group_all[VEH_COMPANY_END]
NOSAVE: Statistics for the ALL_GROUP group.
Definition: company_base.h:128
change the company name
Definition: command_type.h:244
CommandCost CheckOwnership(Owner owner, TileIndex tile)
Check whether the current owner owns something.
void CompaniesYearlyLoop()
A year has passed, update the economic data of all companies, and perhaps show the financial overview...
bool is_ai
If true, the company is (also) controlled by the computer (a NoAI program).
Definition: company_base.h:93
Money money
Money owned by the company.
Definition: company_base.h:65
Basic functions/variables used all over the place.
Sentinel for end.
Definition: company_type.h:60
uint16 num_vehicle
Number of vehicles.
Definition: group.h:25
Last + 1 owner.
Definition: company_type.h:28
bool DoCommandP(const CommandContainer *container, bool my_cmd)
Shortcut for the long DoCommandP when having a container with the data.
Definition: command.cpp:532
uint16 clear_frame_burst
how many tiles may, over a short period, be cleared?
bool show_finances
show finances at end of year
Definition: settings_type.h:87
static T min(const T a, const T b)
Returns the minimum of two values.
Definition: math_func.hpp:40
#define MAX_UVALUE(type)
The largest value that can be entered in a variable.
Definition: stdafx.h:469
void FillData(const struct Company *c, const struct Company *other=nullptr)
Fill the CompanyNewsInformation struct with the required data.
Income from aircraft.
Definition: economy_type.h:158
Functions related to sound.
uint32 StringID
Numeric value that represents a string, independent of the selected language.
Definition: strings_type.h:16
void CompanyAdminUpdate(const Company *company)
Called whenever company related information changes in order to notify admins.
Delete a company.
Definition: company_type.h:67
byte colour2
Second colour, for vehicles with 2CC support.
Definition: livery.h:81
static bool MaybeStartNewCompany()
Start a new competitor company if possible.
static void Stop(CompanyID company)
Stop a company to be controlled by an AI.
Definition: ai_core.cpp:102
CompanyManagerFace face
Face description of the president.
Definition: company_base.h:63
uint _next_competitor_start
the number of ticks before the next AI is started
Definition: company_cmd.cpp:48
int16 bankrupt_timeout
If bigger than 0, amount of time to wait for an answer on an offer to buy this company.
Definition: company_base.h:82
#define return_cmd_error(errcode)
Returns from a function with a specific StringID as error.
Definition: command_func.h:33
void NetworkAdminCompanyRemove(CompanyID company_id, AdminCompanyRemoveReason bcrr)
Notify the admin network of a company to be removed (including the reason why).
Base class for all pools.
Definition: pool_type.hpp:82
uint8 max_companies
maximum amount of companies
static void NewEvent(CompanyID company, ScriptEvent *event)
Queue a new event for an AI.
Definition: ai_core.cpp:234
static const Colours _similar_colour[COLOUR_END][2]
Similar colours, so we can try to prevent same coloured companies.
Company news item. (Newspaper with face)
Definition: news_type.h:80
uint32 president_name_2
Parameter of president_name_1.
Definition: company_base.h:60
Performance detail window; Window numbers:
Definition: window_type.h:564
Network status window; Window numbers:
Definition: window_type.h:485
#define INSTANTIATE_POOL_METHODS(name)
Force instantiation of pool methods so we don&#39;t get linker errors.
Definition: pool_func.hpp:224
Owner share_owners[4]
Owners of the 4 shares of the company. INVALID_OWNER if nobody has bought them yet.
Definition: company_base.h:76
void DeleteWindowById(WindowClass cls, WindowNumber number, bool force)
Delete a window by its class and window number (if it is open).
Definition: window.cpp:1162
static bool IsInteractiveCompany(CompanyID company)
Is the user representing company?
Definition: company_func.h:53
execute the given command
Definition: command_type.h:344
UnitID max_ships
max ships in game per company
static bool CleaningPool()
Returns current state of pool cleaning - yes or no.
Definition: pool_type.hpp:270
Smallmap GUI functions.
static int32 ClampToI32(const int64 a)
Reduce a signed 64-bit int to a signed 32-bit one.
Definition: math_func.hpp:201
Functions related to companies.
Network join status.
Definition: window_type.h:32
An invalid company.
Definition: company_type.h:30
void ShowBuyCompanyDialog(CompanyID company)
Show the query to buy another company.
Used for iterations.
Definition: road_type.h:23
Company(uint16 name_1=0, bool is_ai=false)
Constructor.
Definition: company_cmd.cpp:59
Functionality related to the company manager&#39;s face.
CompanyCtrlAction
The action to do with CMD_COMPANY_CTRL.
Definition: company_type.h:64
GUISettings gui
settings related to the GUI
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
Definition: pool_type.hpp:340
Running costs trains.
Definition: economy_type.h:151
void StartupCompanies()
Start the next competitor now.
Base class for all vehicles.
static bool StrEmpty(const char *s)
Check if a string buffer is empty.
Definition: string_func.h:57
size_t Utf8StringLength(const char *s)
Get the length of an UTF-8 encoded string in number of characters and thus not the number of bytes th...
Definition: string.cpp:310
CommandCost CmdRenamePresident(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
Change the name of the president.
uint32 TileIndex
The index/ID of a Tile.
Definition: tile_type.h:78
static size_t GetNumItems()
Returns number of valid items in the pool.
Definition: pool_type.hpp:321
uint16 servint_trains
service interval for trains
static void GenerateCompanyName(Company *c)
Generate the name of a company from the last build coordinate.
StringID name_1
Name of the company if the user did not change it.
Definition: company_base.h:56
Company info (new companies, bankruptcy messages)
Definition: news_type.h:25
void NetworkServerNewCompany(const Company *company, NetworkClientInfo *ci)
Perform all the server specific administration of a new company.
byte colour
Company colour.
Definition: company_base.h:69
StringID president_name_1
Name of the president if the user did not change it.
Definition: company_base.h:59
Property costs.
Definition: economy_type.h:155
static bool AreCompanyManagerFaceBitsValid(CompanyManagerFace cmf, CompanyManagerFaceVariable cmfv, GenderEthnicity ge)
Checks whether the company manager&#39;s face bits have a valid range.
uint16 terraform_frame_burst
how many tile heights may, over a short period, be terraformed?
RoadTypes avail_roadtypes
Road types available to this company.
Definition: company_base.h:121
static uint GB(const T x, const uint8 s, const uint8 n)
Fetch n bits from x, started at bit s.
TileIndex last_build_coordinate
Coordinate of the last build thing by this company.
Definition: company_base.h:74
CompanyEconomyEntry old_economy[MAX_HISTORY_QUARTERS]
Economic data of the company of the last MAX_HISTORY_QUARTERS quarters.
Definition: company_base.h:97
void SubtractMoneyFromCompany(CommandCost cost)
Subtract money from the _current_company, if the company is valid.
Goal base class.
Maximum number of companies.
Definition: company_type.h:23
Town data structure.
Definition: town.h:53
uint16 servint_aircraft
service interval for aircraft
Group data.
Definition: group.h:65
char default_company_pass[NETWORK_PASSWORD_LENGTH]
default password for new companies in encrypted form
static bool CanAllocateItem(size_t n=1)
Helper functions so we can use PoolItem::Function() instead of _poolitem_pool.Function() ...
Definition: pool_type.hpp:261
Statusbar (at the bottom of your screen); Window numbers:
Definition: window_type.h:57
Base functions for all Games.
Functions related to commands.
Network functions used by other parts of OpenTTD.
byte in_use
Bit 0 set if this livery should override the default livery first colour, Bit 1 for the second colour...
Definition: livery.h:79
char * name
Custom town name. If nullptr, the town was not renamed and uses the generated name.
Definition: town.h:62
bool _network_server
network-server is active
Definition: network.cpp:53
Main toolbar (the long bar at the top); Window numbers:
Definition: window_type.h:51
CompanyID _current_company
Company currently doing an action.
Definition: company_cmd.cpp:45
AI list; Window numbers:
Definition: window_type.h:277
void ShowCompanyFinances(CompanyID company)
Open the finances window of a company.
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
Definition: pool_type.hpp:280
Colours _company_colours[MAX_COMPANIES]
NOSAVE: can be determined from company structs.
Definition: company_cmd.cpp:46
CompanyRemoveReason
The reason why the company was removed.
Definition: company_type.h:55
byte max_no_competitors
the number of competitors (AIs)
Definition: settings_type.h:54
UnitID max_trains
max trains in game per company
ConstructionSettings construction
construction of things in-game
Running costs ships.
Definition: economy_type.h:154
Colour value is already a real palette colour index, not an index of a StringColour.
Definition: gfx_type.h:268
StoryPage base class.
Delivered cargo graph; Window numbers:
Definition: window_type.h:534
AI settings; Window numbers:
Definition: window_type.h:168
Money yearly_expenses[3][EXPENSES_END]
Expenses of the company for the last three years, in every ExpensesType category. ...
Definition: company_base.h:95
Aircraft vehicle type.
Definition: vehicle_type.h:27
static void free(const void *ptr)
Version of the standard free that accepts const pointers.
Definition: depend.cpp:129
GenderEthnicity
The gender/race combinations that we have faces for.
static bool CanStartNew()
Is it possible to start a new AI company?
Definition: ai_core.cpp:30
RailTypes avail_railtypes
Rail types available to this company.
Definition: company_base.h:120
static bool HasBit(const T x, const uint8 y)
Checks if a bit in a value is set.
Create a new company.
Definition: company_type.h:65
Base functions for all AIs.
void AddNewsItem(StringID string, NewsType type, NewsFlag flags, NewsReferenceType reftype1=NR_NONE, uint32 ref1=UINT32_MAX, NewsReferenceType reftype2=NR_NONE, uint32 ref2=UINT32_MAX, void *free_data=nullptr)
Add a new newsitem to be shown.
Definition: news_gui.cpp:745
static const TileIndex INVALID_TILE
The very nice invalid tile marker.
Definition: tile_type.h:83
Base of the town class.
byte colour1
First colour, for all vehicles.
Definition: livery.h:80
uint16 servint_roadveh
service interval for road vehicles
Money income
The amount of income.
Definition: company_base.h:22
Income from road vehicles.
Definition: economy_type.h:157
RailTypes GetCompanyRailtypes(CompanyID company, bool introduces)
Get the rail types the given company can build.
Definition: rail.cpp:251
static void GeneratePresidentName(Company *c)
Generate a random president name of a company.
Window functions not directly related to making/drawing windows.
static NetworkClientInfo * GetByClientID(ClientID client_id)
Return the CI given it&#39;s client-identifier.
Definition: network.cpp:119
static bool IsUniquePresidentName(const char *name)
Is the given name in use as president name of a company?
void UpdateObjectColours(const Company *c)
Updates the colour of the object whenever a company changes.
Definition: object_cmd.cpp:174
const char * NetworkChangeCompanyPassword(CompanyID company_id, const char *password)
Change the company password of a given company.
Definition: network.cpp:162
Legend for graphs; Window numbers:
Definition: window_type.h:510
CompanyEconomyEntry cur_economy
Economic data of the company of this quarter.
Definition: company_base.h:96
Running costs road vehicles.
Definition: economy_type.h:152
void SetWindowClassesDirty(WindowClass cls)
Mark all windows of a particular class as dirty (in need of repainting)
Definition: window.cpp:3243
Functions related to news.
Company * DoStartupNewCompany(bool is_ai, CompanyID company=INVALID_COMPANY)
Create a new company and sets all company variables default values.
void ResetCompanyLivery(Company *c)
Reset the livery schemes to the company&#39;s primary colour.
Income from trains.
Definition: economy_type.h:156
static uint GetCompanyManagerFaceBits(CompanyManagerFace cmf, CompanyManagerFaceVariable cmfv, GenderEthnicity ge)
Gets the company manager&#39;s face bits for the given company manager&#39;s face variable.
Send message/notice to everyone playing the same company (Team)
Definition: network_type.h:80
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Definition: company_cmd.cpp:44
Game options window; Window numbers:
Definition: window_type.h:606
Road vehicle type.
Definition: vehicle_type.h:25
void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub, ZoomLevel zoom)
Draw a sprite, not in a viewport.
Definition: gfx.cpp:835
void OnTick_Companies()
Called every tick for updating some company info.
Performance history graph; Window numbers:
Definition: window_type.h:540
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
Definition: window.cpp:3316
Server part of the admin network protocol.
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition: gfx.cpp:1462
CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
Control the companies: add, delete, etc.
static void SetDParam(uint n, uint64 v)
Set a string parameter v at index n in the global string parameter array.
Definition: strings_func.h:199