author | Tero Marttila <terom@fixme.fi> |
Fri, 18 Jul 2008 21:28:42 +0300 | |
changeset 11175 | 020c61e39c94 |
parent 11133 | a75c67ae67b0 |
permissions | -rw-r--r-- |
2186 | 1 |
/* $Id$ */ |
2 |
||
10429
1b99254f9607
(svn r12971) -Documentation: add @file in files that missed them and add something more than whitespace as description of files that don't have a description.
rubidium
parents:
10382
diff
changeset
|
3 |
/** @file roadveh_cmd.cpp Handling of road vehicles. */ |
6889
f7f6d9cb07a0
(svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents:
6683
diff
changeset
|
4 |
|
3508
99974a14a81d
(svn r4359) MSV6 Release mode now compiles (problem of UINT_MAX. stdafx.h should be the first include). Thanks to KUDr for solution and testing
belugas
parents:
3491
diff
changeset
|
5 |
#include "stdafx.h" |
1891
92a3b0aa0946
(svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents:
1793
diff
changeset
|
6 |
#include "openttd.h" |
1299
0a6510cc889b
(svn r1803) Move debugging stuff into files of it's own
tron
parents:
1295
diff
changeset
|
7 |
#include "debug.h" |
8615
6b91ca653bad
(svn r11680) -Codechange: refactor more out of openttd.h and functions.h.
rubidium
parents:
8612
diff
changeset
|
8 |
#include "tile_cmd.h" |
6949
72d11a1e1e60
(svn r9609) -Codechange: Move some function prototypes out of functions.h and into landscape.h, and add a few where they didn't exist.
maedhros
parents:
6903
diff
changeset
|
9 |
#include "landscape.h" |
3144
426b825578f9
(svn r3763) Adapt to the new 'map accessors go in foo_map.h'-scheme
tron
parents:
3140
diff
changeset
|
10 |
#include "road_map.h" |
3959 | 11 |
#include "roadveh.h" |
3315
1f65f8260092
(svn r4079) Add GetSation{Index,ByTile}() to get the station index resp. the station from a tile
tron
parents:
3236
diff
changeset
|
12 |
#include "station_map.h" |
8612
6414fc21c2f3
(svn r11677) -Codechange: move price and command related types/functions to their respective places.
rubidium
parents:
8610
diff
changeset
|
13 |
#include "command_func.h" |
9281
d8cd9ac52a68
(svn r12489) -Codechange: split station.h into station_base.h and station_func.h.
rubidium
parents:
9280
diff
changeset
|
14 |
#include "station_base.h" |
9259
088d3649dd4f
(svn r12459) -Codechange: split news.h into news_type.h and news_func.h.
rubidium
parents:
9212
diff
changeset
|
15 |
#include "news_func.h" |
0 | 16 |
#include "pathfind.h" |
1247 | 17 |
#include "npf.h" |
8750
fdd6054e7bae
(svn r11818) -Codechange: split player.h into smaller pieces.
rubidium
parents:
8732
diff
changeset
|
18 |
#include "player_func.h" |
fdd6054e7bae
(svn r11818) -Codechange: split player.h into smaller pieces.
rubidium
parents:
8732
diff
changeset
|
19 |
#include "player_base.h" |
5573
afa6f92a71fd
(svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents:
5568
diff
changeset
|
20 |
#include "bridge.h" |
3184
7405329343ce
(svn r3830) Move IsTunnelTile() from tile.h to tunnel_map.h and add IsTunnel(), which just checks for a tunnel, but not the tile type as IsTunnelTile() does
tron
parents:
3169
diff
changeset
|
21 |
#include "tunnel_map.h" |
5573
afa6f92a71fd
(svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents:
5568
diff
changeset
|
22 |
#include "bridge_map.h" |
1752
cdbfb2f23e72
(svn r2256) - Fix: Trains cannot find a depot when they are in a tunnel. (glx)
matthijs
parents:
1745
diff
changeset
|
23 |
#include "vehicle_gui.h" |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
24 |
#include "articulated_vehicles.h" |
3990
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
25 |
#include "newgrf_callbacks.h" |
2962
dbd168a4703a
(svn r3524) - Split newgrf features from engine.[ch] into newgrf_engine.[ch], and add the new files to project files.
peter1138
parents:
2954
diff
changeset
|
26 |
#include "newgrf_engine.h" |
4244
44dcec623504
(svn r5822) - NewGRF: add support for callback 31, vehicle start/stop check. This allows a set to disallow a vehicle from being started, i.e. to not be able to leave the depot. This is almost a partner to callback 1D.
peter1138
parents:
4242
diff
changeset
|
27 |
#include "newgrf_text.h" |
4656
acffecd6f484
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
28 |
#include "newgrf_sound.h" |
3900
4984308f9125
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
29 |
#include "yapf/yapf.h" |
6655
951b0ba32eb1
(svn r9301) -Codechange: Use cargo class to determine if a road vehicle can stop in bus or truck stops.
peter1138
parents:
6642
diff
changeset
|
30 |
#include "cargotype.h" |
8610
17cc343a23dd
(svn r11675) -Codechange: split the string types from the string functions.
rubidium
parents:
8604
diff
changeset
|
31 |
#include "strings_func.h" |
8579
3efbb430092e
(svn r11644) -Codechange: merge some functions from tunnel_map.h and bridge_map.h into tunnelbridge_map.h
smatz
parents:
8577
diff
changeset
|
32 |
#include "tunnelbridge_map.h" |
8627
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8615
diff
changeset
|
33 |
#include "functions.h" |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8615
diff
changeset
|
34 |
#include "window_func.h" |
8636
2b158acb649c
(svn r11702) -Codechange: move all date related stuff to date*.
rubidium
parents:
8635
diff
changeset
|
35 |
#include "date_func.h" |
8640
1e93b81e96d2
(svn r11706) -Codechange: split vehicle.h and remove another bunch of useless includes.
rubidium
parents:
8636
diff
changeset
|
36 |
#include "vehicle_func.h" |
8653
a83f7a536919
(svn r11719) -Codechange: split sound.h in a header with types and one with functions.
rubidium
parents:
8641
diff
changeset
|
37 |
#include "sound_func.h" |
8707
55835d8fbfcd
(svn r11774) -Change: do not include variables.h in a header when it is not needed.
rubidium
parents:
8703
diff
changeset
|
38 |
#include "variables.h" |
8708
0c29fbc79be4
(svn r11775) -Codechange: move all autoreplace/autorenew functions to a single location.
rubidium
parents:
8707
diff
changeset
|
39 |
#include "autoreplace_gui.h" |
8720
4e60c30e2006
(svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents:
8708
diff
changeset
|
40 |
#include "gfx_func.h" |
8766
c86cfa3a7580
(svn r11834) -Codechange: only include settings_type.h if needed.
rubidium
parents:
8762
diff
changeset
|
41 |
#include "settings_type.h" |
9280
9c03416d26b1
(svn r12488) -Codechange: split order.h into order_base.h and order_func.h.
rubidium
parents:
9259
diff
changeset
|
42 |
#include "order_func.h" |
10222
b6919c94cc77
(svn r12754) -Codechange: split depot.h into depot_map.h, depot_func.h and depot_base.h and remove quite a lot of unneeded (before this) includes of depot.h.
rubidium
parents:
10221
diff
changeset
|
43 |
#include "depot_base.h" |
b6919c94cc77
(svn r12754) -Codechange: split depot.h into depot_map.h, depot_func.h and depot_base.h and remove quite a lot of unneeded (before this) includes of depot.h.
rubidium
parents:
10221
diff
changeset
|
44 |
#include "depot_func.h" |
10272
2014f0bdc800
(svn r12804) -Codechange: move the effect vehicle handling out of vehicle.cpp
rubidium
parents:
10271
diff
changeset
|
45 |
#include "effectvehicle_func.h" |
8579
3efbb430092e
(svn r11644) -Codechange: merge some functions from tunnel_map.h and bridge_map.h into tunnelbridge_map.h
smatz
parents:
8577
diff
changeset
|
46 |
|
8760
ce0891c412ce
(svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents:
8757
diff
changeset
|
47 |
#include "table/strings.h" |
0 | 48 |
|
49 |
static const uint16 _roadveh_images[63] = { |
|
50 |
0xCD4, 0xCDC, 0xCE4, 0xCEC, 0xCF4, 0xCFC, 0xD0C, 0xD14, |
|
51 |
0xD24, 0xD1C, 0xD2C, 0xD04, 0xD1C, 0xD24, 0xD6C, 0xD74, |
|
52 |
0xD7C, 0xC14, 0xC1C, 0xC24, 0xC2C, 0xC34, 0xC3C, 0xC4C, |
|
53 |
0xC54, 0xC64, 0xC5C, 0xC6C, 0xC44, 0xC5C, 0xC64, 0xCAC, |
|
54 |
0xCB4, 0xCBC, 0xD94, 0xD9C, 0xDA4, 0xDAC, 0xDB4, 0xDBC, |
|
55 |
0xDCC, 0xDD4, 0xDE4, 0xDDC, 0xDEC, 0xDC4, 0xDDC, 0xDE4, |
|
56 |
0xE2C, 0xE34, 0xE3C, 0xC14, 0xC1C, 0xC2C, 0xC3C, 0xC4C, |
|
57 |
0xC5C, 0xC64, 0xC6C, 0xC74, 0xC84, 0xC94, 0xCA4 |
|
58 |
}; |
|
59 |
||
60 |
static const uint16 _roadveh_full_adder[63] = { |
|
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
61 |
0, 88, 0, 0, 0, 0, 48, 48, |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
62 |
48, 48, 0, 0, 64, 64, 0, 16, |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
63 |
16, 0, 88, 0, 0, 0, 0, 48, |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
64 |
48, 48, 48, 0, 0, 64, 64, 0, |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
65 |
16, 16, 0, 88, 0, 0, 0, 0, |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
66 |
48, 48, 48, 48, 0, 0, 64, 64, |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
67 |
0, 16, 16, 0, 8, 8, 8, 8, |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
68 |
0, 0, 0, 8, 8, 8, 8 |
0 | 69 |
}; |
70 |
||
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
71 |
/** 'Convert' the DiagDirection where a road vehicle enters to the trackdirs it can drive onto */ |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
72 |
static const TrackdirBits _road_enter_dir_to_reachable_trackdirs[DIAGDIR_END] = { |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
73 |
TRACKDIR_BIT_LEFT_N | TRACKDIR_BIT_LOWER_E | TRACKDIR_BIT_X_NE, // Enter from north east |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
74 |
TRACKDIR_BIT_LEFT_S | TRACKDIR_BIT_UPPER_E | TRACKDIR_BIT_Y_SE, // Enter from south east |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
75 |
TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_X_SW | TRACKDIR_BIT_RIGHT_S, // Enter from south west |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
76 |
TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_LOWER_W | TRACKDIR_BIT_Y_NW // Enter from north west |
0 | 77 |
}; |
78 |
||
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
79 |
static const Trackdir _road_reverse_table[DIAGDIR_END] = { |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
80 |
TRACKDIR_RVREV_NE, TRACKDIR_RVREV_SE, TRACKDIR_RVREV_SW, TRACKDIR_RVREV_NW |
0 | 81 |
}; |
82 |
||
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
83 |
/** 'Convert' the DiagDirection where a road vehicle should exit to |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
84 |
* the trackdirs it can use to drive to the exit direction*/ |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
85 |
static const TrackdirBits _road_exit_dir_to_incoming_trackdirs[DIAGDIR_END] = { |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
86 |
TRACKDIR_BIT_LOWER_W | TRACKDIR_BIT_X_SW | TRACKDIR_BIT_LEFT_S, |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
87 |
TRACKDIR_BIT_LEFT_N | TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_Y_NW, |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
88 |
TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_UPPER_E | TRACKDIR_BIT_X_NE, |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
89 |
TRACKDIR_BIT_RIGHT_S | TRACKDIR_BIT_LOWER_E | TRACKDIR_BIT_Y_SE |
0 | 90 |
}; |
91 |
||
6326
c904c7ea1c8d
(svn r8715) -Codechange/cleanup: replace magic numbers related to state of road vehicles with enums. Original patch by mart3p.
rubidium
parents:
6325
diff
changeset
|
92 |
/** Converts the exit direction of a depot to trackdir the vehicle is going to drive to */ |
c904c7ea1c8d
(svn r8715) -Codechange/cleanup: replace magic numbers related to state of road vehicles with enums. Original patch by mart3p.
rubidium
parents:
6325
diff
changeset
|
93 |
static const Trackdir _roadveh_depot_exit_trackdir[DIAGDIR_END] = { |
c904c7ea1c8d
(svn r8715) -Codechange/cleanup: replace magic numbers related to state of road vehicles with enums. Original patch by mart3p.
rubidium
parents:
6325
diff
changeset
|
94 |
TRACKDIR_X_NE, TRACKDIR_Y_SE, TRACKDIR_X_SW, TRACKDIR_Y_NW |
c904c7ea1c8d
(svn r8715) -Codechange/cleanup: replace magic numbers related to state of road vehicles with enums. Original patch by mart3p.
rubidium
parents:
6325
diff
changeset
|
95 |
}; |
c904c7ea1c8d
(svn r8715) -Codechange/cleanup: replace magic numbers related to state of road vehicles with enums. Original patch by mart3p.
rubidium
parents:
6325
diff
changeset
|
96 |
|
10293
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
97 |
static SpriteID GetRoadVehIcon(EngineID engine) |
0 | 98 |
{ |
10293
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
99 |
uint8 spritenum = RoadVehInfo(engine)->image_index; |
0 | 100 |
|
10293
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
101 |
if (is_custom_sprite(spritenum)) { |
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
102 |
SpriteID sprite = GetCustomVehicleIcon(engine, DIR_W); |
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
103 |
if (sprite != 0) return sprite; |
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
104 |
|
10382
d1d4452acbfc
(svn r12924) -Feature: Introducing the so called 'engine pool' which primarily removes the fixed engine type limits and also happens to allow (with the patch option 'dynamic_engines') multiple NewGRF vehicle sets to coexist.
peter1138
parents:
10293
diff
changeset
|
105 |
spritenum = GetEngine(engine)->image_index; |
0 | 106 |
} |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
107 |
|
10293
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
108 |
return 6 + _roadveh_images[spritenum]; |
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
109 |
} |
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
110 |
|
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
111 |
SpriteID RoadVehicle::GetImage(Direction direction) const |
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
112 |
{ |
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
113 |
uint8 spritenum = this->spritenum; |
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
114 |
SpriteID sprite; |
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
115 |
|
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
116 |
if (is_custom_sprite(spritenum)) { |
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
117 |
sprite = GetCustomVehicleSprite(this, (Direction)(direction + 4 * IS_CUSTOM_SECONDHEAD_SPRITE(spritenum))); |
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
118 |
if (sprite != 0) return sprite; |
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
119 |
|
10382
d1d4452acbfc
(svn r12924) -Feature: Introducing the so called 'engine pool' which primarily removes the fixed engine type limits and also happens to allow (with the patch option 'dynamic_engines') multiple NewGRF vehicle sets to coexist.
peter1138
parents:
10293
diff
changeset
|
120 |
spritenum = GetEngine(this->engine_type)->image_index; |
10293
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
121 |
} |
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
122 |
|
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
123 |
sprite = direction + _roadveh_images[spritenum]; |
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
124 |
|
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
125 |
if (this->cargo.Count() >= this->cargo_cap / 2U) sprite += _roadveh_full_adder[spritenum]; |
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
126 |
|
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
127 |
return sprite; |
0 | 128 |
} |
129 |
||
5919
2b58160d667d
(svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents:
5902
diff
changeset
|
130 |
void DrawRoadVehEngine(int x, int y, EngineID engine, SpriteID pal) |
0 | 131 |
{ |
10293
b3ca071d6716
(svn r12824) -Codechange: Standardise routines for drawing vehicle images, using correct types and less duplication.
peter1138
parents:
10286
diff
changeset
|
132 |
DrawSprite(GetRoadVehIcon(engine), pal, x, y); |
0 | 133 |
} |
134 |
||
7439
0c0e2945c890
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
7375
diff
changeset
|
135 |
static CommandCost EstimateRoadVehCost(EngineID engine_type) |
0 | 136 |
{ |
8726
5ae45b46506b
(svn r11793) -Codechange: pass the expense type via the CommandCost instead of a global variable. Patch by Noldo (FS#1114).
rubidium
parents:
8722
diff
changeset
|
137 |
return CommandCost(EXPENSES_NEW_VEHICLES, ((_price.roadveh_base >> 3) * GetEngineProperty(engine_type, 0x11, RoadVehInfo(engine_type)->base_cost)) >> 5); |
0 | 138 |
} |
139 |
||
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
140 |
byte GetRoadVehLength(const Vehicle *v) |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
141 |
{ |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
142 |
byte length = 8; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
143 |
|
7711
66dffbd3b136
(svn r10493) -Codechange: update some callback ID enums to reflect their changed usage, add a few and update the comments.
rubidium
parents:
7631
diff
changeset
|
144 |
uint16 veh_len = GetVehicleCallback(CBID_VEHICLE_LENGTH, 0, 0, v->engine_type, v); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
145 |
if (veh_len != CALLBACK_FAILED) { |
8418
b49fc6be1ab9
(svn r11475) -Codechange: rename clamp and clampu to Clamp and ClampU to fit with the coding style
skidd13
parents:
8405
diff
changeset
|
146 |
length -= Clamp(veh_len, 0, 7); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
147 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
148 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
149 |
return length; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
150 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
151 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
152 |
void RoadVehUpdateCache(Vehicle *v) |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
153 |
{ |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
154 |
assert(v->type == VEH_ROAD); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
155 |
assert(IsRoadVehFront(v)); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
156 |
|
7988
6075538f6111
(svn r11003) -Codechange: replace Vehicle->next to Vehicle->Next() and Vehicle->SetNext() so we can trap instances that change a next pointer and (in the future) update the first/previous pointers based on that.
rubidium
parents:
7986
diff
changeset
|
157 |
for (Vehicle *u = v; u != NULL; u = u->Next()) { |
7993
76b0eb3e19c9
(svn r11011) -Fix [FS#1129]: GetFirstVehicleInChain did change the game state while being marked const.
rubidium
parents:
7988
diff
changeset
|
158 |
/* Check the v->first cache. */ |
76b0eb3e19c9
(svn r11011) -Fix [FS#1129]: GetFirstVehicleInChain did change the game state while being marked const.
rubidium
parents:
7988
diff
changeset
|
159 |
assert(u->First() == v); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
160 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
161 |
/* Update the 'first engine' */ |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
162 |
u->u.road.first_engine = (v == u) ? INVALID_ENGINE : v->engine_type; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
163 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
164 |
/* Update the length of the vehicle. */ |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
165 |
u->u.road.cached_veh_length = GetRoadVehLength(u); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
166 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
167 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
168 |
|
1793
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
169 |
/** Build a road vehicle. |
3491
4c8427796c64
(svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents:
3481
diff
changeset
|
170 |
* @param tile tile of depot where road vehicle is built |
6979
d194d25020e7
(svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents:
6949
diff
changeset
|
171 |
* @param flags operation to perform |
1793
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
172 |
* @param p1 bus/truck type being built (engine) |
11133
a75c67ae67b0
(svn r13691) -Codechange: make it easier to determine whether a command is ran in the context of autoreplace or not
smatz
parents:
11106
diff
changeset
|
173 |
* @param p2 unused |
1793
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
174 |
*/ |
7439
0c0e2945c890
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
7375
diff
changeset
|
175 |
CommandCost CmdBuildRoadVeh(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
0 | 176 |
{ |
7439
0c0e2945c890
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
7375
diff
changeset
|
177 |
CommandCost cost; |
0 | 178 |
Vehicle *v; |
1282
e7a73ee62d2f
(svn r1786) -Fix: unitnumber is increased to 16bit, so now you can have up to 5000
truelight
parents:
1266
diff
changeset
|
179 |
UnitID unit_num; |
0 | 180 |
Engine *e; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
181 |
|
6903
0b3d43bd1fdb
(svn r9543) -Fix [FS#691]: Split up STR_ENGINE_NOT_BUILDABLE into four strings so it can be
maedhros
parents:
6889
diff
changeset
|
182 |
if (!IsEngineBuildable(p1, VEH_ROAD, _current_player)) return_cmd_error(STR_ROAD_VEHICLE_NOT_AVAILABLE); |
1196
115f46e3807d
(svn r1700) - Fix: Hacked clients can no longer be used to build vehicles that are not available yet (Hackykid)
bjarni
parents:
1151
diff
changeset
|
183 |
|
0 | 184 |
cost = EstimateRoadVehCost(p1); |
1793
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
185 |
if (flags & DC_QUERY_COST) return cost; |
0 | 186 |
|
1442
3e0ac5f13ee2
(svn r1946) Fix: [AInew] Allow DC_QUERY_COST even on tiles with no depot built. This is used by the ai_new for deciding if it can afford the vehicles before actually building the depot. Was broken in r1728. Signed-Off-By: TrueLight ;-)
pasky
parents:
1401
diff
changeset
|
187 |
/* The ai_new queries the vehicle cost before building the route, |
3e0ac5f13ee2
(svn r1946) Fix: [AInew] Allow DC_QUERY_COST even on tiles with no depot built. This is used by the ai_new for deciding if it can afford the vehicles before actually building the depot. Was broken in r1728. Signed-Off-By: TrueLight ;-)
pasky
parents:
1401
diff
changeset
|
188 |
* so we must check against cheaters no sooner than now. --pasky */ |
10221
faef62283f5f
(svn r12753) -Codechange: do not use IsDepotTypeTile() where simpler function can be used
smatz
parents:
10213
diff
changeset
|
189 |
if (!IsRoadDepotTile(tile)) return CMD_ERROR; |
1901
fb05044cf5c3
(svn r2407) Use {Get,Is}TileOwner to get/check the owner of a tile and fix some bogus reads of _map_owner
tron
parents:
1891
diff
changeset
|
190 |
if (!IsTileOwner(tile, _current_player)) return CMD_ERROR; |
1442
3e0ac5f13ee2
(svn r1946) Fix: [AInew] Allow DC_QUERY_COST even on tiles with no depot built. This is used by the ai_new for deciding if it can afford the vehicles before actually building the depot. Was broken in r1728. Signed-Off-By: TrueLight ;-)
pasky
parents:
1401
diff
changeset
|
191 |
|
9059
04edde3eb0c6
(svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents:
9052
diff
changeset
|
192 |
if (HasTileRoadType(tile, ROADTYPE_TRAM) != HasBit(EngInfo(p1)->misc_flags, EF_ROAD_TRAM)) return_cmd_error(STR_DEPOT_WRONG_DEPOT_TYPE); |
7205
e3d6da6d1e0b
(svn r9941) -Fix: trams could be cloned to appear in normal road depots and vice versa (spotted by Desolator)
bjarni
parents:
7191
diff
changeset
|
193 |
|
8091
f24d360b6ba1
(svn r11122) -Fix [FS#1234]: crash when building a NewGRF vehicle when the articulated build vehicle callback returneed a different value for the purchase window than the normal build. Thanks for Dalestan and _minime_ for pointers to possible causes.
rubidium
parents:
8089
diff
changeset
|
194 |
uint num_vehicles = 1 + CountArticulatedParts(p1, false); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
195 |
|
8091
f24d360b6ba1
(svn r11122) -Fix [FS#1234]: crash when building a NewGRF vehicle when the articulated build vehicle callback returneed a different value for the purchase window than the normal build. Thanks for Dalestan and _minime_ for pointers to possible causes.
rubidium
parents:
8089
diff
changeset
|
196 |
/* Allow for the front and the articulated parts, plus one to "terminate" the list. */ |
10905
293ba816b703
(svn r13456) -Codechange: use AllocaM() macro instead of alloca() at most places
smatz
parents:
10839
diff
changeset
|
197 |
Vehicle **vl = AllocaM(Vehicle*, num_vehicles + 1); |
8091
f24d360b6ba1
(svn r11122) -Fix [FS#1234]: crash when building a NewGRF vehicle when the articulated build vehicle callback returneed a different value for the purchase window than the normal build. Thanks for Dalestan and _minime_ for pointers to possible causes.
rubidium
parents:
8089
diff
changeset
|
198 |
memset(vl, 0, sizeof(*vl) * (num_vehicles + 1)); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
199 |
|
7894
dbe6e9295ec5
(svn r10770) -Codechange: use the pool item class as super class for the vehicle struct.
rubidium
parents:
7866
diff
changeset
|
200 |
if (!Vehicle::AllocateList(vl, num_vehicles)) { |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
201 |
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
202 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
203 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
204 |
v = vl[0]; |
0 | 205 |
|
206 |
/* find the first free roadveh id */ |
|
11133
a75c67ae67b0
(svn r13691) -Codechange: make it easier to determine whether a command is ran in the context of autoreplace or not
smatz
parents:
11106
diff
changeset
|
207 |
unit_num = (flags & DC_AUTOREPLACE) ? 0 : GetFreeUnitNumber(VEH_ROAD); |
10775
7061477bfbcf
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
10707
diff
changeset
|
208 |
if (unit_num > _settings_game.vehicle.max_roadveh) |
0 | 209 |
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME); |
210 |
||
211 |
if (flags & DC_EXEC) { |
|
3491
4c8427796c64
(svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents:
3481
diff
changeset
|
212 |
int x; |
4c8427796c64
(svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents:
3481
diff
changeset
|
213 |
int y; |
4c8427796c64
(svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents:
3481
diff
changeset
|
214 |
|
538
5dd99f3b7eca
(svn r920) Replace vehicle info macros with inline functions and add asserts to check limits
tron
parents:
534
diff
changeset
|
215 |
const RoadVehicleInfo *rvi = RoadVehInfo(p1); |
5dd99f3b7eca
(svn r920) Replace vehicle info macros with inline functions and add asserts to check limits
tron
parents:
534
diff
changeset
|
216 |
|
8278
c10ecabf001d
(svn r11332) -Fix: vehicles getting a value of 0 on construction.
rubidium
parents:
8264
diff
changeset
|
217 |
v = new (v) RoadVehicle(); |
0 | 218 |
v->unitnumber = unit_num; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
219 |
v->direction = DiagDirToDir(GetRoadDepotDirection(tile)); |
0 | 220 |
v->owner = _current_player; |
221 |
||
222 |
v->tile = tile; |
|
3645
86af43f87885
(svn r4554) Replace magic numbers by TILE_{HEIGHT,SIZE}
tron
parents:
3630
diff
changeset
|
223 |
x = TileX(tile) * TILE_SIZE + TILE_SIZE / 2; |
86af43f87885
(svn r4554) Replace magic numbers by TILE_{HEIGHT,SIZE}
tron
parents:
3630
diff
changeset
|
224 |
y = TileY(tile) * TILE_SIZE + TILE_SIZE / 2; |
0 | 225 |
v->x_pos = x; |
226 |
v->y_pos = y; |
|
6987
b0f13039bda2
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6979
diff
changeset
|
227 |
v->z_pos = GetSlopeZ(x, y); |
0 | 228 |
|
9052
392f5995d323
(svn r12134) -Change: count the number of ticks a vehicle was running this day to calculate running cost
smatz
parents:
9050
diff
changeset
|
229 |
v->running_ticks = 0; |
392f5995d323
(svn r12134) -Change: count the number of ticks a vehicle was running this day to calculate running cost
smatz
parents:
9050
diff
changeset
|
230 |
|
6326
c904c7ea1c8d
(svn r8715) -Codechange/cleanup: replace magic numbers related to state of road vehicles with enums. Original patch by mart3p.
rubidium
parents:
6325
diff
changeset
|
231 |
v->u.road.state = RVSB_IN_DEPOT; |
6987
b0f13039bda2
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6979
diff
changeset
|
232 |
v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL; |
0 | 233 |
|
538
5dd99f3b7eca
(svn r920) Replace vehicle info macros with inline functions and add asserts to check limits
tron
parents:
534
diff
changeset
|
234 |
v->spritenum = rvi->image_index; |
5dd99f3b7eca
(svn r920) Replace vehicle info macros with inline functions and add asserts to check limits
tron
parents:
534
diff
changeset
|
235 |
v->cargo_type = rvi->cargo_type; |
3870
766d7bd6c299
(svn r4910) - NewGRF: add and initialize cargo subtype for vehicle visual variations
peter1138
parents:
3816
diff
changeset
|
236 |
v->cargo_subtype = 0; |
538
5dd99f3b7eca
(svn r920) Replace vehicle info macros with inline functions and add asserts to check limits
tron
parents:
534
diff
changeset
|
237 |
v->cargo_cap = rvi->capacity; |
0 | 238 |
// v->cargo_count = 0; |
7446
1c4d469f986e
(svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents:
7439
diff
changeset
|
239 |
v->value = cost.GetCost(); |
0 | 240 |
// v->day_counter = 0; |
241 |
// v->next_order_param = v->next_order = 0; |
|
242 |
// v->load_unload_time_rem = 0; |
|
243 |
// v->progress = 0; |
|
244 |
||
245 |
// v->u.road.unk2 = 0; |
|
246 |
// v->u.road.overtaking = 0; |
|
247 |
||
1266
9dc5638fe8cc
(svn r1770) -Fix: Hopefully last pieces of code that are containing a station-id
truelight
parents:
1247
diff
changeset
|
248 |
v->last_station_visited = INVALID_STATION; |
538
5dd99f3b7eca
(svn r920) Replace vehicle info macros with inline functions and add asserts to check limits
tron
parents:
534
diff
changeset
|
249 |
v->max_speed = rvi->max_speed; |
8703
62b5536f70c2
(svn r11770) -Codechange: An engine type's type is EngineID, not byte.
peter1138
parents:
8653
diff
changeset
|
250 |
v->engine_type = (EngineID)p1; |
0 | 251 |
|
1926
68d60188a22f
(svn r2432) Use GetEngine() instead of DEREF_ENGINE() or even _engines[]
tron
parents:
1901
diff
changeset
|
252 |
e = GetEngine(p1); |
0 | 253 |
v->reliability = e->reliability; |
254 |
v->reliability_spd_dec = e->reliability_spd_dec; |
|
255 |
v->max_age = e->lifelength * 366; |
|
2564 | 256 |
_new_vehicle_id = v->index; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
257 |
|
8754
5dae65402806
(svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents:
8750
diff
changeset
|
258 |
v->name = NULL; |
0 | 259 |
|
10775
7061477bfbcf
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
10707
diff
changeset
|
260 |
v->service_interval = _settings_game.vehicle.servint_roadveh; |
0 | 261 |
|
262 |
v->date_of_last_service = _date; |
|
4329
9759d5c52010
(svn r6002) -Cleanup: remove the now redundant BASE_YEAR constant.
rubidium
parents:
4293
diff
changeset
|
263 |
v->build_year = _cur_year; |
0 | 264 |
|
265 |
v->cur_image = 0xC15; |
|
2804
b932fe148d36
(svn r3352) - NewGRF: Move initialization of vehicle random_bits to DC_EXEC blocks to allow use of Random() instead of InteractiveRandom(), which will alleviate some possible network desyncs.
peter1138
parents:
2767
diff
changeset
|
266 |
v->random_bits = VehicleRandomBits(); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
267 |
SetRoadVehFront(v); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
268 |
|
8424
4a488a90ccab
(svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents:
8420
diff
changeset
|
269 |
v->u.road.roadtype = HasBit(EngInfo(v->engine_type)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
270 |
v->u.road.compatible_roadtypes = RoadTypeToRoadTypes(v->u.road.roadtype); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
271 |
v->u.road.cached_veh_length = GetRoadVehLength(v); |
0 | 272 |
|
6502
7ca154aca2b7
(svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents:
6501
diff
changeset
|
273 |
v->vehicle_flags = 0; |
8427
143b0be22af1
(svn r11484) -Codechange: Remove the doubled function SetBitT and rename the remaining to fit with the naming style
skidd13
parents:
8425
diff
changeset
|
274 |
if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SetBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE); |
6502
7ca154aca2b7
(svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents:
6501
diff
changeset
|
275 |
|
7104
59f24cd8470b
(svn r9828) -Codechange: [NewGRF] Add support for changing cargo capacity with callback 36. This is set on construction for ships and roadvehicles, and whenever carriages are attached for trains.
peter1138
parents:
7090
diff
changeset
|
276 |
v->cargo_cap = GetVehicleProperty(v, 0x0F, rvi->capacity); |
59f24cd8470b
(svn r9828) -Codechange: [NewGRF] Add support for changing cargo capacity with callback 36. This is set on construction for ships and roadvehicles, and whenever carriages are attached for trains.
peter1138
parents:
7090
diff
changeset
|
277 |
|
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
278 |
AddArticulatedParts(vl, VEH_ROAD); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
279 |
|
0 | 280 |
VehiclePositionChanged(v); |
281 |
||
4739
bd535b408617
(svn r6651) -Coding feature: added the windowevent WE_INVALIDATE_DATA
bjarni
parents:
4725
diff
changeset
|
282 |
InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile); |
10621
3edd349d9c14
(svn r13165) -Codechange: replace some RebuildXXXList/ResortXXXList+InvalidateWindowXXX with InvalidateWindowXXXData.
rubidium
parents:
10556
diff
changeset
|
283 |
InvalidateWindowClassesData(WC_ROADVEH_LIST, 0); |
0 | 284 |
InvalidateWindow(WC_COMPANY, v->owner); |
2618
7546b838230b
(svn r3156) -Fix: removed some cases where autoreplace windows were redrawn when nothing was changed
bjarni
parents:
2574
diff
changeset
|
285 |
if (IsLocalPlayer()) |
7921
f99d5c351e75
(svn r10823) -Fix r8610 [FS#1097]: the autoreplace window vehicle count didn't always update correctly) (Matthias)
bjarni
parents:
7917
diff
changeset
|
286 |
InvalidateAutoreplaceWindow(v->engine_type, v->group_id); // updates the replace Road window |
6195
b90cf92697b9
(svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents:
6194
diff
changeset
|
287 |
|
b90cf92697b9
(svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents:
6194
diff
changeset
|
288 |
GetPlayer(_current_player)->num_engines[p1]++; |
0 | 289 |
} |
290 |
||
8726
5ae45b46506b
(svn r11793) -Codechange: pass the expense type via the CommandCost instead of a global variable. Patch by Noldo (FS#1114).
rubidium
parents:
8722
diff
changeset
|
291 |
return cost; |
0 | 292 |
} |
293 |
||
1793
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
294 |
/** Start/Stop a road vehicle. |
3491
4c8427796c64
(svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents:
3481
diff
changeset
|
295 |
* @param tile unused |
6979
d194d25020e7
(svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents:
6949
diff
changeset
|
296 |
* @param flags operation to perform |
1793
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
297 |
* @param p1 road vehicle ID to start/stop |
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
298 |
* @param p2 unused |
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
299 |
*/ |
7439
0c0e2945c890
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
7375
diff
changeset
|
300 |
CommandCost CmdStartStopRoadVeh(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
0 | 301 |
{ |
4352
8ddb01bc6075
(svn r6053) -Codechange: renamed all IsXXXIndex to IsValidXXXID
truelight
parents:
4351
diff
changeset
|
302 |
if (!IsValidVehicleID(p1)) return CMD_ERROR; |
1237
0a1ce05c3d45
(svn r1741) - Fix: added IsVehicleIndex() so it's possible to protect GetVehicle() from reading an invalid vehicle index
bjarni
parents:
1232
diff
changeset
|
303 |
|
10286
aa0670a976a5
(svn r12818) -Codechange: make callbacks 31 and 37 behave like they do in TTDP according to frosch's survey.
rubidium
parents:
10272
diff
changeset
|
304 |
Vehicle *v = GetVehicle(p1); |
0 | 305 |
|
6585
7da94b26498a
(svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents:
6574
diff
changeset
|
306 |
if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR; |
0 | 307 |
|
4244
44dcec623504
(svn r5822) - NewGRF: add support for callback 31, vehicle start/stop check. This allows a set to disallow a vehicle from being started, i.e. to not be able to leave the depot. This is almost a partner to callback 1D.
peter1138
parents:
4242
diff
changeset
|
308 |
/* Check if this road veh can be started/stopped. The callback will fail or |
44dcec623504
(svn r5822) - NewGRF: add support for callback 31, vehicle start/stop check. This allows a set to disallow a vehicle from being started, i.e. to not be able to leave the depot. This is almost a partner to callback 1D.
peter1138
parents:
4242
diff
changeset
|
309 |
* return 0xFF if it can. */ |
10286
aa0670a976a5
(svn r12818) -Codechange: make callbacks 31 and 37 behave like they do in TTDP according to frosch's survey.
rubidium
parents:
10272
diff
changeset
|
310 |
uint16 callback = GetVehicleCallback(CBID_VEHICLE_START_STOP_CHECK, 0, 0, v->engine_type, v); |
aa0670a976a5
(svn r12818) -Codechange: make callbacks 31 and 37 behave like they do in TTDP according to frosch's survey.
rubidium
parents:
10272
diff
changeset
|
311 |
if (callback != CALLBACK_FAILED && GB(callback, 0, 8) != 0xFF) { |
4244
44dcec623504
(svn r5822) - NewGRF: add support for callback 31, vehicle start/stop check. This allows a set to disallow a vehicle from being started, i.e. to not be able to leave the depot. This is almost a partner to callback 1D.
peter1138
parents:
4242
diff
changeset
|
312 |
StringID error = GetGRFStringID(GetEngineGRFID(v->engine_type), 0xD000 + callback); |
44dcec623504
(svn r5822) - NewGRF: add support for callback 31, vehicle start/stop check. This allows a set to disallow a vehicle from being started, i.e. to not be able to leave the depot. This is almost a partner to callback 1D.
peter1138
parents:
4242
diff
changeset
|
313 |
return_cmd_error(error); |
44dcec623504
(svn r5822) - NewGRF: add support for callback 31, vehicle start/stop check. This allows a set to disallow a vehicle from being started, i.e. to not be able to leave the depot. This is almost a partner to callback 1D.
peter1138
parents:
4242
diff
changeset
|
314 |
} |
44dcec623504
(svn r5822) - NewGRF: add support for callback 31, vehicle start/stop check. This allows a set to disallow a vehicle from being started, i.e. to not be able to leave the depot. This is almost a partner to callback 1D.
peter1138
parents:
4242
diff
changeset
|
315 |
|
0 | 316 |
if (flags & DC_EXEC) { |
7986
881998b115c2
(svn r11001) -Codechange: unify the way to determine whether a vehicle is in a depot.
rubidium
parents:
7972
diff
changeset
|
317 |
if (v->IsStoppedInDepot()) { |
3139
4c950c7ec5c9
(svn r3757) -Feature: Delete news items about vehicles, when they get stale
tron
parents:
3138
diff
changeset
|
318 |
DeleteVehicleNews(p1, STR_9016_ROAD_VEHICLE_IS_WAITING); |
4c950c7ec5c9
(svn r3757) -Feature: Delete news items about vehicles, when they get stale
tron
parents:
3138
diff
changeset
|
319 |
} |
4c950c7ec5c9
(svn r3757) -Feature: Delete news items about vehicles, when they get stale
tron
parents:
3138
diff
changeset
|
320 |
|
0 | 321 |
v->vehstatus ^= VS_STOPPED; |
7188
78055acf1785
(svn r9924) -Fix: update the road vehicle speeds when stopped and/or running just behind another vehicle.
rubidium
parents:
7187
diff
changeset
|
322 |
v->cur_speed = 0; |
8846
f3e877a92e2b
(svn r11916) -Codechange: use enums from VehicleViewWindowWidgets instead of constants
smatz
parents:
8813
diff
changeset
|
323 |
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH); |
0 | 324 |
InvalidateWindow(WC_VEHICLE_DEPOT, v->tile); |
325 |
} |
|
326 |
||
7446
1c4d469f986e
(svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents:
7439
diff
changeset
|
327 |
return CommandCost(); |
0 | 328 |
} |
329 |
||
3123 | 330 |
void ClearSlot(Vehicle *v) |
1664
000099fbae6e
(svn r2168) - Fix: Various stages of invisible trains, and wrong v->u.rail.track combinations. When a vehicle was sold its (possibly) assigned road slot for multislot was not cleared, thus resulting in a bug confusion. This should fix [ 1178520 ] Assertion failure in ai.c (invalid v->u.rail.track). With big thanks to TrueLight for the demo-recording patch, BJH for the wonderful savegame, Hackykid for his brilliant suggestions of the problem and Celestar for... ehm, making it all possible ;p
Darkvater
parents:
1530
diff
changeset
|
331 |
{ |
3123 | 332 |
RoadStop *rs = v->u.road.slot; |
333 |
if (v->u.road.slot == NULL) return; |
|
334 |
||
1664
000099fbae6e
(svn r2168) - Fix: Various stages of invisible trains, and wrong v->u.rail.track combinations. When a vehicle was sold its (possibly) assigned road slot for multislot was not cleared, thus resulting in a bug confusion. This should fix [ 1178520 ] Assertion failure in ai.c (invalid v->u.rail.track). With big thanks to TrueLight for the demo-recording patch, BJH for the wonderful savegame, Hackykid for his brilliant suggestions of the problem and Celestar for... ehm, making it all possible ;p
Darkvater
parents:
1530
diff
changeset
|
335 |
v->u.road.slot = NULL; |
000099fbae6e
(svn r2168) - Fix: Various stages of invisible trains, and wrong v->u.rail.track combinations. When a vehicle was sold its (possibly) assigned road slot for multislot was not cleared, thus resulting in a bug confusion. This should fix [ 1178520 ] Assertion failure in ai.c (invalid v->u.rail.track). With big thanks to TrueLight for the demo-recording patch, BJH for the wonderful savegame, Hackykid for his brilliant suggestions of the problem and Celestar for... ehm, making it all possible ;p
Darkvater
parents:
1530
diff
changeset
|
336 |
v->u.road.slot_age = 0; |
3123 | 337 |
|
3431 | 338 |
assert(rs->num_vehicles != 0); |
339 |
rs->num_vehicles--; |
|
340 |
||
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
341 |
DEBUG(ms, 3, "Clearing slot at 0x%X", rs->xy); |
1664
000099fbae6e
(svn r2168) - Fix: Various stages of invisible trains, and wrong v->u.rail.track combinations. When a vehicle was sold its (possibly) assigned road slot for multislot was not cleared, thus resulting in a bug confusion. This should fix [ 1178520 ] Assertion failure in ai.c (invalid v->u.rail.track). With big thanks to TrueLight for the demo-recording patch, BJH for the wonderful savegame, Hackykid for his brilliant suggestions of the problem and Celestar for... ehm, making it all possible ;p
Darkvater
parents:
1530
diff
changeset
|
342 |
} |
000099fbae6e
(svn r2168) - Fix: Various stages of invisible trains, and wrong v->u.rail.track combinations. When a vehicle was sold its (possibly) assigned road slot for multislot was not cleared, thus resulting in a bug confusion. This should fix [ 1178520 ] Assertion failure in ai.c (invalid v->u.rail.track). With big thanks to TrueLight for the demo-recording patch, BJH for the wonderful savegame, Hackykid for his brilliant suggestions of the problem and Celestar for... ehm, making it all possible ;p
Darkvater
parents:
1530
diff
changeset
|
343 |
|
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
344 |
static bool CheckRoadVehInDepotStopped(const Vehicle *v) |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
345 |
{ |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
346 |
TileIndex tile = v->tile; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
347 |
|
10221
faef62283f5f
(svn r12753) -Codechange: do not use IsDepotTypeTile() where simpler function can be used
smatz
parents:
10213
diff
changeset
|
348 |
if (!IsRoadDepotTile(tile)) return false; |
7946
e53b2f085489
(svn r10924) -Fix [FS#1120]: VS_STOPPED is only set for the front part of an articulated
maedhros
parents:
7921
diff
changeset
|
349 |
if (IsRoadVehFront(v) && !(v->vehstatus & VS_STOPPED)) return false; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
350 |
|
7988
6075538f6111
(svn r11003) -Codechange: replace Vehicle->next to Vehicle->Next() and Vehicle->SetNext() so we can trap instances that change a next pointer and (in the future) update the first/previous pointers based on that.
rubidium
parents:
7986
diff
changeset
|
351 |
for (; v != NULL; v = v->Next()) { |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
352 |
if (v->u.road.state != RVSB_IN_DEPOT || v->tile != tile) return false; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
353 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
354 |
return true; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
355 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
356 |
|
1793
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
357 |
/** Sell a road vehicle. |
3491
4c8427796c64
(svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents:
3481
diff
changeset
|
358 |
* @param tile unused |
6979
d194d25020e7
(svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents:
6949
diff
changeset
|
359 |
* @param flags operation to perform |
1793
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
360 |
* @param p1 vehicle ID to be sold |
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
361 |
* @param p2 unused |
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
362 |
*/ |
7439
0c0e2945c890
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
7375
diff
changeset
|
363 |
CommandCost CmdSellRoadVeh(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
0 | 364 |
{ |
365 |
Vehicle *v; |
|
366 |
||
4352
8ddb01bc6075
(svn r6053) -Codechange: renamed all IsXXXIndex to IsValidXXXID
truelight
parents:
4351
diff
changeset
|
367 |
if (!IsValidVehicleID(p1)) return CMD_ERROR; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
368 |
|
919
b0d6c7642f99
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
904
diff
changeset
|
369 |
v = GetVehicle(p1); |
0 | 370 |
|
6585
7da94b26498a
(svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents:
6574
diff
changeset
|
371 |
if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR; |
0 | 372 |
|
8191
3ffc17ef4ff5
(svn r11229) -Fix [FS#1307]: one could sell vehicles that were crashed in a depot, which would still yield money.
rubidium
parents:
8165
diff
changeset
|
373 |
if (HASBITS(v->vehstatus, VS_CRASHED)) return_cmd_error(STR_CAN_T_SELL_DESTROYED_VEHICLE); |
3ffc17ef4ff5
(svn r11229) -Fix [FS#1307]: one could sell vehicles that were crashed in a depot, which would still yield money.
rubidium
parents:
8165
diff
changeset
|
374 |
|
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
375 |
if (!CheckRoadVehInDepotStopped(v)) { |
0 | 376 |
return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE); |
3033
e4f7c60a1742
(svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents:
3032
diff
changeset
|
377 |
} |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
378 |
|
8726
5ae45b46506b
(svn r11793) -Codechange: pass the expense type via the CommandCost instead of a global variable. Patch by Noldo (FS#1114).
rubidium
parents:
8722
diff
changeset
|
379 |
CommandCost ret(EXPENSES_NEW_VEHICLES, -v->value); |
8264
670152de17cb
(svn r11317) -Fix [FS#1355]: don't read a variable of a destroyed vehicle as the value will be reset to 0.
rubidium
parents:
8191
diff
changeset
|
380 |
|
0 | 381 |
if (flags & DC_EXEC) { |
382 |
// Invalidate depot |
|
383 |
InvalidateWindow(WC_VEHICLE_DEPOT, v->tile); |
|
10621
3edd349d9c14
(svn r13165) -Codechange: replace some RebuildXXXList/ResortXXXList+InvalidateWindowXXX with InvalidateWindowXXXData.
rubidium
parents:
10556
diff
changeset
|
384 |
InvalidateWindowClassesData(WC_ROADVEH_LIST, 0); |
0 | 385 |
InvalidateWindow(WC_COMPANY, v->owner); |
386 |
DeleteWindowById(WC_VEHICLE_VIEW, v->index); |
|
5256
90226d8da8fb
(svn r7386) -Codechange r7385: moved deletion of the vehicle highlight from DeleteVehicle to the sell commands as they are not called as often
bjarni
parents:
5215
diff
changeset
|
387 |
DeleteDepotHighlightOfVehicle(v); |
7894
dbe6e9295ec5
(svn r10770) -Codechange: use the pool item class as super class for the vehicle struct.
rubidium
parents:
7866
diff
changeset
|
388 |
delete v; |
0 | 389 |
} |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
390 |
|
8264
670152de17cb
(svn r11317) -Fix [FS#1355]: don't read a variable of a destroyed vehicle as the value will be reset to 0.
rubidium
parents:
8191
diff
changeset
|
391 |
return ret; |
0 | 392 |
} |
393 |
||
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
394 |
struct RoadFindDepotData { |
0 | 395 |
uint best_length; |
1977
4392ae3d8e31
(svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents:
1942
diff
changeset
|
396 |
TileIndex tile; |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
397 |
OwnerByte owner; |
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
398 |
}; |
0 | 399 |
|
3186
5798593c2d95
(svn r3832) Replace some magic numbers by (Diag)Direction enums
tron
parents:
3184
diff
changeset
|
400 |
static const DiagDirection _road_pf_directions[] = { |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
401 |
DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_SW, DIAGDIR_SE, INVALID_DIAGDIR, INVALID_DIAGDIR, |
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
402 |
DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NE, INVALID_DIAGDIR, INVALID_DIAGDIR |
0 | 403 |
}; |
404 |
||
9107
3e57b96e98f2
(svn r12193) -Codechange: Rename a magic variable, give it a decent type, and remove a 'goto'.
frosch
parents:
9105
diff
changeset
|
405 |
static bool EnumRoadSignalFindDepot(TileIndex tile, void* data, Trackdir trackdir, uint length) |
0 | 406 |
{ |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
407 |
RoadFindDepotData* rfdd = (RoadFindDepotData*)data; |
3137 | 408 |
|
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
409 |
tile += TileOffsByDiagDir(_road_pf_directions[trackdir]); |
0 | 410 |
|
9059
04edde3eb0c6
(svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents:
9052
diff
changeset
|
411 |
if (IsRoadDepotTile(tile) && |
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
412 |
IsTileOwner(tile, rfdd->owner) && |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
413 |
length < rfdd->best_length) { |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
414 |
rfdd->best_length = length; |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
415 |
rfdd->tile = tile; |
0 | 416 |
} |
417 |
return false; |
|
418 |
} |
|
419 |
||
3033
e4f7c60a1742
(svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents:
3032
diff
changeset
|
420 |
static const Depot* FindClosestRoadDepot(const Vehicle* v) |
0 | 421 |
{ |
10775
7061477bfbcf
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
10707
diff
changeset
|
422 |
switch (_settings_game.pf.pathfinder_for_roadvehs) { |
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
423 |
case VPF_YAPF: /* YAPF */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
424 |
return YapfFindNearestRoadDepot(v); |
1745
2dcc0a66d91d
(svn r2249) - Fix: [ 1187703 ] [NPF] Road vehicles cannot find a depot when in a roadstop
matthijs
parents:
1709
diff
changeset
|
425 |
|
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
426 |
case VPF_NPF: { /* NPF */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
427 |
/* See where we are now */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
428 |
Trackdir trackdir = GetVehicleTrackdir(v); |
3153
301c1d71122b
(svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3144
diff
changeset
|
429 |
|
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
430 |
NPFFoundTargetData ftd = NPFRouteToDepotBreadthFirstTwoWay(v->tile, trackdir, false, v->tile, ReverseTrackdir(trackdir), false, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, v->owner, INVALID_RAILTYPES, 0); |
0 | 431 |
|
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
432 |
if (ftd.best_bird_dist == 0) return GetDepotByTile(ftd.node.tile); /* Target found */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
433 |
} break; |
0 | 434 |
|
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
435 |
default: |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
436 |
case VPF_OPF: { /* OPF */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
437 |
RoadFindDepotData rfdd; |
0 | 438 |
|
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
439 |
rfdd.owner = v->owner; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
440 |
rfdd.best_length = UINT_MAX; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
441 |
|
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
442 |
/* search in all directions */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
443 |
for (DiagDirection d = DIAGDIR_BEGIN; d < DIAGDIR_END; d++) { |
9296
5878a50c67b2
(svn r12540) -Codechange: Enumify some values in original pathfinder and remove an unused variable.
frosch
parents:
9289
diff
changeset
|
444 |
FollowTrack(v->tile, PATHFIND_FLAGS_NONE, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, d, EnumRoadSignalFindDepot, NULL, &rfdd); |
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
445 |
} |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
446 |
|
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
447 |
if (rfdd.best_length != UINT_MAX) return GetDepotByTile(rfdd.tile); |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
448 |
} break; |
1247 | 449 |
} |
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
450 |
|
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
451 |
return NULL; /* Target not found */ |
0 | 452 |
} |
453 |
||
10126
bed2d9d38577
(svn r12657) -Codechange: add 'FindClosestDepot' to the vehicle class.
rubidium
parents:
10098
diff
changeset
|
454 |
bool RoadVehicle::FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse) |
bed2d9d38577
(svn r12657) -Codechange: add 'FindClosestDepot' to the vehicle class.
rubidium
parents:
10098
diff
changeset
|
455 |
{ |
bed2d9d38577
(svn r12657) -Codechange: add 'FindClosestDepot' to the vehicle class.
rubidium
parents:
10098
diff
changeset
|
456 |
const Depot *depot = FindClosestRoadDepot(this); |
bed2d9d38577
(svn r12657) -Codechange: add 'FindClosestDepot' to the vehicle class.
rubidium
parents:
10098
diff
changeset
|
457 |
|
bed2d9d38577
(svn r12657) -Codechange: add 'FindClosestDepot' to the vehicle class.
rubidium
parents:
10098
diff
changeset
|
458 |
if (depot == NULL) return false; |
bed2d9d38577
(svn r12657) -Codechange: add 'FindClosestDepot' to the vehicle class.
rubidium
parents:
10098
diff
changeset
|
459 |
|
bed2d9d38577
(svn r12657) -Codechange: add 'FindClosestDepot' to the vehicle class.
rubidium
parents:
10098
diff
changeset
|
460 |
if (location != NULL) *location = depot->xy; |
bed2d9d38577
(svn r12657) -Codechange: add 'FindClosestDepot' to the vehicle class.
rubidium
parents:
10098
diff
changeset
|
461 |
if (destination != NULL) *destination = depot->index; |
bed2d9d38577
(svn r12657) -Codechange: add 'FindClosestDepot' to the vehicle class.
rubidium
parents:
10098
diff
changeset
|
462 |
|
bed2d9d38577
(svn r12657) -Codechange: add 'FindClosestDepot' to the vehicle class.
rubidium
parents:
10098
diff
changeset
|
463 |
return true; |
bed2d9d38577
(svn r12657) -Codechange: add 'FindClosestDepot' to the vehicle class.
rubidium
parents:
10098
diff
changeset
|
464 |
} |
bed2d9d38577
(svn r12657) -Codechange: add 'FindClosestDepot' to the vehicle class.
rubidium
parents:
10098
diff
changeset
|
465 |
|
1793
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
466 |
/** Send a road vehicle to the depot. |
3491
4c8427796c64
(svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents:
3481
diff
changeset
|
467 |
* @param tile unused |
6979
d194d25020e7
(svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents:
6949
diff
changeset
|
468 |
* @param flags operation to perform |
1793
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
469 |
* @param p1 vehicle ID to send to the depot |
4451
66603f0f732e
(svn r6229) -Feature: Shared order lists now got a "goto depot" button
bjarni
parents:
4445
diff
changeset
|
470 |
* @param p2 various bitmasked elements |
4506
0d8fcc0a4e49
(svn r6291) -Feature: Vehicle lists from the station window now also got the goto depot button
bjarni
parents:
4463
diff
changeset
|
471 |
* - p2 bit 0-3 - DEPOT_ flags (see vehicle.h) |
0d8fcc0a4e49
(svn r6291) -Feature: Vehicle lists from the station window now also got the goto depot button
bjarni
parents:
4463
diff
changeset
|
472 |
* - p2 bit 8-10 - VLW flag (for mass goto depot) |
1793
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
473 |
*/ |
7439
0c0e2945c890
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
7375
diff
changeset
|
474 |
CommandCost CmdSendRoadVehToDepot(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
0 | 475 |
{ |
4506
0d8fcc0a4e49
(svn r6291) -Feature: Vehicle lists from the station window now also got the goto depot button
bjarni
parents:
4463
diff
changeset
|
476 |
if (p2 & DEPOT_MASS_SEND) { |
0d8fcc0a4e49
(svn r6291) -Feature: Vehicle lists from the station window now also got the goto depot button
bjarni
parents:
4463
diff
changeset
|
477 |
/* Mass goto depot requested */ |
4546
9345e0569655
(svn r6378) -Codechange: Rename VLW_FLAGS to VLW_MASK as it is a mask
Darkvater
parents:
4544
diff
changeset
|
478 |
if (!ValidVLWFlags(p2 & VLW_MASK)) return CMD_ERROR; |
6585
7da94b26498a
(svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents:
6574
diff
changeset
|
479 |
return SendAllVehiclesToDepot(VEH_ROAD, flags, p2 & DEPOT_SERVICE, _current_player, (p2 & VLW_MASK), p1); |
4463
3a70624c40eb
(svn r6246) -Feature: added the many times requested "send all vehicle to depot" button
bjarni
parents:
4451
diff
changeset
|
480 |
} |
3a70624c40eb
(svn r6246) -Feature: added the many times requested "send all vehicle to depot" button
bjarni
parents:
4451
diff
changeset
|
481 |
|
4506
0d8fcc0a4e49
(svn r6291) -Feature: Vehicle lists from the station window now also got the goto depot button
bjarni
parents:
4463
diff
changeset
|
482 |
if (!IsValidVehicleID(p1)) return CMD_ERROR; |
1237
0a1ce05c3d45
(svn r1741) - Fix: added IsVehicleIndex() so it's possible to protect GetVehicle() from reading an invalid vehicle index
bjarni
parents:
1232
diff
changeset
|
483 |
|
10127
ab5e35f77e87
(svn r12658) -Codechange: unify a vast portion of the CmdSend<VehicleType>ToDepot commands.
rubidium
parents:
10126
diff
changeset
|
484 |
Vehicle *v = GetVehicle(p1); |
4510
071bca98c577
(svn r6295) -Feature: using goto depot with a different control selection will now alter the service/stopping in depot flag instead of cancelling the goto depot order
bjarni
parents:
4506
diff
changeset
|
485 |
|
10127
ab5e35f77e87
(svn r12658) -Codechange: unify a vast portion of the CmdSend<VehicleType>ToDepot commands.
rubidium
parents:
10126
diff
changeset
|
486 |
if (v->type != VEH_ROAD) return CMD_ERROR; |
0 | 487 |
|
10127
ab5e35f77e87
(svn r12658) -Codechange: unify a vast portion of the CmdSend<VehicleType>ToDepot commands.
rubidium
parents:
10126
diff
changeset
|
488 |
return v->SendToDepot(flags, (DepotCommand)(p2 & DEPOT_COMMAND_MASK)); |
0 | 489 |
} |
490 |
||
1793
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
491 |
/** Turn a roadvehicle around. |
3491
4c8427796c64
(svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents:
3481
diff
changeset
|
492 |
* @param tile unused |
6979
d194d25020e7
(svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents:
6949
diff
changeset
|
493 |
* @param flags operation to perform |
1793
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
494 |
* @param p1 vehicle ID to turn |
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
495 |
* @param p2 unused |
8ac8a8c9ec0f
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
496 |
*/ |
7439
0c0e2945c890
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
7375
diff
changeset
|
497 |
CommandCost CmdTurnRoadVeh(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
0 | 498 |
{ |
499 |
Vehicle *v; |
|
500 |
||
4352
8ddb01bc6075
(svn r6053) -Codechange: renamed all IsXXXIndex to IsValidXXXID
truelight
parents:
4351
diff
changeset
|
501 |
if (!IsValidVehicleID(p1)) return CMD_ERROR; |
1237
0a1ce05c3d45
(svn r1741) - Fix: added IsVehicleIndex() so it's possible to protect GetVehicle() from reading an invalid vehicle index
bjarni
parents:
1232
diff
changeset
|
502 |
|
919
b0d6c7642f99
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
904
diff
changeset
|
503 |
v = GetVehicle(p1); |
0 | 504 |
|
6585
7da94b26498a
(svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents:
6574
diff
changeset
|
505 |
if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR; |
0 | 506 |
|
5573
afa6f92a71fd
(svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents:
5568
diff
changeset
|
507 |
if (v->vehstatus & VS_STOPPED || |
7972
dff055fff851
(svn r10983) -Codechange: use vehstatus & VS_CRASHED instead of some other "methods" custom to each vehicle to determine whether the vehicle is crashed.
rubidium
parents:
7965
diff
changeset
|
508 |
v->vehstatus & VS_CRASHED || |
0 | 509 |
v->breakdown_ctr != 0 || |
510 |
v->u.road.overtaking != 0 || |
|
6326
c904c7ea1c8d
(svn r8715) -Codechange/cleanup: replace magic numbers related to state of road vehicles with enums. Original patch by mart3p.
rubidium
parents:
6325
diff
changeset
|
511 |
v->u.road.state == RVSB_WORMHOLE || |
7986
881998b115c2
(svn r11001) -Codechange: unify the way to determine whether a vehicle is in a depot.
rubidium
parents:
7972
diff
changeset
|
512 |
v->IsInDepot() || |
0 | 513 |
v->cur_speed < 5) { |
514 |
return CMD_ERROR; |
|
515 |
} |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
516 |
|
9059
04edde3eb0c6
(svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents:
9052
diff
changeset
|
517 |
if (IsNormalRoadTile(v->tile) && GetDisallowedRoadDirections(v->tile) != DRD_NONE) return CMD_ERROR; |
7260
23cd58b6bf51
(svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents:
7250
diff
changeset
|
518 |
|
8584
a8b6dffead63
(svn r11649) -Codechange: some code can be simplified thanks to changes in r11642
smatz
parents:
8579
diff
changeset
|
519 |
if (IsTileType(v->tile, MP_TUNNELBRIDGE) && DirToDiagDir(v->direction) == GetTunnelBridgeDirection(v->tile)) return CMD_ERROR; |
5573
afa6f92a71fd
(svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents:
5568
diff
changeset
|
520 |
|
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
521 |
if (flags & DC_EXEC) v->u.road.reverse_ctr = 180; |
0 | 522 |
|
7446
1c4d469f986e
(svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents:
7439
diff
changeset
|
523 |
return CommandCost(); |
0 | 524 |
} |
525 |
||
526 |
||
7049
01825af2ce90
(svn r9755) -Codechange: refactor some more of the begin loading stuff.
rubidium
parents:
7048
diff
changeset
|
527 |
void RoadVehicle::MarkDirty() |
0 | 528 |
{ |
7988
6075538f6111
(svn r11003) -Codechange: replace Vehicle->next to Vehicle->Next() and Vehicle->SetNext() so we can trap instances that change a next pointer and (in the future) update the first/previous pointers based on that.
rubidium
parents:
7986
diff
changeset
|
529 |
for (Vehicle *v = this; v != NULL; v = v->Next()) { |
7915
8b20c0c2debf
(svn r10812) -Fix (r10097) [FS#1093]: Make RoadVehicle::MarkDirty() mark all parts of articulated vehicles as dirty, not just the front.
maedhros
parents:
7914
diff
changeset
|
530 |
v->cur_image = v->GetImage(v->direction); |
8813
6d054db96ede
(svn r11882) -Codechange: introduce MarkSingleVehicleDirty() and simplify the code at some places
smatz
parents:
8798
diff
changeset
|
531 |
MarkSingleVehicleDirty(v); |
7915
8b20c0c2debf
(svn r10812) -Fix (r10097) [FS#1093]: Make RoadVehicle::MarkDirty() mark all parts of articulated vehicles as dirty, not just the front.
maedhros
parents:
7914
diff
changeset
|
532 |
} |
0 | 533 |
} |
534 |
||
7054
edbb4d7765f2
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
7049
diff
changeset
|
535 |
void RoadVehicle::UpdateDeltaXY(Direction direction) |
0 | 536 |
{ |
7054
edbb4d7765f2
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
7049
diff
changeset
|
537 |
#define MKIT(a, b, c, d) ((a & 0xFF) << 24) | ((b & 0xFF) << 16) | ((c & 0xFF) << 8) | ((d & 0xFF) << 0) |
0 | 538 |
static const uint32 _delta_xy_table[8] = { |
539 |
MKIT(3, 3, -1, -1), |
|
540 |
MKIT(3, 7, -1, -3), |
|
541 |
MKIT(3, 3, -1, -1), |
|
542 |
MKIT(7, 3, -3, -1), |
|
543 |
MKIT(3, 3, -1, -1), |
|
544 |
MKIT(3, 7, -1, -3), |
|
545 |
MKIT(3, 3, -1, -1), |
|
546 |
MKIT(7, 3, -3, -1), |
|
547 |
}; |
|
548 |
#undef MKIT |
|
7054
edbb4d7765f2
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
7049
diff
changeset
|
549 |
|
edbb4d7765f2
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
7049
diff
changeset
|
550 |
uint32 x = _delta_xy_table[direction]; |
edbb4d7765f2
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
7049
diff
changeset
|
551 |
this->x_offs = GB(x, 0, 8); |
edbb4d7765f2
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
7049
diff
changeset
|
552 |
this->y_offs = GB(x, 8, 8); |
9289
92f1249c304e
(svn r12531) -Codechange: Rename some variables for consistency.
frosch
parents:
9282
diff
changeset
|
553 |
this->x_extent = GB(x, 16, 8); |
92f1249c304e
(svn r12531) -Codechange: Rename some variables for consistency.
frosch
parents:
9282
diff
changeset
|
554 |
this->y_extent = GB(x, 24, 8); |
92f1249c304e
(svn r12531) -Codechange: Rename some variables for consistency.
frosch
parents:
9282
diff
changeset
|
555 |
this->z_extent = 6; |
0 | 556 |
} |
557 |
||
558 |
static void ClearCrashedStation(Vehicle *v) |
|
559 |
{ |
|
2671
457c6cdbf9e7
(svn r3213) - Codechange: Clean up handling of road stops, avoiding unnecessary use of pointers and using the *BIT() macros.
peter1138
parents:
2662
diff
changeset
|
560 |
RoadStop *rs = GetRoadStopByTile(v->tile, GetRoadStopType(v->tile)); |
0 | 561 |
|
6316
6ba1efc2b7fc
(svn r8694) -Codechange: make RoadStop's status accessible via accessor functions.
rubidium
parents:
6315
diff
changeset
|
562 |
/* Mark the station entrance as not busy */ |
6ba1efc2b7fc
(svn r8694) -Codechange: make RoadStop's status accessible via accessor functions.
rubidium
parents:
6315
diff
changeset
|
563 |
rs->SetEntranceBusy(false); |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
564 |
|
6316
6ba1efc2b7fc
(svn r8694) -Codechange: make RoadStop's status accessible via accessor functions.
rubidium
parents:
6315
diff
changeset
|
565 |
/* Free the parking bay */ |
8424
4a488a90ccab
(svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents:
8420
diff
changeset
|
566 |
rs->FreeBay(HasBit(v->u.road.state, RVS_USING_SECOND_BAY)); |
0 | 567 |
} |
568 |
||
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
569 |
static void DeleteLastRoadVeh(Vehicle *v) |
0 | 570 |
{ |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
571 |
Vehicle *u = v; |
7988
6075538f6111
(svn r11003) -Codechange: replace Vehicle->next to Vehicle->Next() and Vehicle->SetNext() so we can trap instances that change a next pointer and (in the future) update the first/previous pointers based on that.
rubidium
parents:
7986
diff
changeset
|
572 |
for (; v->Next() != NULL; v = v->Next()) u = v; |
6075538f6111
(svn r11003) -Codechange: replace Vehicle->next to Vehicle->Next() and Vehicle->SetNext() so we can trap instances that change a next pointer and (in the future) update the first/previous pointers based on that.
rubidium
parents:
7986
diff
changeset
|
573 |
u->SetNext(NULL); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
574 |
|
0 | 575 |
DeleteWindowById(WC_VEHICLE_VIEW, v->index); |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
576 |
|
10621
3edd349d9c14
(svn r13165) -Codechange: replace some RebuildXXXList/ResortXXXList+InvalidateWindowXXX with InvalidateWindowXXXData.
rubidium
parents:
10556
diff
changeset
|
577 |
InvalidateWindowClassesData(WC_ROADVEH_LIST, 0); |
0 | 578 |
InvalidateWindow(WC_COMPANY, v->owner); |
579 |
||
3017
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
580 |
if (IsTileType(v->tile, MP_STATION)) ClearCrashedStation(v); |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
581 |
|
8813
6d054db96ede
(svn r11882) -Codechange: introduce MarkSingleVehicleDirty() and simplify the code at some places
smatz
parents:
8798
diff
changeset
|
582 |
MarkSingleVehicleDirty(v); |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
583 |
|
7894
dbe6e9295ec5
(svn r10770) -Codechange: use the pool item class as super class for the vehicle struct.
rubidium
parents:
7866
diff
changeset
|
584 |
delete v; |
0 | 585 |
} |
586 |
||
587 |
static byte SetRoadVehPosition(Vehicle *v, int x, int y) |
|
588 |
{ |
|
589 |
byte new_z, old_z; |
|
590 |
||
6889
f7f6d9cb07a0
(svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents:
6683
diff
changeset
|
591 |
/* need this hint so it returns the right z coordinate on bridges. */ |
3017
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
592 |
v->x_pos = x; |
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
593 |
v->y_pos = y; |
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
594 |
new_z = GetSlopeZ(x, y); |
0 | 595 |
|
596 |
old_z = v->z_pos; |
|
597 |
v->z_pos = new_z; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
598 |
|
0 | 599 |
VehiclePositionChanged(v); |
600 |
EndVehicleMove(v); |
|
601 |
return old_z; |
|
602 |
} |
|
603 |
||
604 |
static void RoadVehSetRandomDirection(Vehicle *v) |
|
605 |
{ |
|
3160 | 606 |
static const DirDiff delta[] = { |
607 |
DIRDIFF_45LEFT, DIRDIFF_SAME, DIRDIFF_SAME, DIRDIFF_45RIGHT |
|
608 |
}; |
|
609 |
||
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
610 |
do { |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
611 |
uint32 r = Random(); |
3160 | 612 |
|
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
613 |
v->direction = ChangeDir(v->direction, delta[r & 3]); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
614 |
BeginVehicleMove(v); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
615 |
v->UpdateDeltaXY(v->direction); |
7630
2cd754d7dfa4
(svn r10408) -Codechange: make GetImage a class method of Vehicle instead of Get(Aircraft|RoadVeh|Ship|Train)Image.
rubidium
parents:
7592
diff
changeset
|
616 |
v->cur_image = v->GetImage(v->direction); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
617 |
SetRoadVehPosition(v, v->x_pos, v->y_pos); |
7988
6075538f6111
(svn r11003) -Codechange: replace Vehicle->next to Vehicle->Next() and Vehicle->SetNext() so we can trap instances that change a next pointer and (in the future) update the first/previous pointers based on that.
rubidium
parents:
7986
diff
changeset
|
618 |
} while ((v = v->Next()) != NULL); |
0 | 619 |
} |
620 |
||
621 |
static void RoadVehIsCrashed(Vehicle *v) |
|
622 |
{ |
|
623 |
v->u.road.crashed_ctr++; |
|
624 |
if (v->u.road.crashed_ctr == 2) { |
|
1359
8ba976aed634
(svn r1863) Give the effect vehicle type enums more descriptive names and use the enum as parameter type for CreateEffectVehicle*()
tron
parents:
1330
diff
changeset
|
625 |
CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE); |
0 | 626 |
} else if (v->u.road.crashed_ctr <= 45) { |
3017
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
627 |
if ((v->tick_counter & 7) == 0) RoadVehSetRandomDirection(v); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
628 |
} else if (v->u.road.crashed_ctr >= 2220 && !(v->tick_counter & 0x1F)) { |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
629 |
DeleteLastRoadVeh(v); |
0 | 630 |
} |
631 |
} |
|
632 |
||
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
633 |
static void* EnumCheckRoadVehCrashTrain(Vehicle* v, void* data) |
0 | 634 |
{ |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
635 |
const Vehicle* u = (Vehicle*)data; |
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
636 |
|
2989 | 637 |
return |
6585
7da94b26498a
(svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents:
6574
diff
changeset
|
638 |
v->type == VEH_TRAIN && |
8419
de9999f762d0
(svn r11476) -Codechange: rename the function myabs to abs to get rid of an unneeded define
skidd13
parents:
8418
diff
changeset
|
639 |
abs(v->z_pos - u->z_pos) <= 6 && |
de9999f762d0
(svn r11476) -Codechange: rename the function myabs to abs to get rid of an unneeded define
skidd13
parents:
8418
diff
changeset
|
640 |
abs(v->x_pos - u->x_pos) <= 4 && |
de9999f762d0
(svn r11476) -Codechange: rename the function myabs to abs to get rid of an unneeded define
skidd13
parents:
8418
diff
changeset
|
641 |
abs(v->y_pos - u->y_pos) <= 4 ? |
2989 | 642 |
v : NULL; |
0 | 643 |
} |
644 |
||
645 |
static void RoadVehCrash(Vehicle *v) |
|
646 |
{ |
|
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
647 |
uint16 pass = 1; |
0 | 648 |
|
649 |
v->u.road.crashed_ctr++; |
|
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
650 |
|
7988
6075538f6111
(svn r11003) -Codechange: replace Vehicle->next to Vehicle->Next() and Vehicle->SetNext() so we can trap instances that change a next pointer and (in the future) update the first/previous pointers based on that.
rubidium
parents:
7986
diff
changeset
|
651 |
for (Vehicle *u = v; u != NULL; u = u->Next()) { |
7506
e52d89f5c7c1
(svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents:
7476
diff
changeset
|
652 |
if (IsCargoInClass(u->cargo_type, CC_PASSENGERS)) pass += u->cargo.Count(); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
653 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
654 |
u->vehstatus |= VS_CRASHED; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
655 |
|
8813
6d054db96ede
(svn r11882) -Codechange: introduce MarkSingleVehicleDirty() and simplify the code at some places
smatz
parents:
8798
diff
changeset
|
656 |
MarkSingleVehicleDirty(u); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
657 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
658 |
|
3236 | 659 |
ClearSlot(v); |
0 | 660 |
|
8846
f3e877a92e2b
(svn r11916) -Codechange: use enums from VehicleViewWindowWidgets instead of constants
smatz
parents:
8813
diff
changeset
|
661 |
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH); |
0 | 662 |
|
534
17ab2f22ff74
(svn r901) Small step in the process to clean up the DPARAM mess:
tron
parents:
507
diff
changeset
|
663 |
SetDParam(0, pass); |
2260
3e97367f7cbc
(svn r2780) Remove some more unused strings and make the use of a few strings more explicit
tron
parents:
2214
diff
changeset
|
664 |
AddNewsItem( |
3e97367f7cbc
(svn r2780) Remove some more unused strings and make the use of a few strings more explicit
tron
parents:
2214
diff
changeset
|
665 |
(pass == 1) ? |
3e97367f7cbc
(svn r2780) Remove some more unused strings and make the use of a few strings more explicit
tron
parents:
2214
diff
changeset
|
666 |
STR_9031_ROAD_VEHICLE_CRASH_DRIVER : STR_9032_ROAD_VEHICLE_CRASH_DIE, |
10556
ec733f5899fa
(svn r13100) -Codechange: reduce the amount of parameters passed via AddNewsMessage as there is (for each news message type) a tuple of 4 parameters that is the same for all calls.
rubidium
parents:
10546
diff
changeset
|
667 |
NS_ACCIDENT_VEHICLE, |
0 | 668 |
v->index, |
3033
e4f7c60a1742
(svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents:
3032
diff
changeset
|
669 |
0 |
e4f7c60a1742
(svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents:
3032
diff
changeset
|
670 |
); |
0 | 671 |
|
672 |
ModifyStationRatingAround(v->tile, v->owner, -160, 22); |
|
541 | 673 |
SndPlayVehicleFx(SND_12_EXPLOSION, v); |
0 | 674 |
} |
675 |
||
676 |
static void RoadVehCheckTrainCrash(Vehicle *v) |
|
677 |
{ |
|
7988
6075538f6111
(svn r11003) -Codechange: replace Vehicle->next to Vehicle->Next() and Vehicle->SetNext() so we can trap instances that change a next pointer and (in the future) update the first/previous pointers based on that.
rubidium
parents:
7986
diff
changeset
|
678 |
for (Vehicle *u = v; u != NULL; u = u->Next()) { |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
679 |
if (u->u.road.state == RVSB_WORMHOLE) continue; |
0 | 680 |
|
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
681 |
TileIndex tile = u->tile; |
0 | 682 |
|
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
683 |
if (!IsLevelCrossingTile(tile)) continue; |
0 | 684 |
|
7367
a0499d5cb8e5
(svn r10111) -Codechange: Add new vehicle hash table for collision detection and finding vehicles on a tile. The hash area scanned is far smaller than the old hash table, which is now used for viewport updates only. This should give a significant performance improvement for games with many vehicles. (Based on work by 'B. N. SmatZ!' and 'madman2003')
peter1138
parents:
7353
diff
changeset
|
685 |
if (VehicleFromPosXY(v->x_pos, v->y_pos, u, EnumCheckRoadVehCrashTrain) != NULL) { |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
686 |
RoadVehCrash(v); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
687 |
return; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
688 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
689 |
} |
0 | 690 |
} |
691 |
||
692 |
static void HandleBrokenRoadVeh(Vehicle *v) |
|
693 |
{ |
|
694 |
if (v->breakdown_ctr != 1) { |
|
695 |
v->breakdown_ctr = 1; |
|
696 |
v->cur_speed = 0; |
|
697 |
||
698 |
if (v->breakdowns_since_last_service != 255) |
|
699 |
v->breakdowns_since_last_service++; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
700 |
|
0 | 701 |
InvalidateWindow(WC_VEHICLE_VIEW, v->index); |
702 |
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
703 |
|
4656
acffecd6f484
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
704 |
if (!PlayVehicleSound(v, VSE_BREAKDOWN)) { |
10775
7061477bfbcf
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
10707
diff
changeset
|
705 |
SndPlayVehicleFx((_settings_game.game_creation.landscape != LT_TOYLAND) ? |
4656
acffecd6f484
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
706 |
SND_0F_VEHICLE_BREAKDOWN : SND_35_COMEDY_BREAKDOWN, v); |
acffecd6f484
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
707 |
} |
0 | 708 |
|
709 |
if (!(v->vehstatus & VS_HIDDEN)) { |
|
710 |
Vehicle *u = CreateEffectVehicleRel(v, 4, 4, 5, EV_BREAKDOWN_SMOKE); |
|
10271
a20997d33fe8
(svn r12803) -Cleanup: rename SpecialVehicle to EffectVehicle to have a uniform naming of the thing instead of using both names for the same thing.
rubidium
parents:
10263
diff
changeset
|
711 |
if (u != NULL) u->u.effect.animation_state = v->breakdown_delay * 2; |
0 | 712 |
} |
713 |
} |
|
714 |
||
2989 | 715 |
if ((v->tick_counter & 1) == 0) { |
716 |
if (--v->breakdown_delay == 0) { |
|
0 | 717 |
v->breakdown_ctr = 0; |
718 |
InvalidateWindow(WC_VEHICLE_VIEW, v->index); |
|
719 |
} |
|
720 |
} |
|
721 |
} |
|
722 |
||
9323
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
723 |
TileIndex RoadVehicle::GetOrderStationLocation(StationID station) |
0 | 724 |
{ |
9326
326baf219dda
(svn r12578) -Codechange: merge the aircrafts ProcessOrder too into the 'unified' ProcessOrder.
rubidium
parents:
9323
diff
changeset
|
725 |
if (station == this->last_station_visited) this->last_station_visited = INVALID_STATION; |
326baf219dda
(svn r12578) -Codechange: merge the aircrafts ProcessOrder too into the 'unified' ProcessOrder.
rubidium
parents:
9323
diff
changeset
|
726 |
|
9323
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
727 |
TileIndex dest = INVALID_TILE; |
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
728 |
const RoadStop *rs = GetStation(station)->GetPrimaryRoadStop(this); |
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
729 |
if (rs != NULL) { |
11090
3ac220ac9a47
(svn r13647) -Codechange: replace MAX_UVALUE() for std types with the equivalent constant
skidd13
parents:
11025
diff
changeset
|
730 |
uint mindist = UINT_MAX; |
0 | 731 |
|
9323
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
732 |
for (; rs != NULL; rs = rs->GetNextRoadStop(this)) { |
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
733 |
uint dist = DistanceManhattan(this->tile, rs->xy); |
0 | 734 |
|
9323
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
735 |
if (dist < mindist) { |
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
736 |
mindist = dist; |
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
737 |
dest = rs->xy; |
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
738 |
} |
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
739 |
} |
2951 | 740 |
} |
0 | 741 |
|
9323
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
742 |
if (dest != INVALID_TILE) { |
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
743 |
return dest; |
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
744 |
} else { |
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
745 |
/* There is no stop left at the station, so don't even TRY to go there */ |
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
746 |
this->cur_order_index++; |
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
747 |
return 0; |
0 | 748 |
} |
749 |
} |
|
750 |
||
3017
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
751 |
static void StartRoadVehSound(const Vehicle* v) |
0 | 752 |
{ |
4656
acffecd6f484
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
753 |
if (!PlayVehicleSound(v, VSE_START)) { |
acffecd6f484
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
754 |
SoundFx s = RoadVehInfo(v->engine_type)->sfx; |
acffecd6f484
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
755 |
if (s == SND_19_BUS_START_PULL_AWAY && (v->tick_counter & 3) == 0) |
acffecd6f484
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
756 |
s = SND_1A_BUS_START_PULL_AWAY_WITH_HORN; |
acffecd6f484
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
757 |
SndPlayVehicleFx(s, v); |
acffecd6f484
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
758 |
} |
0 | 759 |
} |
760 |
||
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
761 |
struct RoadVehFindData { |
3017
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
762 |
int x; |
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
763 |
int y; |
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
764 |
const Vehicle* veh; |
3157
40de8616c04c
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3153
diff
changeset
|
765 |
Direction dir; |
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
766 |
}; |
0 | 767 |
|
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
768 |
static void* EnumCheckRoadVehClose(Vehicle *v, void* data) |
0 | 769 |
{ |
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
770 |
static const int8 dist_x[] = { -4, -8, -4, -1, 4, 8, 4, 1 }; |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
771 |
static const int8 dist_y[] = { -4, -1, 4, 8, 4, 1, -4, -8 }; |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
772 |
|
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
773 |
const RoadVehFindData* rvf = (RoadVehFindData*)data; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
774 |
|
63
53cc59601b3c
(svn r64) Fix: Road vehicles don't get stuck any more (Truelight + Celestar
dominik
parents:
19
diff
changeset
|
775 |
short x_diff = v->x_pos - rvf->x; |
53cc59601b3c
(svn r64) Fix: Road vehicles don't get stuck any more (Truelight + Celestar
dominik
parents:
19
diff
changeset
|
776 |
short y_diff = v->y_pos - rvf->y; |
0 | 777 |
|
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
778 |
return |
6585
7da94b26498a
(svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents:
6574
diff
changeset
|
779 |
v->type == VEH_ROAD && |
7986
881998b115c2
(svn r11001) -Codechange: unify the way to determine whether a vehicle is in a depot.
rubidium
parents:
7972
diff
changeset
|
780 |
!v->IsInDepot() && |
8419
de9999f762d0
(svn r11476) -Codechange: rename the function myabs to abs to get rid of an unneeded define
skidd13
parents:
8418
diff
changeset
|
781 |
abs(v->z_pos - rvf->veh->z_pos) < 6 && |
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
782 |
v->direction == rvf->dir && |
7993
76b0eb3e19c9
(svn r11011) -Fix [FS#1129]: GetFirstVehicleInChain did change the game state while being marked const.
rubidium
parents:
7988
diff
changeset
|
783 |
rvf->veh->First() != v->First() && |
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
784 |
(dist_x[v->direction] >= 0 || (x_diff > dist_x[v->direction] && x_diff <= 0)) && |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
785 |
(dist_x[v->direction] <= 0 || (x_diff < dist_x[v->direction] && x_diff >= 0)) && |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
786 |
(dist_y[v->direction] >= 0 || (y_diff > dist_y[v->direction] && y_diff <= 0)) && |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
787 |
(dist_y[v->direction] <= 0 || (y_diff < dist_y[v->direction] && y_diff >= 0)) ? |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
788 |
v : NULL; |
0 | 789 |
} |
790 |
||
3157
40de8616c04c
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3153
diff
changeset
|
791 |
static Vehicle* RoadVehFindCloseTo(Vehicle* v, int x, int y, Direction dir) |
0 | 792 |
{ |
793 |
RoadVehFindData rvf; |
|
794 |
Vehicle *u; |
|
8312
48bd7541f6ae
(svn r11366) -Fix [FS#1258]: road vehicles must not drive through eachother on bridges/in tunnels.
rubidium
parents:
8278
diff
changeset
|
795 |
Vehicle *front = v->First(); |
0 | 796 |
|
8312
48bd7541f6ae
(svn r11366) -Fix [FS#1258]: road vehicles must not drive through eachother on bridges/in tunnels.
rubidium
parents:
8278
diff
changeset
|
797 |
if (front->u.road.reverse_ctr != 0) return NULL; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
798 |
|
0 | 799 |
rvf.x = x; |
800 |
rvf.y = y; |
|
801 |
rvf.dir = dir; |
|
802 |
rvf.veh = v; |
|
8312
48bd7541f6ae
(svn r11366) -Fix [FS#1258]: road vehicles must not drive through eachother on bridges/in tunnels.
rubidium
parents:
8278
diff
changeset
|
803 |
if (front->u.road.state == RVSB_WORMHOLE) { |
48bd7541f6ae
(svn r11366) -Fix [FS#1258]: road vehicles must not drive through eachother on bridges/in tunnels.
rubidium
parents:
8278
diff
changeset
|
804 |
u = (Vehicle*)VehicleFromPos(v->tile, &rvf, EnumCheckRoadVehClose); |
8762
e0d5cde5228f
(svn r11830) -Fix [FS#1625]: road vehicles would not wait in line, but at a single point on bridges. Based on a patch by SmatZ.
rubidium
parents:
8760
diff
changeset
|
805 |
if (u == NULL) u = (Vehicle*)VehicleFromPos(GetOtherTunnelBridgeEnd(v->tile), &rvf, EnumCheckRoadVehClose); |
8312
48bd7541f6ae
(svn r11366) -Fix [FS#1258]: road vehicles must not drive through eachother on bridges/in tunnels.
rubidium
parents:
8278
diff
changeset
|
806 |
} else { |
48bd7541f6ae
(svn r11366) -Fix [FS#1258]: road vehicles must not drive through eachother on bridges/in tunnels.
rubidium
parents:
8278
diff
changeset
|
807 |
u = (Vehicle*)VehicleFromPosXY(x, y, &rvf, EnumCheckRoadVehClose); |
48bd7541f6ae
(svn r11366) -Fix [FS#1258]: road vehicles must not drive through eachother on bridges/in tunnels.
rubidium
parents:
8278
diff
changeset
|
808 |
} |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
809 |
|
6889
f7f6d9cb07a0
(svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents:
6683
diff
changeset
|
810 |
/* This code protects a roadvehicle from being blocked for ever |
f7f6d9cb07a0
(svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents:
6683
diff
changeset
|
811 |
* If more than 1480 / 74 days a road vehicle is blocked, it will |
f7f6d9cb07a0
(svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents:
6683
diff
changeset
|
812 |
* drive just through it. The ultimate backup-code of TTD. |
f7f6d9cb07a0
(svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents:
6683
diff
changeset
|
813 |
* It can be disabled. */ |
0 | 814 |
if (u == NULL) { |
8312
48bd7541f6ae
(svn r11366) -Fix [FS#1258]: road vehicles must not drive through eachother on bridges/in tunnels.
rubidium
parents:
8278
diff
changeset
|
815 |
front->u.road.blocked_ctr = 0; |
0 | 816 |
return NULL; |
817 |
} |
|
818 |
||
8312
48bd7541f6ae
(svn r11366) -Fix [FS#1258]: road vehicles must not drive through eachother on bridges/in tunnels.
rubidium
parents:
8278
diff
changeset
|
819 |
if (++front->u.road.blocked_ctr > 1480) return NULL; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
820 |
|
0 | 821 |
return u; |
822 |
} |
|
823 |
||
2630 | 824 |
static void RoadVehArrivesAt(const Vehicle* v, Station* st) |
0 | 825 |
{ |
6655
951b0ba32eb1
(svn r9301) -Codechange: Use cargo class to determine if a road vehicle can stop in bus or truck stops.
peter1138
parents:
6642
diff
changeset
|
826 |
if (IsCargoInClass(v->cargo_type, CC_PASSENGERS)) { |
0 | 827 |
/* Check if station was ever visited before */ |
828 |
if (!(st->had_vehicle_of_type & HVOT_BUS)) { |
|
829 |
st->had_vehicle_of_type |= HVOT_BUS; |
|
534
17ab2f22ff74
(svn r901) Small step in the process to clean up the DPARAM mess:
tron
parents:
507
diff
changeset
|
830 |
SetDParam(0, st->index); |
0 | 831 |
AddNewsItem( |
8920
04df97185061
(svn r11994) -Codechange: Remove numbers from string names where the strings aren't present in TTD, since they don't correspond to either TTD's TextIDs or OpenTTD's StringIDs.
maedhros
parents:
8888
diff
changeset
|
832 |
v->u.road.roadtype == ROADTYPE_ROAD ? STR_902F_CITIZENS_CELEBRATE_FIRST : STR_CITIZENS_CELEBRATE_FIRST_PASSENGER_TRAM, |
10556
ec733f5899fa
(svn r13100) -Codechange: reduce the amount of parameters passed via AddNewsMessage as there is (for each news message type) a tuple of 4 parameters that is the same for all calls.
rubidium
parents:
10546
diff
changeset
|
833 |
(v->owner == _local_player) ? NS_ARRIVAL_PLAYER : NS_ARRIVAL_OTHER, |
0 | 834 |
v->index, |
835 |
0); |
|
836 |
} |
|
837 |
} else { |
|
838 |
/* Check if station was ever visited before */ |
|
839 |
if (!(st->had_vehicle_of_type & HVOT_TRUCK)) { |
|
840 |
st->had_vehicle_of_type |= HVOT_TRUCK; |
|
534
17ab2f22ff74
(svn r901) Small step in the process to clean up the DPARAM mess:
tron
parents:
507
diff
changeset
|
841 |
SetDParam(0, st->index); |
0 | 842 |
AddNewsItem( |
8920
04df97185061
(svn r11994) -Codechange: Remove numbers from string names where the strings aren't present in TTD, since they don't correspond to either TTD's TextIDs or OpenTTD's StringIDs.
maedhros
parents:
8888
diff
changeset
|
843 |
v->u.road.roadtype == ROADTYPE_ROAD ? STR_9030_CITIZENS_CELEBRATE_FIRST : STR_CITIZENS_CELEBRATE_FIRST_CARGO_TRAM, |
10556
ec733f5899fa
(svn r13100) -Codechange: reduce the amount of parameters passed via AddNewsMessage as there is (for each news message type) a tuple of 4 parameters that is the same for all calls.
rubidium
parents:
10546
diff
changeset
|
844 |
(v->owner == _local_player) ? NS_ARRIVAL_PLAYER : NS_ARRIVAL_OTHER, |
0 | 845 |
v->index, |
3033
e4f7c60a1742
(svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents:
3032
diff
changeset
|
846 |
0 |
e4f7c60a1742
(svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents:
3032
diff
changeset
|
847 |
); |
0 | 848 |
} |
849 |
} |
|
850 |
} |
|
851 |
||
852 |
static bool RoadVehAccelerate(Vehicle *v) |
|
853 |
{ |
|
2951 | 854 |
uint spd = v->cur_speed + 1 + (v->u.road.overtaking != 0 ? 1 : 0); |
0 | 855 |
byte t; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
856 |
|
6889
f7f6d9cb07a0
(svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents:
6683
diff
changeset
|
857 |
/* Clamp */ |
0 | 858 |
spd = min(spd, v->max_speed); |
6467 | 859 |
if (v->u.road.state == RVSB_WORMHOLE && !(v->vehstatus & VS_HIDDEN)) { |
8987
782be613237b
(svn r12066) -Codechange: Rename GetBridge for the more common GetBridgeSpec
belugas
parents:
8963
diff
changeset
|
860 |
spd = min(spd, GetBridgeSpec(GetBridgeType(v->tile))->speed * 2); |
6467 | 861 |
} |
0 | 862 |
|
6889
f7f6d9cb07a0
(svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents:
6683
diff
changeset
|
863 |
/* updates statusbar only if speed have changed to save CPU time */ |
0 | 864 |
if (spd != v->cur_speed) { |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
865 |
v->cur_speed = spd; |
10775
7061477bfbcf
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
10707
diff
changeset
|
866 |
if (_settings_client.gui.vehicle_speed) { |
8846
f3e877a92e2b
(svn r11916) -Codechange: use enums from VehicleViewWindowWidgets instead of constants
smatz
parents:
8813
diff
changeset
|
867 |
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH); |
2951 | 868 |
} |
0 | 869 |
} |
870 |
||
6889
f7f6d9cb07a0
(svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents:
6683
diff
changeset
|
871 |
/* Decrease somewhat when turning */ |
2951 | 872 |
if (!(v->direction & 1)) spd = spd * 3 >> 2; |
0 | 873 |
|
2951 | 874 |
if (spd == 0) return false; |
0 | 875 |
|
2951 | 876 |
if ((byte)++spd == 0) return true; |
0 | 877 |
|
878 |
v->progress = (t = v->progress) - (byte)spd; |
|
879 |
||
880 |
return (t < v->progress); |
|
881 |
} |
|
882 |
||
3157
40de8616c04c
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3153
diff
changeset
|
883 |
static Direction RoadVehGetNewDirection(const Vehicle* v, int x, int y) |
0 | 884 |
{ |
3157
40de8616c04c
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3153
diff
changeset
|
885 |
static const Direction _roadveh_new_dir[] = { |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
886 |
DIR_N , DIR_NW, DIR_W , INVALID_DIR, |
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
887 |
DIR_NE, DIR_N , DIR_SW, INVALID_DIR, |
3157
40de8616c04c
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3153
diff
changeset
|
888 |
DIR_E , DIR_SE, DIR_S |
0 | 889 |
}; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
890 |
|
0 | 891 |
x = x - v->x_pos + 1; |
892 |
y = y - v->y_pos + 1; |
|
893 |
||
3017
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
894 |
if ((uint)x > 2 || (uint)y > 2) return v->direction; |
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
895 |
return _roadveh_new_dir[y * 4 + x]; |
0 | 896 |
} |
897 |
||
3157
40de8616c04c
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3153
diff
changeset
|
898 |
static Direction RoadVehGetSlidingDirection(const Vehicle* v, int x, int y) |
0 | 899 |
{ |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
900 |
Direction new_dir = RoadVehGetNewDirection(v, x, y); |
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
901 |
Direction old_dir = v->direction; |
3159
2abc21583259
(svn r3785) Replace some if-magic to determine the turning direction for road vehicles with the new DirDiff stuff
tron
parents:
3157
diff
changeset
|
902 |
DirDiff delta; |
3157
40de8616c04c
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3153
diff
changeset
|
903 |
|
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
904 |
if (new_dir == old_dir) return old_dir; |
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
905 |
delta = (DirDifference(new_dir, old_dir) > DIRDIFF_REVERSE ? DIRDIFF_45LEFT : DIRDIFF_45RIGHT); |
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
906 |
return ChangeDir(old_dir, delta); |
0 | 907 |
} |
908 |
||
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
909 |
struct OvertakeData { |
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
910 |
const Vehicle* u; |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
911 |
const Vehicle* v; |
1977
4392ae3d8e31
(svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents:
1942
diff
changeset
|
912 |
TileIndex tile; |
9105
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
913 |
Trackdir trackdir; |
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
914 |
}; |
0 | 915 |
|
9105
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
916 |
static void* EnumFindVehBlockingOvertake(Vehicle* v, void* data) |
0 | 917 |
{ |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
918 |
const OvertakeData* od = (OvertakeData*)data; |
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
919 |
|
3017
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
920 |
return |
8577
fc4b7dd34058
(svn r11642) -Codechange: VehicleFromPos does check for v->tile == tile, so remove useless checks
smatz
parents:
8556
diff
changeset
|
921 |
v->type == VEH_ROAD && v->First() == v && v != od->u && v != od->v ? |
3017
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
922 |
v : NULL; |
0 | 923 |
} |
924 |
||
9105
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
925 |
/** |
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
926 |
* Check if overtaking is possible on a piece of track |
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
927 |
* |
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
928 |
* @param od Information about the tile and the involved vehicles |
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
929 |
* @return true if we have to abort overtaking |
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
930 |
*/ |
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
931 |
static bool CheckRoadBlockedForOvertaking(OvertakeData *od) |
0 | 932 |
{ |
9112
ec6800eaa340
(svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents:
9107
diff
changeset
|
933 |
TrackStatus ts = GetTileTrackStatus(od->tile, TRANSPORT_ROAD, od->v->u.road.compatible_roadtypes); |
ec6800eaa340
(svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents:
9107
diff
changeset
|
934 |
TrackdirBits trackdirbits = TrackStatusToTrackdirBits(ts); |
ec6800eaa340
(svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents:
9107
diff
changeset
|
935 |
TrackdirBits red_signals = TrackStatusToRedSignals(ts); // barred level crossing |
9105
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
936 |
TrackBits trackbits = TrackdirBitsToTrackBits(trackdirbits); |
0 | 937 |
|
9105
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
938 |
/* Track does not continue along overtaking direction || track has junction || levelcrossing is barred */ |
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
939 |
if (!HasBit(trackdirbits, od->trackdir) || (trackbits & ~TRACK_BIT_CROSS) || (red_signals != TRACKDIR_BIT_NONE)) return true; |
0 | 940 |
|
9105
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
941 |
/* Are there more vehicles on the tile except the two vehicles involved in overtaking */ |
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
942 |
return VehicleFromPos(od->tile, od, EnumFindVehBlockingOvertake) != NULL; |
0 | 943 |
} |
944 |
||
945 |
static void RoadVehCheckOvertake(Vehicle *v, Vehicle *u) |
|
946 |
{ |
|
947 |
OvertakeData od; |
|
948 |
||
949 |
od.v = v; |
|
950 |
od.u = u; |
|
951 |
||
952 |
if (u->max_speed >= v->max_speed && |
|
3431 | 953 |
!(u->vehstatus & VS_STOPPED) && |
2951 | 954 |
u->cur_speed != 0) { |
955 |
return; |
|
956 |
} |
|
0 | 957 |
|
7183
23b20a982228
(svn r9919) -Codechange: prepare some more places for more road types.
rubidium
parents:
7181
diff
changeset
|
958 |
/* Trams can't overtake other trams */ |
23b20a982228
(svn r9919) -Codechange: prepare some more places for more road types.
rubidium
parents:
7181
diff
changeset
|
959 |
if (v->u.road.roadtype == ROADTYPE_TRAM) return; |
23b20a982228
(svn r9919) -Codechange: prepare some more places for more road types.
rubidium
parents:
7181
diff
changeset
|
960 |
|
8165
606d97bce909
(svn r11200) -Fix [FS#1291]: road vehicles could not overtake on one way roads going to the east.
rubidium
parents:
8138
diff
changeset
|
961 |
/* Don't overtake in stations */ |
606d97bce909
(svn r11200) -Fix [FS#1291]: road vehicles could not overtake on one way roads going to the east.
rubidium
parents:
8138
diff
changeset
|
962 |
if (IsTileType(v->tile, MP_STATION)) return; |
606d97bce909
(svn r11200) -Fix [FS#1291]: road vehicles could not overtake on one way roads going to the east.
rubidium
parents:
8138
diff
changeset
|
963 |
|
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
964 |
/* For now, articulated road vehicles can't overtake anything. */ |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
965 |
if (RoadVehHasArticPart(v)) return; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
966 |
|
9105
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
967 |
/* Vehicles are not driving in same direction || direction is not a diagonal direction */ |
3033
e4f7c60a1742
(svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents:
3032
diff
changeset
|
968 |
if (v->direction != u->direction || !(v->direction & 1)) return; |
0 | 969 |
|
6326
c904c7ea1c8d
(svn r8715) -Codechange/cleanup: replace magic numbers related to state of road vehicles with enums. Original patch by mart3p.
rubidium
parents:
6325
diff
changeset
|
970 |
/* Check if vehicle is in a road stop, depot, tunnel or bridge or not on a straight road */ |
6457
2c447a703ec6
(svn r8868) -Fix (r8715): road vehicles could not overtake anymore in some directions (mart3p).
rubidium
parents:
6338
diff
changeset
|
971 |
if (v->u.road.state >= RVSB_IN_ROAD_STOP || !IsStraightRoadTrackdir((Trackdir)(v->u.road.state & RVSB_TRACKDIR_MASK))) return; |
0 | 972 |
|
10546
07ab34af246e
(svn r13090) -Codechange: add functions for direct conversion from DiagDirection to Track and Trackbits
smatz
parents:
10429
diff
changeset
|
973 |
od.trackdir = DiagDirToDiagTrackdir(DirToDiagDir(v->direction)); |
8165
606d97bce909
(svn r11200) -Fix [FS#1291]: road vehicles could not overtake on one way roads going to the east.
rubidium
parents:
8138
diff
changeset
|
974 |
|
9105
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
975 |
/* Are the current and the next tile suitable for overtaking? |
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
976 |
* - Does the track continue along od.trackdir |
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
977 |
* - No junctions |
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
978 |
* - No barred levelcrossing |
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
979 |
* - No other vehicles in the way |
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
980 |
*/ |
0 | 981 |
od.tile = v->tile; |
9105
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
982 |
if (CheckRoadBlockedForOvertaking(&od)) return; |
0 | 983 |
|
4559
c853d2440065
(svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents:
4549
diff
changeset
|
984 |
od.tile = v->tile + TileOffsByDiagDir(DirToDiagDir(v->direction)); |
9105
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
985 |
if (CheckRoadBlockedForOvertaking(&od)) return; |
0 | 986 |
|
3431 | 987 |
if (od.u->cur_speed == 0 || od.u->vehstatus& VS_STOPPED) { |
0 | 988 |
v->u.road.overtaking_ctr = 0x11; |
989 |
v->u.road.overtaking = 0x10; |
|
990 |
} else { |
|
9105
ecc85c6d9176
(svn r12191) -Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles.
frosch
parents:
9059
diff
changeset
|
991 |
// if (CheckRoadBlockedForOvertaking(&od)) return; |
0 | 992 |
v->u.road.overtaking_ctr = 0; |
993 |
v->u.road.overtaking = 0x10; |
|
994 |
} |
|
995 |
} |
|
996 |
||
997 |
static void RoadZPosAffectSpeed(Vehicle *v, byte old_z) |
|
998 |
{ |
|
3017
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
999 |
if (old_z == v->z_pos) return; |
0 | 1000 |
|
1001 |
if (old_z < v->z_pos) { |
|
3017
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
1002 |
v->cur_speed = v->cur_speed * 232 / 256; // slow down by ~10% |
0 | 1003 |
} else { |
1004 |
uint16 spd = v->cur_speed + 2; |
|
3017
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
1005 |
if (spd <= v->max_speed) v->cur_speed = spd; |
0 | 1006 |
} |
1007 |
} |
|
1008 |
||
1009 |
static int PickRandomBit(uint bits) |
|
1010 |
{ |
|
1011 |
uint i; |
|
8328
6909973c8359
(svn r11382) -Codechange: renamed COUNTBITS to CountBits, as it is no longer a macro (skidd13)
truelight
parents:
8313
diff
changeset
|
1012 |
uint num = RandomRange(CountBits(bits)); |
0 | 1013 |
|
3017
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
1014 |
for (i = 0; !(bits & 1) || (int)--num >= 0; bits >>= 1, i++) {} |
0 | 1015 |
return i; |
1016 |
} |
|
1017 |
||
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
1018 |
struct FindRoadToChooseData { |
0 | 1019 |
TileIndex dest; |
1020 |
uint maxtracklen; |
|
1021 |
uint mindist; |
|
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
1022 |
}; |
0 | 1023 |
|
9107
3e57b96e98f2
(svn r12193) -Codechange: Rename a magic variable, give it a decent type, and remove a 'goto'.
frosch
parents:
9105
diff
changeset
|
1024 |
static bool EnumRoadTrackFindDist(TileIndex tile, void* data, Trackdir trackdir, uint length) |
0 | 1025 |
{ |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
1026 |
FindRoadToChooseData* frd = (FindRoadToChooseData*)data; |
1245
768d9bc95aaa
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1239
diff
changeset
|
1027 |
uint dist = DistanceManhattan(tile, frd->dest); |
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
1028 |
|
0 | 1029 |
if (dist <= frd->mindist) { |
1030 |
if (dist != frd->mindist || length < frd->maxtracklen) { |
|
1031 |
frd->maxtracklen = length; |
|
1032 |
} |
|
1033 |
frd->mindist = dist; |
|
1034 |
} |
|
1035 |
return false; |
|
1036 |
} |
|
1037 |
||
9006
f68ac871be5c
(svn r12085) -Fix(r12058): Road vehicles could get stuck, when NPF told them to reverse on junction tiles. (spotted by SmatZ)
frosch
parents:
9002
diff
changeset
|
1038 |
static inline NPFFoundTargetData PerfNPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, bool ignore_start_tile, NPFFindStationOrTileData* target, TransportType type, uint sub_type, Owner owner, RailTypes railtypes) |
3900
4984308f9125
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
1039 |
{ |
4984308f9125
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
1040 |
|
4984308f9125
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
1041 |
void* perf = NpfBeginInterval(); |
9006
f68ac871be5c
(svn r12085) -Fix(r12058): Road vehicles could get stuck, when NPF told them to reverse on junction tiles. (spotted by SmatZ)
frosch
parents:
9002
diff
changeset
|
1042 |
NPFFoundTargetData ret = NPFRouteToStationOrTile(tile, trackdir, ignore_start_tile, target, type, sub_type, owner, railtypes); |
3900
4984308f9125
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
1043 |
int t = NpfEndInterval(perf); |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
1044 |
DEBUG(yapf, 4, "[NPFR] %d us - %d rounds - %d open - %d closed -- ", t, 0, _aystar_stats_open_size, _aystar_stats_closed_size); |
3900
4984308f9125
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
1045 |
return ret; |
4984308f9125
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
1046 |
} |
4984308f9125
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
1047 |
|
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1048 |
/** |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1049 |
* Returns direction to for a road vehicle to take or |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1050 |
* INVALID_TRACKDIR if the direction is currently blocked |
6979
d194d25020e7
(svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents:
6949
diff
changeset
|
1051 |
* @param v the Vehicle to do the pathfinding for |
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1052 |
* @param tile the where to start the pathfinding |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1053 |
* @param enterdir the direction the vehicle enters the tile from |
6979
d194d25020e7
(svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents:
6949
diff
changeset
|
1054 |
* @return the Trackdir to take |
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1055 |
*/ |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1056 |
static Trackdir RoadFindPathToDest(Vehicle* v, TileIndex tile, DiagDirection enterdir) |
0 | 1057 |
{ |
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1058 |
#define return_track(x) { best_track = (Trackdir)x; goto found_best_track; } |
0 | 1059 |
|
1977
4392ae3d8e31
(svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents:
1942
diff
changeset
|
1060 |
TileIndex desttile; |
0 | 1061 |
FindRoadToChooseData frd; |
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1062 |
Trackdir best_track; |
0 | 1063 |
|
9112
ec6800eaa340
(svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents:
9107
diff
changeset
|
1064 |
TrackStatus ts = GetTileTrackStatus(tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes); |
ec6800eaa340
(svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents:
9107
diff
changeset
|
1065 |
TrackdirBits red_signals = TrackStatusToRedSignals(ts); // crossing |
ec6800eaa340
(svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents:
9107
diff
changeset
|
1066 |
TrackdirBits trackdirs = TrackStatusToTrackdirBits(ts); |
0 | 1067 |
|
7866
e19fda04e8d3
(svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents:
7830
diff
changeset
|
1068 |
if (IsTileType(tile, MP_ROAD)) { |
9059
04edde3eb0c6
(svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents:
9052
diff
changeset
|
1069 |
if (IsRoadDepot(tile) && (!IsTileOwner(tile, v->owner) || GetRoadDepotDirection(tile) == enterdir || (GetRoadTypes(tile) & v->u.road.compatible_roadtypes) == 0)) { |
4445
562232eef864
(svn r6223) -Fix: RVs with empty order list were able to enter the depot or road stop from the back. I introduced this bug when I "improved" GetTileTrackStatus(). (thanks glx for the report and fix).
KUDr
parents:
4434
diff
changeset
|
1070 |
/* Road depot owned by another player or with the wrong orientation */ |
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1071 |
trackdirs = TRACKDIR_BIT_NONE; |
2549 | 1072 |
} |
6338
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1073 |
} else if (IsTileType(tile, MP_STATION) && IsStandardRoadStopTile(tile)) { |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1074 |
/* Standard road stop (drive-through stops are treated as normal road) */ |
7965
c1a170885a60
(svn r10974) -Fix [FS#1144, FS#1155]: road vehicles that could not (properly) use a road stop still tried to go to that road stop.
rubidium
parents:
7946
diff
changeset
|
1075 |
|
c1a170885a60
(svn r10974) -Fix [FS#1144, FS#1155]: road vehicles that could not (properly) use a road stop still tried to go to that road stop.
rubidium
parents:
7946
diff
changeset
|
1076 |
if (!IsTileOwner(tile, v->owner) || GetRoadStopDir(tile) == enterdir || RoadVehHasArticPart(v)) { |
c1a170885a60
(svn r10974) -Fix [FS#1144, FS#1155]: road vehicles that could not (properly) use a road stop still tried to go to that road stop.
rubidium
parents:
7946
diff
changeset
|
1077 |
/* different station owner or wrong orientation or the vehicle has articulated parts */ |
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1078 |
trackdirs = TRACKDIR_BIT_NONE; |
3937
60b89172e88e
(svn r5080) -Fix: RVs can enter other player's depot or roadstop (introduced by YAPF related change of GetTileTrackStatus() - r4419)
KUDr
parents:
3933
diff
changeset
|
1079 |
} else { |
241
e6e62a5e7f52
(svn r242) -Fix: Pathfinding bug for road vehicles introduced in r160 fixed (blathijs)
darkvater
parents:
193
diff
changeset
|
1080 |
/* Our station */ |
9281
d8cd9ac52a68
(svn r12489) -Codechange: split station.h into station_base.h and station_func.h.
rubidium
parents:
9280
diff
changeset
|
1081 |
RoadStopType rstype = IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? ROADSTOP_BUS : ROADSTOP_TRUCK; |
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
1082 |
|
3937
60b89172e88e
(svn r5080) -Fix: RVs can enter other player's depot or roadstop (introduced by YAPF related change of GetTileTrackStatus() - r4419)
KUDr
parents:
3933
diff
changeset
|
1083 |
if (GetRoadStopType(tile) != rstype) { |
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1084 |
/* Wrong station type */ |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1085 |
trackdirs = TRACKDIR_BIT_NONE; |
3937
60b89172e88e
(svn r5080) -Fix: RVs can enter other player's depot or roadstop (introduced by YAPF related change of GetTileTrackStatus() - r4419)
KUDr
parents:
3933
diff
changeset
|
1086 |
} else { |
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1087 |
/* Proper station type, check if there is free loading bay */ |
10775
7061477bfbcf
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
10707
diff
changeset
|
1088 |
if (!_settings_game.pf.roadveh_queue && IsStandardRoadStopTile(tile) && |
6316
6ba1efc2b7fc
(svn r8694) -Codechange: make RoadStop's status accessible via accessor functions.
rubidium
parents:
6315
diff
changeset
|
1089 |
!GetRoadStopByTile(tile, rstype)->HasFreeBay()) { |
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1090 |
/* Station is full and RV queuing is off */ |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1091 |
trackdirs = TRACKDIR_BIT_NONE; |
3092
e790a2dbda83
(svn r3681) - [Multistop] Check the RoadStop type before check its status. This fixes an assert introduced in r3663. Also fix the return type of GetRoadStopType().
peter1138
parents:
3074
diff
changeset
|
1092 |
} |
241
e6e62a5e7f52
(svn r242) -Fix: Pathfinding bug for road vehicles introduced in r160 fixed (blathijs)
darkvater
parents:
193
diff
changeset
|
1093 |
} |
e6e62a5e7f52
(svn r242) -Fix: Pathfinding bug for road vehicles introduced in r160 fixed (blathijs)
darkvater
parents:
193
diff
changeset
|
1094 |
} |
e6e62a5e7f52
(svn r242) -Fix: Pathfinding bug for road vehicles introduced in r160 fixed (blathijs)
darkvater
parents:
193
diff
changeset
|
1095 |
} |
e6e62a5e7f52
(svn r242) -Fix: Pathfinding bug for road vehicles introduced in r160 fixed (blathijs)
darkvater
parents:
193
diff
changeset
|
1096 |
/* The above lookups should be moved to GetTileTrackStatus in the |
e6e62a5e7f52
(svn r242) -Fix: Pathfinding bug for road vehicles introduced in r160 fixed (blathijs)
darkvater
parents:
193
diff
changeset
|
1097 |
* future, but that requires more changes to the pathfinder and other |
e6e62a5e7f52
(svn r242) -Fix: Pathfinding bug for road vehicles introduced in r160 fixed (blathijs)
darkvater
parents:
193
diff
changeset
|
1098 |
* stuff, probably even more arguments to GTTS. |
e6e62a5e7f52
(svn r242) -Fix: Pathfinding bug for road vehicles introduced in r160 fixed (blathijs)
darkvater
parents:
193
diff
changeset
|
1099 |
*/ |
0 | 1100 |
|
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1101 |
/* Remove tracks unreachable from the enter dir */ |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1102 |
trackdirs &= _road_enter_dir_to_reachable_trackdirs[enterdir]; |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1103 |
if (trackdirs == TRACKDIR_BIT_NONE) { |
1247 | 1104 |
/* No reachable tracks, so we'll reverse */ |
1105 |
return_track(_road_reverse_table[enterdir]); |
|
0 | 1106 |
} |
1107 |
||
1108 |
if (v->u.road.reverse_ctr != 0) { |
|
1247 | 1109 |
/* What happens here?? */ |
0 | 1110 |
v->u.road.reverse_ctr = 0; |
1986
5dd3db2b86d7
(svn r2492) Remove some pointless casts and fix some nearby indentation
tron
parents:
1980
diff
changeset
|
1111 |
if (v->tile != tile) { |
1247 | 1112 |
return_track(_road_reverse_table[enterdir]); |
0 | 1113 |
} |
1114 |
} |
|
1115 |
||
1116 |
desttile = v->dest_tile; |
|
1117 |
if (desttile == 0) { |
|
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1118 |
/* We've got no destination, pick a random track */ |
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1119 |
return_track(PickRandomBit(trackdirs)); |
0 | 1120 |
} |
1121 |
||
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1122 |
/* Only one track to choose between? */ |
8331
bf1b4474e288
(svn r11385) -Fix r11383: bool operation can be hard to translate for some people ;) (tnx fjb for noticing this bug ;))
truelight
parents:
8329
diff
changeset
|
1123 |
if (KillFirstBit(trackdirs) == TRACKDIR_BIT_NONE) { |
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1124 |
return_track(FindFirstBit2x64(trackdirs)); |
0 | 1125 |
} |
1126 |
||
10775
7061477bfbcf
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
10707
diff
changeset
|
1127 |
switch (_settings_game.pf.pathfinder_for_roadvehs) { |
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1128 |
case VPF_YAPF: { /* YAPF */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1129 |
Trackdir trackdir = YapfChooseRoadTrack(v, tile, enterdir); |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1130 |
if (trackdir != INVALID_TRACKDIR) return_track(trackdir); |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1131 |
return_track(PickRandomBit(trackdirs)); |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1132 |
} break; |
1247 | 1133 |
|
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1134 |
case VPF_NPF: { /* NPF */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1135 |
NPFFindStationOrTileData fstd; |
3167
197b5ee5a831
(svn r3795) Add a function to request the orientation of a depot
tron
parents:
3161
diff
changeset
|
1136 |
|
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1137 |
NPFFillWithOrderData(&fstd, v); |
10546
07ab34af246e
(svn r13090) -Codechange: add functions for direct conversion from DiagDirection to Track and Trackbits
smatz
parents:
10429
diff
changeset
|
1138 |
Trackdir trackdir = DiagDirToDiagTrackdir(enterdir); |
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1139 |
//debug("Finding path. Enterdir: %d, Trackdir: %d", enterdir, trackdir); |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1140 |
|
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1141 |
NPFFoundTargetData ftd = PerfNPFRouteToStationOrTile(tile - TileOffsByDiagDir(enterdir), trackdir, true, &fstd, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, v->owner, INVALID_RAILTYPES); |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1142 |
if (ftd.best_trackdir == INVALID_TRACKDIR) { |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1143 |
/* We are already at our target. Just do something |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1144 |
* @todo: maybe display error? |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1145 |
* @todo: go straight ahead if possible? */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1146 |
return_track(FindFirstBit2x64(trackdirs)); |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1147 |
} else { |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1148 |
/* If ftd.best_bird_dist is 0, we found our target and ftd.best_trackdir contains |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1149 |
* the direction we need to take to get there, if ftd.best_bird_dist is not 0, |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1150 |
* we did not find our target, but ftd.best_trackdir contains the direction leading |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1151 |
* to the tile closest to our target. */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1152 |
return_track(ftd.best_trackdir); |
3167
197b5ee5a831
(svn r3795) Add a function to request the orientation of a depot
tron
parents:
3161
diff
changeset
|
1153 |
} |
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1154 |
} break; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1155 |
|
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1156 |
default: |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1157 |
case VPF_OPF: { /* OPF */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1158 |
DiagDirection dir; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1159 |
|
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1160 |
if (IsTileType(desttile, MP_ROAD)) { |
9059
04edde3eb0c6
(svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents:
9052
diff
changeset
|
1161 |
if (IsRoadDepot(desttile)) { |
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1162 |
dir = GetRoadDepotDirection(desttile); |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1163 |
goto do_it; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1164 |
} |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1165 |
} else if (IsTileType(desttile, MP_STATION)) { |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1166 |
/* For drive-through stops we can head for the actual station tile */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1167 |
if (IsStandardRoadStopTile(desttile)) { |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1168 |
dir = GetRoadStopDir(desttile); |
0 | 1169 |
do_it:; |
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1170 |
/* When we are heading for a depot or station, we just |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1171 |
* pretend we are heading for the tile in front, we'll |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1172 |
* see from there */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1173 |
desttile += TileOffsByDiagDir(dir); |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1174 |
if (desttile == tile && trackdirs & _road_exit_dir_to_incoming_trackdirs[dir]) { |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1175 |
/* If we are already in front of the |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1176 |
* station/depot and we can get in from here, |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1177 |
* we enter */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1178 |
return_track(FindFirstBit2x64(trackdirs & _road_exit_dir_to_incoming_trackdirs[dir])); |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1179 |
} |
1247 | 1180 |
} |
0 | 1181 |
} |
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1182 |
/* Do some pathfinding */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1183 |
frd.dest = desttile; |
0 | 1184 |
|
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1185 |
best_track = INVALID_TRACKDIR; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1186 |
uint best_dist = UINT_MAX; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1187 |
uint best_maxlen = UINT_MAX; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1188 |
uint bitmask = (uint)trackdirs; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1189 |
uint i; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1190 |
FOR_EACH_SET_BIT(i, bitmask) { |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1191 |
if (best_track == INVALID_TRACKDIR) best_track = (Trackdir)i; // in case we don't find the path, just pick a track |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1192 |
frd.maxtracklen = UINT_MAX; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1193 |
frd.mindist = UINT_MAX; |
9296
5878a50c67b2
(svn r12540) -Codechange: Enumify some values in original pathfinder and remove an unused variable.
frosch
parents:
9289
diff
changeset
|
1194 |
FollowTrack(tile, PATHFIND_FLAGS_NONE, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, _road_pf_directions[i], EnumRoadTrackFindDist, NULL, &frd); |
0 | 1195 |
|
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1196 |
if (frd.mindist < best_dist || (frd.mindist == best_dist && frd.maxtracklen < best_maxlen)) { |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1197 |
best_dist = frd.mindist; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1198 |
best_maxlen = frd.maxtracklen; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1199 |
best_track = (Trackdir)i; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1200 |
} |
0 | 1201 |
} |
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1202 |
} break; |
1247 | 1203 |
} |
0 | 1204 |
|
1205 |
found_best_track:; |
|
1206 |
||
9112
ec6800eaa340
(svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents:
9107
diff
changeset
|
1207 |
if (HasBit(red_signals, best_track)) return INVALID_TRACKDIR; |
0 | 1208 |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1209 |
return best_track; |
0 | 1210 |
} |
1211 |
||
3123 | 1212 |
static uint RoadFindPathToStop(const Vehicle *v, TileIndex tile) |
1217
ab9f02a224ab
(svn r1721) -Feature: It is now possible to build multiple road stations (up to 8) on
celestar
parents:
1209
diff
changeset
|
1213 |
{ |
10775
7061477bfbcf
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
10707
diff
changeset
|
1214 |
if (_settings_game.pf.pathfinder_for_roadvehs == VPF_YAPF) { |
6889
f7f6d9cb07a0
(svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents:
6683
diff
changeset
|
1215 |
/* use YAPF */ |
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1216 |
return YapfRoadVehDistanceToTile(v, tile); |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1217 |
} |
1217
ab9f02a224ab
(svn r1721) -Feature: It is now possible to build multiple road stations (up to 8) on
celestar
parents:
1209
diff
changeset
|
1218 |
|
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1219 |
/* use NPF */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1220 |
Trackdir trackdir = GetVehicleTrackdir(v); |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1221 |
assert(trackdir != INVALID_TRACKDIR); |
1217
ab9f02a224ab
(svn r1721) -Feature: It is now possible to build multiple road stations (up to 8) on
celestar
parents:
1209
diff
changeset
|
1222 |
|
9050
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1223 |
NPFFindStationOrTileData fstd; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1224 |
fstd.dest_coords = tile; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1225 |
fstd.station_index = INVALID_STATION; // indicates that the destination is a tile, not a station |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1226 |
|
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1227 |
uint dist = NPFRouteToStationOrTile(v->tile, trackdir, false, &fstd, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, v->owner, INVALID_RAILTYPES).best_path_dist; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1228 |
/* change units from NPF_TILE_LENGTH to # of tiles */ |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1229 |
if (dist != UINT_MAX) dist = (dist + NPF_TILE_LENGTH - 1) / NPF_TILE_LENGTH; |
c9b3ceb09413
(svn r12132) -Cleanup: convert pathfinder selection from if/else to switch/case at many places
smatz
parents:
9047
diff
changeset
|
1230 |
|
3915
281c7ebd27e0
(svn r5033) -CodeChange: [YAPF] RoadFindPathToStop() can now use YAPF for multistop handling.
KUDr
parents:
3900
diff
changeset
|
1231 |
return dist; |
1217
ab9f02a224ab
(svn r1721) -Feature: It is now possible to build multiple road stations (up to 8) on
celestar
parents:
1209
diff
changeset
|
1232 |
} |
ab9f02a224ab
(svn r1721) -Feature: It is now possible to build multiple road stations (up to 8) on
celestar
parents:
1209
diff
changeset
|
1233 |
|
6329
13ccf5062387
(svn r8723) -Codechange: replace yet another couple of magic numbers with enums.
rubidium
parents:
6328
diff
changeset
|
1234 |
enum { |
13ccf5062387
(svn r8723) -Codechange: replace yet another couple of magic numbers with enums.
rubidium
parents:
6328
diff
changeset
|
1235 |
RDE_NEXT_TILE = 0x80, |
13ccf5062387
(svn r8723) -Codechange: replace yet another couple of magic numbers with enums.
rubidium
parents:
6328
diff
changeset
|
1236 |
RDE_TURNED = 0x40, |
6335
0c3dc188f099
(svn r8730) -Codechange: more replacements of magic numbers by enums and removal of some (by now) redundant comments.
rubidium
parents:
6331
diff
changeset
|
1237 |
|
0c3dc188f099
(svn r8730) -Codechange: more replacements of magic numbers by enums and removal of some (by now) redundant comments.
rubidium
parents:
6331
diff
changeset
|
1238 |
/* Start frames for when a vehicle enters a tile/changes its state. |
0c3dc188f099
(svn r8730) -Codechange: more replacements of magic numbers by enums and removal of some (by now) redundant comments.
rubidium
parents:
6331
diff
changeset
|
1239 |
* The start frame is different for vehicles that turned around or |
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1240 |
* are leaving the depot as the do not start at the edge of the tile. |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1241 |
* For trams there are a few different start frames as there are two |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1242 |
* places where trams can turn. */ |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1243 |
RVC_DEFAULT_START_FRAME = 0, |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1244 |
RVC_TURN_AROUND_START_FRAME = 1, |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1245 |
RVC_DEPOT_START_FRAME = 6, |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1246 |
RVC_START_FRAME_AFTER_LONG_TRAM = 22, |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1247 |
RVC_TURN_AROUND_START_FRAME_SHORT_TRAM = 16, |
6338
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1248 |
/* Stop frame for a vehicle in a drive-through stop */ |
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1249 |
RVC_DRIVE_THROUGH_STOP_FRAME = 7 |
6329
13ccf5062387
(svn r8723) -Codechange: replace yet another couple of magic numbers with enums.
rubidium
parents:
6328
diff
changeset
|
1250 |
}; |
13ccf5062387
(svn r8723) -Codechange: replace yet another couple of magic numbers with enums.
rubidium
parents:
6328
diff
changeset
|
1251 |
|
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
1252 |
struct RoadDriveEntry { |
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
1253 |
byte x, y; |
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
1254 |
}; |
0 | 1255 |
|
9002
e7570592e22c
(svn r12081) -Codechange: Rename table/roadveh.h to table/roadveh_movment.h
belugas
parents:
8987
diff
changeset
|
1256 |
#include "table/roadveh_movement.h" |
0 | 1257 |
|
1258 |
static const byte _road_veh_data_1[] = { |
|
1259 |
20, 20, 16, 16, 0, 0, 0, 0, |
|
1260 |
19, 19, 15, 15, 0, 0, 0, 0, |
|
1261 |
16, 16, 12, 12, 0, 0, 0, 0, |
|
1262 |
15, 15, 11, 11 |
|
1263 |
}; |
|
1264 |
||
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1265 |
static bool RoadVehLeaveDepot(Vehicle *v, bool first) |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1266 |
{ |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1267 |
/* Don't leave if not all the wagons are in the depot. */ |
7988
6075538f6111
(svn r11003) -Codechange: replace Vehicle->next to Vehicle->Next() and Vehicle->SetNext() so we can trap instances that change a next pointer and (in the future) update the first/previous pointers based on that.
rubidium
parents:
7986
diff
changeset
|
1268 |
for (const Vehicle *u = v; u != NULL; u = u->Next()) { |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1269 |
if (u->u.road.state != RVSB_IN_DEPOT || u->tile != v->tile) return false; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1270 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1271 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1272 |
DiagDirection dir = GetRoadDepotDirection(v->tile); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1273 |
v->direction = DiagDirToDir(dir); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1274 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1275 |
Trackdir tdir = _roadveh_depot_exit_trackdir[dir]; |
10775
7061477bfbcf
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
10707
diff
changeset
|
1276 |
const RoadDriveEntry *rdp = _road_drive_data[v->u.road.roadtype][(_settings_game.vehicle.road_side << RVS_DRIVE_SIDE) + tdir]; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1277 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1278 |
int x = TileX(v->tile) * TILE_SIZE + (rdp[RVC_DEPOT_START_FRAME].x & 0xF); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1279 |
int y = TileY(v->tile) * TILE_SIZE + (rdp[RVC_DEPOT_START_FRAME].y & 0xF); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1280 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1281 |
if (first) { |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1282 |
if (RoadVehFindCloseTo(v, x, y, v->direction) != NULL) return true; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1283 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1284 |
VehicleServiceInDepot(v); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1285 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1286 |
StartRoadVehSound(v); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1287 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1288 |
/* Vehicle is about to leave a depot */ |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1289 |
v->cur_speed = 0; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1290 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1291 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1292 |
BeginVehicleMove(v); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1293 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1294 |
v->vehstatus &= ~VS_HIDDEN; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1295 |
v->u.road.state = tdir; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1296 |
v->u.road.frame = RVC_DEPOT_START_FRAME; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1297 |
|
7630
2cd754d7dfa4
(svn r10408) -Codechange: make GetImage a class method of Vehicle instead of Get(Aircraft|RoadVeh|Ship|Train)Image.
rubidium
parents:
7592
diff
changeset
|
1298 |
v->cur_image = v->GetImage(v->direction); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1299 |
v->UpdateDeltaXY(v->direction); |
10229
fba3f9fa44d7
(svn r12761) -Codechange: lots of minor whitespace coding style fixes around operators.
rubidium
parents:
10222
diff
changeset
|
1300 |
SetRoadVehPosition(v, x, y); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1301 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1302 |
InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1303 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1304 |
return true; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1305 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1306 |
|
7912
fe352c500b3b
(svn r10809) -Fix (r10097): When reversing, articulated parts of road vehicles should not attempt to do their own pathfinding.
maedhros
parents:
7894
diff
changeset
|
1307 |
static Trackdir FollowPreviousRoadVehicle(const Vehicle *v, const Vehicle *prev, TileIndex tile, DiagDirection entry_dir, bool already_reversed) |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1308 |
{ |
7912
fe352c500b3b
(svn r10809) -Fix (r10097): When reversing, articulated parts of road vehicles should not attempt to do their own pathfinding.
maedhros
parents:
7894
diff
changeset
|
1309 |
if (prev->tile == v->tile && !already_reversed) { |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1310 |
/* If the previous vehicle is on the same tile as this vehicle is |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1311 |
* then it must have reversed. */ |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1312 |
return _road_reverse_table[entry_dir]; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1313 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1314 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1315 |
byte prev_state = prev->u.road.state; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1316 |
Trackdir dir; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1317 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1318 |
if (prev_state == RVSB_WORMHOLE || prev_state == RVSB_IN_DEPOT) { |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1319 |
DiagDirection diag_dir = INVALID_DIAGDIR; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1320 |
|
8584
a8b6dffead63
(svn r11649) -Codechange: some code can be simplified thanks to changes in r11642
smatz
parents:
8579
diff
changeset
|
1321 |
if (IsTileType(tile, MP_TUNNELBRIDGE)) { |
8579
3efbb430092e
(svn r11644) -Codechange: merge some functions from tunnel_map.h and bridge_map.h into tunnelbridge_map.h
smatz
parents:
8577
diff
changeset
|
1322 |
diag_dir = GetTunnelBridgeDirection(tile); |
9059
04edde3eb0c6
(svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents:
9052
diff
changeset
|
1323 |
} else if (IsRoadDepotTile(tile)) { |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1324 |
diag_dir = ReverseDiagDir(GetRoadDepotDirection(tile)); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1325 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1326 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1327 |
if (diag_dir == INVALID_DIAGDIR) return INVALID_TRACKDIR; |
10546
07ab34af246e
(svn r13090) -Codechange: add functions for direct conversion from DiagDirection to Track and Trackbits
smatz
parents:
10429
diff
changeset
|
1328 |
dir = DiagDirToDiagTrackdir(diag_dir); |
8757
b74c2fd3a0da
(svn r11825) -Fix (FS#1627): an articulated road vehicle could split up when it turned around at a corner and then would enter a drive through station at the next tile.
rubidium
parents:
8754
diff
changeset
|
1329 |
} else { |
8365
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1330 |
if (already_reversed && prev->tile != tile) { |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1331 |
/* |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1332 |
* The vehicle has reversed, but did not go straight back. |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1333 |
* It immediatelly turn onto another tile. This means that |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1334 |
* the roadstate of the previous vehicle cannot be used |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1335 |
* as the direction we have to go with this vehicle. |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1336 |
* |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1337 |
* Next table is build in the following way: |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1338 |
* - first row for when the vehicle in front went to the northern or |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1339 |
* western tile, second for southern and eastern. |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1340 |
* - columns represent the entry direction. |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1341 |
* - cell values are determined by the Trackdir one has to take from |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1342 |
* the entry dir (column) to the tile in north or south by only |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1343 |
* going over the trackdirs used for turning 90 degrees, i.e. |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1344 |
* TRACKDIR_{UPPER,RIGHT,LOWER,LEFT}_{N,E,S,W}. |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1345 |
*/ |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1346 |
Trackdir reversed_turn_lookup[2][DIAGDIR_END] = { |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1347 |
{ TRACKDIR_UPPER_W, TRACKDIR_RIGHT_N, TRACKDIR_LEFT_N, TRACKDIR_UPPER_E }, |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1348 |
{ TRACKDIR_RIGHT_S, TRACKDIR_LOWER_W, TRACKDIR_LOWER_E, TRACKDIR_LEFT_S }}; |
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1349 |
dir = reversed_turn_lookup[prev->tile < tile ? 0 : 1][ReverseDiagDir(entry_dir)]; |
8757
b74c2fd3a0da
(svn r11825) -Fix (FS#1627): an articulated road vehicle could split up when it turned around at a corner and then would enter a drive through station at the next tile.
rubidium
parents:
8754
diff
changeset
|
1350 |
} else if (HasBit(prev_state, RVS_IN_DT_ROAD_STOP)) { |
b74c2fd3a0da
(svn r11825) -Fix (FS#1627): an articulated road vehicle could split up when it turned around at a corner and then would enter a drive through station at the next tile.
rubidium
parents:
8754
diff
changeset
|
1351 |
dir = (Trackdir)(prev_state & RVSB_ROAD_STOP_TRACKDIR_MASK); |
b74c2fd3a0da
(svn r11825) -Fix (FS#1627): an articulated road vehicle could split up when it turned around at a corner and then would enter a drive through station at the next tile.
rubidium
parents:
8754
diff
changeset
|
1352 |
} else if (prev_state < TRACKDIR_END) { |
8365
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1353 |
dir = (Trackdir)prev_state; |
8757
b74c2fd3a0da
(svn r11825) -Fix (FS#1627): an articulated road vehicle could split up when it turned around at a corner and then would enter a drive through station at the next tile.
rubidium
parents:
8754
diff
changeset
|
1354 |
} else { |
b74c2fd3a0da
(svn r11825) -Fix (FS#1627): an articulated road vehicle could split up when it turned around at a corner and then would enter a drive through station at the next tile.
rubidium
parents:
8754
diff
changeset
|
1355 |
return INVALID_TRACKDIR; |
8365
542dc6f931ce
(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.
rubidium
parents:
8331
diff
changeset
|
1356 |
} |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1357 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1358 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1359 |
/* Do some sanity checking. */ |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1360 |
static const RoadBits required_roadbits[] = { |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1361 |
ROAD_X, ROAD_Y, ROAD_NW | ROAD_NE, ROAD_SW | ROAD_SE, |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1362 |
ROAD_NW | ROAD_SW, ROAD_NE | ROAD_SE, ROAD_X, ROAD_Y |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1363 |
}; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1364 |
RoadBits required = required_roadbits[dir & 0x07]; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1365 |
|
9212
3503ffa351b6
(svn r12390) -Fix [FS#1851]: trams failing to turn on bridge heads/tunnel entrances.
rubidium
parents:
9122
diff
changeset
|
1366 |
if ((required & GetAnyRoadBits(tile, v->u.road.roadtype, true)) == ROAD_NONE) { |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1367 |
dir = INVALID_TRACKDIR; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1368 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1369 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1370 |
return dir; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1371 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1372 |
|
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1373 |
/** |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1374 |
* Can a tram track build without destruction on the given tile? |
8556
50b175a55d6b
(svn r11621) -Fix [FS#1525]: there were still some cases where one could not build a tram track, but the tram could become blocked.
rubidium
parents:
8507
diff
changeset
|
1375 |
* @param p the player that would be building the tram tracks |
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1376 |
* @param t the tile to build on. |
8556
50b175a55d6b
(svn r11621) -Fix [FS#1525]: there were still some cases where one could not build a tram track, but the tram could become blocked.
rubidium
parents:
8507
diff
changeset
|
1377 |
* @param r the road bits needed. |
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1378 |
* @return true when a track track can be build on 't' |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1379 |
*/ |
8556
50b175a55d6b
(svn r11621) -Fix [FS#1525]: there were still some cases where one could not build a tram track, but the tram could become blocked.
rubidium
parents:
8507
diff
changeset
|
1380 |
static bool CanBuildTramTrackOnTile(PlayerID p, TileIndex t, RoadBits r) |
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1381 |
{ |
8556
50b175a55d6b
(svn r11621) -Fix [FS#1525]: there were still some cases where one could not build a tram track, but the tram could become blocked.
rubidium
parents:
8507
diff
changeset
|
1382 |
/* The 'current' player is not necessarily the owner of the vehicle. */ |
50b175a55d6b
(svn r11621) -Fix [FS#1525]: there were still some cases where one could not build a tram track, but the tram could become blocked.
rubidium
parents:
8507
diff
changeset
|
1383 |
PlayerID original_player = _current_player; |
50b175a55d6b
(svn r11621) -Fix [FS#1525]: there were still some cases where one could not build a tram track, but the tram could become blocked.
rubidium
parents:
8507
diff
changeset
|
1384 |
_current_player = p; |
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1385 |
|
8556
50b175a55d6b
(svn r11621) -Fix [FS#1525]: there were still some cases where one could not build a tram track, but the tram could become blocked.
rubidium
parents:
8507
diff
changeset
|
1386 |
CommandCost ret = DoCommand(t, ROADTYPE_TRAM << 4 | r, 0, 0, CMD_BUILD_ROAD); |
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1387 |
|
8556
50b175a55d6b
(svn r11621) -Fix [FS#1525]: there were still some cases where one could not build a tram track, but the tram could become blocked.
rubidium
parents:
8507
diff
changeset
|
1388 |
_current_player = original_player; |
50b175a55d6b
(svn r11621) -Fix [FS#1525]: there were still some cases where one could not build a tram track, but the tram could become blocked.
rubidium
parents:
8507
diff
changeset
|
1389 |
return CmdSucceeded(ret); |
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1390 |
} |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1391 |
|
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1392 |
static bool IndividualRoadVehicleController(Vehicle *v, const Vehicle *prev) |
0 | 1393 |
{ |
3157
40de8616c04c
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3153
diff
changeset
|
1394 |
Direction new_dir; |
40de8616c04c
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3153
diff
changeset
|
1395 |
Direction old_dir; |
0 | 1396 |
RoadDriveEntry rd; |
10229
fba3f9fa44d7
(svn r12761) -Codechange: lots of minor whitespace coding style fixes around operators.
rubidium
parents:
10222
diff
changeset
|
1397 |
int x, y; |
0 | 1398 |
uint32 r; |
1399 |
||
1400 |
if (v->u.road.overtaking != 0) { |
|
8507
1d4060189029
(svn r11571) -Fix [FS#1493]: road vehicle getting to the wrong side of a station when trying to overtake in there.
rubidium
parents:
8501
diff
changeset
|
1401 |
if (IsTileType(v->tile, MP_STATION)) { |
1d4060189029
(svn r11571) -Fix [FS#1493]: road vehicle getting to the wrong side of a station when trying to overtake in there.
rubidium
parents:
8501
diff
changeset
|
1402 |
/* Force us to be not overtaking! */ |
1d4060189029
(svn r11571) -Fix [FS#1493]: road vehicle getting to the wrong side of a station when trying to overtake in there.
rubidium
parents:
8501
diff
changeset
|
1403 |
v->u.road.overtaking = 0; |
1d4060189029
(svn r11571) -Fix [FS#1493]: road vehicle getting to the wrong side of a station when trying to overtake in there.
rubidium
parents:
8501
diff
changeset
|
1404 |
} else if (++v->u.road.overtaking_ctr >= 35) { |
2823
3aee7190192f
(svn r3371) -Fix: don't allow road-vehicles to perform an out-of-bound operation while overtaking in a curve (tnx to guru3, Tron and peter1138)
truelight
parents:
2819
diff
changeset
|
1405 |
/* If overtaking just aborts at a random moment, we can have a out-of-bound problem, |
3aee7190192f
(svn r3371) -Fix: don't allow road-vehicles to perform an out-of-bound operation while overtaking in a curve (tnx to guru3, Tron and peter1138)
truelight
parents:
2819
diff
changeset
|
1406 |
* if the vehicle started a corner. To protect that, only allow an abort of |
6326
c904c7ea1c8d
(svn r8715) -Codechange/cleanup: replace magic numbers related to state of road vehicles with enums. Original patch by mart3p.
rubidium
parents:
6325
diff
changeset
|
1407 |
* overtake if we are on straight roads */ |
c904c7ea1c8d
(svn r8715) -Codechange/cleanup: replace magic numbers related to state of road vehicles with enums. Original patch by mart3p.
rubidium
parents:
6325
diff
changeset
|
1408 |
if (v->u.road.state < RVSB_IN_ROAD_STOP && IsStraightRoadTrackdir((Trackdir)v->u.road.state)) { |
2823
3aee7190192f
(svn r3371) -Fix: don't allow road-vehicles to perform an out-of-bound operation while overtaking in a curve (tnx to guru3, Tron and peter1138)
truelight
parents:
2819
diff
changeset
|
1409 |
v->u.road.overtaking = 0; |
3033
e4f7c60a1742
(svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents:
3032
diff
changeset
|
1410 |
} |
8507
1d4060189029
(svn r11571) -Fix [FS#1493]: road vehicle getting to the wrong side of a station when trying to overtake in there.
rubidium
parents:
8501
diff
changeset
|
1411 |
} |
0 | 1412 |
} |
1413 |
||
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1414 |
/* If this vehicle is in a depot and we've reached this point it must be |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1415 |
* one of the articulated parts. It will stay in the depot until activated |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1416 |
* by the previous vehicle in the chain when it gets to the right place. */ |
7986
881998b115c2
(svn r11001) -Codechange: unify the way to determine whether a vehicle is in a depot.
rubidium
parents:
7972
diff
changeset
|
1417 |
if (v->IsInDepot()) return true; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1418 |
|
6315
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1419 |
/* Save old vehicle position to use at end of move to set viewport area dirty */ |
0 | 1420 |
BeginVehicleMove(v); |
1421 |
||
6326
c904c7ea1c8d
(svn r8715) -Codechange/cleanup: replace magic numbers related to state of road vehicles with enums. Original patch by mart3p.
rubidium
parents:
6325
diff
changeset
|
1422 |
if (v->u.road.state == RVSB_WORMHOLE) { |
6335
0c3dc188f099
(svn r8730) -Codechange: more replacements of magic numbers by enums and removal of some (by now) redundant comments.
rubidium
parents:
6331
diff
changeset
|
1423 |
/* Vehicle is entering a depot or is on a bridge or in a tunnel */ |
6479 | 1424 |
GetNewVehiclePosResult gp = GetNewVehiclePos(v); |
0 | 1425 |
|
8762
e0d5cde5228f
(svn r11830) -Fix [FS#1625]: road vehicles would not wait in line, but at a single point on bridges. Based on a patch by SmatZ.
rubidium
parents:
8760
diff
changeset
|
1426 |
if (IsRoadVehFront(v)) { |
e0d5cde5228f
(svn r11830) -Fix [FS#1625]: road vehicles would not wait in line, but at a single point on bridges. Based on a patch by SmatZ.
rubidium
parents:
8760
diff
changeset
|
1427 |
const Vehicle *u = RoadVehFindCloseTo(v, gp.x, gp.y, v->direction); |
e0d5cde5228f
(svn r11830) -Fix [FS#1625]: road vehicles would not wait in line, but at a single point on bridges. Based on a patch by SmatZ.
rubidium
parents:
8760
diff
changeset
|
1428 |
if (u != NULL) { |
e0d5cde5228f
(svn r11830) -Fix [FS#1625]: road vehicles would not wait in line, but at a single point on bridges. Based on a patch by SmatZ.
rubidium
parents:
8760
diff
changeset
|
1429 |
v->cur_speed = u->First()->cur_speed; |
e0d5cde5228f
(svn r11830) -Fix [FS#1625]: road vehicles would not wait in line, but at a single point on bridges. Based on a patch by SmatZ.
rubidium
parents:
8760
diff
changeset
|
1430 |
return false; |
e0d5cde5228f
(svn r11830) -Fix [FS#1625]: road vehicles would not wait in line, but at a single point on bridges. Based on a patch by SmatZ.
rubidium
parents:
8760
diff
changeset
|
1431 |
} |
0 | 1432 |
} |
1433 |
||
8886
9f2c7ebc7fc9
(svn r11960) -Cleanup: simplify some IsTunnel(Tile) / IsBridge(Tile) conditions
smatz
parents:
8846
diff
changeset
|
1434 |
if (IsTileType(gp.new_tile, MP_TUNNELBRIDGE) && HasBit(VehicleEnterTile(v, gp.new_tile, gp.x, gp.y), VETS_ENTERED_WORMHOLE)) { |
6315
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1435 |
/* Vehicle has just entered a bridge or tunnel */ |
7630
2cd754d7dfa4
(svn r10408) -Codechange: make GetImage a class method of Vehicle instead of Get(Aircraft|RoadVeh|Ship|Train)Image.
rubidium
parents:
7592
diff
changeset
|
1436 |
v->cur_image = v->GetImage(v->direction); |
7054
edbb4d7765f2
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
7049
diff
changeset
|
1437 |
v->UpdateDeltaXY(v->direction); |
10229
fba3f9fa44d7
(svn r12761) -Codechange: lots of minor whitespace coding style fixes around operators.
rubidium
parents:
10222
diff
changeset
|
1438 |
SetRoadVehPosition(v, gp.x, gp.y); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1439 |
return true; |
0 | 1440 |
} |
1441 |
||
1442 |
v->x_pos = gp.x; |
|
1443 |
v->y_pos = gp.y; |
|
1444 |
VehiclePositionChanged(v); |
|
5573
afa6f92a71fd
(svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents:
5568
diff
changeset
|
1445 |
if (!(v->vehstatus & VS_HIDDEN)) EndVehicleMove(v); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1446 |
return true; |
0 | 1447 |
} |
1448 |
||
6338
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1449 |
/* Get move position data for next frame. |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1450 |
* For a drive-through road stop use 'straight road' move data. |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1451 |
* In this case v->u.road.state is masked to give the road stop entry direction. */ |
7187
f7dc3204d457
(svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents:
7183
diff
changeset
|
1452 |
rd = _road_drive_data[v->u.road.roadtype][( |
8424
4a488a90ccab
(svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents:
8420
diff
changeset
|
1453 |
(HasBit(v->u.road.state, RVS_IN_DT_ROAD_STOP) ? v->u.road.state & RVSB_ROAD_STOP_TRACKDIR_MASK : v->u.road.state) + |
10775
7061477bfbcf
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
10707
diff
changeset
|
1454 |
(_settings_game.vehicle.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking][v->u.road.frame + 1]; |
0 | 1455 |
|
6329
13ccf5062387
(svn r8723) -Codechange: replace yet another couple of magic numbers with enums.
rubidium
parents:
6328
diff
changeset
|
1456 |
if (rd.x & RDE_NEXT_TILE) { |
7813
49fbe41f8a04
(svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents:
7762
diff
changeset
|
1457 |
TileIndex tile = v->tile + TileOffsByDiagDir((DiagDirection)(rd.x & 3)); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1458 |
Trackdir dir; |
0 | 1459 |
uint32 r; |
3157
40de8616c04c
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3153
diff
changeset
|
1460 |
Direction newdir; |
0 | 1461 |
const RoadDriveEntry *rdp; |
1462 |
||
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1463 |
if (IsRoadVehFront(v)) { |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1464 |
/* If this is the front engine, look for the right path. */ |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1465 |
dir = RoadFindPathToDest(v, tile, (DiagDirection)(rd.x & 3)); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1466 |
} else { |
7912
fe352c500b3b
(svn r10809) -Fix (r10097): When reversing, articulated parts of road vehicles should not attempt to do their own pathfinding.
maedhros
parents:
7894
diff
changeset
|
1467 |
dir = FollowPreviousRoadVehicle(v, prev, tile, (DiagDirection)(rd.x & 3), false); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1468 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1469 |
|
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1470 |
if (dir == INVALID_TRACKDIR) { |
10839
a62547c31fdb
(svn r13390) -Codechange: introduce usererror() for fatal but not openttd related errors. Now all error() will 'crash' openttd after showing the message in win32 releases (MSVC), creating a crash.log and crash.dmp (like the '!' hack used before). On the other hand, usererror() will just close the game. So use error() only when it can be helpful to debugging, else use usererror().
glx
parents:
10775
diff
changeset
|
1471 |
if (!IsRoadVehFront(v)) error("Disconnecting road vehicle."); |
0 | 1472 |
v->cur_speed = 0; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1473 |
return false; |
0 | 1474 |
} |
1475 |
||
1476 |
again: |
|
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1477 |
uint start_frame = RVC_DEFAULT_START_FRAME; |
6326
c904c7ea1c8d
(svn r8715) -Codechange/cleanup: replace magic numbers related to state of road vehicles with enums. Original patch by mart3p.
rubidium
parents:
6325
diff
changeset
|
1478 |
if (IsReversingRoadTrackdir(dir)) { |
1247 | 1479 |
/* Turning around */ |
7187
f7dc3204d457
(svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents:
7183
diff
changeset
|
1480 |
if (v->u.road.roadtype == ROADTYPE_TRAM) { |
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1481 |
/* Determine the road bits the tram needs to be able to turn around |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1482 |
* using the 'big' corner loop. */ |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1483 |
RoadBits needed; |
7187
f7dc3204d457
(svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents:
7183
diff
changeset
|
1484 |
switch (dir) { |
f7dc3204d457
(svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents:
7183
diff
changeset
|
1485 |
default: NOT_REACHED(); |
f7dc3204d457
(svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents:
7183
diff
changeset
|
1486 |
case TRACKDIR_RVREV_NE: needed = ROAD_SW; break; |
f7dc3204d457
(svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents:
7183
diff
changeset
|
1487 |
case TRACKDIR_RVREV_SE: needed = ROAD_NW; break; |
f7dc3204d457
(svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents:
7183
diff
changeset
|
1488 |
case TRACKDIR_RVREV_SW: needed = ROAD_NE; break; |
f7dc3204d457
(svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents:
7183
diff
changeset
|
1489 |
case TRACKDIR_RVREV_NW: needed = ROAD_SE; break; |
f7dc3204d457
(svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents:
7183
diff
changeset
|
1490 |
} |
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1491 |
if ((v->Previous() != NULL && v->Previous()->tile == tile) || |
9059
04edde3eb0c6
(svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents:
9052
diff
changeset
|
1492 |
(IsRoadVehFront(v) && IsNormalRoadTile(tile) && !HasRoadWorks(tile) && |
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1493 |
(needed & GetRoadBits(tile, ROADTYPE_TRAM)) != ROAD_NONE)) { |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1494 |
/* |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1495 |
* Taking the 'big' corner for trams only happens when: |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1496 |
* - The previous vehicle in this (articulated) tram chain is |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1497 |
* already on the 'next' tile, we just follow them regardless of |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1498 |
* anything. When it is NOT on the 'next' tile, the tram started |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1499 |
* doing a reversing turn when the piece of tram track on the next |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1500 |
* tile did not exist yet. Do not use the big tram loop as that is |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1501 |
* going to cause the tram to split up. |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1502 |
* - Or the front of the tram can drive over the next tile. |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1503 |
*/ |
8556
50b175a55d6b
(svn r11621) -Fix [FS#1525]: there were still some cases where one could not build a tram track, but the tram could become blocked.
rubidium
parents:
8507
diff
changeset
|
1504 |
} else if (!IsRoadVehFront(v) || !CanBuildTramTrackOnTile(v->owner, tile, needed)) { |
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1505 |
/* |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1506 |
* Taking the 'small' corner for trams only happens when: |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1507 |
* - We are not the from vehicle of an articulated tram. |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1508 |
* - Or when the player cannot build on the next tile. |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1509 |
* |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1510 |
* The 'small' corner means that the vehicle is on the end of a |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1511 |
* tram track and needs to start turning there. To do this properly |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1512 |
* the tram needs to start at an offset in the tram turning 'code' |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1513 |
* for 'big' corners. It furthermore does not go to the next tile, |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1514 |
* so that needs to be fixed too. |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1515 |
*/ |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1516 |
tile = v->tile; |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1517 |
start_frame = RVC_TURN_AROUND_START_FRAME_SHORT_TRAM; |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1518 |
} else { |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1519 |
/* The player can build on the next tile, so wait till (s)he does. */ |
7187
f7dc3204d457
(svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents:
7183
diff
changeset
|
1520 |
v->cur_speed = 0; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1521 |
return false; |
7187
f7dc3204d457
(svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents:
7183
diff
changeset
|
1522 |
} |
9059
04edde3eb0c6
(svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents:
9052
diff
changeset
|
1523 |
} else if (IsNormalRoadTile(v->tile) && GetDisallowedRoadDirections(v->tile) != DRD_NONE) { |
7260
23cd58b6bf51
(svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents:
7250
diff
changeset
|
1524 |
v->cur_speed = 0; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1525 |
return false; |
7187
f7dc3204d457
(svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents:
7183
diff
changeset
|
1526 |
} else { |
f7dc3204d457
(svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents:
7183
diff
changeset
|
1527 |
tile = v->tile; |
f7dc3204d457
(svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents:
7183
diff
changeset
|
1528 |
} |
0 | 1529 |
} |
1530 |
||
6315
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1531 |
/* Get position data for first frame on the new tile */ |
10775
7061477bfbcf
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
10707
diff
changeset
|
1532 |
rdp = _road_drive_data[v->u.road.roadtype][(dir + (_settings_game.vehicle.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking]; |
0 | 1533 |
|
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1534 |
x = TileX(tile) * TILE_SIZE + rdp[start_frame].x; |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1535 |
y = TileY(tile) * TILE_SIZE + rdp[start_frame].y; |
0 | 1536 |
|
3017
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
1537 |
newdir = RoadVehGetSlidingDirection(v, x, y); |
8420
e90a0306973f
(svn r11477) -Fix [FS#1451]: a road vehicle must not show that it is driving max speed when it is standing still waiting for the vehicle in from of it.
rubidium
parents:
8419
diff
changeset
|
1538 |
if (IsRoadVehFront(v)) { |
e90a0306973f
(svn r11477) -Fix [FS#1451]: a road vehicle must not show that it is driving max speed when it is standing still waiting for the vehicle in from of it.
rubidium
parents:
8419
diff
changeset
|
1539 |
Vehicle *u = RoadVehFindCloseTo(v, x, y, newdir); |
e90a0306973f
(svn r11477) -Fix [FS#1451]: a road vehicle must not show that it is driving max speed when it is standing still waiting for the vehicle in from of it.
rubidium
parents:
8419
diff
changeset
|
1540 |
if (u != NULL) { |
e90a0306973f
(svn r11477) -Fix [FS#1451]: a road vehicle must not show that it is driving max speed when it is standing still waiting for the vehicle in from of it.
rubidium
parents:
8419
diff
changeset
|
1541 |
v->cur_speed = u->First()->cur_speed; |
e90a0306973f
(svn r11477) -Fix [FS#1451]: a road vehicle must not show that it is driving max speed when it is standing still waiting for the vehicle in from of it.
rubidium
parents:
8419
diff
changeset
|
1542 |
return false; |
e90a0306973f
(svn r11477) -Fix [FS#1451]: a road vehicle must not show that it is driving max speed when it is standing still waiting for the vehicle in from of it.
rubidium
parents:
8419
diff
changeset
|
1543 |
} |
e90a0306973f
(svn r11477) -Fix [FS#1451]: a road vehicle must not show that it is driving max speed when it is standing still waiting for the vehicle in from of it.
rubidium
parents:
8419
diff
changeset
|
1544 |
} |
0 | 1545 |
|
1546 |
r = VehicleEnterTile(v, tile, x, y); |
|
8424
4a488a90ccab
(svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents:
8420
diff
changeset
|
1547 |
if (HasBit(r, VETS_CANNOT_ENTER)) { |
1035
0a170deb6e33
(svn r1536) Move GET_TILEHEIGHT, GET_TILETYPE and IS_TILETYPE to map.h, turn them into inline functions and add some asserts
tron
parents:
1024
diff
changeset
|
1548 |
if (!IsTileType(tile, MP_TUNNELBRIDGE)) { |
0 | 1549 |
v->cur_speed = 0; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1550 |
return false; |
0 | 1551 |
} |
6315
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1552 |
/* Try an about turn to re-enter the previous tile */ |
6326
c904c7ea1c8d
(svn r8715) -Codechange/cleanup: replace magic numbers related to state of road vehicles with enums. Original patch by mart3p.
rubidium
parents:
6325
diff
changeset
|
1553 |
dir = _road_reverse_table[rd.x & 3]; |
0 | 1554 |
goto again; |
1555 |
} |
|
1556 |
||
8450
dce58137301f
(svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents:
8428
diff
changeset
|
1557 |
if (IsInsideMM(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_DT_ROAD_STOP_END) && IsTileType(v->tile, MP_STATION)) { |
dce58137301f
(svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents:
8428
diff
changeset
|
1558 |
if (IsReversingRoadTrackdir(dir) && IsInsideMM(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_ROAD_STOP_END)) { |
6315
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1559 |
/* New direction is trying to turn vehicle around. |
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1560 |
* We can't turn at the exit of a road stop so wait.*/ |
3033
e4f7c60a1742
(svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents:
3032
diff
changeset
|
1561 |
v->cur_speed = 0; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1562 |
return false; |
3033
e4f7c60a1742
(svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents:
3032
diff
changeset
|
1563 |
} |
3338
2c60ed0dcce3
(svn r4120) Use the new station functions where appropriate
tron
parents:
3315
diff
changeset
|
1564 |
if (IsRoadStop(v->tile)) { |
1217
ab9f02a224ab
(svn r1721) -Feature: It is now possible to build multiple road stations (up to 8) on
celestar
parents:
1209
diff
changeset
|
1565 |
RoadStop *rs = GetRoadStopByTile(v->tile, GetRoadStopType(v->tile)); |
0 | 1566 |
|
6338
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1567 |
/* Vehicle is leaving a road stop tile, mark bay as free |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1568 |
* For drive-through stops, only do it if the vehicle stopped here */ |
8424
4a488a90ccab
(svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents:
8420
diff
changeset
|
1569 |
if (IsStandardRoadStopTile(v->tile) || HasBit(v->u.road.state, RVS_IS_STOPPING)) { |
4a488a90ccab
(svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents:
8420
diff
changeset
|
1570 |
rs->FreeBay(HasBit(v->u.road.state, RVS_USING_SECOND_BAY)); |
8425
72a71d480c5f
(svn r11482) -Codechange: Remove the doubled function ClrBitT and rename the remaining to fit with the naming style
skidd13
parents:
8424
diff
changeset
|
1571 |
ClrBit(v->u.road.state, RVS_IS_STOPPING); |
6338
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1572 |
} |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1573 |
if (IsStandardRoadStopTile(v->tile)) rs->SetEntranceBusy(false); |
0 | 1574 |
} |
1575 |
} |
|
1576 |
||
8424
4a488a90ccab
(svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents:
8420
diff
changeset
|
1577 |
if (!HasBit(r, VETS_ENTERED_WORMHOLE)) { |
0 | 1578 |
v->tile = tile; |
2823
3aee7190192f
(svn r3371) -Fix: don't allow road-vehicles to perform an out-of-bound operation while overtaking in a curve (tnx to guru3, Tron and peter1138)
truelight
parents:
2819
diff
changeset
|
1579 |
v->u.road.state = (byte)dir; |
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1580 |
v->u.road.frame = start_frame; |
0 | 1581 |
} |
1582 |
if (newdir != v->direction) { |
|
1583 |
v->direction = newdir; |
|
1584 |
v->cur_speed -= v->cur_speed >> 2; |
|
1585 |
} |
|
1586 |
||
7630
2cd754d7dfa4
(svn r10408) -Codechange: make GetImage a class method of Vehicle instead of Get(Aircraft|RoadVeh|Ship|Train)Image.
rubidium
parents:
7592
diff
changeset
|
1587 |
v->cur_image = v->GetImage(newdir); |
7054
edbb4d7765f2
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
7049
diff
changeset
|
1588 |
v->UpdateDeltaXY(v->direction); |
0 | 1589 |
RoadZPosAffectSpeed(v, SetRoadVehPosition(v, x, y)); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1590 |
return true; |
0 | 1591 |
} |
1592 |
||
6329
13ccf5062387
(svn r8723) -Codechange: replace yet another couple of magic numbers with enums.
rubidium
parents:
6328
diff
changeset
|
1593 |
if (rd.x & RDE_TURNED) { |
6315
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1594 |
/* Vehicle has finished turning around, it will now head back onto the same tile */ |
7912
fe352c500b3b
(svn r10809) -Fix (r10097): When reversing, articulated parts of road vehicles should not attempt to do their own pathfinding.
maedhros
parents:
7894
diff
changeset
|
1595 |
Trackdir dir; |
0 | 1596 |
uint32 r; |
3157
40de8616c04c
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3153
diff
changeset
|
1597 |
Direction newdir; |
0 | 1598 |
const RoadDriveEntry *rdp; |
1599 |
||
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1600 |
uint turn_around_start_frame = RVC_TURN_AROUND_START_FRAME; |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1601 |
|
8405
301456a669bd
(svn r11461) -Fix [FS#1449] (r11449): a bus turning around in a station could case an assertion error. Patch by divide.
rubidium
parents:
8394
diff
changeset
|
1602 |
RoadBits tram; |
9212
3503ffa351b6
(svn r12390) -Fix [FS#1851]: trams failing to turn on bridge heads/tunnel entrances.
rubidium
parents:
9122
diff
changeset
|
1603 |
if (v->u.road.roadtype == ROADTYPE_TRAM && CountBits(tram = GetAnyRoadBits(v->tile, ROADTYPE_TRAM, true)) == 1) { |
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1604 |
/* |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1605 |
* The tram is turning around with one tram 'roadbit'. This means that |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1606 |
* it is using the 'big' corner 'drive data'. However, to support the |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1607 |
* trams to take a small corner, there is a 'turned' marker in the middle |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1608 |
* of the turning 'drive data'. When the tram took the long corner, we |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1609 |
* will still use the 'big' corner drive data, but we advance it one |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1610 |
* frame. We furthermore set the driving direction so the turning is |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1611 |
* going to be properly shown. |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1612 |
*/ |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1613 |
turn_around_start_frame = RVC_START_FRAME_AFTER_LONG_TRAM; |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1614 |
switch (tram) { |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1615 |
default: NOT_REACHED(); |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1616 |
case ROAD_SW: dir = TRACKDIR_RVREV_NE; break; |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1617 |
case ROAD_NW: dir = TRACKDIR_RVREV_SE; break; |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1618 |
case ROAD_NE: dir = TRACKDIR_RVREV_SW; break; |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1619 |
case ROAD_SE: dir = TRACKDIR_RVREV_NW; break; |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1620 |
} |
7912
fe352c500b3b
(svn r10809) -Fix (r10097): When reversing, articulated parts of road vehicles should not attempt to do their own pathfinding.
maedhros
parents:
7894
diff
changeset
|
1621 |
} else { |
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1622 |
if (IsRoadVehFront(v)) { |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1623 |
/* If this is the front engine, look for the right path. */ |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1624 |
dir = RoadFindPathToDest(v, v->tile, (DiagDirection)(rd.x & 3)); |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1625 |
} else { |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1626 |
dir = FollowPreviousRoadVehicle(v, prev, v->tile, (DiagDirection)(rd.x & 3), true); |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1627 |
} |
7912
fe352c500b3b
(svn r10809) -Fix (r10097): When reversing, articulated parts of road vehicles should not attempt to do their own pathfinding.
maedhros
parents:
7894
diff
changeset
|
1628 |
} |
fe352c500b3b
(svn r10809) -Fix (r10097): When reversing, articulated parts of road vehicles should not attempt to do their own pathfinding.
maedhros
parents:
7894
diff
changeset
|
1629 |
|
6325
f03f94f4d8fc
(svn r8712) -Codechange/cleanup: replace 'magic' constants with enums, use proper types instead of byte, uint etc., give variables more descriptive names and add some comments.
rubidium
parents:
6317
diff
changeset
|
1630 |
if (dir == INVALID_TRACKDIR) { |
0 | 1631 |
v->cur_speed = 0; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1632 |
return false; |
0 | 1633 |
} |
1634 |
||
10775
7061477bfbcf
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
10707
diff
changeset
|
1635 |
rdp = _road_drive_data[v->u.road.roadtype][(_settings_game.vehicle.road_side << RVS_DRIVE_SIDE) + dir]; |
0 | 1636 |
|
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1637 |
x = TileX(v->tile) * TILE_SIZE + rdp[turn_around_start_frame].x; |
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1638 |
y = TileY(v->tile) * TILE_SIZE + rdp[turn_around_start_frame].y; |
0 | 1639 |
|
3017
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
1640 |
newdir = RoadVehGetSlidingDirection(v, x, y); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1641 |
if (IsRoadVehFront(v) && RoadVehFindCloseTo(v, x, y, newdir) != NULL) return false; |
0 | 1642 |
|
1643 |
r = VehicleEnterTile(v, v->tile, x, y); |
|
8424
4a488a90ccab
(svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents:
8420
diff
changeset
|
1644 |
if (HasBit(r, VETS_CANNOT_ENTER)) { |
0 | 1645 |
v->cur_speed = 0; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1646 |
return false; |
0 | 1647 |
} |
1648 |
||
6335
0c3dc188f099
(svn r8730) -Codechange: more replacements of magic numbers by enums and removal of some (by now) redundant comments.
rubidium
parents:
6331
diff
changeset
|
1649 |
v->u.road.state = dir; |
8394
8b0f485cebbe
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
rubidium
parents:
8365
diff
changeset
|
1650 |
v->u.road.frame = turn_around_start_frame; |
0 | 1651 |
|
1652 |
if (newdir != v->direction) { |
|
1653 |
v->direction = newdir; |
|
1654 |
v->cur_speed -= v->cur_speed >> 2; |
|
1655 |
} |
|
1656 |
||
7630
2cd754d7dfa4
(svn r10408) -Codechange: make GetImage a class method of Vehicle instead of Get(Aircraft|RoadVeh|Ship|Train)Image.
rubidium
parents:
7592
diff
changeset
|
1657 |
v->cur_image = v->GetImage(newdir); |
7054
edbb4d7765f2
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
7049
diff
changeset
|
1658 |
v->UpdateDeltaXY(v->direction); |
0 | 1659 |
RoadZPosAffectSpeed(v, SetRoadVehPosition(v, x, y)); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1660 |
return true; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1661 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1662 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1663 |
/* This vehicle is not in a wormhole and it hasn't entered a new tile. If |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1664 |
* it's on a depot tile, check if it's time to activate the next vehicle in |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1665 |
* the chain yet. */ |
9059
04edde3eb0c6
(svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents:
9052
diff
changeset
|
1666 |
if (v->Next() != NULL && IsRoadDepotTile(v->tile)) { |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1667 |
if (v->u.road.frame == v->u.road.cached_veh_length + RVC_DEPOT_START_FRAME) { |
7988
6075538f6111
(svn r11003) -Codechange: replace Vehicle->next to Vehicle->Next() and Vehicle->SetNext() so we can trap instances that change a next pointer and (in the future) update the first/previous pointers based on that.
rubidium
parents:
7986
diff
changeset
|
1668 |
RoadVehLeaveDepot(v->Next(), false); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1669 |
} |
0 | 1670 |
} |
1671 |
||
6315
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1672 |
/* Calculate new position for the vehicle */ |
3033
e4f7c60a1742
(svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents:
3032
diff
changeset
|
1673 |
x = (v->x_pos & ~15) + (rd.x & 15); |
e4f7c60a1742
(svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents:
3032
diff
changeset
|
1674 |
y = (v->y_pos & ~15) + (rd.y & 15); |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1675 |
|
0 | 1676 |
new_dir = RoadVehGetSlidingDirection(v, x, y); |
1677 |
||
8450
dce58137301f
(svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents:
8428
diff
changeset
|
1678 |
if (IsRoadVehFront(v) && !IsInsideMM(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_ROAD_STOP_END)) { |
6315
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1679 |
/* Vehicle is not in a road stop. |
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1680 |
* Check for another vehicle to overtake */ |
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
1681 |
Vehicle* u = RoadVehFindCloseTo(v, x, y, new_dir); |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
1682 |
|
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
1683 |
if (u != NULL) { |
8313
d92b90b5e9ed
(svn r11367) -Fix [FS#1258]: non-articulated road vehicles should be able to overtake (not-too-long) articulated vehicles, i.e. overtaking of articulated vehicles that are several (3+) tiles long is not supported.
rubidium
parents:
8312
diff
changeset
|
1684 |
u = u->First(); |
6315
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1685 |
/* There is a vehicle in front overtake it if possible */ |
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
1686 |
if (v->u.road.overtaking == 0) RoadVehCheckOvertake(v, u); |
8165
606d97bce909
(svn r11200) -Fix [FS#1291]: road vehicles could not overtake on one way roads going to the east.
rubidium
parents:
8138
diff
changeset
|
1687 |
if (v->u.road.overtaking == 0) v->cur_speed = u->cur_speed; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1688 |
return false; |
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
1689 |
} |
0 | 1690 |
} |
1691 |
||
1692 |
old_dir = v->direction; |
|
1693 |
if (new_dir != old_dir) { |
|
1694 |
v->direction = new_dir; |
|
1695 |
v->cur_speed -= (v->cur_speed >> 2); |
|
1696 |
if (old_dir != v->u.road.state) { |
|
6315
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1697 |
/* The vehicle is in a road stop */ |
7630
2cd754d7dfa4
(svn r10408) -Codechange: make GetImage a class method of Vehicle instead of Get(Aircraft|RoadVeh|Ship|Train)Image.
rubidium
parents:
7592
diff
changeset
|
1698 |
v->cur_image = v->GetImage(new_dir); |
7054
edbb4d7765f2
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
7049
diff
changeset
|
1699 |
v->UpdateDeltaXY(v->direction); |
0 | 1700 |
SetRoadVehPosition(v, v->x_pos, v->y_pos); |
6315
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1701 |
/* Note, return here means that the frame counter is not incremented |
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1702 |
* for vehicles changing direction in a road stop. This causes frames to |
6335
0c3dc188f099
(svn r8730) -Codechange: more replacements of magic numbers by enums and removal of some (by now) redundant comments.
rubidium
parents:
6331
diff
changeset
|
1703 |
* be repeated. (XXX) Is this intended? */ |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1704 |
return true; |
0 | 1705 |
} |
1706 |
} |
|
1707 |
||
6338
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1708 |
/* If the vehicle is in a normal road stop and the frame equals the stop frame OR |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1709 |
* if the vehicle is in a drive-through road stop and this is the destination station |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1710 |
* and it's the correct type of stop (bus or truck) and the frame equals the stop frame... |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1711 |
* (the station test and stop type test ensure that other vehicles, using the road stop as |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1712 |
* a through route, do not stop) */ |
8450
dce58137301f
(svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents:
8428
diff
changeset
|
1713 |
if (IsRoadVehFront(v) && ((IsInsideMM(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_ROAD_STOP_END) && |
10775
7061477bfbcf
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
10707
diff
changeset
|
1714 |
_road_veh_data_1[v->u.road.state - RVSB_IN_ROAD_STOP + (_settings_game.vehicle.road_side << RVS_DRIVE_SIDE)] == v->u.road.frame) || |
8450
dce58137301f
(svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents:
8428
diff
changeset
|
1715 |
(IsInsideMM(v->u.road.state, RVSB_IN_DT_ROAD_STOP, RVSB_IN_DT_ROAD_STOP_END) && |
10158
e4e8e74d96c7
(svn r12689) -Feature: non-stop(or rather no non-stop) and via orders for road vehicles.
rubidium
parents:
10127
diff
changeset
|
1716 |
v->current_order.ShouldStopAtStation(v, GetStationIndex(v->tile)) && |
10927
5e398769e415
(svn r13480) -Fix [FS#2050]: RVs stoppping at drive through stations of other companies.
rubidium
parents:
10905
diff
changeset
|
1717 |
v->owner == GetRoadOwner(v->tile, v->u.road.roadtype) && |
9281
d8cd9ac52a68
(svn r12489) -Codechange: split station.h into station_base.h and station_func.h.
rubidium
parents:
9280
diff
changeset
|
1718 |
GetRoadStopType(v->tile) == (IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? ROADSTOP_BUS : ROADSTOP_TRUCK) && |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1719 |
v->u.road.frame == RVC_DRIVE_THROUGH_STOP_FRAME))) { |
6338
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1720 |
|
1217
ab9f02a224ab
(svn r1721) -Feature: It is now possible to build multiple road stations (up to 8) on
celestar
parents:
1209
diff
changeset
|
1721 |
RoadStop *rs = GetRoadStopByTile(v->tile, GetRoadStopType(v->tile)); |
11106
f51503265cb2
(svn r13664) -Fix [FS#2117]: bus/truck forgetting go-to-depot order when entering a non-drivethrough road stop.
rubidium
parents:
11090
diff
changeset
|
1722 |
Station *st = GetStationByTile(v->tile); |
0 | 1723 |
|
6315
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1724 |
/* Vehicle is at the stop position (at a bay) in a road stop. |
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1725 |
* Note, if vehicle is loading/unloading it has already been handled, |
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1726 |
* so if we get here the vehicle has just arrived or is just ready to leave. */ |
10158
e4e8e74d96c7
(svn r12689) -Feature: non-stop(or rather no non-stop) and via orders for road vehicles.
rubidium
parents:
10127
diff
changeset
|
1727 |
if (!v->current_order.IsType(OT_LEAVESTATION)) { |
6315
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1728 |
/* Vehicle has arrived at a bay in a road stop */ |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1729 |
|
6338
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1730 |
if (IsDriveThroughStopTile(v->tile)) { |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1731 |
TileIndex next_tile = TILE_ADD(v->tile, TileOffsByDir(v->direction)); |
9281
d8cd9ac52a68
(svn r12489) -Codechange: split station.h into station_base.h and station_func.h.
rubidium
parents:
9280
diff
changeset
|
1732 |
RoadStopType type = IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? ROADSTOP_BUS : ROADSTOP_TRUCK; |
6338
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1733 |
|
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1734 |
/* Check if next inline bay is free */ |
11025
be3a48c6a25e
(svn r13581) -Fix [FS#2040]: RVs continueing onto next DT station when they are build adjacent to them.
rubidium
parents:
10927
diff
changeset
|
1735 |
if (IsDriveThroughStopTile(next_tile) && (GetRoadStopType(next_tile) == type) && GetStationIndex(v->tile) == GetStationIndex(next_tile)) { |
6338
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1736 |
RoadStop *rs_n = GetRoadStopByTile(next_tile, type); |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1737 |
|
8424
4a488a90ccab
(svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents:
8420
diff
changeset
|
1738 |
if (rs_n->IsFreeBay(HasBit(v->u.road.state, RVS_USING_SECOND_BAY))) { |
6338
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1739 |
/* Bay in next stop along is free - use it */ |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1740 |
ClearSlot(v); |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1741 |
rs_n->num_vehicles++; |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1742 |
v->u.road.slot = rs_n; |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1743 |
v->dest_tile = rs_n->xy; |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1744 |
v->u.road.slot_age = 14; |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1745 |
|
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1746 |
v->u.road.frame++; |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1747 |
RoadZPosAffectSpeed(v, SetRoadVehPosition(v, x, y)); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1748 |
return true; |
6338
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1749 |
} |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1750 |
} |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1751 |
} |
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1752 |
|
6316
6ba1efc2b7fc
(svn r8694) -Codechange: make RoadStop's status accessible via accessor functions.
rubidium
parents:
6315
diff
changeset
|
1753 |
rs->SetEntranceBusy(false); |
0 | 1754 |
|
10158
e4e8e74d96c7
(svn r12689) -Feature: non-stop(or rather no non-stop) and via orders for road vehicles.
rubidium
parents:
10127
diff
changeset
|
1755 |
v->last_station_visited = st->index; |
0 | 1756 |
|
11106
f51503265cb2
(svn r13664) -Fix [FS#2117]: bus/truck forgetting go-to-depot order when entering a non-drivethrough road stop.
rubidium
parents:
11090
diff
changeset
|
1757 |
if (IsDriveThroughStopTile(v->tile) || (v->current_order.IsType(OT_GOTO_STATION) && v->current_order.GetDestination() == st->index)) { |
10158
e4e8e74d96c7
(svn r12689) -Feature: non-stop(or rather no non-stop) and via orders for road vehicles.
rubidium
parents:
10127
diff
changeset
|
1758 |
RoadVehArrivesAt(v, st); |
e4e8e74d96c7
(svn r12689) -Feature: non-stop(or rather no non-stop) and via orders for road vehicles.
rubidium
parents:
10127
diff
changeset
|
1759 |
v->BeginLoading(); |
11106
f51503265cb2
(svn r13664) -Fix [FS#2117]: bus/truck forgetting go-to-depot order when entering a non-drivethrough road stop.
rubidium
parents:
11090
diff
changeset
|
1760 |
return false; |
10158
e4e8e74d96c7
(svn r12689) -Feature: non-stop(or rather no non-stop) and via orders for road vehicles.
rubidium
parents:
10127
diff
changeset
|
1761 |
} |
11106
f51503265cb2
(svn r13664) -Fix [FS#2117]: bus/truck forgetting go-to-depot order when entering a non-drivethrough road stop.
rubidium
parents:
11090
diff
changeset
|
1762 |
} else { |
f51503265cb2
(svn r13664) -Fix [FS#2117]: bus/truck forgetting go-to-depot order when entering a non-drivethrough road stop.
rubidium
parents:
11090
diff
changeset
|
1763 |
/* Vehicle is ready to leave a bay in a road stop */ |
6316
6ba1efc2b7fc
(svn r8694) -Codechange: make RoadStop's status accessible via accessor functions.
rubidium
parents:
6315
diff
changeset
|
1764 |
if (rs->IsEntranceBusy()) { |
6335
0c3dc188f099
(svn r8730) -Codechange: more replacements of magic numbers by enums and removal of some (by now) redundant comments.
rubidium
parents:
6331
diff
changeset
|
1765 |
/* Road stop entrance is busy, so wait as there is nowhere else to go */ |
0 | 1766 |
v->cur_speed = 0; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1767 |
return false; |
0 | 1768 |
} |
6589
addf4b6946d0
(svn r9072) -Codechange: [Orders] added methods to orders to free them and check if they are in use
bjarni
parents:
6585
diff
changeset
|
1769 |
v->current_order.Free(); |
3123 | 1770 |
ClearSlot(v); |
0 | 1771 |
} |
6335
0c3dc188f099
(svn r8730) -Codechange: more replacements of magic numbers by enums and removal of some (by now) redundant comments.
rubidium
parents:
6331
diff
changeset
|
1772 |
|
6338
0fb4f452873c
(svn r8735) -Feature: drive-through road stops made possible by the hard work of mart3p.
rubidium
parents:
6335
diff
changeset
|
1773 |
if (IsStandardRoadStopTile(v->tile)) rs->SetEntranceBusy(true); |
0 | 1774 |
|
1217
ab9f02a224ab
(svn r1721) -Feature: It is now possible to build multiple road stations (up to 8) on
celestar
parents:
1209
diff
changeset
|
1775 |
if (rs == v->u.road.slot) { |
6315
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1776 |
/* We are leaving the correct station */ |
3123 | 1777 |
ClearSlot(v); |
1217
ab9f02a224ab
(svn r1721) -Feature: It is now possible to build multiple road stations (up to 8) on
celestar
parents:
1209
diff
changeset
|
1778 |
} else if (v->u.road.slot != NULL) { |
6889
f7f6d9cb07a0
(svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents:
6683
diff
changeset
|
1779 |
/* We are leaving the wrong station |
f7f6d9cb07a0
(svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents:
6683
diff
changeset
|
1780 |
* XXX The question is .. what to do? Actually we shouldn't be here |
f7f6d9cb07a0
(svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents:
6683
diff
changeset
|
1781 |
* but I guess we need to clear the slot */ |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
1782 |
DEBUG(ms, 0, "Vehicle %d (index %d) arrived at wrong stop", v->unitnumber, v->index); |
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
1783 |
if (v->tile != v->dest_tile) { |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
1784 |
DEBUG(ms, 2, " current tile 0x%X is not destination tile 0x%X. Route problem", v->tile, v->dest_tile); |
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
1785 |
} |
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
1786 |
if (v->dest_tile != v->u.road.slot->xy) { |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
1787 |
DEBUG(ms, 2, " stop tile 0x%X is not destination tile 0x%X. Multistop desync", v->u.road.slot->xy, v->dest_tile); |
3138
2bd76fda80c1
(svn r3754) Miscellaneous changes: indentation, reduce variable scope, constness, avoid some more function pointer casts
tron
parents:
3137
diff
changeset
|
1788 |
} |
9332
2e120d0bd632
(svn r12584) -Codechange: do not access the order type directly.
rubidium
parents:
9326
diff
changeset
|
1789 |
if (!v->current_order.IsType(OT_GOTO_STATION)) { |
2e120d0bd632
(svn r12584) -Codechange: do not access the order type directly.
rubidium
parents:
9326
diff
changeset
|
1790 |
DEBUG(ms, 2, " current order type (%d) is not OT_GOTO_STATION", v->current_order.GetType()); |
3123 | 1791 |
} else { |
9336
3f75a2c5e0d3
(svn r12588) -Codechange: do not access the destination of an order directly.
rubidium
parents:
9332
diff
changeset
|
1792 |
if (v->current_order.GetDestination() != st->index) |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
1793 |
DEBUG(ms, 2, " current station %d is not target station in current_order.station (%d)", |
9336
3f75a2c5e0d3
(svn r12588) -Codechange: do not access the destination of an order directly.
rubidium
parents:
9332
diff
changeset
|
1794 |
st->index, v->current_order.GetDestination()); |
3123 | 1795 |
} |
1796 |
||
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
1797 |
DEBUG(ms, 2, " force a slot clearing"); |
3123 | 1798 |
ClearSlot(v); |
1217
ab9f02a224ab
(svn r1721) -Feature: It is now possible to build multiple road stations (up to 8) on
celestar
parents:
1209
diff
changeset
|
1799 |
} |
ab9f02a224ab
(svn r1721) -Feature: It is now possible to build multiple road stations (up to 8) on
celestar
parents:
1209
diff
changeset
|
1800 |
|
0 | 1801 |
StartRoadVehSound(v); |
8846
f3e877a92e2b
(svn r11916) -Codechange: use enums from VehicleViewWindowWidgets instead of constants
smatz
parents:
8813
diff
changeset
|
1802 |
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH); |
0 | 1803 |
} |
1804 |
||
6315
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1805 |
/* Check tile position conditions - i.e. stop position in depot, |
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1806 |
* entry onto bridge or into tunnel */ |
0 | 1807 |
r = VehicleEnterTile(v, v->tile, x, y); |
8424
4a488a90ccab
(svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents:
8420
diff
changeset
|
1808 |
if (HasBit(r, VETS_CANNOT_ENTER)) { |
0 | 1809 |
v->cur_speed = 0; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1810 |
return false; |
0 | 1811 |
} |
1812 |
||
10158
e4e8e74d96c7
(svn r12689) -Feature: non-stop(or rather no non-stop) and via orders for road vehicles.
rubidium
parents:
10127
diff
changeset
|
1813 |
if (v->current_order.IsType(OT_LEAVESTATION) && IsDriveThroughStopTile(v->tile)) v->current_order.Free(); |
e4e8e74d96c7
(svn r12689) -Feature: non-stop(or rather no non-stop) and via orders for road vehicles.
rubidium
parents:
10127
diff
changeset
|
1814 |
|
6315
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1815 |
/* Move to next frame unless vehicle arrived at a stop position |
0f38464910a1
(svn r8692) -Cleanup: add comments to RoadVehController. Patch by mart3p.
rubidium
parents:
6195
diff
changeset
|
1816 |
* in a depot or entered a tunnel/bridge */ |
8424
4a488a90ccab
(svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents:
8420
diff
changeset
|
1817 |
if (!HasBit(r, VETS_ENTERED_WORMHOLE)) v->u.road.frame++; |
0 | 1818 |
|
7630
2cd754d7dfa4
(svn r10408) -Codechange: make GetImage a class method of Vehicle instead of Get(Aircraft|RoadVeh|Ship|Train)Image.
rubidium
parents:
7592
diff
changeset
|
1819 |
v->cur_image = v->GetImage(v->direction); |
7054
edbb4d7765f2
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
7049
diff
changeset
|
1820 |
v->UpdateDeltaXY(v->direction); |
0 | 1821 |
RoadZPosAffectSpeed(v, SetRoadVehPosition(v, x, y)); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1822 |
return true; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1823 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1824 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1825 |
static void RoadVehController(Vehicle *v) |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1826 |
{ |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1827 |
/* decrease counters */ |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1828 |
v->tick_counter++; |
7476
7f086e4b2a76
(svn r10236) -Feature: Introduce a form of timetabling for vehicles.
maedhros
parents:
7449
diff
changeset
|
1829 |
v->current_order_time++; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1830 |
if (v->u.road.reverse_ctr != 0) v->u.road.reverse_ctr--; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1831 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1832 |
/* handle crashed */ |
7972
dff055fff851
(svn r10983) -Codechange: use vehstatus & VS_CRASHED instead of some other "methods" custom to each vehicle to determine whether the vehicle is crashed.
rubidium
parents:
7965
diff
changeset
|
1833 |
if (v->vehstatus & VS_CRASHED) { |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1834 |
RoadVehIsCrashed(v); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1835 |
return; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1836 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1837 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1838 |
RoadVehCheckTrainCrash(v); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1839 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1840 |
/* road vehicle has broken down? */ |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1841 |
if (v->breakdown_ctr != 0) { |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1842 |
if (v->breakdown_ctr <= 2) { |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1843 |
HandleBrokenRoadVeh(v); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1844 |
return; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1845 |
} |
10263
e725d23bc34e
(svn r12795) -Fix [FS#1938]: vehicles could break down during loading and keep loading. The intention of the break down code is not to break down when having zero speed, therefor break downs now do not happen when loading.
rubidium
parents:
10229
diff
changeset
|
1846 |
if (!v->current_order.IsType(OT_LOADING)) v->breakdown_ctr--; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1847 |
} |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1848 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1849 |
if (v->vehstatus & VS_STOPPED) return; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1850 |
|
9323
9bc423363f6a
(svn r12575) -Codechange: unduplicate Process*Orders for trains, ships and road vehicles.
rubidium
parents:
9296
diff
changeset
|
1851 |
ProcessOrders(v); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1852 |
v->HandleLoading(); |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1853 |
|
9332
2e120d0bd632
(svn r12584) -Codechange: do not access the order type directly.
rubidium
parents:
9326
diff
changeset
|
1854 |
if (v->current_order.IsType(OT_LOADING)) return; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1855 |
|
7986
881998b115c2
(svn r11001) -Codechange: unify the way to determine whether a vehicle is in a depot.
rubidium
parents:
7972
diff
changeset
|
1856 |
if (v->IsInDepot() && RoadVehLeaveDepot(v, true)) return; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1857 |
|
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1858 |
/* Check if vehicle needs to proceed, return if it doesn't */ |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1859 |
if (!RoadVehAccelerate(v)) return; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1860 |
|
7988
6075538f6111
(svn r11003) -Codechange: replace Vehicle->next to Vehicle->Next() and Vehicle->SetNext() so we can trap instances that change a next pointer and (in the future) update the first/previous pointers based on that.
rubidium
parents:
7986
diff
changeset
|
1861 |
for (Vehicle *prev = NULL; v != NULL; prev = v, v = v->Next()) { |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1862 |
if (!IndividualRoadVehicleController(v, prev)) break; |
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1863 |
} |
0 | 1864 |
} |
1865 |
||
1866 |
static void AgeRoadVehCargo(Vehicle *v) |
|
1867 |
{ |
|
3017
915fae59d5e0
(svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents:
3009
diff
changeset
|
1868 |
if (_age_cargo_skip_counter != 0) return; |
7506
e52d89f5c7c1
(svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents:
7476
diff
changeset
|
1869 |
v->cargo.AgeCargo(); |
0 | 1870 |
} |
1871 |
||
7631
e810ef25497e
(svn r10409) -Codechange: replace (Aircraft|RoadVeh|Ship|Train)_Tick with a Tick method in the Vehicle class.
rubidium
parents:
7630
diff
changeset
|
1872 |
void RoadVehicle::Tick() |
0 | 1873 |
{ |
7631
e810ef25497e
(svn r10409) -Codechange: replace (Aircraft|RoadVeh|Ship|Train)_Tick with a Tick method in the Vehicle class.
rubidium
parents:
7630
diff
changeset
|
1874 |
AgeRoadVehCargo(this); |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1875 |
|
9052
392f5995d323
(svn r12134) -Change: count the number of ticks a vehicle was running this day to calculate running cost
smatz
parents:
9050
diff
changeset
|
1876 |
if (IsRoadVehFront(this)) { |
392f5995d323
(svn r12134) -Change: count the number of ticks a vehicle was running this day to calculate running cost
smatz
parents:
9050
diff
changeset
|
1877 |
if (!(this->vehstatus & VS_STOPPED)) this->running_ticks++; |
392f5995d323
(svn r12134) -Change: count the number of ticks a vehicle was running this day to calculate running cost
smatz
parents:
9050
diff
changeset
|
1878 |
RoadVehController(this); |
392f5995d323
(svn r12134) -Change: count the number of ticks a vehicle was running this day to calculate running cost
smatz
parents:
9050
diff
changeset
|
1879 |
} |
0 | 1880 |
} |
1881 |
||
1882 |
static void CheckIfRoadVehNeedsService(Vehicle *v) |
|
1883 |
{ |
|
6889
f7f6d9cb07a0
(svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents:
6683
diff
changeset
|
1884 |
/* If we already got a slot at a stop, use that FIRST, and go to a depot later */ |
10775
7061477bfbcf
(svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents:
10707
diff
changeset
|
1885 |
if (v->u.road.slot != NULL || _settings_game.vehicle.servint_roadveh == 0 || !v->NeedsAutomaticServicing()) return; |
7986
881998b115c2
(svn r11001) -Codechange: unify the way to determine whether a vehicle is in a depot.
rubidium
parents:
7972
diff
changeset
|
1886 |
if (v->IsInDepot()) { |
4529
2bfac24af02a
(svn r6356) -Fix: FS#263 planes come out of hangar and drive back into hangar
bjarni
parents:
4527
diff
changeset
|
1887 |
VehicleServiceInDepot(v); |
2bfac24af02a
(svn r6356) -Fix: FS#263 planes come out of hangar and drive back into hangar
bjarni
parents:
4527
diff
changeset
|
1888 |
return; |
2bfac24af02a
(svn r6356) -Fix: FS#263 planes come out of hangar and drive back into hangar
bjarni
parents:
4527
diff
changeset
|
1889 |
} |
2bfac24af02a
(svn r6356) -Fix: FS#263 planes come out of hangar and drive back into hangar
bjarni
parents:
4527
diff
changeset
|
1890 |
|
6889
f7f6d9cb07a0
(svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents:
6683
diff
changeset
|
1891 |
/* XXX If we already have a depot order, WHY do we search over and over? */ |
7998
f1a308b61b8f
(svn r11017) -Codechange: unify determining whether a vehicle needs/can be service a little more.
rubidium
parents:
7993
diff
changeset
|
1892 |
const Depot *depot = FindClosestRoadDepot(v); |
0 | 1893 |
|
1313
bba6afb8a995
(svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents:
1299
diff
changeset
|
1894 |
if (depot == NULL || DistanceManhattan(v->tile, depot->xy) > 12) { |
9332
2e120d0bd632
(svn r12584) -Codechange: do not access the order type directly.
rubidium
parents:
9326
diff
changeset
|
1895 |
if (v->current_order.IsType(OT_GOTO_DEPOT)) { |
2e120d0bd632
(svn r12584) -Codechange: do not access the order type directly.
rubidium
parents:
9326
diff
changeset
|
1896 |
v->current_order.MakeDummy(); |
8846
f3e877a92e2b
(svn r11916) -Codechange: use enums from VehicleViewWindowWidgets instead of constants
smatz
parents:
8813
diff
changeset
|
1897 |
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH); |
0 | 1898 |
} |
1899 |
return; |
|
1900 |
} |
|
1901 |
||
9332
2e120d0bd632
(svn r12584) -Codechange: do not access the order type directly.
rubidium
parents:
9326
diff
changeset
|
1902 |
if (v->current_order.IsType(OT_GOTO_DEPOT) && |
9344
1be7ac6bd504
(svn r12600) -Codechange: make GetNonStopType return a more augmented type; not is there a non-stop order but the kind of non-stop order, so one doesn't need to check _patches.new_nonstop type everywhere.
rubidium
parents:
9339
diff
changeset
|
1903 |
v->current_order.GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS && |
8463
3920ac0ab803
(svn r11523) -Codechange: Move the CHANCE macros to core/random_func.cpp cause they depend on Random()
skidd13
parents:
8450
diff
changeset
|
1904 |
!Chance16(1, 20)) { |
0 | 1905 |
return; |
3033
e4f7c60a1742
(svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents:
3032
diff
changeset
|
1906 |
} |
0 | 1907 |
|
9332
2e120d0bd632
(svn r12584) -Codechange: do not access the order type directly.
rubidium
parents:
9326
diff
changeset
|
1908 |
if (v->current_order.IsType(OT_LOADING)) v->LeaveStation(); |
7109
7d410365d6fc
(svn r9833) -Fix: also 'leave' the station when leaving for automatic servicing.
rubidium
parents:
7104
diff
changeset
|
1909 |
ClearSlot(v); |
7d410365d6fc
(svn r9833) -Fix: also 'leave' the station when leaving for automatic servicing.
rubidium
parents:
7104
diff
changeset
|
1910 |
|
10079
99aba130db3c
(svn r12615) -Codechange: rename some enums related to depot orders to make it more clear that they are no loading/unloading flags. Also add more type strictness.
rubidium
parents:
9344
diff
changeset
|
1911 |
v->current_order.MakeGoToDepot(depot->index, ODTFB_SERVICE); |
1313
bba6afb8a995
(svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents:
1299
diff
changeset
|
1912 |
v->dest_tile = depot->xy; |
8846
f3e877a92e2b
(svn r11916) -Codechange: use enums from VehicleViewWindowWidgets instead of constants
smatz
parents:
8813
diff
changeset
|
1913 |
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH); |
0 | 1914 |
} |
1915 |
||
8963
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1916 |
void RoadVehicle::OnNewDay() |
0 | 1917 |
{ |
8963
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1918 |
if (!IsRoadVehFront(this)) return; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
1919 |
|
8963
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1920 |
if ((++this->day_counter & 7) == 0) DecreaseVehicleValue(this); |
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1921 |
if (this->u.road.blocked_ctr == 0) CheckVehicleBreakdown(this); |
0 | 1922 |
|
8963
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1923 |
AgeVehicle(this); |
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1924 |
CheckIfRoadVehNeedsService(this); |
0 | 1925 |
|
8963
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1926 |
CheckOrders(this); |
19
6080d2b6a959
(svn r20) Feature: warning when a vehicle has invalid orders (celestar)
dominik
parents:
11
diff
changeset
|
1927 |
|
6889
f7f6d9cb07a0
(svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents:
6683
diff
changeset
|
1928 |
/* Current slot has expired */ |
9332
2e120d0bd632
(svn r12584) -Codechange: do not access the order type directly.
rubidium
parents:
9326
diff
changeset
|
1929 |
if (this->current_order.IsType(OT_GOTO_STATION) && this->u.road.slot != NULL && this->u.road.slot_age-- == 0) { |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
1930 |
DEBUG(ms, 3, "Slot expired for vehicle %d (index %d) at stop 0x%X", |
8963
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1931 |
this->unitnumber, this->index, this->u.road.slot->xy); |
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1932 |
ClearSlot(this); |
3123 | 1933 |
} |
1934 |
||
0 | 1935 |
/* update destination */ |
9332
2e120d0bd632
(svn r12584) -Codechange: do not access the order type directly.
rubidium
parents:
9326
diff
changeset
|
1936 |
if (!(this->vehstatus & VS_STOPPED) && this->current_order.IsType(OT_GOTO_STATION) && this->u.road.slot == NULL && !(this->vehstatus & VS_CRASHED)) { |
9336
3f75a2c5e0d3
(svn r12588) -Codechange: do not access the destination of an order directly.
rubidium
parents:
9332
diff
changeset
|
1937 |
Station *st = GetStation(this->current_order.GetDestination()); |
8963
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1938 |
RoadStop *rs = st->GetPrimaryRoadStop(this); |
7965
c1a170885a60
(svn r10974) -Fix [FS#1144, FS#1155]: road vehicles that could not (properly) use a road stop still tried to go to that road stop.
rubidium
parents:
7946
diff
changeset
|
1939 |
RoadStop *best = NULL; |
1217
ab9f02a224ab
(svn r1721) -Feature: It is now possible to build multiple road stations (up to 8) on
celestar
parents:
1209
diff
changeset
|
1940 |
|
3123 | 1941 |
if (rs != NULL) { |
6161
754debc55207
(svn r8536) -Fix (FS#577): Road Vehicles now can obtain a slot even if the station is very spread out
celestar
parents:
6127
diff
changeset
|
1942 |
/* We try to obtain a slot if: |
754debc55207
(svn r8536) -Fix (FS#577): Road Vehicles now can obtain a slot even if the station is very spread out
celestar
parents:
6127
diff
changeset
|
1943 |
* 1) we're reasonably close to the primary road stop |
754debc55207
(svn r8536) -Fix (FS#577): Road Vehicles now can obtain a slot even if the station is very spread out
celestar
parents:
6127
diff
changeset
|
1944 |
* or |
754debc55207
(svn r8536) -Fix (FS#577): Road Vehicles now can obtain a slot even if the station is very spread out
celestar
parents:
6127
diff
changeset
|
1945 |
* 2) we're somewhere close to the station rectangle (to make sure we do assign |
754debc55207
(svn r8536) -Fix (FS#577): Road Vehicles now can obtain a slot even if the station is very spread out
celestar
parents:
6127
diff
changeset
|
1946 |
* slots even if the station and its road stops are incredibly spread out) |
754debc55207
(svn r8536) -Fix (FS#577): Road Vehicles now can obtain a slot even if the station is very spread out
celestar
parents:
6127
diff
changeset
|
1947 |
*/ |
8963
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1948 |
if (DistanceManhattan(this->tile, rs->xy) < 16 || st->rect.PtInExtendedRect(TileX(this->tile), TileY(this->tile), 2)) { |
3431 | 1949 |
uint dist, badness; |
1950 |
uint minbadness = UINT_MAX; |
|
1217
ab9f02a224ab
(svn r1721) -Feature: It is now possible to build multiple road stations (up to 8) on
celestar
parents:
1209
diff
changeset
|
1951 |
|
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
1952 |
DEBUG(ms, 2, "Attempting to obtain a slot for vehicle %d (index %d) at station %d (0x%X)", |
8963
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1953 |
this->unitnumber, this->index, st->index, st->xy |
4077
d3022f976946
(svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents:
3990
diff
changeset
|
1954 |
); |
3123 | 1955 |
/* Now we find the nearest road stop that has a free slot */ |
8963
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1956 |
for (; rs != NULL; rs = rs->GetNextRoadStop(this)) { |
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1957 |
dist = RoadFindPathToStop(this, rs->xy); |
3431 | 1958 |
if (dist == UINT_MAX) { |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
1959 |
DEBUG(ms, 4, " stop 0x%X is unreachable, not treating further", rs->xy); |
3123 | 1960 |
continue; |
1961 |
} |
|
3915
281c7ebd27e0
(svn r5033) -CodeChange: [YAPF] RoadFindPathToStop() can now use YAPF for multistop handling.
KUDr
parents:
3900
diff
changeset
|
1962 |
badness = (rs->num_vehicles + 1) * (rs->num_vehicles + 1) + dist; |
3123 | 1963 |
|
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
1964 |
DEBUG(ms, 4, " stop 0x%X has %d vehicle%s waiting", rs->xy, rs->num_vehicles, rs->num_vehicles == 1 ? "":"s"); |
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
1965 |
DEBUG(ms, 4, " distance is %u", dist); |
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
1966 |
DEBUG(ms, 4, " badness %u", badness); |
3431 | 1967 |
|
1968 |
if (badness < minbadness) { |
|
1969 |
best = rs; |
|
1970 |
minbadness = badness; |
|
3123 | 1971 |
} |
3033
e4f7c60a1742
(svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents:
3032
diff
changeset
|
1972 |
} |
1217
ab9f02a224ab
(svn r1721) -Feature: It is now possible to build multiple road stations (up to 8) on
celestar
parents:
1209
diff
changeset
|
1973 |
|
3431 | 1974 |
if (best != NULL) { |
1975 |
best->num_vehicles++; |
|
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
1976 |
DEBUG(ms, 3, "Assigned to stop 0x%X", best->xy); |
1217
ab9f02a224ab
(svn r1721) -Feature: It is now possible to build multiple road stations (up to 8) on
celestar
parents:
1209
diff
changeset
|
1977 |
|
8963
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1978 |
this->u.road.slot = best; |
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1979 |
this->dest_tile = best->xy; |
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1980 |
this->u.road.slot_age = 14; |
3123 | 1981 |
} else { |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
1982 |
DEBUG(ms, 3, "Could not find a suitable stop"); |
3123 | 1983 |
} |
1984 |
} else { |
|
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
1985 |
DEBUG(ms, 5, "Distance from station too far. Postponing slotting for vehicle %d (index %d) at station %d, (0x%X)", |
8963
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1986 |
this->unitnumber, this->index, st->index, st->xy); |
1295
5dc810674581
(svn r1799) -Codechange: [ Multistop ] Added debug class "ms" and more debugging
celestar
parents:
1282
diff
changeset
|
1987 |
} |
3123 | 1988 |
} else { |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
1989 |
DEBUG(ms, 4, "No road stop for vehicle %d (index %d) at station %d (0x%X)", |
8963
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
1990 |
this->unitnumber, this->index, st->index, st->xy); |
1217
ab9f02a224ab
(svn r1721) -Feature: It is now possible to build multiple road stations (up to 8) on
celestar
parents:
1209
diff
changeset
|
1991 |
} |
0 | 1992 |
} |
1993 |
||
9052
392f5995d323
(svn r12134) -Change: count the number of ticks a vehicle was running this day to calculate running cost
smatz
parents:
9050
diff
changeset
|
1994 |
if (this->running_ticks == 0) return; |
0 | 1995 |
|
9122
bc3651767850
(svn r12209) -Fix: [NewGRF] Support using any base price for rail and road vehicles' running cost, and show running cost of wagons if they have it.
peter1138
parents:
9112
diff
changeset
|
1996 |
const RoadVehicleInfo *rvi = RoadVehInfo(this->engine_type); |
bc3651767850
(svn r12209) -Fix: [NewGRF] Support using any base price for rail and road vehicles' running cost, and show running cost of wagons if they have it.
peter1138
parents:
9112
diff
changeset
|
1997 |
CommandCost cost(EXPENSES_ROADVEH_RUN, rvi->running_cost * GetPriceByIndex(rvi->running_cost_class) * this->running_ticks / (364 * DAY_TICKS)); |
9052
392f5995d323
(svn r12134) -Change: count the number of ticks a vehicle was running this day to calculate running cost
smatz
parents:
9050
diff
changeset
|
1998 |
|
392f5995d323
(svn r12134) -Change: count the number of ticks a vehicle was running this day to calculate running cost
smatz
parents:
9050
diff
changeset
|
1999 |
this->profit_this_year -= cost.GetCost(); |
392f5995d323
(svn r12134) -Change: count the number of ticks a vehicle was running this day to calculate running cost
smatz
parents:
9050
diff
changeset
|
2000 |
this->running_ticks = 0; |
0 | 2001 |
|
8963
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
2002 |
SubtractMoneyFromPlayerFract(this->owner, cost); |
0 | 2003 |
|
8963
4b41ed1df7e5
(svn r12037) -Codechange: replace OnNewDay_(Aircraft|RoadVeh|Ship|Train) with an OnNewDay method in the Vehicle class
glx
parents:
8920
diff
changeset
|
2004 |
InvalidateWindow(WC_VEHICLE_DETAILS, this->index); |
1151
614cbcb5b9fe
(svn r1652) Fix: train and road vehicle lists are now redrawn when vehicles enters/leaves a depot (Hackykid)
bjarni
parents:
1128
diff
changeset
|
2005 |
InvalidateWindowClasses(WC_ROADVEH_LIST); |
0 | 2006 |
} |
2007 |
||
2008 |
||
6573 | 2009 |
void RoadVehiclesYearlyLoop() |
0 | 2010 |
{ |
2011 |
Vehicle *v; |
|
2012 |
||
2013 |
FOR_ALL_VEHICLES(v) { |
|
6585
7da94b26498a
(svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents:
6574
diff
changeset
|
2014 |
if (v->type == VEH_ROAD) { |
0 | 2015 |
v->profit_last_year = v->profit_this_year; |
2016 |
v->profit_this_year = 0; |
|
2017 |
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); |
|
2018 |
} |
|
2019 |
} |
|
2020 |
} |
|
3990
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2021 |
|
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2022 |
/** Refit a road vehicle to the specified cargo type |
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2023 |
* @param tile unused |
6979
d194d25020e7
(svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents:
6949
diff
changeset
|
2024 |
* @param flags operation to perform |
3990
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2025 |
* @param p1 Vehicle ID of the vehicle to refit |
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2026 |
* @param p2 Bitstuffed elements |
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2027 |
* - p2 = (bit 0-7) - the new cargo type to refit to |
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2028 |
* - p2 = (bit 8-15) - the new cargo subtype to refit to |
7914
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2029 |
* - p2 = (bit 16) - refit only this vehicle |
7042
d841fb0d8e9a
(svn r9742) -Fix (r9689) [FS#739]: Fix cloning with refit costs again, hopefully for good this time.
maedhros
parents:
7040
diff
changeset
|
2030 |
* @return cost of refit or error |
3990
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2031 |
*/ |
7439
0c0e2945c890
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
7375
diff
changeset
|
2032 |
CommandCost CmdRefitRoadVeh(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
3990
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2033 |
{ |
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2034 |
Vehicle *v; |
8726
5ae45b46506b
(svn r11793) -Codechange: pass the expense type via the CommandCost instead of a global variable. Patch by Noldo (FS#1114).
rubidium
parents:
8722
diff
changeset
|
2035 |
CommandCost cost(EXPENSES_ROADVEH_RUN); |
3990
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2036 |
CargoID new_cid = GB(p2, 0, 8); |
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2037 |
byte new_subtype = GB(p2, 8, 8); |
8424
4a488a90ccab
(svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents:
8420
diff
changeset
|
2038 |
bool only_this = HasBit(p2, 16); |
3990
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2039 |
uint16 capacity = CALLBACK_FAILED; |
7914
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2040 |
uint total_capacity = 0; |
3990
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2041 |
|
4352
8ddb01bc6075
(svn r6053) -Codechange: renamed all IsXXXIndex to IsValidXXXID
truelight
parents:
4351
diff
changeset
|
2042 |
if (!IsValidVehicleID(p1)) return CMD_ERROR; |
3990
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2043 |
|
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2044 |
v = GetVehicle(p1); |
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2045 |
|
6585
7da94b26498a
(svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents:
6574
diff
changeset
|
2046 |
if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR; |
7353
716c6dd9322a
(svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents:
7286
diff
changeset
|
2047 |
if (!CheckRoadVehInDepotStopped(v)) return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE); |
8641
966d79f41865
(svn r11707) -Fix: do not allow refitting flooded (destroyed) vehicles
smatz
parents:
8640
diff
changeset
|
2048 |
if (v->vehstatus & VS_CRASHED) return_cmd_error(STR_CAN_T_REFIT_DESTROYED_VEHICLE); |
3990
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2049 |
|
7914
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2050 |
if (new_cid >= NUM_CARGO) return CMD_ERROR; |
3990
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2051 |
|
7988
6075538f6111
(svn r11003) -Codechange: replace Vehicle->next to Vehicle->Next() and Vehicle->SetNext() so we can trap instances that change a next pointer and (in the future) update the first/previous pointers based on that.
rubidium
parents:
7986
diff
changeset
|
2052 |
for (; v != NULL; v = v->Next()) { |
7914
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2053 |
/* XXX: We refit all the attached wagons en-masse if they can be |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2054 |
* refitted. This is how TTDPatch does it. TODO: Have some nice |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2055 |
* [Refit] button near each wagon. */ |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2056 |
if (!CanRefitTo(v->engine_type, new_cid)) continue; |
3990
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2057 |
|
7914
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2058 |
if (v->cargo_cap == 0) continue; |
3990
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2059 |
|
8424
4a488a90ccab
(svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents:
8420
diff
changeset
|
2060 |
if (HasBit(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_REFIT_CAPACITY)) { |
7914
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2061 |
/* Back up the cargo type */ |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2062 |
CargoID temp_cid = v->cargo_type; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2063 |
byte temp_subtype = v->cargo_subtype; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2064 |
v->cargo_type = new_cid; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2065 |
v->cargo_subtype = new_subtype; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2066 |
|
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2067 |
/* Check the refit capacity callback */ |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2068 |
capacity = GetVehicleCallback(CBID_VEHICLE_REFIT_CAPACITY, 0, 0, v->engine_type, v); |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2069 |
|
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2070 |
/* Restore the original cargo type */ |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2071 |
v->cargo_type = temp_cid; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2072 |
v->cargo_subtype = temp_subtype; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2073 |
} |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2074 |
|
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2075 |
if (capacity == CALLBACK_FAILED) { |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2076 |
/* callback failed or not used, use default capacity */ |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2077 |
const RoadVehicleInfo *rvi = RoadVehInfo(v->engine_type); |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2078 |
|
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2079 |
CargoID old_cid = rvi->cargo_type; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2080 |
/* normally, the capacity depends on the cargo type, a vehicle can |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2081 |
* carry twice as much mail/goods as normal cargo, and four times as |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2082 |
* many passengers |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2083 |
*/ |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2084 |
capacity = GetVehicleProperty(v, 0x0F, rvi->capacity); |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2085 |
switch (old_cid) { |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2086 |
case CT_PASSENGERS: break; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2087 |
case CT_MAIL: |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2088 |
case CT_GOODS: capacity *= 2; break; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2089 |
default: capacity *= 4; break; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2090 |
} |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2091 |
switch (new_cid) { |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2092 |
case CT_PASSENGERS: break; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2093 |
case CT_MAIL: |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2094 |
case CT_GOODS: capacity /= 2; break; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2095 |
default: capacity /= 4; break; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2096 |
} |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2097 |
} |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2098 |
|
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2099 |
if (capacity == 0) continue; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2100 |
|
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2101 |
total_capacity += capacity; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2102 |
|
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2103 |
if (IsHumanPlayer(v->owner) && new_cid != v->cargo_type) { |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2104 |
cost.AddCost(GetRefitCost(v->engine_type)); |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2105 |
} |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2106 |
|
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2107 |
if (flags & DC_EXEC) { |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2108 |
v->cargo_cap = capacity; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2109 |
v->cargo.Truncate((v->cargo_type == new_cid) ? capacity : 0); |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2110 |
v->cargo_type = new_cid; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2111 |
v->cargo_subtype = new_subtype; |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2112 |
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2113 |
InvalidateWindow(WC_VEHICLE_DEPOT, v->tile); |
10621
3edd349d9c14
(svn r13165) -Codechange: replace some RebuildXXXList/ResortXXXList+InvalidateWindowXXX with InvalidateWindowXXXData.
rubidium
parents:
10556
diff
changeset
|
2114 |
InvalidateWindowClassesData(WC_ROADVEH_LIST, 0); |
7914
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2115 |
} |
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2116 |
|
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2117 |
if (only_this) break; |
3990
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2118 |
} |
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2119 |
|
7914
946aa6131995
(svn r10811) -Fix (r10097): Refit all the parts of an articulated road vehicle, not just the first part.
maedhros
parents:
7912
diff
changeset
|
2120 |
_returned_refit_capacity = total_capacity; |
3990
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2121 |
|
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2122 |
return cost; |
d3d23f3bcd34
(svn r5191) - NewGRF: add cargo refit support for road vehicles
peter1138
parents:
3977
diff
changeset
|
2123 |
} |