From e0471187d0645c9e1b3034944ec678e72305e477 Mon Sep 17 00:00:00 2001 From: celestar Date: Mon, 17 Jan 2005 21:54:45 +0000 Subject: [PATCH] (svn r1554) -Fix: [ 1103187 ] Order Check messages are now validated before displayed, so that there are no stray error messages any more. -Feature/Fix: Order Checking is only execute for ONE vehicle in an order-share system --- aircraft_cmd.c | 2 +- order.h | 8 +++++++- order_cmd.c | 34 ++++++++++++++++++++++++++++++---- roadveh_cmd.c | 2 +- ship_cmd.c | 2 +- train_cmd.c | 2 +- 6 files changed, 41 insertions(+), 9 deletions(-) diff --git a/aircraft_cmd.c b/aircraft_cmd.c index 4f61d21a78..06adeca0eb 100644 --- a/aircraft_cmd.c +++ b/aircraft_cmd.c @@ -528,7 +528,7 @@ void OnNewDay_Aircraft(Vehicle *v) if ((++v->day_counter & 7) == 0) DecreaseVehicleValue(v); - CheckOrders(v); + CheckOrders(v->index, OC_INIT); CheckVehicleBreakdown(v); AgeVehicle(v); diff --git a/order.h b/order.h index 07fd95e4ac..97f823a544 100644 --- a/order.h +++ b/order.h @@ -33,6 +33,12 @@ enum { CO_UNSHARE = 2 }; +/* Modes for the order checker */ +enum { + OC_INIT = 0, //the order checker can initialize a news message + OC_VALIDATE = 1, //the order checker validates a news message +}; + /* If you change this, keep in mind that it is saved on 3 places: - Load_ORDR, all the global orders - Vehicle -> current_order @@ -112,7 +118,7 @@ void RestoreVehicleOrders(Vehicle *v, BackuppedOrders *order); void DeleteDestinationFromVehicleOrder(Order dest); void InvalidateVehicleOrder(const Vehicle *v); bool VehicleHasDepotOrders(const Vehicle *v); -bool CheckOrders(const Vehicle *v); +bool CheckOrders(uint data_a, uint data_b); void DeleteVehicleOrders(Vehicle *v); bool IsOrderListShared(const Vehicle *v); void AssignOrder(Order *order, Order data); diff --git a/order_cmd.c b/order_cmd.c index 3a40e22418..24fe6809b6 100644 --- a/order_cmd.c +++ b/order_cmd.c @@ -629,8 +629,9 @@ int32 CmdRestoreOrderIndex(int x, int y, uint32 flags, uint32 vehicle_id, uint32 * Check the orders of a vehicle, to see if there are invalid orders and stuff * */ -bool CheckOrders(const Vehicle *v) +bool CheckOrders(uint data_a, uint data_b) { + Vehicle *v = GetVehicle(data_a); /* Does the user wants us to check things? */ if (_patches.order_review_system == 0) return false; @@ -643,6 +644,10 @@ bool CheckOrders(const Vehicle *v) if ( (_patches.order_review_system == 1) && (v->vehstatus & VS_STOPPED) ) return false; + /* do nothing we we're not the first vehicle in a share-chain */ + if (v->next_shared != NULL) + return false; + /* Only check every 20 days, so that we don't flood the message log */ if ( ( ( v->day_counter % 20) == 0 ) && (v->owner == _local_player) ) { int n_st, problem_type = -1; @@ -653,6 +658,12 @@ bool CheckOrders(const Vehicle *v) /* Check the order list */ n_st = 0; + /*if (data_b == OC_INIT) { + DEBUG(misc, 3) ("CheckOrder called in mode 0 (initiation mode) for %d", v->index); + } else { + DEBUG(misc, 3) ("CheckOrder called in mode 1 (validation mode) for %d", v->index); + }*/ + FOR_VEHICLE_ORDERS(v, order) { /* Dummy order? */ if (order->type == OT_DUMMY) { @@ -683,17 +694,32 @@ bool CheckOrders(const Vehicle *v) problem_type = 0; /* We don't have a problem */ - if (problem_type < 0) + if (problem_type < 0) { + /*if (data_b == OC_INIT) { + DEBUG(misc, 3) ("CheckOrder mode 0: no problems found for %d", v->index); + } else { + DEBUG(misc, 3) ("CheckOrder mode 1: news item surpressed for %d", v->index); + }*/ return false; + } + + /* we have a problem, are we're just in the validation process + so don't display an error message */ + if (data_b == OC_VALIDATE) { + /*DEBUG(misc, 3) ("CheckOrder mode 1: new item validated for %d", v->index);*/ + return true; + } message = (STR_TRAIN_HAS_TOO_FEW_ORDERS) + (((v->type) - VEH_Train) << 2) + problem_type; + /*DEBUG(misc, 3) ("Checkorder mode 0: Triggered News Item for %d", v->index);*/ SetDParam(0, v->unitnumber); - AddNewsItem( + AddValidatedNewsItem( message, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, 0), v->index, - 0); + OC_VALIDATE, //next time, just validate the orders + CheckOrders); } return true; diff --git a/roadveh_cmd.c b/roadveh_cmd.c index c86c52fc3f..471cd99b7a 100644 --- a/roadveh_cmd.c +++ b/roadveh_cmd.c @@ -1481,7 +1481,7 @@ void OnNewDay_RoadVeh(Vehicle *v) AgeVehicle(v); CheckIfRoadVehNeedsService(v); - CheckOrders(v); + CheckOrders(v->index, OC_INIT); /* update destination */ if (v->current_order.type == OT_GOTO_STATION) { diff --git a/ship_cmd.c b/ship_cmd.c index ba8e288ba7..9b0233e937 100644 --- a/ship_cmd.c +++ b/ship_cmd.c @@ -145,7 +145,7 @@ void OnNewDay_Ship(Vehicle *v) AgeVehicle(v); CheckIfShipNeedsService(v); - CheckOrders(v); + CheckOrders(v->index, OC_INIT); if (v->vehstatus & VS_STOPPED) return; diff --git a/train_cmd.c b/train_cmd.c index 06c09ce6ec..783b5bbd0b 100644 --- a/train_cmd.c +++ b/train_cmd.c @@ -2756,7 +2756,7 @@ void OnNewDay_Train(Vehicle *v) 0); } - CheckOrders(v); + CheckOrders(v->index, OC_INIT); /* update destination */ if (v->current_order.type == OT_GOTO_STATION &&