diff --git a/src/group_gui.cpp b/src/group_gui.cpp index 94e5ac9426..ebd2292d39 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -127,7 +127,7 @@ static const NWidgetPart _nested_group_widgets[] = { EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, GRP_WIDGET_AVAILABLE_VEHICLES), SetMinimalSize(106, 12), SetFill(0, 1), - SetDataTip(0x0, STR_VEHICLE_LIST_AVAILABLE_ENGINES_TOOLTIP), + SetDataTip(STR_BLACK_STRING, STR_VEHICLE_LIST_AVAILABLE_ENGINES_TOOLTIP), NWidget(WWT_DROPDOWN, COLOUR_GREY, GRP_WIDGET_MANAGE_VEHICLES_DROPDOWN), SetMinimalSize(118, 12), SetFill(0, 1), SetDataTip(STR_VEHICLE_LIST_MANAGE_LIST, STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, GRP_WIDGET_STOP_ALL), SetMinimalSize(12, 12), SetFill(0, 1), @@ -226,7 +226,6 @@ public: this->GetWidget(GRP_WIDGET_CAPTION)->widget_data = STR_VEHICLE_LIST_TRAIN_CAPTION + this->vehicle_type; this->GetWidget(GRP_WIDGET_LIST_VEHICLE)->tool_tip = STR_VEHICLE_LIST_TRAIN_LIST_TOOLTIP + this->vehicle_type; - this->GetWidget(GRP_WIDGET_AVAILABLE_VEHICLES)->widget_data = STR_VEHICLE_LIST_AVAILABLE_TRAINS + this->vehicle_type; this->GetWidget(GRP_WIDGET_CREATE_GROUP)->widget_data += this->vehicle_type; this->GetWidget(GRP_WIDGET_RENAME_GROUP)->widget_data += this->vehicle_type; @@ -301,22 +300,28 @@ public: virtual void SetStringParameters(int widget) const { - if (widget != GRP_WIDGET_CAPTION) return; + switch (widget) { + case GRP_WIDGET_AVAILABLE_VEHICLES: + SetDParam(0, STR_VEHICLE_LIST_AVAILABLE_TRAINS + this->vehicle_type); + break; - /* If selected_group == DEFAULT_GROUP || ALL_GROUP, draw the standard caption - * We list all vehicles or ungrouped vehicles */ - if (IsDefaultGroupID(this->group_sel) || IsAllGroupID(this->group_sel)) { - SetDParam(0, STR_COMPANY_NAME); - SetDParam(1, GB(this->window_number, 0, 8)); - SetDParam(2, this->vehicles.Length()); - SetDParam(3, this->vehicles.Length()); - } else { - const Group *g = Group::Get(this->group_sel); + case GRP_WIDGET_CAPTION: + /* If selected_group == DEFAULT_GROUP || ALL_GROUP, draw the standard caption + * We list all vehicles or ungrouped vehicles */ + if (IsDefaultGroupID(this->group_sel) || IsAllGroupID(this->group_sel)) { + SetDParam(0, STR_COMPANY_NAME); + SetDParam(1, GB(this->window_number, 0, 8)); + SetDParam(2, this->vehicles.Length()); + SetDParam(3, this->vehicles.Length()); + } else { + const Group *g = Group::Get(this->group_sel); - SetDParam(0, STR_GROUP_NAME); - SetDParam(1, g->index); - SetDParam(2, g->num_vehicle); - SetDParam(3, g->num_vehicle); + SetDParam(0, STR_GROUP_NAME); + SetDParam(1, g->index); + SetDParam(2, g->num_vehicle); + SetDParam(3, g->num_vehicle); + } + break; } } diff --git a/src/lang/english.txt b/src/lang/english.txt index c4afc5f3db..128f80be9c 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2656,10 +2656,10 @@ STR_VEHICLE_LIST_AIRCRAFT_TOOLTIP :{BLACK}Aircraft STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINYFONT}{BLACK}Profit this year: {CURRENCY} (last year: {CURRENCY}) -STR_VEHICLE_LIST_AVAILABLE_TRAINS :{BLACK}Available Trains -STR_VEHICLE_LIST_AVAILABLE_ROAD_VEHICLES :{BLACK}Available Vehicles -STR_VEHICLE_LIST_AVAILABLE_SHIPS :{BLACK}Available Ships -STR_VEHICLE_LIST_AVAILABLE_AIRCRAFT :{BLACK}Available Aircraft +STR_VEHICLE_LIST_AVAILABLE_TRAINS :Available Trains +STR_VEHICLE_LIST_AVAILABLE_ROAD_VEHICLES :Available Vehicles +STR_VEHICLE_LIST_AVAILABLE_SHIPS :Available Ships +STR_VEHICLE_LIST_AVAILABLE_AIRCRAFT :Available Aircraft STR_VEHICLE_LIST_AVAILABLE_ENGINES_TOOLTIP :{BLACK}See a list of available engine designs for this vehicle type. STR_VEHICLE_LIST_MANAGE_LIST :{BLACK}Manage list diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 512dd02b34..0f6f9f27f8 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -1671,6 +1671,12 @@ bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth) return true; case OT_GOTO_DEPOT: + if ((order->GetDepotOrderType() & ODTFB_SERVICE) && !v->NeedsServicing()) { + UpdateVehicleTimetable(v, true); + v->IncrementOrderIndex(); + break; + } + if (v->current_order.GetDepotActionType() & ODATFB_NEAREST_DEPOT) { /* We need to search for the nearest depot (hangar). */ TileIndex location; @@ -1695,9 +1701,6 @@ bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth) return true; } - UpdateVehicleTimetable(v, true); - v->IncrementOrderIndex(); - } else if ((order->GetDepotOrderType() & ODTFB_SERVICE) && !v->NeedsServicing()) { UpdateVehicleTimetable(v, true); v->IncrementOrderIndex(); } else { diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 57606de5ee..5a64edd4a0 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -2372,11 +2372,9 @@ static void TileLoop_Track(TileIndex tile) break; } - if (!IsPlainRail(tile)) return; - new_ground = RAIL_GROUND_GRASS; - if (old_ground != RAIL_GROUND_BARREN) { // wait until bottom is green + if (IsPlainRail(tile) && old_ground != RAIL_GROUND_BARREN) { // wait until bottom is green /* determine direction of fence */ TrackBits rail = GetTrackBits(tile); diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index c22b68db06..0310e01caa 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -491,11 +491,20 @@ CommandCost CmdBuildRoad(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 Owner owner = GetRoadOwner(tile, ROADTYPE_ROAD); if (owner != OWNER_NONE && !CheckOwnership(owner, tile)) return CMD_ERROR; - if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR; + DisallowedRoadDirections dis_existing = GetDisallowedRoadDirections(tile); + DisallowedRoadDirections dis_new = dis_existing ^ toggle_drd; + + /* We allow removing disallowed directions to break up + * deadlocks, but adding them can break articulated + * vehicles. As such, only when less is disallowed, + * i.e. bits are removed, we skip the vehicle check. */ + if (CountBits(dis_existing) <= CountBits(dis_new)) { + if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR; + } /* Ignore half built tiles */ if ((flags & DC_EXEC) && rt != ROADTYPE_TRAM && IsStraightRoad(existing)) { - SetDisallowedRoadDirections(tile, GetDisallowedRoadDirections(tile) ^ toggle_drd); + SetDisallowedRoadDirections(tile, dis_new); MarkTileDirtyByTile(tile); } return CommandCost(); diff --git a/src/vehicle.cpp b/src/vehicle.cpp index fde6355ea5..f027a5fa26 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -1069,8 +1069,11 @@ void VehicleEnterDepot(Vehicle *v) SetDParam(0, v->index); AddVehicleNewsItem(STR_NEWS_ORDER_REFIT_FAILED, NS_ADVICE, v->index); } - } else if (v->owner == _local_company && cost.GetCost() != 0) { - ShowCostOrIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, cost.GetCost()); + } else if (cost.GetCost() != 0) { + v->profit_this_year -= cost.GetCost() << 8; + if (v->owner == _local_company) { + ShowCostOrIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, cost.GetCost()); + } } } diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 84a65ec1ba..f92b69f950 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -784,7 +784,7 @@ static const NWidgetPart _nested_vehicle_list[] = { NWidget(NWID_SELECTION, INVALID_COLOUR, VLW_WIDGET_HIDE_BUTTONS), NWidget(NWID_HORIZONTAL), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, VLW_WIDGET_AVAILABLE_VEHICLES), SetMinimalSize(106, 12), SetFill(0, 1), - SetDataTip(0x0, STR_VEHICLE_LIST_AVAILABLE_ENGINES_TOOLTIP), + SetDataTip(STR_BLACK_STRING, STR_VEHICLE_LIST_AVAILABLE_ENGINES_TOOLTIP), NWidget(WWT_DROPDOWN, COLOUR_GREY, VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN), SetMinimalSize(118, 12), SetFill(0, 1), SetDataTip(STR_VEHICLE_LIST_MANAGE_LIST, STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VLW_WIDGET_STOP_ALL), SetMinimalSize(12, 12), SetFill(0, 1), @@ -978,8 +978,7 @@ public: this->CreateNestedTree(desc); /* Set up the window widgets */ - this->GetWidget(VLW_WIDGET_LIST)->tool_tip = STR_VEHICLE_LIST_TRAIN_LIST_TOOLTIP + this->vehicle_type; - this->GetWidget(VLW_WIDGET_AVAILABLE_VEHICLES)->widget_data = STR_VEHICLE_LIST_AVAILABLE_TRAINS + this->vehicle_type; + this->GetWidget(VLW_WIDGET_LIST)->tool_tip = STR_VEHICLE_LIST_TRAIN_LIST_TOOLTIP + this->vehicle_type; if (window_type == VLW_SHARED_ORDERS) { this->GetWidget(VLW_WIDGET_CAPTION)->widget_data = STR_VEHICLE_LIST_SHARED_ORDERS_LIST_CAPTION; @@ -1022,47 +1021,53 @@ public: virtual void SetStringParameters(int widget) const { - if (widget != VLW_WIDGET_CAPTION) return; + switch (widget) { + case VLW_WIDGET_AVAILABLE_VEHICLES: + SetDParam(0, STR_VEHICLE_LIST_AVAILABLE_TRAINS + this->vehicle_type); + break; - const uint16 index = GB(this->window_number, 16, 16); - switch (this->window_number & VLW_MASK) { - case VLW_SHARED_ORDERS: // Shared Orders - if (this->vehicles.Length() == 0) { - /* We can't open this window without vehicles using this order - * and we should close the window when deleting the order */ - NOT_REACHED(); + case VLW_WIDGET_CAPTION: { + const uint16 index = GB(this->window_number, 16, 16); + switch (this->window_number & VLW_MASK) { + case VLW_SHARED_ORDERS: // Shared Orders + if (this->vehicles.Length() == 0) { + /* We can't open this window without vehicles using this order + * and we should close the window when deleting the order */ + NOT_REACHED(); + } + SetDParam(0, this->vscroll.GetCount()); + break; + + case VLW_STANDARD: // Company Name + SetDParam(0, STR_COMPANY_NAME); + SetDParam(1, index); + SetDParam(2, this->vscroll.GetCount()); + break; + + case VLW_WAYPOINT_LIST: + SetDParam(0, STR_WAYPOINT_NAME); + SetDParam(1, index); + SetDParam(2, this->vscroll.GetCount()); + break; + + case VLW_STATION_LIST: // Station Name + SetDParam(0, STR_STATION_NAME); + SetDParam(1, index); + SetDParam(2, this->vscroll.GetCount()); + break; + + case VLW_DEPOT_LIST: + SetDParam(0, STR_DEPOT_TRAIN_CAPTION + this->vehicle_type); + if (this->vehicle_type == VEH_AIRCRAFT) { + SetDParam(1, index); // Airport name + } else { + SetDParam(1, Depot::Get(index)->town_index); + } + SetDParam(2, this->vscroll.GetCount()); + break; + default: NOT_REACHED(); } - SetDParam(0, this->vscroll.GetCount()); - break; - - case VLW_STANDARD: // Company Name - SetDParam(0, STR_COMPANY_NAME); - SetDParam(1, index); - SetDParam(2, this->vscroll.GetCount()); - break; - - case VLW_WAYPOINT_LIST: - SetDParam(0, STR_WAYPOINT_NAME); - SetDParam(1, index); - SetDParam(2, this->vscroll.GetCount()); - break; - - case VLW_STATION_LIST: // Station Name - SetDParam(0, STR_STATION_NAME); - SetDParam(1, index); - SetDParam(2, this->vscroll.GetCount()); - break; - - case VLW_DEPOT_LIST: - SetDParam(0, STR_DEPOT_TRAIN_CAPTION + this->vehicle_type); - if (this->vehicle_type == VEH_AIRCRAFT) { - SetDParam(1, index); // Airport name - } else { - SetDParam(1, Depot::Get(index)->town_index); - } - SetDParam(2, this->vscroll.GetCount()); - break; - default: NOT_REACHED(); + } break; } }