order_cmd.c
changeset 55 73fae6c6568e
parent 29 b4bf7559cfa7
child 193 0a7025304867
equal deleted inserted replaced
54:a26c36eae24a 55:73fae6c6568e
   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 }