355 return 0; |
355 return 0; |
356 } |
356 } |
357 |
357 |
358 int CheckOrders(Vehicle *v) |
358 int CheckOrders(Vehicle *v) |
359 { |
359 { |
360 int i, n_st, duplicate; |
360 if (!_patches.order_review_system) //User doesn't want things to be checked |
361 uint16 order, old_orderer; |
361 return 0; |
362 uint16 dummy; |
362 |
363 int message=0; |
363 if ( (_patches.order_review_system == 1) && (v->vehstatus & VS_STOPPED) ) |
364 |
364 return 0; |
365 /* check the order list */ |
365 |
366 order = v->schedule_ptr[0]; |
366 /* only check every 20 days, so that we don't flood the message log */ |
367 n_st = duplicate = dummy = 0; |
|
368 |
|
369 /* only check every 20 days */ |
|
370 if ( ( ( v->day_counter % 20) == 0 ) && (v->owner == _local_player) ) { |
367 if ( ( ( v->day_counter % 20) == 0 ) && (v->owner == _local_player) ) { |
371 for(old_orderer = i = 0; order!=0; i++ ) { |
368 |
|
369 uint16 order, old_order; |
|
370 int i, n_st, problem_type = -1; |
|
371 Station *st; |
|
372 int message=0; |
|
373 TileIndex required_tile=-1; |
|
374 |
|
375 /* check the order list */ |
|
376 order = v->schedule_ptr[0]; |
|
377 n_st = 0; |
|
378 |
|
379 for (old_order = i = 0; order!=0; i++ ) { |
372 order = v->schedule_ptr[i]; |
380 order = v->schedule_ptr[i]; |
373 if (order == old_orderer) duplicate = -1; |
381 if (order == old_order) { |
374 if ( (order & OT_MASK) == OT_DUMMY ) dummy = -1; |
382 problem_type = 2; |
|
383 break; |
|
384 } |
|
385 if ( (order & OT_MASK) == OT_DUMMY ) { |
|
386 problem_type = 1; |
|
387 break; |
|
388 } |
375 if ( ( (order & OT_MASK) == OT_GOTO_STATION ) /*&& (order != old_order) */) { |
389 if ( ( (order & OT_MASK) == OT_GOTO_STATION ) /*&& (order != old_order) */) { |
376 //I uncommented this in order not to get two error messages |
390 //I uncommented this in order not to get two error messages |
377 //when two identical entries are in the list |
391 //when two identical entries are in the list |
378 n_st++; |
392 n_st++; |
379 } |
393 st = DEREF_STATION(order >> 8); |
380 old_orderer = order; //store the old order |
394 required_tile = GetStationTileForVehicle(v,st); |
|
395 } |
|
396 old_order = order; //store the old order |
381 } |
397 } |
382 |
398 |
383 //Now, check the last and the first order |
399 //Now, check the last and the first order |
384 //as the last order is the end of order marker, jump back 2 |
400 //as the last order is the end of order marker, jump back 2 |
385 if ( (v->schedule_ptr[0] == v->schedule_ptr[i-2]) && ( i-2 != 0 ) ) duplicate = -1; |
401 if ( (v->schedule_ptr[0] == v->schedule_ptr[i-2]) && ( i-2 != 0 ) ) { |
|
402 problem_type = 2; |
|
403 } |
|
404 |
|
405 if (n_st < 2) problem_type = 0; |
|
406 |
|
407 if (!required_tile) problem_type = 3; |
386 |
408 |
387 SET_DPARAM16(0, v->unitnumber); |
409 SET_DPARAM16(0, v->unitnumber); |
388 |
410 |
389 if (n_st < 2) { |
411 message = (STR_TRAIN_HAS_TOO_FEW_ORDERS) + (((v->type) - VEH_Train) << 2) + problem_type; |
390 switch (v->type) { |
412 |
391 case VEH_Train: message = STR_TRAIN_HAS_TOO_FEW_ORDERS; break; |
413 if (problem_type < 0) return 0; |
392 case VEH_Road: message = STR_ROADVEHICLE_HAS_TOO_FEW_ORDERS; break; |
414 |
393 case VEH_Ship: message = STR_SHIP_HAS_TOO_FEW_ORDERS; break; |
415 AddNewsItem( |
394 case VEH_Aircraft: message = STR_AIRCRAFT_HAS_TOO_FEW_ORDERS; break; |
416 message, |
395 } |
417 NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), |
396 AddNewsItem( |
418 v->index, |
397 message, |
419 0); |
398 NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), |
|
399 v->index, |
|
400 0); |
|
401 } else if (duplicate) { |
|
402 switch (v->type) { |
|
403 case VEH_Train: message = STR_TRAIN_HAS_DUPLICATE_ENTRY; break; |
|
404 case VEH_Road: message = STR_ROADVEHICLE_HAS_DUPLICATE_ENTRY; break; |
|
405 case VEH_Ship: message = STR_SHIP_HAS_DUPLICATE_ENTRY; break; |
|
406 case VEH_Aircraft: message = STR_AIRCRAFT_HAS_DUPLICATE_ENTRY; break; |
|
407 } |
|
408 AddNewsItem( |
|
409 message, |
|
410 NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), |
|
411 v->index, |
|
412 0); |
|
413 } else if (dummy) { |
|
414 switch (v->type) { |
|
415 case VEH_Train: message = STR_TRAIN_HAS_VOID_ORDER; break; |
|
416 case VEH_Road: message = STR_ROADVEHICLE_HAS_VOID_ORDER; break; |
|
417 case VEH_Ship: message = STR_SHIP_HAS_VOID_ORDER; break; |
|
418 case VEH_Aircraft: message = STR_AIRCRAFT_HAS_VOID_ORDER; break; |
|
419 } |
|
420 AddNewsItem( |
|
421 message, |
|
422 NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), |
|
423 v->index, |
|
424 0); |
|
425 } |
|
426 } |
420 } |
427 // End of order check |
421 // End of order check |
428 |
422 |
429 if ( (n_st > 2) || (duplicate) || (dummy) ) |
423 return 1; |
430 return 1; |
424 } |
431 else |
|
432 return 0; |
|
433 } |
|