Files
@ r9880:ab5464c57091
Branch filter:
Location: cpp/openttd-patchpack/source/src/timetable_cmd.cpp - annotation
r9880:ab5464c57091
6.6 KiB
text/x-c
(svn r14028) -Fix(r14027): Wrong value for the multiline_skipping. Just the other way around.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 | r6981:8e1c715f9e05 r6981:8e1c715f9e05 r9111:983de9c5a848 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r8116:df67d3c5e4fd r8131:7a50db7be0ff r8131:7a50db7be0ff r8144:1432edd15267 r8144:1432edd15267 r8270:c2ec53375c9d r6981:8e1c715f9e05 r8264:d493cb51fe8a r6981:8e1c715f9e05 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r8853:c56f6dec859b r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7809:a8c0806e350f r7809:a8c0806e350f r7809:a8c0806e350f r7066:7459a71fc283 r7066:7459a71fc283 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r8650:a2162c17e10b r6981:8e1c715f9e05 r8650:a2162c17e10b r8650:a2162c17e10b r8650:a2162c17e10b r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r9413:fcf267325763 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r8650:a2162c17e10b r8650:a2162c17e10b r9665:f312055347cc r9829:0846dd86e8ef r9829:0846dd86e8ef r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9641:a78fbf5c85cc r9665:f312055347cc r6981:8e1c715f9e05 r6981:8e1c715f9e05 r9829:0846dd86e8ef r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9829:0846dd86e8ef r9665:f312055347cc r6981:8e1c715f9e05 r9829:0846dd86e8ef r9829:0846dd86e8ef r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r9413:fcf267325763 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r9413:fcf267325763 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7931:4c17a74c399e r7929:67846e70abf8 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7929:67846e70abf8 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7809:a8c0806e350f r7809:a8c0806e350f r7809:a8c0806e350f r7809:a8c0806e350f r7066:7459a71fc283 r7066:7459a71fc283 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r9413:fcf267325763 r7066:7459a71fc283 r7066:7459a71fc283 r8970:a7dc16677ffd r8970:a7dc16677ffd r8970:a7dc16677ffd r8970:a7dc16677ffd r8970:a7dc16677ffd r7066:7459a71fc283 r7928:a80e7e05d6c5 r7066:7459a71fc283 r8970:a7dc16677ffd r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r9641:a78fbf5c85cc r9641:a78fbf5c85cc r9641:a78fbf5c85cc r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7929:67846e70abf8 r7066:7459a71fc283 r8970:a7dc16677ffd r7066:7459a71fc283 r7062:6a1de70754de r7062:6a1de70754de r7062:6a1de70754de r7066:7459a71fc283 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r7809:a8c0806e350f r7809:a8c0806e350f r7809:a8c0806e350f r6981:8e1c715f9e05 | /* $Id$ */
/** @file timetable_cmd.cpp Commands related to time tabling. */
#include "stdafx.h"
#include "openttd.h"
#include "variables.h"
#include "command_func.h"
#include "functions.h"
#include "window_func.h"
#include "vehicle_func.h"
#include "vehicle_base.h"
#include "settings_type.h"
#include "table/strings.h"
static void ChangeTimetable(Vehicle *v, VehicleOrderID order_number, uint16 time, bool is_journey)
{
Order *order = GetVehicleOrder(v, order_number);
if (is_journey) {
order->travel_time = time;
} else {
order->wait_time = time;
}
if (v->cur_order_index == order_number && v->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) {
if (is_journey) {
v->current_order.travel_time = time;
} else {
v->current_order.wait_time = time;
}
}
for (v = GetFirstVehicleFromSharedList(v); v != NULL; v = v->next_shared) {
InvalidateWindow(WC_VEHICLE_TIMETABLE, v->index);
}
}
/**
* Add or remove waiting times from an order.
* @param tile Not used.
* @param flags Operation to perform.
* @param p1 Various bitstuffed elements
* - p1 = (bit 0-15) - Vehicle with the orders to change.
* - p1 = (bit 16-23) - Order index to modify.
* - p1 = (bit 24) - Whether to change the waiting time or the travelling
* time.
* - p1 = (bit 25) - Whether p2 contains waiting and travelling time.
* @param p2 The amount of time to wait.
* - p2 = (bit 0-15) - Waiting or travelling time as specified by p1 bit 24 if p1 bit 25 is not set,
* Travelling time if p1 bit 25 is set.
* - p2 = (bit 16-31) - Waiting time if p1 bit 25 is set
*/
CommandCost CmdChangeTimetable(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{
if (!_settings_game.order.timetabling) return CMD_ERROR;
VehicleID veh = GB(p1, 0, 16);
if (!IsValidVehicleID(veh)) return CMD_ERROR;
Vehicle *v = GetVehicle(veh);
if (!CheckOwnership(v->owner)) return CMD_ERROR;
VehicleOrderID order_number = GB(p1, 16, 8);
Order *order = GetVehicleOrder(v, order_number);
if (order == NULL) return CMD_ERROR;
bool packed_time = HasBit(p1, 25);
bool is_journey = HasBit(p1, 24) || packed_time;
int wait_time = -1;
int travel_time = -1;
if (packed_time) {
travel_time = GB(p2, 0, 16);
wait_time = GB(p2, 16, 16);;
} else if (is_journey) {
travel_time = GB(p2, 0, 16);
} else {
wait_time = GB(p2, 0, 16);
}
if (wait_time != -1) {
switch (order->GetType()) {
case OT_GOTO_STATION:
if (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) return_cmd_error(STR_TIMETABLE_NOT_STOPPING_HERE);
break;
case OT_CONDITIONAL:
break;
default: return_cmd_error(STR_TIMETABLE_ONLY_WAIT_AT_STATIONS);
}
}
if (travel_time != -1 && order->IsType(OT_CONDITIONAL)) return CMD_ERROR;
if (flags & DC_EXEC) {
if (wait_time != -1) ChangeTimetable(v, order_number, wait_time, false);
if (travel_time != -1) ChangeTimetable(v, order_number, travel_time, true);
}
return CommandCost();
}
/**
* Clear the lateness counter to make the vehicle on time.
* @param tile Not used.
* @param flags Operation to perform.
* @param p1 Various bitstuffed elements
* - p1 = (bit 0-15) - Vehicle with the orders to change.
*/
CommandCost CmdSetVehicleOnTime(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{
if (!_settings_game.order.timetabling) return CMD_ERROR;
VehicleID veh = GB(p1, 0, 16);
if (!IsValidVehicleID(veh)) return CMD_ERROR;
Vehicle *v = GetVehicle(veh);
if (!CheckOwnership(v->owner)) return CMD_ERROR;
if (flags & DC_EXEC) {
v->lateness_counter = 0;
}
return CommandCost();
}
/**
* Start or stop filling the timetable automatically from the time the vehicle
* actually takes to complete it. When starting to autofill the current times
* are cleared and the timetable will start again from scratch.
* @param tile Not used.
* @param flags Operation to perform.
* @param p1 Vehicle index.
* @param p2 Set to 1 to enable, 0 to disable.
*/
CommandCost CmdAutofillTimetable(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{
if (!_settings_game.order.timetabling) return CMD_ERROR;
VehicleID veh = GB(p1, 0, 16);
if (!IsValidVehicleID(veh)) return CMD_ERROR;
Vehicle *v = GetVehicle(veh);
if (!CheckOwnership(v->owner)) return CMD_ERROR;
if (flags & DC_EXEC) {
if (p2 == 1) {
/* Start autofilling the timetable, which clears all the current
* timings and clears the "timetable has started" bit. */
SetBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE);
ClrBit(v->vehicle_flags, VF_TIMETABLE_STARTED);
for (Order *order = GetVehicleOrder(v, 0); order != NULL; order = order->next) {
order->wait_time = 0;
order->travel_time = 0;
}
v->current_order.wait_time = 0;
v->current_order.travel_time = 0;
} else {
ClrBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE);
}
}
for (v = GetFirstVehicleFromSharedList(v); v != NULL; v = v->next_shared) {
InvalidateWindow(WC_VEHICLE_TIMETABLE, v->index);
}
return CommandCost();
}
void UpdateVehicleTimetable(Vehicle *v, bool travelling)
{
uint timetabled = travelling ? v->current_order.travel_time : v->current_order.wait_time;
uint time_taken = v->current_order_time;
v->current_order_time = 0;
if (!_settings_game.order.timetabling) return;
/* Make sure the timetable only starts when the vehicle reaches the first
* order, not when travelling from the depot to the first station. */
if (v->cur_order_index == 0 && !HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) {
SetBit(v->vehicle_flags, VF_TIMETABLE_STARTED);
return;
}
if (!HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) return;
if (HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE)) {
if (timetabled == 0) {
/* Round the time taken up to the nearest day, as this will avoid
* confusion for people who are timetabling in days, and can be
* adjusted later by people who aren't. */
time_taken = (((time_taken - 1) / DAY_TICKS) + 1) * DAY_TICKS;
if (!v->current_order.IsType(OT_CONDITIONAL)) {
ChangeTimetable(v, v->cur_order_index, time_taken, travelling);
}
return;
} else if (v->cur_order_index == 0) {
/* Otherwise if we're at the beginning and it already has a value,
* assume that autofill is finished and turn it off again. */
ClrBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE);
}
}
/* Vehicles will wait at stations if they arrive early even if they are not
* timetabled to wait there, so make sure the lateness counter is updated
* when this happens. */
if (timetabled == 0 && (travelling || v->lateness_counter >= 0)) return;
v->lateness_counter -= (timetabled - time_taken);
for (v = GetFirstVehicleFromSharedList(v); v != NULL; v = v->next_shared) {
InvalidateWindow(WC_VEHICLE_TIMETABLE, v->index);
}
}
|