changeset 19:10ff2b3e2780 draft

(svn r20) Feature: warning when a vehicle has invalid orders (celestar)
author dominik <dominik@openttd.org>
date Wed, 11 Aug 2004 10:15:38 +0000
parents 90238fa5e5dc
children 5c78444d3e3d
files aircraft_cmd.c lang/english.txt order_cmd.c roadveh_cmd.c ship_cmd.c train_cmd.c vehicle.h
diffstat 7 files changed, 102 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/aircraft_cmd.c
+++ b/aircraft_cmd.c
@@ -563,6 +563,8 @@
 	if ((++v->day_counter & 7) == 0)
 		DecreaseVehicleValue(v);
 
+	CheckOrders(v);
+
 	CheckVehicleBreakdown(v);
 	AgeVehicle(v);
 	CheckIfAircraftNeedsService(v);
--- a/lang/english.txt
+++ b/lang/english.txt
@@ -903,6 +903,19 @@
 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
--- 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 @@
 	}
 	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;
+}
--- a/roadveh_cmd.c
+++ b/roadveh_cmd.c
@@ -1540,6 +1540,8 @@
 	AgeVehicle(v);
 	CheckIfRoadVehNeedsService(v);
 
+	CheckOrders(v);
+
 	/* update destination */
 	if ((v->next_order & OT_MASK) == OT_GOTO_STATION) {
 		st = DEREF_STATION(v->next_order_param);
--- a/ship_cmd.c
+++ b/ship_cmd.c
@@ -127,9 +127,13 @@
 	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;
 
--- a/train_cmd.c
+++ b/train_cmd.c
@@ -2578,6 +2578,8 @@
 				0);
 		}
 
+		CheckOrders(v);
+				
 		/* update destination */
 		if ((v->next_order & OT_MASK) == OT_GOTO_STATION &&
 				(tile=DEREF_STATION(v->next_order_param)->train_tile) != 0)
--- a/vehicle.h
+++ b/vehicle.h
@@ -354,6 +354,7 @@
 int CheckStoppedInDepot(Vehicle *v);
 
 int ScheduleHasDepotOrders(uint16 *schedule);
+int CheckOrders(Vehicle *v);
 
 typedef struct GetNewVehiclePosResult {
 	int x,y;