Files
@ r11071:70854404b978
Branch filter:
Location: cpp/openttd-patchpack/source/src/timetable_cmd.cpp - annotation
r11071:70854404b978
7.7 KiB
text/x-c
(svn r15412) -Fix: Clearing custom engine names could cause desyncs due to be client-side only; GUI parts of save/load of custom engine names also removed as it was never implemented.
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 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 | r6981:8e1c715f9e05 r6981:8e1c715f9e05 r9111:983de9c5a848 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r8116:df67d3c5e4fd r8131:7a50db7be0ff r8131:7a50db7be0ff r8144:1432edd15267 r8270:c2ec53375c9d r6981:8e1c715f9e05 r8264:d493cb51fe8a r6981:8e1c715f9e05 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r10546:a4ec290c1c46 r7066:7459a71fc283 r7066:7459a71fc283 r10546:a4ec290c1c46 r7066:7459a71fc283 r7066:7459a71fc283 r10546:a4ec290c1c46 r7066:7459a71fc283 r7066:7459a71fc283 r10546:a4ec290c1c46 r7066:7459a71fc283 r10033:424b14d0d013 r10033:424b14d0d013 r10033:424b14d0d013 r10033:424b14d0d013 r10033:424b14d0d013 r10033:424b14d0d013 r10033:424b14d0d013 r7066:7459a71fc283 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 r10499:570896340d7a 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 r10227:5c84b06816db r10227:5c84b06816db r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9641:a78fbf5c85cc r9665:f312055347cc r6981:8e1c715f9e05 r6981:8e1c715f9e05 r10227:5c84b06816db r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r9665:f312055347cc r10227:5c84b06816db r9665:f312055347cc r6981:8e1c715f9e05 r10227:5c84b06816db r10227:5c84b06816db r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r10499:570896340d7a 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 r10341:c21fa463ba20 r10341:c21fa463ba20 r10341:c21fa463ba20 r7066:7459a71fc283 r10499:570896340d7a r7066:7459a71fc283 r9413:fcf267325763 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r10341:c21fa463ba20 r10677:1a6f3c7876cf r10677:1a6f3c7876cf r10677:1a6f3c7876cf r7931:4c17a74c399e r7929:67846e70abf8 r7066:7459a71fc283 r10677:1a6f3c7876cf r10341:c21fa463ba20 r7066:7459a71fc283 r10341:c21fa463ba20 r7066:7459a71fc283 r7929:67846e70abf8 r10341:c21fa463ba20 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r11042:9a00dc9e0e93 r11042:9a00dc9e0e93 r11042:9a00dc9e0e93 r11042:9a00dc9e0e93 r11042:9a00dc9e0e93 r11042:9a00dc9e0e93 r11042:9a00dc9e0e93 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 r10341:c21fa463ba20 r10341:c21fa463ba20 r7066:7459a71fc283 r8970:a7dc16677ffd r8970:a7dc16677ffd r8970:a7dc16677ffd r10341:c21fa463ba20 r8970:a7dc16677ffd r7066:7459a71fc283 r7928:a80e7e05d6c5 r7066:7459a71fc283 r8970:a7dc16677ffd r10341:c21fa463ba20 r10341:c21fa463ba20 r10341:c21fa463ba20 r10341:c21fa463ba20 r10341:c21fa463ba20 r10341:c21fa463ba20 r10341:c21fa463ba20 r10341:c21fa463ba20 r10341:c21fa463ba20 r10341:c21fa463ba20 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r7066:7459a71fc283 r10341:c21fa463ba20 r10341:c21fa463ba20 r10341:c21fa463ba20 r10341:c21fa463ba20 r10341:c21fa463ba20 r10341:c21fa463ba20 r10341:c21fa463ba20 r7929:67846e70abf8 r10341:c21fa463ba20 r7066:7459a71fc283 r10341:c21fa463ba20 r8970:a7dc16677ffd r7066:7459a71fc283 r10341:c21fa463ba20 r10341:c21fa463ba20 r7062:6a1de70754de r7062:6a1de70754de r7062:6a1de70754de r7066:7459a71fc283 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r6981:8e1c715f9e05 r9941:945cc0c6ccbc r7809:a8c0806e350f r7809:a8c0806e350f r6981:8e1c715f9e05 | /* $Id$ */
/** @file timetable_cmd.cpp Commands related to time tabling. */
#include "stdafx.h"
#include "command_func.h"
#include "functions.h"
#include "window_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);
int delta;
if (is_journey) {
delta = time - order->travel_time;
order->travel_time = time;
} else {
delta = time - order->wait_time;
order->wait_time = time;
}
v->orders.list->UpdateOrderTimetable(delta);
for (v = v->FirstShared(); v != NULL; v = v->NextShared()) {
if (v->cur_order_index == order_number && v->current_order.Equals(*order)) {
if (is_journey) {
v->current_order.travel_time = time;
} else {
v->current_order.wait_time = time;
}
}
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, const char *text)
{
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 = order->wait_time;
int travel_time = order->travel_time;
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 != order->wait_time) {
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 != order->travel_time && order->IsType(OT_CONDITIONAL)) return CMD_ERROR;
if (flags & DC_EXEC) {
if (wait_time != order->wait_time) ChangeTimetable(v, order_number, wait_time, false);
if (travel_time != order->travel_time) 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, const char *text)
{
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 Various bitstuffed elements
* - p2 = (bit 0) - Set to 1 to enable, 0 to disable autofill.
* - p2 = (bit 1) - Set to 1 to preserve waiting times in non-destructive mode
*/
CommandCost CmdAutofillTimetable(TileIndex tile, uint32 flags, uint32 p1, uint32 p2, const char *text)
{
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 (HasBit(p2, 0)) {
/* Start autofilling the timetable, which clears the
* "timetable has started" bit. Times are not cleared anymore, but are
* overwritten when the order is reached now. */
SetBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE);
ClrBit(v->vehicle_flags, VF_TIMETABLE_STARTED);
/* Overwrite waiting times only if they got longer */
if (HasBit(p2, 1)) SetBit(v->vehicle_flags, VF_AUTOFILL_PRES_WAIT_TIME);
v->lateness_counter = 0;
} else {
ClrBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE);
ClrBit(v->vehicle_flags, VF_AUTOFILL_PRES_WAIT_TIME);
}
}
for (Vehicle *v2 = v->FirstShared(); v2 != NULL; v2 = v2->NextShared()) {
if (v2 != v) {
/* Stop autofilling; only one vehicle at a time can perform autofill */
ClrBit(v2->vehicle_flags, VF_AUTOFILL_TIMETABLE);
ClrBit(v2->vehicle_flags, VF_AUTOFILL_PRES_WAIT_TIME);
}
InvalidateWindow(WC_VEHICLE_TIMETABLE, v2->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;
bool just_started = false;
/* 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);
just_started = true;
}
if (!HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) return;
if (HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE)) {
if (travelling && !HasBit(v->vehicle_flags, VF_AUTOFILL_PRES_WAIT_TIME)) {
/* Need to clear that now as otherwise we are not able to reduce the wait time */
v->current_order.wait_time = 0;
}
if (just_started) return;
/* Modify station waiting time only if our new value is larger (this is
* always the case when we cleared the timetable). */
if (!v->current_order.IsType(OT_CONDITIONAL) && (travelling || time_taken > v->current_order.wait_time)) {
/* 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;
ChangeTimetable(v, v->cur_order_index, time_taken, travelling);
}
if (v->cur_order_index == 0 && travelling) {
/* If we just started we would have returned earlier and have not reached
* this code. So obviously, we have completed our round: So turn autofill
* off again. */
ClrBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE);
ClrBit(v->vehicle_flags, VF_AUTOFILL_PRES_WAIT_TIME);
}
return;
}
if (just_started) return;
/* 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 = v->FirstShared(); v != NULL; v = v->NextShared()) {
InvalidateWindow(WC_VEHICLE_TIMETABLE, v->index);
}
}
|