src/timetable_cmd.cpp
author truebrain
Mon, 16 Jun 2008 14:43:19 +0000
branchnoai
changeset 10978 13fd0364b2c6
parent 10776 07203fc29812
permissions -rw-r--r--
(svn r13532) [NoAI] -Fix: in MultiPlayer SignID wasn't set correctly, causing weird effects. Code is now more unified, which should avoid simular effects in the future (tnx to glx for initial patch)
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
     1
/* $Id$ */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
     2
10455
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10249
diff changeset
     3
/** @file timetable_cmd.cpp Commands related to time tabling. */
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
     4
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
     5
#include "stdafx.h"
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
     6
#include "openttd.h"
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
     7
#include "variables.h"
9723
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
     8
#include "command_func.h"
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
     9
#include "functions.h"
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
    10
#include "window_func.h"
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
    11
#include "vehicle_func.h"
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
    12
#include "vehicle_base.h"
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
    13
#include "settings_type.h"
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    14
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
    15
#include "table/strings.h"
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    16
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    17
static void ChangeTimetable(Vehicle *v, VehicleOrderID order_number, uint16 time, bool is_journey)
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    18
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    19
	Order *order = GetVehicleOrder(v, order_number);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    20
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    21
	if (is_journey) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    22
		order->travel_time = time;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    23
	} else {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    24
		order->wait_time = time;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    25
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    26
10142
56ee7da4ad56 (svn r12673) [NoAI] -Sync: with trunk r12596:12672. Note that due to the order rewrite AIOrder.ChangeOrder does currently not work as expected.
rubidium
parents: 9869
diff changeset
    27
	if (v->cur_order_index == order_number && v->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) {
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    28
		if (is_journey) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    29
			v->current_order.travel_time = time;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    30
		} else {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    31
			v->current_order.wait_time = time;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    32
		}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    33
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    34
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9629
diff changeset
    35
	for (v = GetFirstVehicleFromSharedList(v); v != NULL; v = v->next_shared) {
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9629
diff changeset
    36
		InvalidateWindow(WC_VEHICLE_TIMETABLE, v->index);
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9629
diff changeset
    37
	}
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    38
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    39
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    40
/**
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    41
 * Add or remove waiting times from an order.
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    42
 * @param tile Not used.
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    43
 * @param flags Operation to perform.
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    44
 * @param p1 Various bitstuffed elements
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    45
 * - p1 = (bit  0-15) - Vehicle with the orders to change.
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    46
 * - p1 = (bit 16-23) - Order index to modify.
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    47
 * - p1 = (bit    24) - Whether to change the waiting time or the travelling
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    48
 *                      time.
9800
ab08ca2a2018 (svn r12306) [NoAI] -Sync with trunk r12209:12304
glx
parents: 9724
diff changeset
    49
 * - p1 = (bit    25) - Whether p2 contains waiting and travelling time.
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    50
 * @param p2 The amount of time to wait.
9800
ab08ca2a2018 (svn r12306) [NoAI] -Sync with trunk r12209:12304
glx
parents: 9724
diff changeset
    51
 * - p2 = (bit  0-15) - Waiting or travelling time as specified by p1 bit 24 if p1 bit 25 is not set,
ab08ca2a2018 (svn r12306) [NoAI] -Sync with trunk r12209:12304
glx
parents: 9724
diff changeset
    52
 *                      Travelling time if p1 bit 25 is set.
ab08ca2a2018 (svn r12306) [NoAI] -Sync with trunk r12209:12304
glx
parents: 9724
diff changeset
    53
 * - p2 = (bit 16-31) - Waiting time if p1 bit 25 is set
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    54
 */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    55
CommandCost CmdChangeTimetable(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    56
{
10776
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10715
diff changeset
    57
	if (!_settings_game.order.timetabling) return CMD_ERROR;
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    58
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    59
	VehicleID veh = GB(p1, 0, 16);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    60
	if (!IsValidVehicleID(veh)) return CMD_ERROR;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    61
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    62
	Vehicle *v = GetVehicle(veh);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    63
	if (!CheckOwnership(v->owner)) return CMD_ERROR;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    64
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    65
	VehicleOrderID order_number = GB(p1, 16, 8);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    66
	Order *order = GetVehicleOrder(v, order_number);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    67
	if (order == NULL) return CMD_ERROR;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    68
9800
ab08ca2a2018 (svn r12306) [NoAI] -Sync with trunk r12209:12304
glx
parents: 9724
diff changeset
    69
	bool packed_time = HasBit(p1, 25);
ab08ca2a2018 (svn r12306) [NoAI] -Sync with trunk r12209:12304
glx
parents: 9724
diff changeset
    70
	bool is_journey = HasBit(p1, 24) || packed_time;
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    71
	if (!is_journey) {
9869
6404afe43575 (svn r12597) [NoAI] -Sync: with trunk r12501:12596.
rubidium
parents: 9800
diff changeset
    72
		if (!order->IsType(OT_GOTO_STATION)) return_cmd_error(STR_TIMETABLE_ONLY_WAIT_AT_STATIONS);
10142
56ee7da4ad56 (svn r12673) [NoAI] -Sync: with trunk r12596:12672. Note that due to the order rewrite AIOrder.ChangeOrder does currently not work as expected.
rubidium
parents: 9869
diff changeset
    73
		if (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) return_cmd_error(STR_TIMETABLE_NOT_STOPPING_HERE);
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    74
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    75
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    76
	if (flags & DC_EXEC) {
9800
ab08ca2a2018 (svn r12306) [NoAI] -Sync with trunk r12209:12304
glx
parents: 9724
diff changeset
    77
		ChangeTimetable(v, order_number, GB(p2, 0, 16), is_journey);
ab08ca2a2018 (svn r12306) [NoAI] -Sync with trunk r12209:12304
glx
parents: 9724
diff changeset
    78
		if (packed_time) ChangeTimetable(v, order_number, GB(p2, 16, 16), false);
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    79
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    80
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    81
	return CommandCost();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    82
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    83
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    84
/**
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    85
 * Clear the lateness counter to make the vehicle on time.
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    86
 * @param tile Not used.
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    87
 * @param flags Operation to perform.
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    88
 * @param p1 Various bitstuffed elements
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    89
 * - p1 = (bit  0-15) - Vehicle with the orders to change.
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    90
 */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    91
CommandCost CmdSetVehicleOnTime(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    92
{
10776
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10715
diff changeset
    93
	if (!_settings_game.order.timetabling) return CMD_ERROR;
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    94
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    95
	VehicleID veh = GB(p1, 0, 16);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    96
	if (!IsValidVehicleID(veh)) return CMD_ERROR;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    97
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    98
	Vehicle *v = GetVehicle(veh);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    99
	if (!CheckOwnership(v->owner)) return CMD_ERROR;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   100
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   101
	if (flags & DC_EXEC) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   102
		v->lateness_counter = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   103
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   104
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   105
	return CommandCost();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   106
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   107
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   108
/**
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   109
 * Start or stop filling the timetable automatically from the time the vehicle
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   110
 * actually takes to complete it. When starting to autofill the current times
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   111
 * are cleared and the timetable will start again from scratch.
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   112
 * @param tile Not used.
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   113
 * @param flags Operation to perform.
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   114
 * @param p1 Vehicle index.
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   115
 * @param p2 Set to 1 to enable, 0 to disable.
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   116
 */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   117
CommandCost CmdAutofillTimetable(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   118
{
10776
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10715
diff changeset
   119
	if (!_settings_game.order.timetabling) return CMD_ERROR;
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   120
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   121
	VehicleID veh = GB(p1, 0, 16);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   122
	if (!IsValidVehicleID(veh)) return CMD_ERROR;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   123
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   124
	Vehicle *v = GetVehicle(veh);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   125
	if (!CheckOwnership(v->owner)) return CMD_ERROR;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   126
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   127
	if (flags & DC_EXEC) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   128
		if (p2 == 1) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   129
			/* Start autofilling the timetable, which clears all the current
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   130
			 * timings and clears the "timetable has started" bit. */
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9629
diff changeset
   131
			SetBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE);
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9629
diff changeset
   132
			ClrBit(v->vehicle_flags, VF_TIMETABLE_STARTED);
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   133
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   134
			for (Order *order = GetVehicleOrder(v, 0); order != NULL; order = order->next) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   135
				order->wait_time = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   136
				order->travel_time = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   137
			}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   138
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   139
			v->current_order.wait_time = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   140
			v->current_order.travel_time = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   141
		} else {
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9629
diff changeset
   142
			ClrBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE);
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   143
		}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   144
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   145
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9629
diff changeset
   146
	for (v = GetFirstVehicleFromSharedList(v); v != NULL; v = v->next_shared) {
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9629
diff changeset
   147
		InvalidateWindow(WC_VEHICLE_TIMETABLE, v->index);
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9629
diff changeset
   148
	}
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9629
diff changeset
   149
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   150
	return CommandCost();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   151
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   152
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   153
void UpdateVehicleTimetable(Vehicle *v, bool travelling)
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   154
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   155
	uint timetabled = travelling ? v->current_order.travel_time : v->current_order.wait_time;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   156
	uint time_taken = v->current_order_time;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   157
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   158
	v->current_order_time = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   159
10776
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10715
diff changeset
   160
	if (!_settings_game.order.timetabling) return;
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   161
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   162
	/* Make sure the timetable only starts when the vehicle reaches the first
10249
58810805030e (svn r12781) [NoAI] -Sync: with trunk r12711:12780.
rubidium
parents: 10142
diff changeset
   163
	 * order, not when travelling from the depot to the first station. */
58810805030e (svn r12781) [NoAI] -Sync: with trunk r12711:12780.
rubidium
parents: 10142
diff changeset
   164
	if (v->cur_order_index == 0 && !HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) {
58810805030e (svn r12781) [NoAI] -Sync: with trunk r12711:12780.
rubidium
parents: 10142
diff changeset
   165
		SetBit(v->vehicle_flags, VF_TIMETABLE_STARTED);
58810805030e (svn r12781) [NoAI] -Sync: with trunk r12711:12780.
rubidium
parents: 10142
diff changeset
   166
		return;
58810805030e (svn r12781) [NoAI] -Sync: with trunk r12711:12780.
rubidium
parents: 10142
diff changeset
   167
	}
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   168
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9629
diff changeset
   169
	if (!HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) return;
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   170
10249
58810805030e (svn r12781) [NoAI] -Sync: with trunk r12711:12780.
rubidium
parents: 10142
diff changeset
   171
	if (HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE)) {
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   172
		if (timetabled == 0) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   173
			/* Round the time taken up to the nearest day, as this will avoid
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   174
			 * confusion for people who are timetabling in days, and can be
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   175
			 * adjusted later by people who aren't. */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   176
			time_taken = (((time_taken - 1) / DAY_TICKS) + 1) * DAY_TICKS;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   177
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   178
			ChangeTimetable(v, v->cur_order_index, time_taken, travelling);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   179
			return;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   180
		} else if (v->cur_order_index == 0) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   181
			/* Otherwise if we're at the beginning and it already has a value,
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   182
			 * assume that autofill is finished and turn it off again. */
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9629
diff changeset
   183
			ClrBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE);
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   184
		}
10249
58810805030e (svn r12781) [NoAI] -Sync: with trunk r12711:12780.
rubidium
parents: 10142
diff changeset
   185
	}
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   186
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   187
	/* Vehicles will wait at stations if they arrive early even if they are not
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   188
	 * timetabled to wait there, so make sure the lateness counter is updated
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   189
	 * when this happens. */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   190
	if (timetabled == 0 && (travelling || v->lateness_counter >= 0)) return;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   191
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   192
	v->lateness_counter -= (timetabled - time_taken);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   193
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9629
diff changeset
   194
	for (v = GetFirstVehicleFromSharedList(v); v != NULL; v = v->next_shared) {
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9629
diff changeset
   195
		InvalidateWindow(WC_VEHICLE_TIMETABLE, v->index);
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9629
diff changeset
   196
	}
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   197
}