author | rubidium |
Sun, 21 Oct 2007 16:45:00 +0000 | |
changeset 7782 | e2999b5fcfad |
parent 7695 | 4b27fd86b318 |
child 7815 | b821a6aafd09 |
permissions | -rw-r--r-- |
2186 | 1 |
/* $Id$ */ |
2 |
||
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
3 |
/** @file ship_cmd.cpp */ |
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
4 |
|
0 | 5 |
#include "stdafx.h" |
1891
862800791170
(svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents:
1802
diff
changeset
|
6 |
#include "openttd.h" |
3961
9868b766fda7
(svn r5120) Add IsShipInDepot{Stopped,}() and remove some redundant checks
tron
parents:
3955
diff
changeset
|
7 |
#include "ship.h" |
507
04b5403aaf6b
(svn r815) Include strings.h only in the files which need it.
tron
parents:
445
diff
changeset
|
8 |
#include "table/strings.h" |
7266
b16e67e992b4
(svn r10587) -Codechange: move the string/dparam related stuff from variables.h to strings.h
rubidium
parents:
7135
diff
changeset
|
9 |
#include "strings.h" |
2163
b17b313113a0
(svn r2673) Include functions.h directly, not globally via openttd.h
tron
parents:
2159
diff
changeset
|
10 |
#include "functions.h" |
6453
226bcddeba32
(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:
6420
diff
changeset
|
11 |
#include "landscape.h" |
679
04ca2cd69420
(svn r1117) Move map arrays and some related macros into their own files map.c and map.h
tron
parents:
593
diff
changeset
|
12 |
#include "map.h" |
1209
2e00193652b2
(svn r1713) Split off several functions which query/set information about a single tile from map.h and put them into a seperate file tile.h
tron
parents:
1206
diff
changeset
|
13 |
#include "tile.h" |
0 | 14 |
#include "vehicle.h" |
6980
c7c4f3bf5901
(svn r10236) -Feature: Introduce a form of timetabling for vehicles.
maedhros
parents:
6953
diff
changeset
|
15 |
#include "timetable.h" |
0 | 16 |
#include "command.h" |
17 |
#include "pathfind.h" |
|
3442
41d828e2d5ab
(svn r4272) -Codechange: Moved the map-accessing stuff from station.h into station_map.h
celestar
parents:
3421
diff
changeset
|
18 |
#include "station_map.h" |
0 | 19 |
#include "station.h" |
20 |
#include "news.h" |
|
21 |
#include "engine.h" |
|
22 |
#include "player.h" |
|
337
cbe0c766c947
(svn r513) Merge revisions 402, 416, 417, 478, 479, 511, 512 from map to trunk
tron
parents:
297
diff
changeset
|
23 |
#include "sound.h" |
1247 | 24 |
#include "npf.h" |
1313
f1013ec3d318
(svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents:
1282
diff
changeset
|
25 |
#include "depot.h" |
2159
f6284cf5fab0
(svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents:
2150
diff
changeset
|
26 |
#include "vehicle_gui.h" |
2962
f0a49b646c48
(svn r3524) - Split newgrf features from engine.[ch] into newgrf_engine.[ch], and add the new files to project files.
peter1138
parents:
2916
diff
changeset
|
27 |
#include "newgrf_engine.h" |
3454
8dfe8de79c02
(svn r4289) -Codechange: Make use of water_map accessors for ships. Make a mental note to clean ship_cmd
celestar
parents:
3442
diff
changeset
|
28 |
#include "water_map.h" |
3900
2c84ed52709d
(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" |
2c84ed52709d
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
30 |
#include "debug.h" |
3989
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
31 |
#include "newgrf_callbacks.h" |
4244
d40c73c55357
(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
|
32 |
#include "newgrf_text.h" |
4656
9c1d8c4d3e60
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
33 |
#include "newgrf_sound.h" |
4261
28670f743746
(svn r5887) -Cleanup: move date related functions, defines and variables to date.[ch]
rubidium
parents:
4244
diff
changeset
|
34 |
#include "date.h" |
5972
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
35 |
#include "spritecache.h" |
7398
b933416cf32b
(svn r10770) -Codechange: use the pool item class as super class for the vehicle struct.
rubidium
parents:
7334
diff
changeset
|
36 |
#include "misc/autoptr.hpp" |
0 | 37 |
|
38 |
static const uint16 _ship_sprites[] = {0x0E5D, 0x0E55, 0x0E65, 0x0E6D}; |
|
39 |
||
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
40 |
static const TrackBits _ship_sometracks[4] = { |
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
41 |
TRACK_BIT_X | TRACK_BIT_LOWER | TRACK_BIT_LEFT, // 0x19, // DIAGDIR_NE |
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
42 |
TRACK_BIT_Y | TRACK_BIT_UPPER | TRACK_BIT_LEFT, // 0x16, // DIAGDIR_SE |
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
43 |
TRACK_BIT_X | TRACK_BIT_UPPER | TRACK_BIT_RIGHT, // 0x25, // DIAGDIR_SW |
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
44 |
TRACK_BIT_Y | TRACK_BIT_LOWER | TRACK_BIT_RIGHT, // 0x2A, // DIAGDIR_NW |
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
45 |
}; |
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
46 |
|
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
47 |
static TrackBits GetTileShipTrackStatus(TileIndex tile) |
1977
37bbebf94434
(svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents:
1942
diff
changeset
|
48 |
{ |
6683
b88ae30866ce
(svn r9914) -Codechange: prepare GTTS and the pathfinders to handle multiple road types on a single tile.
rubidium
parents:
6613
diff
changeset
|
49 |
uint32 r = GetTileTrackStatus(tile, TRANSPORT_WATER, 0); |
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
50 |
return TrackdirBitsToTrackBits((TrackdirBits)(TRACKDIR_BIT_MASK & (r | r >> 8))); |
0 | 51 |
} |
52 |
||
5668
36b39f4a9032
(svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents:
5651
diff
changeset
|
53 |
void DrawShipEngine(int x, int y, EngineID engine, SpriteID pal) |
0 | 54 |
{ |
538
24fdb517fbe5
(svn r920) Replace vehicle info macros with inline functions and add asserts to check limits
tron
parents:
534
diff
changeset
|
55 |
int spritenum = ShipVehInfo(engine)->image_index; |
0 | 56 |
|
57 |
if (is_custom_sprite(spritenum)) { |
|
3186
4317b5b295c4
(svn r3832) Replace some magic numbers by (Diag)Direction enums
tron
parents:
3157
diff
changeset
|
58 |
int sprite = GetCustomVehicleIcon(engine, DIR_W); |
0 | 59 |
|
2639 | 60 |
if (sprite != 0) { |
5668
36b39f4a9032
(svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents:
5651
diff
changeset
|
61 |
DrawSprite(sprite, pal, x, y); |
0 | 62 |
return; |
63 |
} |
|
2464
e3054f0f0627
(svn r2990) Remove _engine_original_sprites and replace all uses with references to our (new) original engine/vehicle tables.
peter1138
parents:
2214
diff
changeset
|
64 |
spritenum = orig_ship_vehicle_info[engine - SHIP_ENGINES_INDEX].image_index; |
0 | 65 |
} |
5668
36b39f4a9032
(svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents:
5651
diff
changeset
|
66 |
DrawSprite(6 + _ship_sprites[spritenum], pal, x, y); |
0 | 67 |
} |
68 |
||
5972
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
69 |
/** Get the size of the sprite of a ship sprite heading west (used for lists) |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
70 |
* @param engine The engine to get the sprite from |
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
71 |
* @param width The width of the sprite |
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
72 |
* @param height The height of the sprite |
5972
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
73 |
*/ |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
74 |
void GetShipSpriteSize(EngineID engine, uint &width, uint &height) |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
75 |
{ |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
76 |
SpriteID spritenum = ShipVehInfo(engine)->image_index; |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
77 |
SpriteID custom_sprite = 0; |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
78 |
|
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
79 |
if (is_custom_sprite(spritenum)) { |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
80 |
custom_sprite = GetCustomVehicleIcon(engine, DIR_W); |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
81 |
spritenum = orig_ship_vehicle_info[engine - SHIP_ENGINES_INDEX].image_index; |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
82 |
} |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
83 |
if (custom_sprite == 0) { |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
84 |
spritenum = 6 + _ship_sprites[spritenum]; |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
85 |
} else { |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
86 |
spritenum = custom_sprite; |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
87 |
} |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
88 |
|
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
89 |
const Sprite *spr = GetSprite(spritenum); |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
90 |
|
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
91 |
width = spr->width; |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
92 |
height = spr->height; |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
93 |
} |
59953719a3ff
(svn r8661) -Fix: [depot windows] Enlarge the blocks in the depot window if a sprite is too big to fit (ships and aircraft only)
bjarni
parents:
5944
diff
changeset
|
94 |
|
7134
5b2d47128d05
(svn r10408) -Codechange: make GetImage a class method of Vehicle instead of Get(Aircraft|RoadVeh|Ship|Train)Image.
rubidium
parents:
7096
diff
changeset
|
95 |
int Ship::GetImage(Direction direction) const |
0 | 96 |
{ |
7134
5b2d47128d05
(svn r10408) -Codechange: make GetImage a class method of Vehicle instead of Get(Aircraft|RoadVeh|Ship|Train)Image.
rubidium
parents:
7096
diff
changeset
|
97 |
int spritenum = this->spritenum; |
0 | 98 |
|
99 |
if (is_custom_sprite(spritenum)) { |
|
7134
5b2d47128d05
(svn r10408) -Codechange: make GetImage a class method of Vehicle instead of Get(Aircraft|RoadVeh|Ship|Train)Image.
rubidium
parents:
7096
diff
changeset
|
100 |
int sprite = GetCustomVehicleSprite(this, direction); |
0 | 101 |
|
2639 | 102 |
if (sprite != 0) return sprite; |
7134
5b2d47128d05
(svn r10408) -Codechange: make GetImage a class method of Vehicle instead of Get(Aircraft|RoadVeh|Ship|Train)Image.
rubidium
parents:
7096
diff
changeset
|
103 |
spritenum = orig_ship_vehicle_info[this->engine_type - SHIP_ENGINES_INDEX].image_index; |
0 | 104 |
} |
105 |
return _ship_sprites[spritenum] + direction; |
|
106 |
} |
|
107 |
||
2630 | 108 |
static const Depot* FindClosestShipDepot(const Vehicle* v) |
0 | 109 |
{ |
2630 | 110 |
const Depot* depot; |
111 |
const Depot* best_depot = NULL; |
|
1977
37bbebf94434
(svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents:
1942
diff
changeset
|
112 |
uint dist; |
37bbebf94434
(svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents:
1942
diff
changeset
|
113 |
uint best_dist = (uint)-1; |
37bbebf94434
(svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents:
1942
diff
changeset
|
114 |
TileIndex tile; |
37bbebf94434
(svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents:
1942
diff
changeset
|
115 |
TileIndex tile2 = v->tile; |
0 | 116 |
|
1247 | 117 |
if (_patches.new_pathfinding_all) { |
118 |
NPFFoundTargetData ftd; |
|
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
119 |
Trackdir trackdir = GetVehicleTrackdir(v); |
6683
b88ae30866ce
(svn r9914) -Codechange: prepare GTTS and the pathfinders to handle multiple road types on a single tile.
rubidium
parents:
6613
diff
changeset
|
120 |
ftd = NPFRouteToDepotTrialError(v->tile, trackdir, TRANSPORT_WATER, 0, v->owner, INVALID_RAILTYPE); |
2639 | 121 |
if (ftd.best_bird_dist == 0) { |
1313
f1013ec3d318
(svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents:
1282
diff
changeset
|
122 |
best_depot = GetDepotByTile(ftd.node.tile); /* Found target */ |
2639 | 123 |
} else { |
1313
f1013ec3d318
(svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents:
1282
diff
changeset
|
124 |
best_depot = NULL; /* Did not find target */ |
2639 | 125 |
} |
1247 | 126 |
} else { |
1313
f1013ec3d318
(svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents:
1282
diff
changeset
|
127 |
FOR_ALL_DEPOTS(depot) { |
f1013ec3d318
(svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents:
1282
diff
changeset
|
128 |
tile = depot->xy; |
4346
66105d4f6e83
(svn r6047) -Codechange: FOR_ALL now _only_ loops valid items, and skips invalid ones
truelight
parents:
4344
diff
changeset
|
129 |
if (IsTileDepotType(tile, TRANSPORT_WATER) && IsTileOwner(tile, v->owner)) { |
1247 | 130 |
dist = DistanceManhattan(tile, tile2); |
131 |
if (dist < best_dist) { |
|
132 |
best_dist = dist; |
|
1313
f1013ec3d318
(svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents:
1282
diff
changeset
|
133 |
best_depot = depot; |
1247 | 134 |
} |
0 | 135 |
} |
136 |
} |
|
137 |
} |
|
138 |
return best_depot; |
|
139 |
} |
|
140 |
||
141 |
static void CheckIfShipNeedsService(Vehicle *v) |
|
142 |
{ |
|
7502
f821f134ec5a
(svn r11017) -Codechange: unify determining whether a vehicle needs/can be service a little more.
rubidium
parents:
7490
diff
changeset
|
143 |
if (_patches.servint_ships == 0 || !VehicleNeedsService(v)) return; |
7490
bb27d92565d3
(svn r11001) -Codechange: unify the way to determine whether a vehicle is in a depot.
rubidium
parents:
7425
diff
changeset
|
144 |
if (v->IsInDepot()) { |
4529
18bd5e7e35aa
(svn r6356) -Fix: FS#263 planes come out of hangar and drive back into hangar
bjarni
parents:
4527
diff
changeset
|
145 |
VehicleServiceInDepot(v); |
18bd5e7e35aa
(svn r6356) -Fix: FS#263 planes come out of hangar and drive back into hangar
bjarni
parents:
4527
diff
changeset
|
146 |
return; |
18bd5e7e35aa
(svn r6356) -Fix: FS#263 planes come out of hangar and drive back into hangar
bjarni
parents:
4527
diff
changeset
|
147 |
} |
18bd5e7e35aa
(svn r6356) -Fix: FS#263 planes come out of hangar and drive back into hangar
bjarni
parents:
4527
diff
changeset
|
148 |
|
7502
f821f134ec5a
(svn r11017) -Codechange: unify determining whether a vehicle needs/can be service a little more.
rubidium
parents:
7490
diff
changeset
|
149 |
const Depot *depot = FindClosestShipDepot(v); |
0 | 150 |
|
1313
f1013ec3d318
(svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents:
1282
diff
changeset
|
151 |
if (depot == NULL || DistanceManhattan(v->tile, depot->xy) > 12) { |
555
02df8a1b7f33
(svn r955) Replace uint16 for orders with struct Order
tron
parents:
541
diff
changeset
|
152 |
if (v->current_order.type == OT_GOTO_DEPOT) { |
02df8a1b7f33
(svn r955) Replace uint16 for orders with struct Order
tron
parents:
541
diff
changeset
|
153 |
v->current_order.type = OT_DUMMY; |
02df8a1b7f33
(svn r955) Replace uint16 for orders with struct Order
tron
parents:
541
diff
changeset
|
154 |
v->current_order.flags = 0; |
755
80091de50044
(svn r1211) -Feature: Introduce sticky windows to all vehicle windows...Just make sure you do not sticky more than 23 at a time. Also a lot of places in the code invalidated the 'status bar' of the vehicle, referring to it as widget 4. This is now widget 5 and has been #definitized
darkvater
parents:
679
diff
changeset
|
155 |
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR); |
0 | 156 |
} |
157 |
return; |
|
158 |
} |
|
159 |
||
555
02df8a1b7f33
(svn r955) Replace uint16 for orders with struct Order
tron
parents:
541
diff
changeset
|
160 |
v->current_order.type = OT_GOTO_DEPOT; |
02df8a1b7f33
(svn r955) Replace uint16 for orders with struct Order
tron
parents:
541
diff
changeset
|
161 |
v->current_order.flags = OF_NON_STOP; |
4527
fa30d19685c2
(svn r6353) -Codechange: Make DestinationID a typedef of uin16, which is as large as any type of destinataion (StationID, DepotID, WaypointID) it can hold
tron
parents:
4526
diff
changeset
|
162 |
v->current_order.dest = depot->index; |
1313
f1013ec3d318
(svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents:
1282
diff
changeset
|
163 |
v->dest_tile = depot->xy; |
755
80091de50044
(svn r1211) -Feature: Introduce sticky windows to all vehicle windows...Just make sure you do not sticky more than 23 at a time. Also a lot of places in the code invalidated the 'status bar' of the vehicle, referring to it as widget 4. This is now widget 5 and has been #definitized
darkvater
parents:
679
diff
changeset
|
164 |
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR); |
0 | 165 |
} |
166 |
||
167 |
void OnNewDay_Ship(Vehicle *v) |
|
168 |
{ |
|
6943
1914f26aee04
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
6888
diff
changeset
|
169 |
CommandCost cost; |
0 | 170 |
|
171 |
if ((++v->day_counter & 7) == 0) |
|
172 |
DecreaseVehicleValue(v); |
|
173 |
||
174 |
CheckVehicleBreakdown(v); |
|
175 |
AgeVehicle(v); |
|
176 |
CheckIfShipNeedsService(v); |
|
177 |
||
3140
5555cc95043a
(svn r3758) Remove the news validation callback. It is superseded by r3757.
tron
parents:
3139
diff
changeset
|
178 |
CheckOrders(v); |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
179 |
|
2639 | 180 |
if (v->vehstatus & VS_STOPPED) return; |
19
6080d2b6a959
(svn r20) Feature: warning when a vehicle has invalid orders (celestar)
dominik
parents:
11
diff
changeset
|
181 |
|
6950
14ecb0acdfb4
(svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents:
6943
diff
changeset
|
182 |
cost.AddCost(GetVehicleProperty(v, 0x0F, ShipVehInfo(v->engine_type)->running_cost) * _price.ship_running / 364); |
14ecb0acdfb4
(svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents:
6943
diff
changeset
|
183 |
v->profit_this_year -= cost.GetCost() >> 8; |
0 | 184 |
|
185 |
SET_EXPENSES_TYPE(EXPENSES_SHIP_RUN); |
|
6950
14ecb0acdfb4
(svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents:
6943
diff
changeset
|
186 |
SubtractMoneyFromPlayerFract(v->owner, CommandCost(cost)); |
0 | 187 |
|
188 |
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); |
|
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
189 |
/* we need this for the profit */ |
1055
cc4f60cc9102
(svn r1556) -Fix: Vehicle list updates should now really work
Celestar
parents:
1053
diff
changeset
|
190 |
InvalidateWindowClasses(WC_SHIPS_LIST); |
0 | 191 |
} |
192 |
||
193 |
static void HandleBrokenShip(Vehicle *v) |
|
194 |
{ |
|
195 |
if (v->breakdown_ctr != 1) { |
|
196 |
v->breakdown_ctr = 1; |
|
197 |
v->cur_speed = 0; |
|
198 |
||
199 |
if (v->breakdowns_since_last_service != 255) |
|
200 |
v->breakdowns_since_last_service++; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
201 |
|
0 | 202 |
InvalidateWindow(WC_VEHICLE_VIEW, v->index); |
203 |
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
204 |
|
4656
9c1d8c4d3e60
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
205 |
if (!PlayVehicleSound(v, VSE_BREAKDOWN)) { |
6357
f0f5e7d1713c
(svn r9400) -Codechange: Use some more representative enum names for landscape types.
belugas
parents:
6316
diff
changeset
|
206 |
SndPlayVehicleFx((_opt.landscape != LT_TOYLAND) ? |
4656
9c1d8c4d3e60
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
207 |
SND_10_TRAIN_BREAKDOWN : SND_3A_COMEDY_BREAKDOWN_2, v); |
9c1d8c4d3e60
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
208 |
} |
0 | 209 |
|
210 |
if (!(v->vehstatus & VS_HIDDEN)) { |
|
211 |
Vehicle *u = CreateEffectVehicleRel(v, 4, 4, 5, EV_BREAKDOWN_SMOKE); |
|
7334
ed9a43cf642a
(svn r10697) -Codechange: give a more sensible names to some of the unkX variables.
rubidium
parents:
7266
diff
changeset
|
212 |
if (u != NULL) u->u.special.animation_state = v->breakdown_delay * 2; |
0 | 213 |
} |
214 |
} |
|
215 |
||
216 |
if (!(v->tick_counter & 1)) { |
|
217 |
if (!--v->breakdown_delay) { |
|
218 |
v->breakdown_ctr = 0; |
|
1151
06c115ce7b7a
(svn r1652) Fix: train and road vehicle lists are now redrawn when vehicles enters/leaves a depot (Hackykid)
bjarni
parents:
1128
diff
changeset
|
219 |
InvalidateWindow(WC_VEHICLE_VIEW, v->index); |
0 | 220 |
} |
221 |
} |
|
222 |
} |
|
223 |
||
6553
976a684212ad
(svn r9755) -Codechange: refactor some more of the begin loading stuff.
rubidium
parents:
6552
diff
changeset
|
224 |
void Ship::MarkDirty() |
0 | 225 |
{ |
7134
5b2d47128d05
(svn r10408) -Codechange: make GetImage a class method of Vehicle instead of Get(Aircraft|RoadVeh|Ship|Train)Image.
rubidium
parents:
7096
diff
changeset
|
226 |
this->cur_image = this->GetImage(this->direction); |
6553
976a684212ad
(svn r9755) -Codechange: refactor some more of the begin loading stuff.
rubidium
parents:
6552
diff
changeset
|
227 |
MarkAllViewportsDirty(this->left_coord, this->top_coord, this->right_coord + 1, this->bottom_coord + 1); |
0 | 228 |
} |
229 |
||
6593
102aa05c5ca4
(svn r9807) -Codechange: unify playing of sound when vehicle has been loaded and leaves the station.
rubidium
parents:
6592
diff
changeset
|
230 |
static void PlayShipSound(const Vehicle *v) |
0 | 231 |
{ |
4656
9c1d8c4d3e60
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
232 |
if (!PlayVehicleSound(v, VSE_START)) { |
9c1d8c4d3e60
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
233 |
SndPlayVehicleFx(ShipVehInfo(v->engine_type)->sfx, v); |
9c1d8c4d3e60
(svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents:
4574
diff
changeset
|
234 |
} |
0 | 235 |
} |
236 |
||
6593
102aa05c5ca4
(svn r9807) -Codechange: unify playing of sound when vehicle has been loaded and leaves the station.
rubidium
parents:
6592
diff
changeset
|
237 |
void Ship::PlayLeaveStationSound() const |
102aa05c5ca4
(svn r9807) -Codechange: unify playing of sound when vehicle has been loaded and leaves the station.
rubidium
parents:
6592
diff
changeset
|
238 |
{ |
102aa05c5ca4
(svn r9807) -Codechange: unify playing of sound when vehicle has been loaded and leaves the station.
rubidium
parents:
6592
diff
changeset
|
239 |
PlayShipSound(this); |
102aa05c5ca4
(svn r9807) -Codechange: unify playing of sound when vehicle has been loaded and leaves the station.
rubidium
parents:
6592
diff
changeset
|
240 |
} |
102aa05c5ca4
(svn r9807) -Codechange: unify playing of sound when vehicle has been loaded and leaves the station.
rubidium
parents:
6592
diff
changeset
|
241 |
|
0 | 242 |
static void ProcessShipOrder(Vehicle *v) |
243 |
{ |
|
1024
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
1020
diff
changeset
|
244 |
const Order *order; |
0 | 245 |
|
3005
2590b9b4823b
(svn r3585) Similar changes to the order handlers of the other vehicle types like r3584
tron
parents:
2962
diff
changeset
|
246 |
switch (v->current_order.type) { |
2590b9b4823b
(svn r3585) Similar changes to the order handlers of the other vehicle types like r3584
tron
parents:
2962
diff
changeset
|
247 |
case OT_GOTO_DEPOT: |
2590b9b4823b
(svn r3585) Similar changes to the order handlers of the other vehicle types like r3584
tron
parents:
2962
diff
changeset
|
248 |
if (!(v->current_order.flags & OF_PART_OF_ORDERS)) return; |
2590b9b4823b
(svn r3585) Similar changes to the order handlers of the other vehicle types like r3584
tron
parents:
2962
diff
changeset
|
249 |
if (v->current_order.flags & OF_SERVICE_IF_NEEDED && |
2590b9b4823b
(svn r3585) Similar changes to the order handlers of the other vehicle types like r3584
tron
parents:
2962
diff
changeset
|
250 |
!VehicleNeedsService(v)) { |
7070
2f4e1b2facc6
(svn r10335) -Fix (r10331): Increment the current order index *after* using it in UpdateVehicleTimetable.
maedhros
parents:
7010
diff
changeset
|
251 |
UpdateVehicleTimetable(v, true); |
3005
2590b9b4823b
(svn r3585) Similar changes to the order handlers of the other vehicle types like r3584
tron
parents:
2962
diff
changeset
|
252 |
v->cur_order_index++; |
2590b9b4823b
(svn r3585) Similar changes to the order handlers of the other vehicle types like r3584
tron
parents:
2962
diff
changeset
|
253 |
} |
2590b9b4823b
(svn r3585) Similar changes to the order handlers of the other vehicle types like r3584
tron
parents:
2962
diff
changeset
|
254 |
break; |
2590b9b4823b
(svn r3585) Similar changes to the order handlers of the other vehicle types like r3584
tron
parents:
2962
diff
changeset
|
255 |
|
2590b9b4823b
(svn r3585) Similar changes to the order handlers of the other vehicle types like r3584
tron
parents:
2962
diff
changeset
|
256 |
case OT_LOADING: |
2590b9b4823b
(svn r3585) Similar changes to the order handlers of the other vehicle types like r3584
tron
parents:
2962
diff
changeset
|
257 |
case OT_LEAVESTATION: |
0 | 258 |
return; |
4351
c9799dd53eec
(svn r6052) -Codechange: change OrderType (order->type) in a typedef
truelight
parents:
4346
diff
changeset
|
259 |
|
c9799dd53eec
(svn r6052) -Codechange: change OrderType (order->type) in a typedef
truelight
parents:
4346
diff
changeset
|
260 |
default: break; |
0 | 261 |
} |
262 |
||
3005
2590b9b4823b
(svn r3585) Similar changes to the order handlers of the other vehicle types like r3584
tron
parents:
2962
diff
changeset
|
263 |
if (v->cur_order_index >= v->num_orders) v->cur_order_index = 0; |
0 | 264 |
|
1024
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
1020
diff
changeset
|
265 |
order = GetVehicleOrder(v, v->cur_order_index); |
0 | 266 |
|
1024
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
1020
diff
changeset
|
267 |
if (order == NULL) { |
6263
6bd0726c74e2
(svn r9072) -Codechange: [Orders] added methods to orders to free them and check if they are in use
bjarni
parents:
6259
diff
changeset
|
268 |
v->current_order.Free(); |
0 | 269 |
v->dest_tile = 0; |
270 |
return; |
|
271 |
} |
|
272 |
||
4527
fa30d19685c2
(svn r6353) -Codechange: Make DestinationID a typedef of uin16, which is as large as any type of destinataion (StationID, DepotID, WaypointID) it can hold
tron
parents:
4526
diff
changeset
|
273 |
if (order->type == v->current_order.type && |
fa30d19685c2
(svn r6353) -Codechange: Make DestinationID a typedef of uin16, which is as large as any type of destinataion (StationID, DepotID, WaypointID) it can hold
tron
parents:
4526
diff
changeset
|
274 |
order->flags == v->current_order.flags && |
6888
024407b0e309
(svn r10131) -Fix [FS#810]: when removing a dock, a ship will always try to reach the old location of the dock even when it cannot anymore because it the old location of the dock is now land instead of water.
rubidium
parents:
6683
diff
changeset
|
275 |
order->dest == v->current_order.dest && |
024407b0e309
(svn r10131) -Fix [FS#810]: when removing a dock, a ship will always try to reach the old location of the dock even when it cannot anymore because it the old location of the dock is now land instead of water.
rubidium
parents:
6683
diff
changeset
|
276 |
(order->type != OT_GOTO_STATION || GetStation(order->dest)->dock_tile != 0)) |
0 | 277 |
return; |
278 |
||
1024
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
1020
diff
changeset
|
279 |
v->current_order = *order; |
0 | 280 |
|
1024
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
1020
diff
changeset
|
281 |
if (order->type == OT_GOTO_STATION) { |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
1020
diff
changeset
|
282 |
const Station *st; |
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
1020
diff
changeset
|
283 |
|
4527
fa30d19685c2
(svn r6353) -Codechange: Make DestinationID a typedef of uin16, which is as large as any type of destinataion (StationID, DepotID, WaypointID) it can hold
tron
parents:
4526
diff
changeset
|
284 |
if (order->dest == v->last_station_visited) |
1266
eccd576e322f
(svn r1770) -Fix: Hopefully last pieces of code that are containing a station-id
truelight
parents:
1247
diff
changeset
|
285 |
v->last_station_visited = INVALID_STATION; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
286 |
|
4527
fa30d19685c2
(svn r6353) -Codechange: Make DestinationID a typedef of uin16, which is as large as any type of destinataion (StationID, DepotID, WaypointID) it can hold
tron
parents:
4526
diff
changeset
|
287 |
st = GetStation(order->dest); |
0 | 288 |
if (st->dock_tile != 0) { |
3472
04173b5ed0d2
(svn r4317) -Codechange: More map accessors for ship_cmd. it is now map-access free, but still requires a huge cleanup
celestar
parents:
3454
diff
changeset
|
289 |
v->dest_tile = TILE_ADD(st->dock_tile, ToTileIndexDiff(GetDockOffset(st->dock_tile))); |
6888
024407b0e309
(svn r10131) -Fix [FS#810]: when removing a dock, a ship will always try to reach the old location of the dock even when it cannot anymore because it the old location of the dock is now land instead of water.
rubidium
parents:
6683
diff
changeset
|
290 |
} else { |
024407b0e309
(svn r10131) -Fix [FS#810]: when removing a dock, a ship will always try to reach the old location of the dock even when it cannot anymore because it the old location of the dock is now land instead of water.
rubidium
parents:
6683
diff
changeset
|
291 |
v->cur_order_index++; |
0 | 292 |
} |
1024
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
1020
diff
changeset
|
293 |
} else if (order->type == OT_GOTO_DEPOT) { |
4527
fa30d19685c2
(svn r6353) -Codechange: Make DestinationID a typedef of uin16, which is as large as any type of destinataion (StationID, DepotID, WaypointID) it can hold
tron
parents:
4526
diff
changeset
|
294 |
v->dest_tile = GetDepot(order->dest)->xy; |
0 | 295 |
} else { |
296 |
v->dest_tile = 0; |
|
297 |
} |
|
1024
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
1020
diff
changeset
|
298 |
|
5e446b5b3ec5
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
1020
diff
changeset
|
299 |
InvalidateVehicleOrder(v); |
1020
59ee8ceac74c
(svn r1521) -Fix: Ship Vehicle Lists are now redrawn correctly
celestar
parents:
926
diff
changeset
|
300 |
|
1055
cc4f60cc9102
(svn r1556) -Fix: Vehicle list updates should now really work
Celestar
parents:
1053
diff
changeset
|
301 |
InvalidateWindowClasses(WC_SHIPS_LIST); |
0 | 302 |
} |
303 |
||
6558
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
304 |
void Ship::UpdateDeltaXY(Direction direction) |
0 | 305 |
{ |
6558
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
306 |
#define MKIT(a, b, c, d) ((a & 0xFF) << 24) | ((b & 0xFF) << 16) | ((c & 0xFF) << 8) | ((d & 0xFF) << 0) |
0 | 307 |
static const uint32 _delta_xy_table[8] = { |
6558
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
308 |
MKIT( 6, 6, -3, -3), |
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
309 |
MKIT( 6, 32, -3, -16), |
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
310 |
MKIT( 6, 6, -3, -3), |
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
311 |
MKIT(32, 6, -16, -3), |
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
312 |
MKIT( 6, 6, -3, -3), |
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
313 |
MKIT( 6, 32, -3, -16), |
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
314 |
MKIT( 6, 6, -3, -3), |
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
315 |
MKIT(32, 6, -16, -3), |
0 | 316 |
}; |
317 |
#undef MKIT |
|
6558
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
318 |
|
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
319 |
uint32 x = _delta_xy_table[direction]; |
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
320 |
this->x_offs = GB(x, 0, 8); |
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
321 |
this->y_offs = GB(x, 8, 8); |
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
322 |
this->sprite_width = GB(x, 16, 8); |
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
323 |
this->sprite_height = GB(x, 24, 8); |
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
324 |
this->z_height = 6; |
0 | 325 |
} |
326 |
||
4725
40cccaaa042c
(svn r6637) -Codechange: merged all (vehicle type)EnterDepot into VehicleEnterDepot()
bjarni
parents:
4712
diff
changeset
|
327 |
void RecalcShipStuff(Vehicle *v) |
0 | 328 |
{ |
6558
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
329 |
v->UpdateDeltaXY(v->direction); |
7134
5b2d47128d05
(svn r10408) -Codechange: make GetImage a class method of Vehicle instead of Get(Aircraft|RoadVeh|Ship|Train)Image.
rubidium
parents:
7096
diff
changeset
|
330 |
v->cur_image = v->GetImage(v->direction); |
6553
976a684212ad
(svn r9755) -Codechange: refactor some more of the begin loading stuff.
rubidium
parents:
6552
diff
changeset
|
331 |
v->MarkDirty(); |
0 | 332 |
InvalidateWindow(WC_VEHICLE_DEPOT, v->tile); |
333 |
} |
|
334 |
||
909
65cdb609b7a6
(svn r1396) Introduce TileIndexDiffC - the compile time version of TileIndexDiff
tron
parents:
900
diff
changeset
|
335 |
static const TileIndexDiffC _ship_leave_depot_offs[] = { |
65cdb609b7a6
(svn r1396) Introduce TileIndexDiffC - the compile time version of TileIndexDiff
tron
parents:
900
diff
changeset
|
336 |
{-1, 0}, |
65cdb609b7a6
(svn r1396) Introduce TileIndexDiffC - the compile time version of TileIndexDiff
tron
parents:
900
diff
changeset
|
337 |
{ 0, -1} |
0 | 338 |
}; |
339 |
||
340 |
static void CheckShipLeaveDepot(Vehicle *v) |
|
341 |
{ |
|
1977
37bbebf94434
(svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents:
1942
diff
changeset
|
342 |
TileIndex tile; |
3454
8dfe8de79c02
(svn r4289) -Codechange: Make use of water_map accessors for ships. Make a mental note to clean ship_cmd
celestar
parents:
3442
diff
changeset
|
343 |
Axis axis; |
0 | 344 |
uint m; |
345 |
||
7490
bb27d92565d3
(svn r11001) -Codechange: unify the way to determine whether a vehicle is in a depot.
rubidium
parents:
7425
diff
changeset
|
346 |
if (!v->IsInDepot()) return; |
0 | 347 |
|
348 |
tile = v->tile; |
|
3454
8dfe8de79c02
(svn r4289) -Codechange: Make use of water_map accessors for ships. Make a mental note to clean ship_cmd
celestar
parents:
3442
diff
changeset
|
349 |
axis = GetShipDepotAxis(tile); |
0 | 350 |
|
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
351 |
/* Check first side */ |
3454
8dfe8de79c02
(svn r4289) -Codechange: Make use of water_map accessors for ships. Make a mental note to clean ship_cmd
celestar
parents:
3442
diff
changeset
|
352 |
if (_ship_sometracks[axis] & GetTileShipTrackStatus(TILE_ADD(tile, ToTileIndexDiff(_ship_leave_depot_offs[axis])))) { |
8dfe8de79c02
(svn r4289) -Codechange: Make use of water_map accessors for ships. Make a mental note to clean ship_cmd
celestar
parents:
3442
diff
changeset
|
353 |
m = (axis == AXIS_X) ? 0x101 : 0x207; |
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
354 |
/* Check second side */ |
3454
8dfe8de79c02
(svn r4289) -Codechange: Make use of water_map accessors for ships. Make a mental note to clean ship_cmd
celestar
parents:
3442
diff
changeset
|
355 |
} else if (_ship_sometracks[axis + 2] & GetTileShipTrackStatus(TILE_ADD(tile, -2 * ToTileIndexDiff(_ship_leave_depot_offs[axis])))) { |
8dfe8de79c02
(svn r4289) -Codechange: Make use of water_map accessors for ships. Make a mental note to clean ship_cmd
celestar
parents:
3442
diff
changeset
|
356 |
m = (axis == AXIS_X) ? 0x105 : 0x203; |
0 | 357 |
} else { |
358 |
return; |
|
359 |
} |
|
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
360 |
v->direction = (Direction)GB(m, 0, 8); |
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
361 |
v->u.ship.state = (TrackBits)GB(m, 8, 8); |
0 | 362 |
v->vehstatus &= ~VS_HIDDEN; |
363 |
||
364 |
v->cur_speed = 0; |
|
365 |
RecalcShipStuff(v); |
|
366 |
||
367 |
PlayShipSound(v); |
|
578
1e66514eb621
(svn r998) now vehicles are serviced both when entering and when leaving depots to prevent that vehicles might need service when leaving after a long stay (ln--)
bjarni
parents:
555
diff
changeset
|
368 |
VehicleServiceInDepot(v); |
4739
e626ef1b522e
(svn r6651) -Coding feature: added the windowevent WE_INVALIDATE_DATA
bjarni
parents:
4725
diff
changeset
|
369 |
InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile); |
1055
cc4f60cc9102
(svn r1556) -Fix: Vehicle list updates should now really work
Celestar
parents:
1053
diff
changeset
|
370 |
InvalidateWindowClasses(WC_SHIPS_LIST); |
0 | 371 |
} |
372 |
||
373 |
static bool ShipAccelerate(Vehicle *v) |
|
374 |
{ |
|
375 |
uint spd; |
|
376 |
byte t; |
|
377 |
||
6490
fe4443fba5e3
(svn r9671) -Codechange: Implement NewGRF callback 36, which allows changing of various properties which were previously static. Vehicle max speed and train power/te/running costs are adjustable.
peter1138
parents:
6453
diff
changeset
|
378 |
spd = min(v->cur_speed + 1, GetVehicleProperty(v, 0x0B, v->max_speed)); |
0 | 379 |
|
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
380 |
/*updates statusbar only if speed have changed to save CPU time */ |
0 | 381 |
if (spd != v->cur_speed) { |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
382 |
v->cur_speed = spd; |
0 | 383 |
if (_patches.vehicle_speed) |
755
80091de50044
(svn r1211) -Feature: Introduce sticky windows to all vehicle windows...Just make sure you do not sticky more than 23 at a time. Also a lot of places in the code invalidated the 'status bar' of the vehicle, referring to it as widget 4. This is now widget 5 and has been #definitized
darkvater
parents:
679
diff
changeset
|
384 |
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR); |
0 | 385 |
} |
386 |
||
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
387 |
/* Decrease somewhat when turning */ |
2639 | 388 |
if (!(v->direction & 1)) spd = spd * 3 / 4; |
0 | 389 |
|
2639 | 390 |
if (spd == 0) return false; |
391 |
if ((byte)++spd == 0) return true; |
|
0 | 392 |
|
393 |
v->progress = (t = v->progress) - (byte)spd; |
|
394 |
||
395 |
return (t < v->progress); |
|
396 |
} |
|
397 |
||
6943
1914f26aee04
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
6888
diff
changeset
|
398 |
static CommandCost EstimateShipCost(EngineID engine_type) |
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
399 |
{ |
6950
14ecb0acdfb4
(svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents:
6943
diff
changeset
|
400 |
return CommandCost(GetEngineProperty(engine_type, 0x0A, ShipVehInfo(engine_type)->base_cost) * (_price.ship_base >> 3) >> 5); |
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
401 |
} |
0 | 402 |
|
2630 | 403 |
static void ShipArrivesAt(const Vehicle* v, Station* st) |
0 | 404 |
{ |
405 |
/* Check if station was ever visited before */ |
|
406 |
if (!(st->had_vehicle_of_type & HVOT_SHIP)) { |
|
407 |
uint32 flags; |
|
2639 | 408 |
|
0 | 409 |
st->had_vehicle_of_type |= HVOT_SHIP; |
2639 | 410 |
|
534
306bc86eb23e
(svn r901) Small step in the process to clean up the DPARAM mess:
tron
parents:
507
diff
changeset
|
411 |
SetDParam(0, st->index); |
0 | 412 |
flags = (v->owner == _local_player) ? NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) : NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_OTHER, 0); |
413 |
AddNewsItem( |
|
414 |
STR_9833_CITIZENS_CELEBRATE_FIRST, |
|
415 |
flags, |
|
416 |
v->index, |
|
417 |
0); |
|
418 |
} |
|
419 |
} |
|
420 |
||
6248
e4a2ed7e5613
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6247
diff
changeset
|
421 |
struct PathFindShip { |
1977
37bbebf94434
(svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents:
1942
diff
changeset
|
422 |
TileIndex skiptile; |
37bbebf94434
(svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents:
1942
diff
changeset
|
423 |
TileIndex dest_coords; |
0 | 424 |
uint best_bird_dist; |
425 |
uint best_length; |
|
6248
e4a2ed7e5613
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6247
diff
changeset
|
426 |
}; |
0 | 427 |
|
1977
37bbebf94434
(svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents:
1942
diff
changeset
|
428 |
static bool ShipTrackFollower(TileIndex tile, PathFindShip *pfs, int track, uint length, byte *state) |
0 | 429 |
{ |
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
430 |
/* Found dest? */ |
0 | 431 |
if (tile == pfs->dest_coords) { |
432 |
pfs->best_bird_dist = 0; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
433 |
|
0 | 434 |
pfs->best_length = minu(pfs->best_length, length); |
435 |
return true; |
|
436 |
} |
|
437 |
||
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
438 |
/* Skip this tile in the calculation */ |
0 | 439 |
if (tile != pfs->skiptile) { |
1245
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1237
diff
changeset
|
440 |
pfs->best_bird_dist = minu(pfs->best_bird_dist, DistanceMaxPlusManhattan(pfs->dest_coords, tile)); |
0 | 441 |
} |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
442 |
|
0 | 443 |
return false; |
444 |
} |
|
445 |
||
446 |
static const byte _ship_search_directions[6][4] = { |
|
447 |
{ 0, 9, 2, 9 }, |
|
448 |
{ 9, 1, 9, 3 }, |
|
449 |
{ 9, 0, 3, 9 }, |
|
450 |
{ 1, 9, 9, 2 }, |
|
451 |
{ 3, 2, 9, 9 }, |
|
452 |
{ 9, 9, 1, 0 }, |
|
453 |
}; |
|
454 |
||
455 |
static const byte _pick_shiptrack_table[6] = {1, 3, 2, 2, 0, 0}; |
|
456 |
||
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
457 |
static uint FindShipTrack(Vehicle *v, TileIndex tile, DiagDirection dir, TrackBits bits, TileIndex skiptile, Track *track) |
0 | 458 |
{ |
459 |
PathFindShip pfs; |
|
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
460 |
Track i, best_track; |
0 | 461 |
uint best_bird_dist = 0; |
462 |
uint best_length = 0; |
|
463 |
uint r; |
|
464 |
byte ship_dir = v->direction & 3; |
|
465 |
||
466 |
pfs.dest_coords = v->dest_tile; |
|
467 |
pfs.skiptile = skiptile; |
|
468 |
||
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
469 |
best_track = INVALID_TRACK; |
0 | 470 |
|
471 |
do { |
|
5598
2fadbd43709d
(svn r8052) - Codechange: RemoveFirstTrack() and RemoveFirstTrackdir() now accept pointer to TrackBits/TrackdirBits instead of reference.
KUDr
parents:
5587
diff
changeset
|
472 |
i = RemoveFirstTrack(&bits); |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
473 |
|
0 | 474 |
pfs.best_bird_dist = (uint)-1; |
475 |
pfs.best_length = (uint)-1; |
|
476 |
||
6683
b88ae30866ce
(svn r9914) -Codechange: prepare GTTS and the pathfinders to handle multiple road types on a single tile.
rubidium
parents:
6613
diff
changeset
|
477 |
FollowTrack(tile, 0x3800 | TRANSPORT_WATER, 0, (DiagDirection)_ship_search_directions[i][dir], (TPFEnumProc*)ShipTrackFollower, NULL, &pfs); |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
478 |
|
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
479 |
if (best_track != INVALID_TRACK) { |
0 | 480 |
if (pfs.best_bird_dist != 0) { |
481 |
/* neither reached the destination, pick the one with the smallest bird dist */ |
|
482 |
if (pfs.best_bird_dist > best_bird_dist) goto bad; |
|
483 |
if (pfs.best_bird_dist < best_bird_dist) goto good; |
|
484 |
} else { |
|
485 |
if (pfs.best_length > best_length) goto bad; |
|
486 |
if (pfs.best_length < best_length) goto good; |
|
487 |
} |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
488 |
|
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
489 |
/* if we reach this position, there's two paths of equal value so far. |
0 | 490 |
* pick one randomly. */ |
2150
f710b959b1c4
(svn r2660) Get rid of some more shifting/anding/casting
tron
parents:
2049
diff
changeset
|
491 |
r = GB(Random(), 0, 8); |
0 | 492 |
if (_pick_shiptrack_table[i] == ship_dir) r += 80; |
493 |
if (_pick_shiptrack_table[best_track] == ship_dir) r -= 80; |
|
494 |
if (r <= 127) goto bad; |
|
495 |
} |
|
496 |
good:; |
|
497 |
best_track = i; |
|
498 |
best_bird_dist = pfs.best_bird_dist; |
|
499 |
best_length = pfs.best_length; |
|
500 |
bad:; |
|
501 |
||
502 |
} while (bits != 0); |
|
503 |
||
504 |
*track = best_track; |
|
505 |
return best_bird_dist; |
|
506 |
} |
|
507 |
||
3900
2c84ed52709d
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
508 |
static inline NPFFoundTargetData PerfNPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailTypeMask railtypes) |
2c84ed52709d
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
509 |
{ |
2c84ed52709d
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
510 |
|
2c84ed52709d
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
511 |
void* perf = NpfBeginInterval(); |
6683
b88ae30866ce
(svn r9914) -Codechange: prepare GTTS and the pathfinders to handle multiple road types on a single tile.
rubidium
parents:
6613
diff
changeset
|
512 |
NPFFoundTargetData ret = NPFRouteToStationOrTile(tile, trackdir, target, type, 0, owner, railtypes); |
3900
2c84ed52709d
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
513 |
int t = NpfEndInterval(perf); |
5380
8ea58542b6e0
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5259
diff
changeset
|
514 |
DEBUG(yapf, 4, "[NPFW] %d us - %d rounds - %d open - %d closed -- ", t, 0, _aystar_stats_open_size, _aystar_stats_closed_size); |
3900
2c84ed52709d
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
515 |
return ret; |
2c84ed52709d
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
516 |
} |
2c84ed52709d
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
517 |
|
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
518 |
/** returns the track to choose on the next tile, or -1 when it's better to |
1247 | 519 |
* reverse. The tile given is the tile we are about to enter, enterdir is the |
520 |
* direction in which we are entering the tile */ |
|
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
521 |
static Track ChooseShipTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks) |
0 | 522 |
{ |
6491
00dc414c909d
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6490
diff
changeset
|
523 |
assert(enterdir >= 0 && enterdir <= 3); |
0 | 524 |
|
3900
2c84ed52709d
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
525 |
if (_patches.yapf.ship_use_yapf) { |
2c84ed52709d
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
526 |
Trackdir trackdir = YapfChooseShipTrack(v, tile, enterdir, tracks); |
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
527 |
return (trackdir != INVALID_TRACKDIR) ? TrackdirToTrack(trackdir) : INVALID_TRACK; |
3900
2c84ed52709d
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
528 |
} else if (_patches.new_pathfinding_all) { |
1247 | 529 |
NPFFindStationOrTileData fstd; |
530 |
NPFFoundTargetData ftd; |
|
4559
aa0c13e39840
(svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents:
4546
diff
changeset
|
531 |
TileIndex src_tile = TILE_ADD(tile, TileOffsByDiagDir(ReverseDiagDir(enterdir))); |
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
532 |
Trackdir trackdir = GetVehicleTrackdir(v); |
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
533 |
assert(trackdir != INVALID_TRACKDIR); // Check that we are not in a depot |
1247 | 534 |
|
535 |
NPFFillWithOrderData(&fstd, v); |
|
536 |
||
3900
2c84ed52709d
(svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
3870
diff
changeset
|
537 |
ftd = PerfNPFRouteToStationOrTile(src_tile, trackdir, &fstd, TRANSPORT_WATER, v->owner, INVALID_RAILTYPE); |
1247 | 538 |
|
2639 | 539 |
if (ftd.best_trackdir != 0xff) { |
1698
3f979f9ecf6c
(svn r2202) - Fix: [NPF] When a vehicle could not reach its target, it would choose a random direction. It will now try to get as close as possible.
matthijs
parents:
1530
diff
changeset
|
540 |
/* If ftd.best_bird_dist is 0, we found our target and ftd.best_trackdir contains |
3f979f9ecf6c
(svn r2202) - Fix: [NPF] When a vehicle could not reach its target, it would choose a random direction. It will now try to get as close as possible.
matthijs
parents:
1530
diff
changeset
|
541 |
the direction we need to take to get there, if ftd.best_bird_dist is not 0, |
3f979f9ecf6c
(svn r2202) - Fix: [NPF] When a vehicle could not reach its target, it would choose a random direction. It will now try to get as close as possible.
matthijs
parents:
1530
diff
changeset
|
542 |
we did not find our target, but ftd.best_trackdir contains the direction leading |
3f979f9ecf6c
(svn r2202) - Fix: [NPF] When a vehicle could not reach its target, it would choose a random direction. It will now try to get as close as possible.
matthijs
parents:
1530
diff
changeset
|
543 |
to the tile closest to our target. */ |
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
544 |
return TrackdirToTrack(ftd.best_trackdir); /* TODO: Wrapper function? */ |
2639 | 545 |
} else { |
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
546 |
return INVALID_TRACK; /* Already at target, reverse? */ |
2639 | 547 |
} |
1247 | 548 |
} else { |
549 |
uint tot_dist, dist; |
|
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
550 |
Track track; |
1977
37bbebf94434
(svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents:
1942
diff
changeset
|
551 |
TileIndex tile2; |
1247 | 552 |
|
4559
aa0c13e39840
(svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents:
4546
diff
changeset
|
553 |
tile2 = TILE_ADD(tile, -TileOffsByDiagDir(enterdir)); |
1247 | 554 |
tot_dist = (uint)-1; |
555 |
||
556 |
/* Let's find out how far it would be if we would reverse first */ |
|
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
557 |
TrackBits b = GetTileShipTrackStatus(tile2) & _ship_sometracks[ReverseDiagDir(enterdir)] & v->u.ship.state; |
1247 | 558 |
if (b != 0) { |
3147
fc76d566a68e
(svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
3140
diff
changeset
|
559 |
dist = FindShipTrack(v, tile2, ReverseDiagDir(enterdir), b, tile, &track); |
1247 | 560 |
if (dist != (uint)-1) |
561 |
tot_dist = dist + 1; |
|
562 |
} |
|
563 |
/* And if we would not reverse? */ |
|
564 |
dist = FindShipTrack(v, tile, enterdir, tracks, 0, &track); |
|
565 |
if (dist > tot_dist) |
|
566 |
/* We could better reverse */ |
|
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
567 |
return INVALID_TRACK; |
1247 | 568 |
return track; |
0 | 569 |
} |
570 |
} |
|
571 |
||
3157
3f35e2d9c8e3
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3147
diff
changeset
|
572 |
static const Direction _new_vehicle_direction_table[] = { |
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
573 |
DIR_N , DIR_NW, DIR_W , INVALID_DIR, |
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
574 |
DIR_NE, DIR_N , DIR_SW, INVALID_DIR, |
3157
3f35e2d9c8e3
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3147
diff
changeset
|
575 |
DIR_E , DIR_SE, DIR_S |
0 | 576 |
}; |
577 |
||
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
578 |
static Direction ShipGetNewDirectionFromTiles(TileIndex new_tile, TileIndex old_tile) |
0 | 579 |
{ |
926
a6d140a6a4de
(svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents:
919
diff
changeset
|
580 |
uint offs = (TileY(new_tile) - TileY(old_tile) + 1) * 4 + |
a6d140a6a4de
(svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents:
919
diff
changeset
|
581 |
TileX(new_tile) - TileX(old_tile) + 1; |
0 | 582 |
assert(offs < 11 && offs != 3 && offs != 7); |
583 |
return _new_vehicle_direction_table[offs]; |
|
584 |
} |
|
585 |
||
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
586 |
static Direction ShipGetNewDirection(Vehicle *v, int x, int y) |
0 | 587 |
{ |
588 |
uint offs = (y - v->y_pos + 1) * 4 + (x - v->x_pos + 1); |
|
589 |
assert(offs < 11 && offs != 3 && offs != 7); |
|
590 |
return _new_vehicle_direction_table[offs]; |
|
591 |
} |
|
592 |
||
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
593 |
static TrackBits GetAvailShipTracks(TileIndex tile, int dir) |
0 | 594 |
{ |
6683
b88ae30866ce
(svn r9914) -Codechange: prepare GTTS and the pathfinders to handle multiple road types on a single tile.
rubidium
parents:
6613
diff
changeset
|
595 |
uint32 r = GetTileTrackStatus(tile, TRANSPORT_WATER, 0); |
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
596 |
return (TrackBits)((r | r >> 8) & _ship_sometracks[dir]); |
0 | 597 |
} |
598 |
||
599 |
static const byte _ship_subcoord[4][6][3] = { |
|
600 |
{ |
|
601 |
{15, 8, 1}, |
|
602 |
{ 0, 0, 0}, |
|
603 |
{ 0, 0, 0}, |
|
604 |
{15, 8, 2}, |
|
605 |
{15, 7, 0}, |
|
606 |
{ 0, 0, 0}, |
|
607 |
}, |
|
608 |
{ |
|
609 |
{ 0, 0, 0}, |
|
610 |
{ 8, 0, 3}, |
|
611 |
{ 7, 0, 2}, |
|
612 |
{ 0, 0, 0}, |
|
613 |
{ 8, 0, 4}, |
|
614 |
{ 0, 0, 0}, |
|
615 |
}, |
|
616 |
{ |
|
617 |
{ 0, 8, 5}, |
|
618 |
{ 0, 0, 0}, |
|
619 |
{ 0, 7, 6}, |
|
620 |
{ 0, 0, 0}, |
|
621 |
{ 0, 0, 0}, |
|
622 |
{ 0, 8, 4}, |
|
623 |
}, |
|
624 |
{ |
|
625 |
{ 0, 0, 0}, |
|
6491
00dc414c909d
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6490
diff
changeset
|
626 |
{ 8, 15, 7}, |
0 | 627 |
{ 0, 0, 0}, |
6491
00dc414c909d
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6490
diff
changeset
|
628 |
{ 8, 15, 6}, |
0 | 629 |
{ 0, 0, 0}, |
6491
00dc414c909d
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6490
diff
changeset
|
630 |
{ 7, 15, 0}, |
0 | 631 |
} |
632 |
}; |
|
633 |
||
634 |
static void ShipController(Vehicle *v) |
|
635 |
{ |
|
636 |
uint32 r; |
|
637 |
const byte *b; |
|
3157
3f35e2d9c8e3
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3147
diff
changeset
|
638 |
Direction dir; |
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
639 |
Track track; |
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
640 |
TrackBits tracks; |
0 | 641 |
|
642 |
v->tick_counter++; |
|
6980
c7c4f3bf5901
(svn r10236) -Feature: Introduce a form of timetabling for vehicles.
maedhros
parents:
6953
diff
changeset
|
643 |
v->current_order_time++; |
0 | 644 |
|
645 |
if (v->breakdown_ctr != 0) { |
|
646 |
if (v->breakdown_ctr <= 2) { |
|
647 |
HandleBrokenShip(v); |
|
648 |
return; |
|
649 |
} |
|
650 |
v->breakdown_ctr--; |
|
651 |
} |
|
652 |
||
2639 | 653 |
if (v->vehstatus & VS_STOPPED) return; |
0 | 654 |
|
655 |
ProcessShipOrder(v); |
|
6594
9673331eb174
(svn r9808) -Codechange: unify the Handle<VehicleType>Loading functions.
rubidium
parents:
6593
diff
changeset
|
656 |
v->HandleLoading(); |
0 | 657 |
|
2639 | 658 |
if (v->current_order.type == OT_LOADING) return; |
0 | 659 |
|
660 |
CheckShipLeaveDepot(v); |
|
661 |
||
2639 | 662 |
if (!ShipAccelerate(v)) return; |
0 | 663 |
|
664 |
BeginVehicleMove(v); |
|
665 |
||
6153 | 666 |
GetNewVehiclePosResult gp = GetNewVehiclePos(v); |
6152 | 667 |
if (gp.old_tile == gp.new_tile) { |
5994
a067afdb59b1
(svn r8703) -Codechange/cleanup: some magic numbers -> enums and other small coding style changes to the ShipController and TrainController.
rubidium
parents:
5993
diff
changeset
|
668 |
/* Staying in tile */ |
7490
bb27d92565d3
(svn r11001) -Codechange: unify the way to determine whether a vehicle is in a depot.
rubidium
parents:
7425
diff
changeset
|
669 |
if (v->IsInDepot()) { |
0 | 670 |
gp.x = v->x_pos; |
671 |
gp.y = v->y_pos; |
|
672 |
} else { |
|
5994
a067afdb59b1
(svn r8703) -Codechange/cleanup: some magic numbers -> enums and other small coding style changes to the ShipController and TrainController.
rubidium
parents:
5993
diff
changeset
|
673 |
/* Not inside depot */ |
0 | 674 |
r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y); |
5991
ec2eebfe86de
(svn r8698) -Codechange: enumify the returns of VehicleEnterTile
rubidium
parents:
5972
diff
changeset
|
675 |
if (HASBIT(r, VETS_CANNOT_ENTER)) goto reverse_direction; |
0 | 676 |
|
1751
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
677 |
/* A leave station order only needs one tick to get processed, so we can |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
678 |
* always skip ahead. */ |
555
02df8a1b7f33
(svn r955) Replace uint16 for orders with struct Order
tron
parents:
541
diff
changeset
|
679 |
if (v->current_order.type == OT_LEAVESTATION) { |
6263
6bd0726c74e2
(svn r9072) -Codechange: [Orders] added methods to orders to free them and check if they are in use
bjarni
parents:
6259
diff
changeset
|
680 |
v->current_order.Free(); |
755
80091de50044
(svn r1211) -Feature: Introduce sticky windows to all vehicle windows...Just make sure you do not sticky more than 23 at a time. Also a lot of places in the code invalidated the 'status bar' of the vehicle, referring to it as widget 4. This is now widget 5 and has been #definitized
darkvater
parents:
679
diff
changeset
|
681 |
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR); |
1751
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
682 |
} else if (v->dest_tile != 0) { |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
683 |
/* We have a target, let's see if we reached it... */ |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
684 |
if (v->current_order.type == OT_GOTO_STATION && |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
685 |
IsBuoyTile(v->dest_tile) && |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
686 |
DistanceManhattan(v->dest_tile, gp.new_tile) <= 3) { |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
687 |
/* We got within 3 tiles of our target buoy, so let's skip to our |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
688 |
* next order */ |
7070
2f4e1b2facc6
(svn r10335) -Fix (r10331): Increment the current order index *after* using it in UpdateVehicleTimetable.
maedhros
parents:
7010
diff
changeset
|
689 |
UpdateVehicleTimetable(v, true); |
1751
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
690 |
v->cur_order_index++; |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
691 |
v->current_order.type = OT_DUMMY; |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
692 |
InvalidateVehicleOrder(v); |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
693 |
} else { |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
694 |
/* Non-buoy orders really need to reach the tile */ |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
695 |
if (v->dest_tile == gp.new_tile) { |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
696 |
if (v->current_order.type == OT_GOTO_DEPOT) { |
5994
a067afdb59b1
(svn r8703) -Codechange/cleanup: some magic numbers -> enums and other small coding style changes to the ShipController and TrainController.
rubidium
parents:
5993
diff
changeset
|
697 |
if ((gp.x & 0xF) == 8 && (gp.y & 0xF) == 8) { |
4725
40cccaaa042c
(svn r6637) -Codechange: merged all (vehicle type)EnterDepot into VehicleEnterDepot()
bjarni
parents:
4712
diff
changeset
|
698 |
VehicleEnterDepot(v); |
1751
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
699 |
return; |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
700 |
} |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
701 |
} else if (v->current_order.type == OT_GOTO_STATION) { |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
702 |
Station *st; |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
703 |
|
4527
fa30d19685c2
(svn r6353) -Codechange: Make DestinationID a typedef of uin16, which is as large as any type of destinataion (StationID, DepotID, WaypointID) it can hold
tron
parents:
4526
diff
changeset
|
704 |
v->last_station_visited = v->current_order.dest; |
1751
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
705 |
|
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
706 |
/* Process station in the orderlist. */ |
4527
fa30d19685c2
(svn r6353) -Codechange: Make DestinationID a typedef of uin16, which is as large as any type of destinataion (StationID, DepotID, WaypointID) it can hold
tron
parents:
4526
diff
changeset
|
707 |
st = GetStation(v->current_order.dest); |
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
708 |
if (st->facilities & FACIL_DOCK) { // ugly, ugly workaround for problem with ships able to drop off cargo at wrong stations |
1751
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
709 |
ShipArrivesAt(v, st); |
6553
976a684212ad
(svn r9755) -Codechange: refactor some more of the begin loading stuff.
rubidium
parents:
6552
diff
changeset
|
710 |
v->BeginLoading(); |
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
711 |
} else { // leave stations without docks right aways |
1751
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
712 |
v->current_order.type = OT_LEAVESTATION; |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
713 |
v->cur_order_index++; |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
714 |
InvalidateVehicleOrder(v); |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
715 |
} |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
716 |
} |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
717 |
} |
009a240d035a
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1698
diff
changeset
|
718 |
} |
0 | 719 |
} |
720 |
} |
|
721 |
} else { |
|
3157
3f35e2d9c8e3
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3147
diff
changeset
|
722 |
DiagDirection diagdir; |
5994
a067afdb59b1
(svn r8703) -Codechange/cleanup: some magic numbers -> enums and other small coding style changes to the ShipController and TrainController.
rubidium
parents:
5993
diff
changeset
|
723 |
/* New tile */ |
a067afdb59b1
(svn r8703) -Codechange/cleanup: some magic numbers -> enums and other small coding style changes to the ShipController and TrainController.
rubidium
parents:
5993
diff
changeset
|
724 |
if (TileX(gp.new_tile) >= MapMaxX() || TileY(gp.new_tile) >= MapMaxY()) { |
926
a6d140a6a4de
(svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents:
919
diff
changeset
|
725 |
goto reverse_direction; |
5994
a067afdb59b1
(svn r8703) -Codechange/cleanup: some magic numbers -> enums and other small coding style changes to the ShipController and TrainController.
rubidium
parents:
5993
diff
changeset
|
726 |
} |
0 | 727 |
|
728 |
dir = ShipGetNewDirectionFromTiles(gp.new_tile, gp.old_tile); |
|
3157
3f35e2d9c8e3
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3147
diff
changeset
|
729 |
assert(dir == DIR_NE || dir == DIR_SE || dir == DIR_SW || dir == DIR_NW); |
3f35e2d9c8e3
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3147
diff
changeset
|
730 |
diagdir = DirToDiagDir(dir); |
3f35e2d9c8e3
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3147
diff
changeset
|
731 |
tracks = GetAvailShipTracks(gp.new_tile, diagdir); |
5994
a067afdb59b1
(svn r8703) -Codechange/cleanup: some magic numbers -> enums and other small coding style changes to the ShipController and TrainController.
rubidium
parents:
5993
diff
changeset
|
732 |
if (tracks == TRACK_BIT_NONE) goto reverse_direction; |
0 | 733 |
|
5994
a067afdb59b1
(svn r8703) -Codechange/cleanup: some magic numbers -> enums and other small coding style changes to the ShipController and TrainController.
rubidium
parents:
5993
diff
changeset
|
734 |
/* Choose a direction, and continue if we find one */ |
3157
3f35e2d9c8e3
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3147
diff
changeset
|
735 |
track = ChooseShipTrack(v, gp.new_tile, diagdir, tracks); |
5994
a067afdb59b1
(svn r8703) -Codechange/cleanup: some magic numbers -> enums and other small coding style changes to the ShipController and TrainController.
rubidium
parents:
5993
diff
changeset
|
736 |
if (track == INVALID_TRACK) goto reverse_direction; |
0 | 737 |
|
3157
3f35e2d9c8e3
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3147
diff
changeset
|
738 |
b = _ship_subcoord[diagdir][track]; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
739 |
|
5994
a067afdb59b1
(svn r8703) -Codechange/cleanup: some magic numbers -> enums and other small coding style changes to the ShipController and TrainController.
rubidium
parents:
5993
diff
changeset
|
740 |
gp.x = (gp.x & ~0xF) | b[0]; |
a067afdb59b1
(svn r8703) -Codechange/cleanup: some magic numbers -> enums and other small coding style changes to the ShipController and TrainController.
rubidium
parents:
5993
diff
changeset
|
741 |
gp.y = (gp.y & ~0xF) | b[1]; |
0 | 742 |
|
743 |
/* Call the landscape function and tell it that the vehicle entered the tile */ |
|
744 |
r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y); |
|
5991
ec2eebfe86de
(svn r8698) -Codechange: enumify the returns of VehicleEnterTile
rubidium
parents:
5972
diff
changeset
|
745 |
if (HASBIT(r, VETS_CANNOT_ENTER)) goto reverse_direction; |
0 | 746 |
|
5991
ec2eebfe86de
(svn r8698) -Codechange: enumify the returns of VehicleEnterTile
rubidium
parents:
5972
diff
changeset
|
747 |
if (!HASBIT(r, VETS_ENTERED_WORMHOLE)) { |
0 | 748 |
v->tile = gp.new_tile; |
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
749 |
v->u.ship.state = TrackToTrackBits(track); |
0 | 750 |
} |
751 |
||
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
752 |
v->direction = (Direction)b[2]; |
0 | 753 |
} |
754 |
||
755 |
/* update image of ship, as well as delta XY */ |
|
756 |
dir = ShipGetNewDirection(v, gp.x, gp.y); |
|
757 |
v->x_pos = gp.x; |
|
758 |
v->y_pos = gp.y; |
|
759 |
v->z_pos = GetSlopeZ(gp.x, gp.y); |
|
760 |
||
761 |
getout: |
|
6558
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
762 |
v->UpdateDeltaXY(dir); |
7134
5b2d47128d05
(svn r10408) -Codechange: make GetImage a class method of Vehicle instead of Get(Aircraft|RoadVeh|Ship|Train)Image.
rubidium
parents:
7096
diff
changeset
|
763 |
v->cur_image = v->GetImage(dir); |
0 | 764 |
VehiclePositionChanged(v); |
765 |
EndVehicleMove(v); |
|
766 |
return; |
|
767 |
||
768 |
reverse_direction: |
|
3157
3f35e2d9c8e3
(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents:
3147
diff
changeset
|
769 |
dir = ReverseDir(v->direction); |
0 | 770 |
v->direction = dir; |
771 |
goto getout; |
|
772 |
} |
|
773 |
||
774 |
static void AgeShipCargo(Vehicle *v) |
|
775 |
{ |
|
2639 | 776 |
if (_age_cargo_skip_counter != 0) return; |
7010
6f0d9f03180d
(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:
6980
diff
changeset
|
777 |
v->cargo.AgeCargo(); |
0 | 778 |
} |
779 |
||
7135
3c1bcca0d6bb
(svn r10409) -Codechange: replace (Aircraft|RoadVeh|Ship|Train)_Tick with a Tick method in the Vehicle class.
rubidium
parents:
7134
diff
changeset
|
780 |
void Ship::Tick() |
0 | 781 |
{ |
7135
3c1bcca0d6bb
(svn r10409) -Codechange: replace (Aircraft|RoadVeh|Ship|Train)_Tick with a Tick method in the Vehicle class.
rubidium
parents:
7134
diff
changeset
|
782 |
AgeShipCargo(this); |
3c1bcca0d6bb
(svn r10409) -Codechange: replace (Aircraft|RoadVeh|Ship|Train)_Tick with a Tick method in the Vehicle class.
rubidium
parents:
7134
diff
changeset
|
783 |
ShipController(this); |
0 | 784 |
} |
785 |
||
786 |
||
6247 | 787 |
void ShipsYearlyLoop() |
0 | 788 |
{ |
789 |
Vehicle *v; |
|
790 |
||
791 |
FOR_ALL_VEHICLES(v) { |
|
6259
471b91a4b1d8
(svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents:
6248
diff
changeset
|
792 |
if (v->type == VEH_SHIP) { |
0 | 793 |
v->profit_last_year = v->profit_this_year; |
794 |
v->profit_this_year = 0; |
|
795 |
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); |
|
796 |
} |
|
797 |
} |
|
798 |
} |
|
799 |
||
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
800 |
/** Build a ship. |
3491
35d747bb5e82
(svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents:
3476
diff
changeset
|
801 |
* @param tile tile of depot where ship is built |
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
802 |
* @param flags type of operation |
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
803 |
* @param p1 ship type being built (engine) |
3816
28ee8b8c2522
(svn r4826) -Fix: [autoreplace] fixed possible problem when autoreplacing and was number of vehicles (of a type, not total) was reached
bjarni
parents:
3645
diff
changeset
|
804 |
* @param p2 bit 0 when set, the unitnumber will be 0, otherwise it will be a free number |
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
805 |
*/ |
6943
1914f26aee04
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
6888
diff
changeset
|
806 |
CommandCost CmdBuildShip(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
0 | 807 |
{ |
6943
1914f26aee04
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
6888
diff
changeset
|
808 |
CommandCost value; |
0 | 809 |
Vehicle *v; |
1282
ea2ae881814c
(svn r1786) -Fix: unitnumber is increased to 16bit, so now you can have up to 5000
truelight
parents:
1266
diff
changeset
|
810 |
UnitID unit_num; |
0 | 811 |
Engine *e; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
812 |
|
6407
757a3cec2422
(svn r9543) -Fix [FS#691]: Split up STR_ENGINE_NOT_BUILDABLE into four strings so it can be
maedhros
parents:
6357
diff
changeset
|
813 |
if (!IsEngineBuildable(p1, VEH_SHIP, _current_player)) return_cmd_error(STR_SHIP_NOT_AVAILABLE); |
1196
67f7f3017d99
(svn r1700) - Fix: Hacked clients can no longer be used to build vehicles that are not available yet (Hackykid)
bjarni
parents:
1151
diff
changeset
|
814 |
|
0 | 815 |
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); |
816 |
||
817 |
value = EstimateShipCost(p1); |
|
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
818 |
if (flags & DC_QUERY_COST) return value; |
0 | 819 |
|
1443
2b8e1b123d91
(svn r1947) As in r1946, permit DC_QUERY_COST even on non-depot tiles - so that it works for the ai_new. It is de iure not a bug yet but let's be safe against future annoying headaches. Signed-Off-By: TrueLight
pasky
parents:
1401
diff
changeset
|
820 |
/* The ai_new queries the vehicle cost before building the route, |
2b8e1b123d91
(svn r1947) As in r1946, permit DC_QUERY_COST even on non-depot tiles - so that it works for the ai_new. It is de iure not a bug yet but let's be safe against future annoying headaches. Signed-Off-By: TrueLight
pasky
parents:
1401
diff
changeset
|
821 |
* so we must check against cheaters no sooner than now. --pasky */ |
2b8e1b123d91
(svn r1947) As in r1946, permit DC_QUERY_COST even on non-depot tiles - so that it works for the ai_new. It is de iure not a bug yet but let's be safe against future annoying headaches. Signed-Off-By: TrueLight
pasky
parents:
1401
diff
changeset
|
822 |
if (!IsTileDepotType(tile, TRANSPORT_WATER)) return CMD_ERROR; |
1901
03bf9bf99319
(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
|
823 |
if (!IsTileOwner(tile, _current_player)) return CMD_ERROR; |
1443
2b8e1b123d91
(svn r1947) As in r1946, permit DC_QUERY_COST even on non-depot tiles - so that it works for the ai_new. It is de iure not a bug yet but let's be safe against future annoying headaches. Signed-Off-By: TrueLight
pasky
parents:
1401
diff
changeset
|
824 |
|
7398
b933416cf32b
(svn r10770) -Codechange: use the pool item class as super class for the vehicle struct.
rubidium
parents:
7334
diff
changeset
|
825 |
v = new Ship(); |
6259
471b91a4b1d8
(svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents:
6248
diff
changeset
|
826 |
unit_num = HASBIT(p2, 0) ? 0 : GetFreeUnitNumber(VEH_SHIP); |
7398
b933416cf32b
(svn r10770) -Codechange: use the pool item class as super class for the vehicle struct.
rubidium
parents:
7334
diff
changeset
|
827 |
AutoPtrT<Vehicle> v_auto_delete = v; |
3816
28ee8b8c2522
(svn r4826) -Fix: [autoreplace] fixed possible problem when autoreplacing and was number of vehicles (of a type, not total) was reached
bjarni
parents:
3645
diff
changeset
|
828 |
|
5922 | 829 |
if (v == NULL || unit_num > _patches.max_ships) |
0 | 830 |
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME); |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
831 |
|
0 | 832 |
if (flags & DC_EXEC) { |
3491
35d747bb5e82
(svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents:
3476
diff
changeset
|
833 |
int x; |
35d747bb5e82
(svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents:
3476
diff
changeset
|
834 |
int y; |
35d747bb5e82
(svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents:
3476
diff
changeset
|
835 |
|
538
24fdb517fbe5
(svn r920) Replace vehicle info macros with inline functions and add asserts to check limits
tron
parents:
534
diff
changeset
|
836 |
const ShipVehicleInfo *svi = ShipVehInfo(p1); |
24fdb517fbe5
(svn r920) Replace vehicle info macros with inline functions and add asserts to check limits
tron
parents:
534
diff
changeset
|
837 |
|
7782
e2999b5fcfad
(svn r11332) -Fix: vehicles getting a value of 0 on construction.
rubidium
parents:
7695
diff
changeset
|
838 |
v = new (v) Ship(); |
0 | 839 |
v->unitnumber = unit_num; |
840 |
||
841 |
v->owner = _current_player; |
|
842 |
v->tile = tile; |
|
3645
7f950533d510
(svn r4554) Replace magic numbers by TILE_{HEIGHT,SIZE}
tron
parents:
3610
diff
changeset
|
843 |
x = TileX(tile) * TILE_SIZE + TILE_SIZE / 2; |
7f950533d510
(svn r4554) Replace magic numbers by TILE_{HEIGHT,SIZE}
tron
parents:
3610
diff
changeset
|
844 |
y = TileY(tile) * TILE_SIZE + TILE_SIZE / 2; |
0 | 845 |
v->x_pos = x; |
846 |
v->y_pos = y; |
|
6491
00dc414c909d
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6490
diff
changeset
|
847 |
v->z_pos = GetSlopeZ(x, y); |
0 | 848 |
|
6558
c88e142f896e
(svn r9760) -Codechange: remove the need for saving some vehicle variables.
rubidium
parents:
6553
diff
changeset
|
849 |
v->UpdateDeltaXY(v->direction); |
0 | 850 |
v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
851 |
|
538
24fdb517fbe5
(svn r920) Replace vehicle info macros with inline functions and add asserts to check limits
tron
parents:
534
diff
changeset
|
852 |
v->spritenum = svi->image_index; |
24fdb517fbe5
(svn r920) Replace vehicle info macros with inline functions and add asserts to check limits
tron
parents:
534
diff
changeset
|
853 |
v->cargo_type = svi->cargo_type; |
3870
d9ebc4ea750a
(svn r4910) - NewGRF: add and initialize cargo subtype for vehicle visual variations
peter1138
parents:
3816
diff
changeset
|
854 |
v->cargo_subtype = 0; |
538
24fdb517fbe5
(svn r920) Replace vehicle info macros with inline functions and add asserts to check limits
tron
parents:
534
diff
changeset
|
855 |
v->cargo_cap = svi->capacity; |
6950
14ecb0acdfb4
(svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents:
6943
diff
changeset
|
856 |
v->value = value.GetCost(); |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
857 |
|
1266
eccd576e322f
(svn r1770) -Fix: Hopefully last pieces of code that are containing a station-id
truelight
parents:
1247
diff
changeset
|
858 |
v->last_station_visited = INVALID_STATION; |
538
24fdb517fbe5
(svn r920) Replace vehicle info macros with inline functions and add asserts to check limits
tron
parents:
534
diff
changeset
|
859 |
v->max_speed = svi->max_speed; |
2477
225b2916fe2a
(svn r3003) Change int, uint, uin16 and byte to EngineID where appropriate, plus some related changes (mostly casts)
tron
parents:
2464
diff
changeset
|
860 |
v->engine_type = p1; |
0 | 861 |
|
1926
530480d14685
(svn r2432) Use GetEngine() instead of DEREF_ENGINE() or even _engines[]
tron
parents:
1901
diff
changeset
|
862 |
e = GetEngine(p1); |
0 | 863 |
v->reliability = e->reliability; |
864 |
v->reliability_spd_dec = e->reliability_spd_dec; |
|
865 |
v->max_age = e->lifelength * 366; |
|
2564 | 866 |
_new_vehicle_id = v->index; |
0 | 867 |
|
868 |
v->string_id = STR_SV_SHIP_NAME; |
|
5993
956d341d930e
(svn r8701) -Codechange: replace magic numbers with enums for u.rail.track.
rubidium
parents:
5991
diff
changeset
|
869 |
v->u.ship.state = TRACK_BIT_DEPOT; |
0 | 870 |
|
871 |
v->service_interval = _patches.servint_ships; |
|
872 |
v->date_of_last_service = _date; |
|
4329
0e6e689f66e7
(svn r6002) -Cleanup: remove the now redundant BASE_YEAR constant.
rubidium
parents:
4293
diff
changeset
|
873 |
v->build_year = _cur_year; |
0 | 874 |
v->cur_image = 0x0E5E; |
2804
ea4080819175
(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:
2791
diff
changeset
|
875 |
v->random_bits = VehicleRandomBits(); |
0 | 876 |
|
6176
153f0f24dc1b
(svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents:
6175
diff
changeset
|
877 |
v->vehicle_flags = 0; |
153f0f24dc1b
(svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents:
6175
diff
changeset
|
878 |
if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SETBIT(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE); |
153f0f24dc1b
(svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents:
6175
diff
changeset
|
879 |
|
6608
dc0b009642a4
(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:
6595
diff
changeset
|
880 |
v->cargo_cap = GetVehicleProperty(v, 0x0D, svi->capacity); |
dc0b009642a4
(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:
6595
diff
changeset
|
881 |
|
0 | 882 |
VehiclePositionChanged(v); |
883 |
||
4739
e626ef1b522e
(svn r6651) -Coding feature: added the windowevent WE_INVALIDATE_DATA
bjarni
parents:
4725
diff
changeset
|
884 |
InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile); |
588 | 885 |
RebuildVehicleLists(); |
0 | 886 |
InvalidateWindow(WC_COMPANY, v->owner); |
2618
9691753519ac
(svn r3156) -Fix: removed some cases where autoreplace windows were redrawn when nothing was changed
bjarni
parents:
2574
diff
changeset
|
887 |
if (IsLocalPlayer()) |
7425
d9bc116f2f54
(svn r10823) -Fix r8610 [FS#1097]: the autoreplace window vehicle count didn't always update correctly) (Matthias)
bjarni
parents:
7398
diff
changeset
|
888 |
InvalidateAutoreplaceWindow(v->engine_type, v->group_id); // updates the replace Ship window |
5944
6d059cc8662b
(svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents:
5922
diff
changeset
|
889 |
|
6d059cc8662b
(svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents:
5922
diff
changeset
|
890 |
GetPlayer(_current_player)->num_engines[p1]++; |
7398
b933416cf32b
(svn r10770) -Codechange: use the pool item class as super class for the vehicle struct.
rubidium
parents:
7334
diff
changeset
|
891 |
|
b933416cf32b
(svn r10770) -Codechange: use the pool item class as super class for the vehicle struct.
rubidium
parents:
7334
diff
changeset
|
892 |
v_auto_delete.Detach(); |
0 | 893 |
} |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
894 |
|
0 | 895 |
return value; |
896 |
} |
|
897 |
||
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
898 |
/** Sell a ship. |
3491
35d747bb5e82
(svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents:
3476
diff
changeset
|
899 |
* @param tile unused |
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
900 |
* @param flags type of operation |
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
901 |
* @param p1 vehicle ID to be sold |
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
902 |
* @param p2 unused |
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
903 |
*/ |
6943
1914f26aee04
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
6888
diff
changeset
|
904 |
CommandCost CmdSellShip(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
0 | 905 |
{ |
906 |
Vehicle *v; |
|
907 |
||
4352
6703cd8d39e0
(svn r6053) -Codechange: renamed all IsXXXIndex to IsValidXXXID
truelight
parents:
4351
diff
changeset
|
908 |
if (!IsValidVehicleID(p1)) return CMD_ERROR; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
909 |
|
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
910 |
v = GetVehicle(p1); |
0 | 911 |
|
6259
471b91a4b1d8
(svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents:
6248
diff
changeset
|
912 |
if (v->type != VEH_SHIP || !CheckOwnership(v->owner)) return CMD_ERROR; |
0 | 913 |
|
7695
4b27fd86b318
(svn r11229) -Fix [FS#1307]: one could sell vehicles that were crashed in a depot, which would still yield money.
rubidium
parents:
7642
diff
changeset
|
914 |
if (HASBITS(v->vehstatus, VS_CRASHED)) return_cmd_error(STR_CAN_T_SELL_DESTROYED_VEHICLE); |
4b27fd86b318
(svn r11229) -Fix [FS#1307]: one could sell vehicles that were crashed in a depot, which would still yield money.
rubidium
parents:
7642
diff
changeset
|
915 |
|
1237
1c7a3f9c94b9
(svn r1741) - Fix: added IsVehicleIndex() so it's possible to protect GetVehicle() from reading an invalid vehicle index
bjarni
parents:
1235
diff
changeset
|
916 |
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); |
1c7a3f9c94b9
(svn r1741) - Fix: added IsVehicleIndex() so it's possible to protect GetVehicle() from reading an invalid vehicle index
bjarni
parents:
1235
diff
changeset
|
917 |
|
7490
bb27d92565d3
(svn r11001) -Codechange: unify the way to determine whether a vehicle is in a depot.
rubidium
parents:
7425
diff
changeset
|
918 |
if (!v->IsStoppedInDepot()) { |
0 | 919 |
return_cmd_error(STR_980B_SHIP_MUST_BE_STOPPED_IN); |
3961
9868b766fda7
(svn r5120) Add IsShipInDepot{Stopped,}() and remove some redundant checks
tron
parents:
3955
diff
changeset
|
920 |
} |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
921 |
|
7782
e2999b5fcfad
(svn r11332) -Fix: vehicles getting a value of 0 on construction.
rubidium
parents:
7695
diff
changeset
|
922 |
CommandCost ret(-v->value); |
e2999b5fcfad
(svn r11332) -Fix: vehicles getting a value of 0 on construction.
rubidium
parents:
7695
diff
changeset
|
923 |
|
0 | 924 |
if (flags & DC_EXEC) { |
925 |
InvalidateWindow(WC_VEHICLE_DEPOT, v->tile); |
|
588 | 926 |
RebuildVehicleLists(); |
0 | 927 |
InvalidateWindow(WC_COMPANY, v->owner); |
928 |
DeleteWindowById(WC_VEHICLE_VIEW, v->index); |
|
5256
9056fd4b30f4
(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
|
929 |
DeleteDepotHighlightOfVehicle(v); |
7398
b933416cf32b
(svn r10770) -Codechange: use the pool item class as super class for the vehicle struct.
rubidium
parents:
7334
diff
changeset
|
930 |
delete v; |
0 | 931 |
} |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
932 |
|
7782
e2999b5fcfad
(svn r11332) -Fix: vehicles getting a value of 0 on construction.
rubidium
parents:
7695
diff
changeset
|
933 |
return ret; |
0 | 934 |
} |
935 |
||
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
936 |
/** Start/Stop a ship. |
3491
35d747bb5e82
(svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents:
3476
diff
changeset
|
937 |
* @param tile unused |
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
938 |
* @param flags type of operation |
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
939 |
* @param p1 ship ID to start/stop |
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
940 |
* @param p2 unused |
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
941 |
*/ |
6943
1914f26aee04
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
6888
diff
changeset
|
942 |
CommandCost CmdStartStopShip(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
0 | 943 |
{ |
944 |
Vehicle *v; |
|
4244
d40c73c55357
(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
|
945 |
uint16 callback; |
0 | 946 |
|
4352
6703cd8d39e0
(svn r6053) -Codechange: renamed all IsXXXIndex to IsValidXXXID
truelight
parents:
4351
diff
changeset
|
947 |
if (!IsValidVehicleID(p1)) return CMD_ERROR; |
1237
1c7a3f9c94b9
(svn r1741) - Fix: added IsVehicleIndex() so it's possible to protect GetVehicle() from reading an invalid vehicle index
bjarni
parents:
1235
diff
changeset
|
948 |
|
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
949 |
v = GetVehicle(p1); |
0 | 950 |
|
6259
471b91a4b1d8
(svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents:
6248
diff
changeset
|
951 |
if (v->type != VEH_SHIP || !CheckOwnership(v->owner)) return CMD_ERROR; |
0 | 952 |
|
4244
d40c73c55357
(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
|
953 |
/* Check if this ship can be started/stopped. The callback will fail or |
d40c73c55357
(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
|
954 |
* return 0xFF if it can. */ |
d40c73c55357
(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
|
955 |
callback = GetVehicleCallback(CBID_VEHICLE_START_STOP_CHECK, 0, 0, v->engine_type, v); |
d40c73c55357
(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
|
956 |
if (callback != CALLBACK_FAILED && callback != 0xFF) { |
d40c73c55357
(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
|
957 |
StringID error = GetGRFStringID(GetEngineGRFID(v->engine_type), 0xD000 + callback); |
d40c73c55357
(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
|
958 |
return_cmd_error(error); |
d40c73c55357
(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
|
959 |
} |
d40c73c55357
(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
|
960 |
|
0 | 961 |
if (flags & DC_EXEC) { |
7490
bb27d92565d3
(svn r11001) -Codechange: unify the way to determine whether a vehicle is in a depot.
rubidium
parents:
7425
diff
changeset
|
962 |
if (v->IsStoppedInDepot()) { |
3139
b17abef09e15
(svn r3757) -Feature: Delete news items about vehicles, when they get stale
tron
parents:
3005
diff
changeset
|
963 |
DeleteVehicleNews(p1, STR_981C_SHIP_IS_WAITING_IN_DEPOT); |
b17abef09e15
(svn r3757) -Feature: Delete news items about vehicles, when they get stale
tron
parents:
3005
diff
changeset
|
964 |
} |
b17abef09e15
(svn r3757) -Feature: Delete news items about vehicles, when they get stale
tron
parents:
3005
diff
changeset
|
965 |
|
0 | 966 |
v->vehstatus ^= VS_STOPPED; |
755
80091de50044
(svn r1211) -Feature: Introduce sticky windows to all vehicle windows...Just make sure you do not sticky more than 23 at a time. Also a lot of places in the code invalidated the 'status bar' of the vehicle, referring to it as widget 4. This is now widget 5 and has been #definitized
darkvater
parents:
679
diff
changeset
|
967 |
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR); |
0 | 968 |
InvalidateWindow(WC_VEHICLE_DEPOT, v->tile); |
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
969 |
InvalidateWindowClasses(WC_SHIPS_LIST); |
0 | 970 |
} |
971 |
||
6950
14ecb0acdfb4
(svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents:
6943
diff
changeset
|
972 |
return CommandCost(); |
0 | 973 |
} |
974 |
||
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
975 |
/** Send a ship to the depot. |
3491
35d747bb5e82
(svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents:
3476
diff
changeset
|
976 |
* @param tile unused |
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
977 |
* @param flags type of operation |
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
978 |
* @param p1 vehicle ID to send to the depot |
4451
2e86da0081b5
(svn r6229) -Feature: Shared order lists now got a "goto depot" button
bjarni
parents:
4412
diff
changeset
|
979 |
* @param p2 various bitmasked elements |
4506
e6a56518135c
(svn r6291) -Feature: Vehicle lists from the station window now also got the goto depot button
bjarni
parents:
4463
diff
changeset
|
980 |
* - p2 bit 0-3 - DEPOT_ flags (see vehicle.h) |
e6a56518135c
(svn r6291) -Feature: Vehicle lists from the station window now also got the goto depot button
bjarni
parents:
4463
diff
changeset
|
981 |
* - p2 bit 8-10 - VLW flag (for mass goto depot) |
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
982 |
*/ |
6943
1914f26aee04
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
6888
diff
changeset
|
983 |
CommandCost CmdSendShipToDepot(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
0 | 984 |
{ |
985 |
Vehicle *v; |
|
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
986 |
const Depot *dep; |
0 | 987 |
|
4506
e6a56518135c
(svn r6291) -Feature: Vehicle lists from the station window now also got the goto depot button
bjarni
parents:
4463
diff
changeset
|
988 |
if (p2 & DEPOT_MASS_SEND) { |
e6a56518135c
(svn r6291) -Feature: Vehicle lists from the station window now also got the goto depot button
bjarni
parents:
4463
diff
changeset
|
989 |
/* Mass goto depot requested */ |
4546
507b7d9bd834
(svn r6378) -Codechange: Rename VLW_FLAGS to VLW_MASK as it is a mask
Darkvater
parents:
4544
diff
changeset
|
990 |
if (!ValidVLWFlags(p2 & VLW_MASK)) return CMD_ERROR; |
6259
471b91a4b1d8
(svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents:
6248
diff
changeset
|
991 |
return SendAllVehiclesToDepot(VEH_SHIP, flags, p2 & DEPOT_SERVICE, _current_player, (p2 & VLW_MASK), p1); |
4463
4d67d3a36fc5
(svn r6246) -Feature: added the many times requested "send all vehicle to depot" button
bjarni
parents:
4451
diff
changeset
|
992 |
} |
4d67d3a36fc5
(svn r6246) -Feature: added the many times requested "send all vehicle to depot" button
bjarni
parents:
4451
diff
changeset
|
993 |
|
4506
e6a56518135c
(svn r6291) -Feature: Vehicle lists from the station window now also got the goto depot button
bjarni
parents:
4463
diff
changeset
|
994 |
if (!IsValidVehicleID(p1)) return CMD_ERROR; |
1237
1c7a3f9c94b9
(svn r1741) - Fix: added IsVehicleIndex() so it's possible to protect GetVehicle() from reading an invalid vehicle index
bjarni
parents:
1235
diff
changeset
|
995 |
|
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
996 |
v = GetVehicle(p1); |
0 | 997 |
|
6259
471b91a4b1d8
(svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents:
6248
diff
changeset
|
998 |
if (v->type != VEH_SHIP || !CheckOwnership(v->owner)) return CMD_ERROR; |
0 | 999 |
|
4506
e6a56518135c
(svn r6291) -Feature: Vehicle lists from the station window now also got the goto depot button
bjarni
parents:
4463
diff
changeset
|
1000 |
if (v->vehstatus & VS_CRASHED) return CMD_ERROR; |
1757
89f63a75ffd2
(svn r2261) - Fix: When crashed vehicles try to find a depot for servicing, openttd asserts.
matthijs
parents:
1752
diff
changeset
|
1001 |
|
7490
bb27d92565d3
(svn r11001) -Codechange: unify the way to determine whether a vehicle is in a depot.
rubidium
parents:
7425
diff
changeset
|
1002 |
if (v->IsInDepot()) return CMD_ERROR; |
4526 | 1003 |
|
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
1004 |
/* If the current orders are already goto-depot */ |
555
02df8a1b7f33
(svn r955) Replace uint16 for orders with struct Order
tron
parents:
541
diff
changeset
|
1005 |
if (v->current_order.type == OT_GOTO_DEPOT) { |
4519
f53d829de680
(svn r6304) -Codechange r6295: Use !! instead of (bool) in commands to send vehicles to depots
bjarni
parents:
4510
diff
changeset
|
1006 |
if (!!(p2 & DEPOT_SERVICE) == HASBIT(v->current_order.flags, OFB_HALT_IN_DEPOT)) { |
4510
54d30a2372c3
(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
|
1007 |
/* We called with a different DEPOT_SERVICE setting. |
54d30a2372c3
(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
|
1008 |
* Now we change the setting to apply the new one and let the vehicle head for the same depot. |
54d30a2372c3
(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
|
1009 |
* Note: the if is (true for requesting service == true for ordered to stop in depot) */ |
54d30a2372c3
(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
|
1010 |
if (flags & DC_EXEC) { |
7551
7e76a6be5873
(svn r11072) -Fix [FS#1045]: when a vehicle had a service order, the goto-depot button did not make it possible to stop the vehicle at that depot.
rubidium
parents:
7502
diff
changeset
|
1011 |
CLRBIT(v->current_order.flags, OFB_PART_OF_ORDERS); |
4510
54d30a2372c3
(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
|
1012 |
TOGGLEBIT(v->current_order.flags, OFB_HALT_IN_DEPOT); |
54d30a2372c3
(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
|
1013 |
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR); |
54d30a2372c3
(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
|
1014 |
} |
6950
14ecb0acdfb4
(svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents:
6943
diff
changeset
|
1015 |
return CommandCost(); |
4510
54d30a2372c3
(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
|
1016 |
} |
54d30a2372c3
(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
|
1017 |
|
4506
e6a56518135c
(svn r6291) -Feature: Vehicle lists from the station window now also got the goto depot button
bjarni
parents:
4463
diff
changeset
|
1018 |
if (p2 & DEPOT_DONT_CANCEL) return CMD_ERROR; // Requested no cancelation of depot orders |
0 | 1019 |
if (flags & DC_EXEC) { |
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
1020 |
/* If the orders to 'goto depot' are in the orders list (forced servicing), |
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
1021 |
* then skip to the next order; effectively cancelling this forced service */ |
1530
2b46869fc0d4
(svn r2034) -Codechange: Replaced the rather meaningless LOAD and UNLOAD flags for depots by something more meaningful
celestar
parents:
1520
diff
changeset
|
1022 |
if (HASBIT(v->current_order.flags, OFB_PART_OF_ORDERS)) |
2b46869fc0d4
(svn r2034) -Codechange: Replaced the rather meaningless LOAD and UNLOAD flags for depots by something more meaningful
celestar
parents:
1520
diff
changeset
|
1023 |
v->cur_order_index++; |
2b46869fc0d4
(svn r2034) -Codechange: Replaced the rather meaningless LOAD and UNLOAD flags for depots by something more meaningful
celestar
parents:
1520
diff
changeset
|
1024 |
|
555
02df8a1b7f33
(svn r955) Replace uint16 for orders with struct Order
tron
parents:
541
diff
changeset
|
1025 |
v->current_order.type = OT_DUMMY; |
02df8a1b7f33
(svn r955) Replace uint16 for orders with struct Order
tron
parents:
541
diff
changeset
|
1026 |
v->current_order.flags = 0; |
755
80091de50044
(svn r1211) -Feature: Introduce sticky windows to all vehicle windows...Just make sure you do not sticky more than 23 at a time. Also a lot of places in the code invalidated the 'status bar' of the vehicle, referring to it as widget 4. This is now widget 5 and has been #definitized
darkvater
parents:
679
diff
changeset
|
1027 |
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR); |
0 | 1028 |
} |
6950
14ecb0acdfb4
(svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents:
6943
diff
changeset
|
1029 |
return CommandCost(); |
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
1030 |
} |
0 | 1031 |
|
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
1032 |
dep = FindClosestShipDepot(v); |
4506
e6a56518135c
(svn r6291) -Feature: Vehicle lists from the station window now also got the goto depot button
bjarni
parents:
4463
diff
changeset
|
1033 |
if (dep == NULL) return_cmd_error(STR_981A_UNABLE_TO_FIND_LOCAL_DEPOT); |
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
1034 |
|
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
1035 |
if (flags & DC_EXEC) { |
6502
8056fdc57aa9
(svn r9685) -Fix (r9683): Call v->LeaveStation() when a vehicle in a station is sent to a depot.
maedhros
parents:
6491
diff
changeset
|
1036 |
if (v->current_order.type == OT_LOADING) v->LeaveStation(); |
8056fdc57aa9
(svn r9685) -Fix (r9683): Call v->LeaveStation() when a vehicle in a station is sent to a depot.
maedhros
parents:
6491
diff
changeset
|
1037 |
|
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
1038 |
v->dest_tile = dep->xy; |
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
1039 |
v->current_order.type = OT_GOTO_DEPOT; |
4412
cae52239a576
(svn r6165) -Feature: control click Goto Depot will now make the vehicle service
bjarni
parents:
4389
diff
changeset
|
1040 |
v->current_order.flags = OF_NON_STOP; |
4506
e6a56518135c
(svn r6291) -Feature: Vehicle lists from the station window now also got the goto depot button
bjarni
parents:
4463
diff
changeset
|
1041 |
if (!(p2 & DEPOT_SERVICE)) SETBIT(v->current_order.flags, OFB_HALT_IN_DEPOT); |
5259
9d7de9a6b364
(svn r7389) -Fix: when forcing a vehicle to go to a depot, clear refit orders from current orders (caused refit error popup when not having no orders)
bjarni
parents:
5256
diff
changeset
|
1042 |
v->current_order.refit_cargo = CT_INVALID; |
4527
fa30d19685c2
(svn r6353) -Codechange: Make DestinationID a typedef of uin16, which is as large as any type of destinataion (StationID, DepotID, WaypointID) it can hold
tron
parents:
4526
diff
changeset
|
1043 |
v->current_order.dest = dep->index; |
1793
b9a37c98b468
(svn r2297) - CodeChange: server-check the next batch of commands.
Darkvater
parents:
1790
diff
changeset
|
1044 |
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR); |
0 | 1045 |
} |
1046 |
||
6950
14ecb0acdfb4
(svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents:
6943
diff
changeset
|
1047 |
return CommandCost(); |
0 | 1048 |
} |
1049 |
||
1050 |
||
1802
da61740cc1e7
(svn r2306) - CodeChange: Check the last commands; refits. This needed an extensive rewrite and global/local-cargo ID juggling and bitmasking. However with this done it looks better as well and is compatible with newgrf handling. Big thanks to HackyKid for doing most of the work. This also closes patch "[ 1199277 ] Command checks"
Darkvater
parents:
1793
diff
changeset
|
1051 |
/** Refits a ship to the specified cargo type. |
3491
35d747bb5e82
(svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents:
3476
diff
changeset
|
1052 |
* @param tile unused |
6420
456c275f3313
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6407
diff
changeset
|
1053 |
* @param flags type of operation |
1802
da61740cc1e7
(svn r2306) - CodeChange: Check the last commands; refits. This needed an extensive rewrite and global/local-cargo ID juggling and bitmasking. However with this done it looks better as well and is compatible with newgrf handling. Big thanks to HackyKid for doing most of the work. This also closes patch "[ 1199277 ] Command checks"
Darkvater
parents:
1793
diff
changeset
|
1054 |
* @param p1 vehicle ID of the ship to refit |
da61740cc1e7
(svn r2306) - CodeChange: Check the last commands; refits. This needed an extensive rewrite and global/local-cargo ID juggling and bitmasking. However with this done it looks better as well and is compatible with newgrf handling. Big thanks to HackyKid for doing most of the work. This also closes patch "[ 1199277 ] Command checks"
Darkvater
parents:
1793
diff
changeset
|
1055 |
* @param p2 various bitstuffed elements |
da61740cc1e7
(svn r2306) - CodeChange: Check the last commands; refits. This needed an extensive rewrite and global/local-cargo ID juggling and bitmasking. However with this done it looks better as well and is compatible with newgrf handling. Big thanks to HackyKid for doing most of the work. This also closes patch "[ 1199277 ] Command checks"
Darkvater
parents:
1793
diff
changeset
|
1056 |
* - p2 = (bit 0-7) - the new cargo type to refit to (p2 & 0xFF) |
3954
7b51d0046efb
(svn r5103) - Add cargo subtype parameter to refit commands (mart3p)
peter1138
parents:
3948
diff
changeset
|
1057 |
* - p2 = (bit 8-15) - the new cargo subtype to refit to |
6546
4c6d90bde803
(svn r9742) -Fix (r9689) [FS#739]: Fix cloning with refit costs again, hopefully for good this time.
maedhros
parents:
6502
diff
changeset
|
1058 |
* - p2 = (bit 16) - refit only this vehicle (ignored) |
4c6d90bde803
(svn r9742) -Fix (r9689) [FS#739]: Fix cloning with refit costs again, hopefully for good this time.
maedhros
parents:
6502
diff
changeset
|
1059 |
* @return cost of refit or error |
1802
da61740cc1e7
(svn r2306) - CodeChange: Check the last commands; refits. This needed an extensive rewrite and global/local-cargo ID juggling and bitmasking. However with this done it looks better as well and is compatible with newgrf handling. Big thanks to HackyKid for doing most of the work. This also closes patch "[ 1199277 ] Command checks"
Darkvater
parents:
1793
diff
changeset
|
1060 |
*/ |
6943
1914f26aee04
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
6888
diff
changeset
|
1061 |
CommandCost CmdRefitShip(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
0 | 1062 |
{ |
1063 |
Vehicle *v; |
|
6943
1914f26aee04
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
6888
diff
changeset
|
1064 |
CommandCost cost; |
3954
7b51d0046efb
(svn r5103) - Add cargo subtype parameter to refit commands (mart3p)
peter1138
parents:
3948
diff
changeset
|
1065 |
CargoID new_cid = GB(p2, 0, 8); //gets the cargo number |
7b51d0046efb
(svn r5103) - Add cargo subtype parameter to refit commands (mart3p)
peter1138
parents:
3948
diff
changeset
|
1066 |
byte new_subtype = GB(p2, 8, 8); |
3989
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1067 |
uint16 capacity = CALLBACK_FAILED; |
1237
1c7a3f9c94b9
(svn r1741) - Fix: added IsVehicleIndex() so it's possible to protect GetVehicle() from reading an invalid vehicle index
bjarni
parents:
1235
diff
changeset
|
1068 |
|
4352
6703cd8d39e0
(svn r6053) -Codechange: renamed all IsXXXIndex to IsValidXXXID
truelight
parents:
4351
diff
changeset
|
1069 |
if (!IsValidVehicleID(p1)) return CMD_ERROR; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
164
diff
changeset
|
1070 |
|
919
544f374ee392
(svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents:
915
diff
changeset
|
1071 |
v = GetVehicle(p1); |
1237
1c7a3f9c94b9
(svn r1741) - Fix: added IsVehicleIndex() so it's possible to protect GetVehicle() from reading an invalid vehicle index
bjarni
parents:
1235
diff
changeset
|
1072 |
|
6259
471b91a4b1d8
(svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents:
6248
diff
changeset
|
1073 |
if (v->type != VEH_SHIP || !CheckOwnership(v->owner)) return CMD_ERROR; |
2567
ee48d423f868
(svn r3104) -Codechange: [refit] removed now obsolite code that the old autoreplace needed
bjarni
parents:
2564
diff
changeset
|
1074 |
|
7490
bb27d92565d3
(svn r11001) -Codechange: unify the way to determine whether a vehicle is in a depot.
rubidium
parents:
7425
diff
changeset
|
1075 |
if (!v->IsStoppedInDepot()) { |
3961
9868b766fda7
(svn r5120) Add IsShipInDepot{Stopped,}() and remove some redundant checks
tron
parents:
3955
diff
changeset
|
1076 |
return_cmd_error(STR_980B_SHIP_MUST_BE_STOPPED_IN); |
9868b766fda7
(svn r5120) Add IsShipInDepot{Stopped,}() and remove some redundant checks
tron
parents:
3955
diff
changeset
|
1077 |
} |
0 | 1078 |
|
1802
da61740cc1e7
(svn r2306) - CodeChange: Check the last commands; refits. This needed an extensive rewrite and global/local-cargo ID juggling and bitmasking. However with this done it looks better as well and is compatible with newgrf handling. Big thanks to HackyKid for doing most of the work. This also closes patch "[ 1199277 ] Command checks"
Darkvater
parents:
1793
diff
changeset
|
1079 |
/* Check cargo */ |
da61740cc1e7
(svn r2306) - CodeChange: Check the last commands; refits. This needed an extensive rewrite and global/local-cargo ID juggling and bitmasking. However with this done it looks better as well and is compatible with newgrf handling. Big thanks to HackyKid for doing most of the work. This also closes patch "[ 1199277 ] Command checks"
Darkvater
parents:
1793
diff
changeset
|
1080 |
if (!ShipVehInfo(v->engine_type)->refittable) return CMD_ERROR; |
6316
d2b70e10f106
(svn r9259) -Codechange: NUM_CARGO isn't a valid cargo type...
peter1138
parents:
6263
diff
changeset
|
1081 |
if (new_cid >= NUM_CARGO || !CanRefitTo(v->engine_type, new_cid)) return CMD_ERROR; |
915 | 1082 |
|
1237
1c7a3f9c94b9
(svn r1741) - Fix: added IsVehicleIndex() so it's possible to protect GetVehicle() from reading an invalid vehicle index
bjarni
parents:
1235
diff
changeset
|
1083 |
SET_EXPENSES_TYPE(EXPENSES_SHIP_RUN); |
1c7a3f9c94b9
(svn r1741) - Fix: added IsVehicleIndex() so it's possible to protect GetVehicle() from reading an invalid vehicle index
bjarni
parents:
1235
diff
changeset
|
1084 |
|
3989
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1085 |
/* Check the refit capacity callback */ |
7642
535e5d93ffb1
(svn r11173) -Codechange: rename some callback enums so they are more uniform.
rubidium
parents:
7551
diff
changeset
|
1086 |
if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_REFIT_CAPACITY)) { |
3989
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1087 |
/* Back up the existing cargo type */ |
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1088 |
CargoID temp_cid = v->cargo_type; |
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1089 |
byte temp_subtype = v->cargo_subtype; |
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1090 |
v->cargo_type = new_cid; |
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1091 |
v->cargo_subtype = new_subtype; |
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1092 |
|
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1093 |
capacity = GetVehicleCallback(CBID_VEHICLE_REFIT_CAPACITY, 0, 0, v->engine_type, v); |
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1094 |
|
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1095 |
/* Restore the cargo type */ |
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1096 |
v->cargo_type = temp_cid; |
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1097 |
v->cargo_subtype = temp_subtype; |
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1098 |
} |
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1099 |
|
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1100 |
if (capacity == CALLBACK_FAILED) { |
6608
dc0b009642a4
(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:
6595
diff
changeset
|
1101 |
capacity = GetVehicleProperty(v, 0x0D, ShipVehInfo(v->engine_type)->capacity); |
3989
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1102 |
} |
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1103 |
_returned_refit_capacity = capacity; |
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1104 |
|
4845
72bbb6e2694e
(svn r6771) -Codechange: Replace two macros with functions. IS_HUMAN_PLAYER and
Darkvater
parents:
4739
diff
changeset
|
1105 |
if (IsHumanPlayer(v->owner) && new_cid != v->cargo_type) { |
4544
69f1248a2d97
(svn r6376) -Codechange: [vehicle refit] moved all refit cost calculations into GetRefitCost()
bjarni
parents:
4529
diff
changeset
|
1106 |
cost = GetRefitCost(v->engine_type); |
0 | 1107 |
} |
1108 |
||
1109 |
if (flags & DC_EXEC) { |
|
3989
9b99f0898ca2
(svn r5188) - NewGRF: check refit capacity callback when refitting a ship
peter1138
parents:
3961
diff
changeset
|
1110 |
v->cargo_cap = capacity; |
7010
6f0d9f03180d
(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:
6980
diff
changeset
|
1111 |
v->cargo.Truncate((v->cargo_type == new_cid) ? capacity : 0); |
1802
da61740cc1e7
(svn r2306) - CodeChange: Check the last commands; refits. This needed an extensive rewrite and global/local-cargo ID juggling and bitmasking. However with this done it looks better as well and is compatible with newgrf handling. Big thanks to HackyKid for doing most of the work. This also closes patch "[ 1199277 ] Command checks"
Darkvater
parents:
1793
diff
changeset
|
1112 |
v->cargo_type = new_cid; |
3954
7b51d0046efb
(svn r5103) - Add cargo subtype parameter to refit commands (mart3p)
peter1138
parents:
3948
diff
changeset
|
1113 |
v->cargo_subtype = new_subtype; |
0 | 1114 |
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); |
3954
7b51d0046efb
(svn r5103) - Add cargo subtype parameter to refit commands (mart3p)
peter1138
parents:
3948
diff
changeset
|
1115 |
InvalidateWindow(WC_VEHICLE_DEPOT, v->tile); |
7b51d0046efb
(svn r5103) - Add cargo subtype parameter to refit commands (mart3p)
peter1138
parents:
3948
diff
changeset
|
1116 |
RebuildVehicleLists(); |
0 | 1117 |
} |
1118 |
||
1119 |
return cost; |
|
1120 |
||
1121 |
} |