/** * Handle the bankruptcy take over of a company. * Companies going bankrupt will ask the other companies in order of their * performance rating, so better performing companies get the 'do you want to * merge with Y' question earlier. The question will then stay till either the * company has gone bankrupt or got merged with a company. * * @param c the company that is going bankrupt. */ static void HandleBankruptcyTakeover(Company *c) { /* Amount of time out for each company to take over a company; * Timeout is a quarter (3 months of 30 days) divided over the * number of companies. The minimum number of days in a quarter * is 90: 31 in January, 28 in February and 31 in March. * Note that the company going bankrupt can't buy itself. */ static const int TAKE_OVER_TIMEOUT = 3 * 30 * DAY_TICKS / (MAX_COMPANIES - 1); assert(c->bankrupt_asked != 0); /* We're currently asking some company to buy 'us' */ if (c->bankrupt_timeout != 0) { c->bankrupt_timeout -= MAX_COMPANIES; if (c->bankrupt_timeout > 0) return; c->bankrupt_timeout = 0; return; } /* Did we ask everyone for bankruptcy? If so, bail out. */ if (c->bankrupt_asked == MAX_UVALUE(CompanyMask)) return; Company *c2, *best = NULL; int32 best_performance = -1; /* Ask the company with the highest performance history first */ FOR_ALL_COMPANIES(c2) { if (c2->bankrupt_asked == 0 && // Don't ask companies going bankrupt themselves !HasBit(c->bankrupt_asked, c2->index) && best_performance < c2->old_economy[1].performance_history && MayCompanyTakeOver(c2->index, c->index)) { best_performance = c2->old_economy[1].performance_history; best = c2; } } /* Asked all companies? */ if (best_performance == -1) { c->bankrupt_asked = MAX_UVALUE(CompanyMask); return; } SetBit(c->bankrupt_asked, best->index); c->bankrupt_timeout = TAKE_OVER_TIMEOUT; if (best->is_ai) { AI::NewEvent(best->index, new ScriptEventCompanyAskMerger(c->index, ClampToI32(c->bankrupt_value))); } else if (IsInteractiveCompany(best->index)) { ShowBuyCompanyDialog(c->index); } }
void CopyPastePlaceRailWaypoint(GenericTileIndex tile, StationID sid, Axis axis, RailType rt, StationGfx gfx, StationClassID stat_class, byte stat_type, int specindex, bool adjacent) { if (IsMainMapTile(tile)) { TileIndex t = AsMainMapTile(tile); /* check if required track is already there, try to build one if not */ if (!IsTileOwner(t, _current_company) || (!IsRailWaypointTile(tile) && !IsPlainRailTile(tile)) || GetRailType(t) != rt || (IsTileType(t, MP_STATION) ? GetRailStationAxis(tile) != axis : !HasBit(GetTrackBits(t), AxisToTrack(axis)))) { CopyPastePlaceTracks(tile, rt, AxisToTrackBits(axis)); if (_current_pasting->last_result.Failed()) return; } /* build the waypoint */ _station_cmd_specindex_to_paste = specindex; uint32 p1 = 0; SB(p1, 0, 4, rt); SB(p1, 4, 1, axis); SB(p1, 8, 8, 1); // width SB(p1, 16, 8, 1); // height SB(p1, 24, 1, adjacent); uint32 p2 = 0; SB(p2, 0, 8, stat_class); SB(p2, 8, 8, stat_type); SB(p2, 16, 16, sid); _current_pasting->DoCommand(t, p1, p2, CMD_BUILD_RAIL_WAYPOINT | CMD_MSG(STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT)); } else { MakeRailWaypoint(tile, OWNER_NONE, sid, axis, gfx & ~1, rt); assert(IsInsideMM(specindex, 0, MAX_UVALUE(byte) + 1)); SetCustomStationSpecIndex(tile, (byte)specindex); _clipboard_stations_builder.AddRailPart(sid, stat_class, stat_type, (byte)specindex); } }
/** * Truncate the list removing everything older than/more than the amount * as specified in the config file. * As a side effect also increase the time the other lines have been in * the list. * @return true if and only if items got removed. */ static bool Truncate() { IConsoleLine *cur = IConsoleLine::front; if (cur == NULL) return false; int count = 1; for (IConsoleLine *item = cur->previous; item != NULL; count++, cur = item, item = item->previous) { if (item->time > _settings_client.gui.console_backlog_timeout && count > _settings_client.gui.console_backlog_length) { delete item; cur->previous = NULL; return true; } if (item->time != MAX_UVALUE(uint16)) item->time++; } return false; }