diff --git a/src/command_func.h b/src/command_func.h index b7738f4efa..462867a38f 100644 --- a/src/command_func.h +++ b/src/command_func.h @@ -140,5 +140,6 @@ CommandCallback CcFoundRandomTown; /* vehicle_gui.cpp */ CommandCallback CcBuildPrimaryVehicle; +CommandCallback CcStartStopVehicle; #endif /* COMMAND_FUNC_H */ diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp index e6d5dfc7c5..f663dcd57d 100644 --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -509,7 +509,7 @@ struct DepotWindow : Window { break; case MODE_START_STOP: // click start/stop flag - StartStopVehicle(v); + StartStopVehicle(v, false); break; default: NOT_REACHED(); diff --git a/src/lang/english.txt b/src/lang/english.txt index ba1fedece1..3f2bec04a2 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2967,6 +2967,12 @@ STR_VEHICLE_STATUS_HEADING_FOR_SHIP_DEPOT_SERVICE_VEL :{LTBLUE}Service STR_VEHICLE_STATUS_HEADING_FOR_HANGAR_SERVICE :{LTBLUE}Service at {STATION} Hangar STR_VEHICLE_STATUS_HEADING_FOR_HANGAR_SERVICE_VEL :{LTBLUE}Service at {STATION} Hangar, {VELOCITY} +# Vehicle stopped/started animations +STR_VEHICLE_COMMAND_STOPPED_SMALL :{TINYFONT}{RED}Stopped +STR_VEHICLE_COMMAND_STOPPED :{RED}Stopped +STR_VEHICLE_COMMAND_STARTED_SMALL :{TINYFONT}{GREEN}Started +STR_VEHICLE_COMMAND_STARTED :{GREEN}Started + # Vehicle details STR_VEHICLE_DETAILS_CAPTION :{WHITE}{VEHICLE} (Details) STR_VEHICLE_NAME_BUTTON :{BLACK}Name diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp index 725b034d08..71724b5095 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -49,6 +49,7 @@ static CommandCallback * const _callback_table[] = { /* 0x16 */ CcFoundRandomTown, /* 0x17 */ CcRoadStop, /* 0x18 */ CcBuildIndustry, + /* 0x19 */ CcStartStopVehicle, }; /** Local queue of packets */ diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index c621ed271b..19c0016e12 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -64,7 +64,7 @@ const uint32 _send_to_depot_proc_table[] = { /** Start/Stop a vehicle * @param tile unused * @param flags type of operation - * @param p1 vehicle to start/stop + * @param p1 vehicle to start/stop, don't forget to change CcStartStopVehicle if you modify this! * @param p2 bit 0: Shall the start/stop newgrf callback be evaluated (only valid with DC_AUTOREPLACE for network safety) * @param text unused * @return the cost of this operation or an error diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index db638838ca..89a3f94302 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -1868,14 +1868,34 @@ static const uint32 _vehicle_command_translation_table[][4] = { }, }; +/** + * This is the Callback method after the cloning attempt of a vehicle + * @param result the result of the cloning command + * @param tile unused + * @param p1 vehicle ID + * @param p2 unused + */ +void CcStartStopVehicle(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2) +{ + if (result.Failed()) return; + + const Vehicle *v = Vehicle::GetIfValid(p1); + if (v == NULL || !v->IsPrimaryVehicle() || v->owner != _local_company) return; + + StringID msg = (v->vehstatus & VS_STOPPED) ? STR_VEHICLE_COMMAND_STOPPED : STR_VEHICLE_COMMAND_STARTED; + Point pt = RemapCoords(v->x_pos, v->y_pos, v->z_pos); + AddTextEffect(msg, pt.x, pt.y, DAY_TICKS, TE_RISING); +} + /** * Executes #CMD_START_STOP_VEHICLE for given vehicle. * @param v Vehicle to start/stop + * @param texteffect Should a texteffect be shown? */ -void StartStopVehicle(const Vehicle *v) +void StartStopVehicle(const Vehicle *v, bool texteffect) { assert(v->IsPrimaryVehicle()); - DoCommandP(v->tile, v->index, 0, _vehicle_command_translation_table[VCT_CMD_START_STOP][v->type]); + DoCommandP(v->tile, v->index, 0, _vehicle_command_translation_table[VCT_CMD_START_STOP][v->type], texteffect ? CcStartStopVehicle : NULL); } /** Checks whether the vehicle may be refitted at the moment.*/ @@ -2129,7 +2149,7 @@ public: if (tile != INVALID_TILE) ScrollMainWindowToTile(tile); } else { /* Start/Stop */ - StartStopVehicle(v); + StartStopVehicle(v, false); } break; case VVW_WIDGET_CENTER_MAIN_VIEH: {// center main view diff --git a/src/vehicle_gui.h b/src/vehicle_gui.h index 029737204f..07dda47fca 100644 --- a/src/vehicle_gui.h +++ b/src/vehicle_gui.h @@ -108,7 +108,7 @@ static inline WindowClass GetWindowClassForVehicleType(VehicleType vt) /* Unified window procedure */ void ShowVehicleViewWindow(const Vehicle *v); -void StartStopVehicle(const Vehicle *v); +void StartStopVehicle(const Vehicle *v, bool texteffect); Vehicle *CheckClickOnVehicle(const struct ViewPort *vp, int x, int y); diff --git a/src/viewport.cpp b/src/viewport.cpp index 52488e140e..18999d341d 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -1811,7 +1811,14 @@ bool HandleViewportClicked(const ViewPort *vp, int x, int y) v = CheckClickOnVehicle(vp, x, y); if (v != NULL) { DEBUG(misc, 2, "Vehicle %d (index %d) at %p", v->unitnumber, v->index, v); - if (IsCompanyBuildableVehicleType(v)) ShowVehicleViewWindow(v->First()); + if (IsCompanyBuildableVehicleType(v)) { + v = v->First(); + if (_ctrl_pressed && v->owner == _local_company) { + StartStopVehicle(v, true); + } else { + ShowVehicleViewWindow(v); + } + } return true; } return CheckClickOnLandscape(vp, x, y);