/** * Change engine renewal parameters * @param tile unused * @param flags operation to perform * @param p1 packed data * - bits 16-31 = engine group * @param p2 packed data * - bits 0-15 = old engine type * - bits 16-31 = new engine type * @param text unused * @return the cost of this operation or an error */ CommandCost CmdSetAutoReplace(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) { Company *c = Company::GetIfValid(_current_company); if (c == NULL) return CMD_ERROR; EngineID old_engine_type = GB(p2, 0, 16); EngineID new_engine_type = GB(p2, 16, 16); GroupID id_g = GB(p1, 16, 16); CommandCost cost; if (Group::IsValidID(id_g) ? Group::Get(id_g)->owner != _current_company : !IsAllGroupID(id_g) && !IsDefaultGroupID(id_g)) return CMD_ERROR; if (!Engine::IsValidID(old_engine_type)) return CMD_ERROR; if (new_engine_type != INVALID_ENGINE) { if (!Engine::IsValidID(new_engine_type)) return CMD_ERROR; if (!CheckAutoreplaceValidity(old_engine_type, new_engine_type, _current_company)) return CMD_ERROR; cost = AddEngineReplacementForCompany(c, old_engine_type, new_engine_type, id_g, flags); } else { cost = RemoveEngineReplacementForCompany(c, old_engine_type, id_g, flags); } if (flags & DC_EXEC) GroupStatistics::UpdateAutoreplace(_current_company); if ((flags & DC_EXEC) && IsLocalCompany()) InvalidateAutoreplaceWindow(old_engine_type, id_g); return cost; }
/** * Draw a row in the group list. * @param y Top of the row. * @param left Left of the row. * @param right Right of the row. * @param g_id Group to list. * @param indent Indentation level. * @param protection Whether autoreplace protection is set. */ void DrawGroupInfo(int y, int left, int right, GroupID g_id, int indent = 0, bool protection = false) const { /* Highlight the group if a vehicle is dragged over it */ if (g_id == this->group_over) { GfxFillRect(left + WD_FRAMERECT_LEFT, y + WD_FRAMERECT_TOP + WD_MATRIX_TOP, right - WD_FRAMERECT_RIGHT, y + this->tiny_step_height - WD_FRAMERECT_BOTTOM - WD_MATRIX_TOP, _colour_gradient[COLOUR_GREY][7]); } if (g_id == NEW_GROUP) return; /* draw the selected group in white, else we draw it in black */ TextColour colour = g_id == this->vli.index ? TC_WHITE : TC_BLACK; const GroupStatistics &stats = GroupStatistics::Get(this->vli.company, g_id, this->vli.vtype); bool rtl = _current_text_dir == TD_RTL; /* draw group name */ int longer_name = 0; StringID str; if (IsAllGroupID(g_id)) { str = STR_GROUP_ALL_TRAINS + this->vli.vtype; } else if (IsDefaultGroupID(g_id)) { str = STR_GROUP_DEFAULT_TRAINS + this->vli.vtype; } else { SetDParam(0, g_id); str = STR_GROUP_NAME; if (!protection) { longer_name += this->column_size[VGC_PROTECT].width + 2; if (!stats.autoreplace_defined) longer_name += this->column_size[VGC_AUTOREPLACE].width + 2; } } int x = rtl ? right - WD_FRAMERECT_RIGHT - 8 - this->column_size[VGC_NAME].width - longer_name + 1 : left + WD_FRAMERECT_LEFT + 8; DrawString(x + indent * LEVEL_WIDTH, x + this->column_size[VGC_NAME].width + longer_name - 1, y + (this->tiny_step_height - this->column_size[VGC_NAME].height) / 2, str, colour); /* draw autoreplace protection */ x = rtl ? x - 2 - this->column_size[VGC_PROTECT].width : x + 2 + this->column_size[VGC_NAME].width; if (protection) DrawSprite(SPR_GROUP_REPLACE_PROTECT, PAL_NONE, x, y + (this->tiny_step_height - this->column_size[VGC_PROTECT].height) / 2); /* draw autoreplace status */ x = rtl ? x - 2 - this->column_size[VGC_AUTOREPLACE].width : x + 2 + this->column_size[VGC_PROTECT].width; if (stats.autoreplace_defined) DrawSprite(SPR_GROUP_REPLACE_ACTIVE, stats.autoreplace_finished ? PALETTE_CRASH : PAL_NONE, x, y + (this->tiny_step_height - this->column_size[VGC_AUTOREPLACE].height) / 2); /* draw the profit icon */ x = rtl ? x - 2 - this->column_size[VGC_PROFIT].width : x + 2 + this->column_size[VGC_AUTOREPLACE].width; SpriteID spr; if (stats.num_profit_vehicle == 0) { spr = SPR_PROFIT_NA; } else if (stats.profit_last_year < 0) { spr = SPR_PROFIT_NEGATIVE; } else if (stats.profit_last_year < 10000 * stats.num_profit_vehicle) { // TODO magic number spr = SPR_PROFIT_SOME; } else { spr = SPR_PROFIT_LOT; } DrawSprite(spr, PAL_NONE, x, y + (this->tiny_step_height - this->column_size[VGC_PROFIT].height) / 2); /* draw the number of vehicles of the group */ x = rtl ? x - 2 - this->column_size[VGC_NUMBER].width : x + 2 + this->column_size[VGC_PROFIT].width; SetDParam(0, stats.num_vehicle); DrawString(x, x + this->column_size[VGC_NUMBER].width - 1, y + (this->tiny_step_height - this->column_size[VGC_NUMBER].height) / 2, STR_TINY_COMMA, colour, SA_RIGHT | SA_FORCE); }
/** * Mark the widget containing the currently highlighted group as dirty. */ void DirtyHighlightedGroupWidget() { if (this->group_over == INVALID_GROUP) return; if (IsAllGroupID(this->group_over)) { this->SetWidgetDirty(WID_GL_ALL_VEHICLES); } else if (IsDefaultGroupID(this->group_over)) { this->SetWidgetDirty(WID_GL_DEFAULT_VEHICLES); } else { this->SetWidgetDirty(WID_GL_LIST_GROUP); } }
/** * Returns the GroupStatistics for a specific group. * @param company Owner of the group. * @param id_g GroupID of the group. * @param type VehicleType of the vehicles in the group. * @return Statistics for the group. */ /* static */ GroupStatistics &GroupStatistics::Get(CompanyID company, GroupID id_g, VehicleType type) { if (Group::IsValidID(id_g)) { Group *g = Group::Get(id_g); assert(g->owner == company); assert(g->vehicle_type == type); return g->statistics; } if (IsDefaultGroupID(id_g)) return Company::Get(company)->group_default[type]; if (IsAllGroupID(id_g)) return Company::Get(company)->group_all[type]; NOT_REACHED(); }
/** * Draw a row in the group list. * @param y Top of the row. * @param left Left of the row. * @param right Right of the row. * @param g_id Group to list. * @param protection Whether autoreplace protection is set. */ void DrawGroupInfo(int y, int left, int right, GroupID g_id, bool protection = false) const { /* draw the selected group in white, else we draw it in black */ TextColour colour = g_id == this->vli.index ? TC_WHITE : TC_BLACK; const GroupStatistics &stats = GroupStatistics::Get(this->vli.company, g_id, this->vli.vtype); bool rtl = _current_text_dir == TD_RTL; /* draw group name */ StringID str; if (IsAllGroupID(g_id)) { str = STR_GROUP_ALL_TRAINS + this->vli.vtype; } else if (IsDefaultGroupID(g_id)) { str = STR_GROUP_DEFAULT_TRAINS + this->vli.vtype; } else { SetDParam(0, g_id); str = STR_GROUP_NAME; } int x = rtl ? right - WD_FRAMERECT_RIGHT - 8 - this->column_size[VGC_NAME].width + 1 : left + WD_FRAMERECT_LEFT + 8; DrawString(x, x + this->column_size[VGC_NAME].width - 1, y + (this->tiny_step_height - this->column_size[VGC_NAME].height) / 2, str, colour); /* draw autoreplace protection */ x = rtl ? x - 8 - this->column_size[VGC_PROTECT].width : x + 8 + this->column_size[VGC_NAME].width; if (protection) DrawSprite(SPR_GROUP_REPLACE_PROTECT, PAL_NONE, x, y + (this->tiny_step_height - this->column_size[VGC_PROTECT].height) / 2); /* draw autoreplace status */ x = rtl ? x - 2 - this->column_size[VGC_AUTOREPLACE].width : x + 2 + this->column_size[VGC_PROTECT].width; if (stats.autoreplace_defined) DrawSprite(SPR_GROUP_REPLACE_ACTIVE, stats.autoreplace_finished ? PALETTE_CRASH : PAL_NONE, x, y + (this->tiny_step_height - this->column_size[VGC_AUTOREPLACE].height) / 2); /* draw the profit icon */ x = rtl ? x - 2 - this->column_size[VGC_PROFIT].width : x + 2 + this->column_size[VGC_AUTOREPLACE].width; SpriteID spr; if (stats.num_profit_vehicle == 0) { spr = SPR_PROFIT_NA; } else if (stats.profit_last_year < 0) { spr = SPR_PROFIT_NEGATIVE; } else if (stats.profit_last_year < 10000 * stats.num_profit_vehicle) { // TODO magic number spr = SPR_PROFIT_SOME; } else { spr = SPR_PROFIT_LOT; } DrawSprite(spr, PAL_NONE, x, y + (this->tiny_step_height - this->column_size[VGC_PROFIT].height) / 2); /* draw the number of vehicles of the group */ x = rtl ? x - 2 - this->column_size[VGC_NUMBER].width : x + 2 + this->column_size[VGC_PROFIT].width; SetDParam(0, stats.num_vehicle); DrawString(x, x + this->column_size[VGC_NUMBER].width - 1, y + (this->tiny_step_height - this->column_size[VGC_NUMBER].height) / 2, STR_TINY_COMMA, colour, SA_RIGHT | SA_FORCE); }