diff --git a/aircraft_cmd.c b/aircraft_cmd.c index 2e95c12351..f6ee422aaf 100644 --- a/aircraft_cmd.c +++ b/aircraft_cmd.c @@ -563,6 +563,8 @@ void OnNewDay_Aircraft(Vehicle *v) if ((++v->day_counter & 7) == 0) DecreaseVehicleValue(v); + CheckOrders(v); + CheckVehicleBreakdown(v); AgeVehicle(v); CheckIfAircraftNeedsService(v); diff --git a/lang/english.txt b/lang/english.txt index 329ad51040..33f24c3556 100644 --- a/lang/english.txt +++ b/lang/english.txt @@ -903,6 +903,19 @@ STR_TRAIN_IS_LOST :{WHITE}Train {COMMA16} is lost. STR_TRAIN_IS_UNPROFITABLE :{WHITE}Train {COMMA16}'s profit last year was {CURRENCY} STR_EURO_INTRODUCE :{BLACK}{BIGFONT}European Monetary Union!{}{}The Euro is introduced as the sole currency for everyday transactions in your country! +STR_TRAIN_HAS_TOO_FEW_ORDERS :{WHITE}Train {COMMA16} has too few orders in the schedule +STR_TRAIN_HAS_VOID_ORDER :{WHITE}Train {COMMA16} has a void order +STR_TRAIN_HAS_DUPLICATE_ENTRY :{WHITE}Train {COMMA16} has duplicate orders +STR_AIRCRAFT_HAS_TOO_FEW_ORDERS :{WHITE}Aircraft {COMMA16} has too few orders in the schedule +STR_AIRCRAFT_HAS_VOID_ORDER :{WHITE}Aircraft {COMMA16} has void order +STR_AIRCRAFT_HAS_DUPLICATE_ENTRY :{WHITE}Aircraft {COMMA16} has duplicate orders +STR_ROADVEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}Road Vehicle {COMMA16} has too few orders in the schedule +STR_ROADVEHICLE_HAS_VOID_ORDER :{WHITE}Road Vehicle {COMMA16} has void order +STR_ROADVEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}Road Vehicle {COMMA16} has duplicate orders +STR_SHIP_HAS_TOO_FEW_ORDERS :{WHITE}Ship {COMMA16} has too few orders in the schedule +STR_SHIP_HAS_VOID_ORDER :{WHITE}Ship {COMMA16} has void order +STR_SHIP_HAS_DUPLICATE_ENTRY :{WHITE}Ship {COMMA16} has duplicate orders + STR_CONFIG_PATCHES :{BLACK}Configure Patches STR_CONFIG_PATCHES_TIP :{BLACK}Configure the patches STR_CONFIG_PATCHES_CAPTION :{WHITE}Configure Patches diff --git a/order_cmd.c b/order_cmd.c index ab4e064844..eb5c4ccf2a 100644 --- a/order_cmd.c +++ b/order_cmd.c @@ -4,6 +4,7 @@ #include "command.h" #include "station.h" #include "player.h" +#include "news.h" /* p1 & 0xFFFF = vehicle * p1 >> 16 = index in order list @@ -330,3 +331,80 @@ int32 CmdRestoreOrderIndex(int x, int y, uint32 flags, uint32 p1, uint32 p2) } return 0; } + +int CheckOrders(Vehicle *v) +{ + int i, n_st, duplicate; + uint16 order, old_orderer; + uint16 dummy; + int message=0; + + /* check the order list */ + order = v->schedule_ptr[0]; + n_st = duplicate = dummy = 0; + + /* only check every 20 days */ + if ( ( ( v->day_counter % 20) == 0 ) && (v->owner == _local_player) ) { + for(old_orderer = i = 0; order!=0; i++ ) { + order = v->schedule_ptr[i]; + if (order == old_orderer) duplicate = -1; + if ( (order & OT_MASK) == OT_DUMMY ) dummy = -1; + if ( ( (order & OT_MASK) == OT_GOTO_STATION ) /*&& (order != old_order) */) { + //I uncommented this in order not to get two error messages + //when two identical entries are in the list + n_st++; + } + old_orderer = order; //store the old order + } + + //Now, check the last and the first order + //as the last order is the end of order marker, jump back 2 + if ( (v->schedule_ptr[0] == v->schedule_ptr[i-2]) && ( i-2 != 0 ) ) duplicate = -1; + + SET_DPARAM16(0, v->unitnumber); + + if (n_st < 2) { + switch (v->type) { + case VEH_Train: message = STR_TRAIN_HAS_TOO_FEW_ORDERS; break; + case VEH_Road: message = STR_ROADVEHICLE_HAS_TOO_FEW_ORDERS; break; + case VEH_Ship: message = STR_SHIP_HAS_TOO_FEW_ORDERS; break; + case VEH_Aircraft: message = STR_AIRCRAFT_HAS_TOO_FEW_ORDERS; break; + } + AddNewsItem( + message, + NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), + v->index, + 0); + } else if (duplicate) { + switch (v->type) { + case VEH_Train: message = STR_TRAIN_HAS_DUPLICATE_ENTRY; break; + case VEH_Road: message = STR_ROADVEHICLE_HAS_DUPLICATE_ENTRY; break; + case VEH_Ship: message = STR_SHIP_HAS_DUPLICATE_ENTRY; break; + case VEH_Aircraft: message = STR_AIRCRAFT_HAS_DUPLICATE_ENTRY; break; + } + AddNewsItem( + message, + NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), + v->index, + 0); + } else if (dummy) { + switch (v->type) { + case VEH_Train: message = STR_TRAIN_HAS_VOID_ORDER; break; + case VEH_Road: message = STR_ROADVEHICLE_HAS_VOID_ORDER; break; + case VEH_Ship: message = STR_SHIP_HAS_VOID_ORDER; break; + case VEH_Aircraft: message = STR_AIRCRAFT_HAS_VOID_ORDER; break; + } + AddNewsItem( + message, + NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), + v->index, + 0); + } + } + // End of order check + + if ( (n_st > 2) || (duplicate) || (dummy) ) + return 1; + else + return 0; +} diff --git a/roadveh_cmd.c b/roadveh_cmd.c index 81ffe78ad2..79d74d9830 100644 --- a/roadveh_cmd.c +++ b/roadveh_cmd.c @@ -1540,6 +1540,8 @@ void OnNewDay_RoadVeh(Vehicle *v) AgeVehicle(v); CheckIfRoadVehNeedsService(v); + CheckOrders(v); + /* update destination */ if ((v->next_order & OT_MASK) == OT_GOTO_STATION) { st = DEREF_STATION(v->next_order_param); diff --git a/ship_cmd.c b/ship_cmd.c index eaf50fde1d..6c8b0cc7a8 100644 --- a/ship_cmd.c +++ b/ship_cmd.c @@ -127,9 +127,13 @@ void OnNewDay_Ship(Vehicle *v) AgeVehicle(v); CheckIfShipNeedsService(v); + CheckOrders(v); + if (v->vehstatus & VS_STOPPED) return; + + cost = ship_vehicle_info(v->engine_type).running_cost * _price.ship_running / 364; v->profit_this_year -= cost >> 8; diff --git a/train_cmd.c b/train_cmd.c index 2c89bac4b5..d8a43e13fa 100644 --- a/train_cmd.c +++ b/train_cmd.c @@ -2578,6 +2578,8 @@ void OnNewDay_Train(Vehicle *v) 0); } + CheckOrders(v); + /* update destination */ if ((v->next_order & OT_MASK) == OT_GOTO_STATION && (tile=DEREF_STATION(v->next_order_param)->train_tile) != 0) diff --git a/vehicle.h b/vehicle.h index acb18eb02d..046f765870 100644 --- a/vehicle.h +++ b/vehicle.h @@ -354,6 +354,7 @@ int32 GetTrainRunningCost(Vehicle *v); int CheckStoppedInDepot(Vehicle *v); int ScheduleHasDepotOrders(uint16 *schedule); +int CheckOrders(Vehicle *v); typedef struct GetNewVehiclePosResult { int x,y;