summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordominik <dominik@openttd.org>2004-08-11 10:15:38 +0000
committerdominik <dominik@openttd.org>2004-08-11 10:15:38 +0000
commit6f8e7943c5568d4dfcc2dcac5a795e06ca4cf29f (patch)
treeea7ee7f2eac38a902c0ba16da371712222e06254
parenta778b317f6ad08f9180161b6632cc4ffeebc37f9 (diff)
downloadopenttd-6f8e7943c5568d4dfcc2dcac5a795e06ca4cf29f.tar.xz
(svn r20) Feature: warning when a vehicle has invalid orders (celestar)
-rw-r--r--aircraft_cmd.c2
-rw-r--r--lang/english.txt13
-rw-r--r--order_cmd.c78
-rw-r--r--roadveh_cmd.c2
-rw-r--r--ship_cmd.c4
-rw-r--r--train_cmd.c2
-rw-r--r--vehicle.h1
7 files changed, 102 insertions, 0 deletions
diff --git a/aircraft_cmd.c b/aircraft_cmd.c
index 2e95c1235..f6ee422aa 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 329ad5104..33f24c355 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 ab4e06484..eb5c4ccf2 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 81ffe78ad..79d74d983 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 eaf50fde1..6c8b0cc7a 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 2c89bac4b..d8a43e13f 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 acb18eb02..046f76587 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;