src/newgrf_engine.cpp
author richk
Wed, 16 Apr 2008 00:07:47 +0000
branchNewGRF_ports
changeset 10200 aba3af04cdbd
parent 10184 fcf5fb2548eb
child 10724 68a692eacf22
permissions -rw-r--r--
(svn r12732) [NewGRF_ports] -Sync: with trunk r12657:12672.
2186
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     1
/* $Id$ */
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     2
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
     3
/** @file newgrf_engine.cpp */
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
     4
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     5
#include "stdafx.h"
1891
92a3b0aa0946 (svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents: 1883
diff changeset
     6
#include "openttd.h"
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
     7
#include "variables.h"
1299
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents: 1197
diff changeset
     8
#include "debug.h"
10184
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
     9
#include "engine_func.h"
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
    10
#include "train.h"
6872
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    11
#include "player_func.h"
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    12
#include "player_base.h"
10184
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
    13
#include "station_base.h"
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
    14
#include "airport.h"
3924
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
    15
#include "newgrf.h"
2982
286f69caaf05 (svn r3557) - NewGRF: move callback enums to a new file as more than just engines will use them
peter1138
parents: 2971
diff changeset
    16
#include "newgrf_callbacks.h"
2962
dbd168a4703a (svn r3524) - Split newgrf features from engine.[ch] into newgrf_engine.[ch], and add the new files to project files.
peter1138
parents: 2951
diff changeset
    17
#include "newgrf_engine.h"
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
    18
#include "newgrf_station.h"
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
    19
#include "newgrf_spritegroup.h"
3866
113de2b20059 (svn r4902) Newgrf : Introduction of the newgrf_cargo files.
belugas
parents: 3862
diff changeset
    20
#include "newgrf_cargo.h"
6417
26acff62d001 (svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
peter1138
parents: 6358
diff changeset
    21
#include "cargotype.h"
6872
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    22
#include "date_func.h"
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    23
#include "vehicle_func.h"
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    24
#include "core/random_func.hpp"
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    25
#include "direction_func.h"
6878
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
    26
#include "rail_map.h"
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
    27
#include "rail.h"
3843
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
    28
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
    29
3785
1becd6b333fe (svn r4781) - NewGRF: give _traininfo_vehicle_pitch a proper declaration
peter1138
parents: 3739
diff changeset
    30
int _traininfo_vehicle_pitch = 0;
3845
c3cd4b825c2f (svn r4869) - NewGRF: support setting train list vehicle width to 32 instead of 29 pixels, for sets which use 32 pixel long engines/wagons.
peter1138
parents: 3843
diff changeset
    31
int _traininfo_vehicle_width = 29;
3785
1becd6b333fe (svn r4781) - NewGRF: give _traininfo_vehicle_pitch a proper declaration
peter1138
parents: 3739
diff changeset
    32
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    33
struct WagonOverride {
6872
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    34
	EngineID *train_id;
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    35
	uint trains;
4869
cded5f3a83c9 (svn r6795) - NewGRF: Add support for cargo-specific wagon overrides.
peter1138
parents: 4832
diff changeset
    36
	CargoID cargo;
3693
af2ee9b328e6 (svn r4629) - NewGRF: constify more code that deals with sprite groups, now that ref counting is gone.
peter1138
parents: 3686
diff changeset
    37
	const SpriteGroup *group;
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    38
};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    39
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    40
struct WagonOverrides {
6872
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    41
	uint overrides_count;
1477
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1475
diff changeset
    42
	WagonOverride *overrides;
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    43
};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    44
1477
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1475
diff changeset
    45
static WagonOverrides _engine_wagon_overrides[TOTAL_NUM_ENGINES];
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1475
diff changeset
    46
6872
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    47
void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, EngineID *train_id, uint trains)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    48
{
1477
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1475
diff changeset
    49
	WagonOverrides *wos;
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1475
diff changeset
    50
	WagonOverride *wo;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    51
5338
5b48218d8bd2 (svn r7503) -Codechange: [NewGRF] Add bounds checking for spriteset cargo types. (NewCargo support will change this rule a bit...)
peter1138
parents: 5175
diff changeset
    52
	assert(engine < TOTAL_NUM_ENGINES);
6483
5d2df05c88dd (svn r8903) -Regression (r8891): CT_PURCHASE does apply to aircraft overrides...
peter1138
parents: 6474
diff changeset
    53
	assert(cargo < NUM_CARGO + 2); // Include CT_DEFAULT and CT_PURCHASE pseudo cargos.
5338
5b48218d8bd2 (svn r7503) -Codechange: [NewGRF] Add bounds checking for spriteset cargo types. (NewCargo support will change this rule a bit...)
peter1138
parents: 5175
diff changeset
    54
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    55
	wos = &_engine_wagon_overrides[engine];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    56
	wos->overrides_count++;
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5852
diff changeset
    57
	wos->overrides = ReallocT(wos->overrides, wos->overrides_count);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 114
diff changeset
    58
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    59
	wo = &wos->overrides[wos->overrides_count - 1];
408
63a8c0505aab (svn r605) -newgrf: Framework for supporting variational spritegroups . Deterministic only at the moment, but random ones support shouldn't be that difficult now It doesn't do anything, but makes these actions actually possible (pasky).
darkvater
parents: 405
diff changeset
    60
	/* FIXME: If we are replacing an override, release original SpriteGroup
63a8c0505aab (svn r605) -newgrf: Framework for supporting variational spritegroups . Deterministic only at the moment, but random ones support shouldn't be that difficult now It doesn't do anything, but makes these actions actually possible (pasky).
darkvater
parents: 405
diff changeset
    61
	 * to prevent leaks. But first we need to refcount the SpriteGroup.
63a8c0505aab (svn r605) -newgrf: Framework for supporting variational spritegroups . Deterministic only at the moment, but random ones support shouldn't be that difficult now It doesn't do anything, but makes these actions actually possible (pasky).
darkvater
parents: 405
diff changeset
    62
	 * --pasky */
2488
cbe3d6b60c27 (svn r3014) -NewGRF, Codechange: Make all sprite group references be pointers instead of copying the data around.
peter1138
parents: 2477
diff changeset
    63
	wo->group = group;
4869
cded5f3a83c9 (svn r6795) - NewGRF: Add support for cargo-specific wagon overrides.
peter1138
parents: 4832
diff changeset
    64
	wo->cargo = cargo;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    65
	wo->trains = trains;
6872
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    66
	wo->train_id = MallocT<EngineID>(trains);
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    67
	memcpy(wo->train_id, train_id, trains * sizeof *train_id);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    68
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    69
6872
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    70
const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, EngineID overriding_engine)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    71
{
2242
27fa4807cd61 (svn r2762) Simplify a loop, remove an unused variable and add many consts
tron
parents: 2204
diff changeset
    72
	const WagonOverrides *wos = &_engine_wagon_overrides[engine];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    73
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
    74
	/* XXX: This could turn out to be a timesink on profiles. We could
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
    75
	 * always just dedicate 65535 bytes for an [engine][train] trampoline
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
    76
	 * for O(1). Or O(logMlogN) and searching binary tree or smt. like
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
    77
	 * that. --pasky */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    78
6872
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    79
	for (uint i = 0; i < wos->overrides_count; i++) {
2242
27fa4807cd61 (svn r2762) Simplify a loop, remove an unused variable and add many consts
tron
parents: 2204
diff changeset
    80
		const WagonOverride *wo = &wos->overrides[i];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    81
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
    82
		if (wo->cargo != cargo && wo->cargo != CT_DEFAULT) continue;
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
    83
6872
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    84
		for (uint j = 0; j < wo->trains; j++) {
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
    85
			if (wo->train_id[j] == overriding_engine) return wo->group;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    86
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    87
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    88
	return NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    89
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    90
2491
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
    91
/**
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
    92
 * Unload all wagon override sprite groups.
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
    93
 */
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6502
diff changeset
    94
void UnloadWagonOverrides()
2491
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
    95
{
6872
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    96
	for (EngineID engine = 0; engine < TOTAL_NUM_ENGINES; engine++) {
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    97
		WagonOverrides *wos = &_engine_wagon_overrides[engine];
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    98
		for (uint i = 0; i < wos->overrides_count; i++) {
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
    99
			WagonOverride *wo = &wos->overrides[i];
2491
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   100
			free(wo->train_id);
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   101
		}
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   102
		free(wos->overrides);
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   103
		wos->overrides_count = 0;
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   104
		wos->overrides = NULL;
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   105
	}
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   106
}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   107
6474
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6473
diff changeset
   108
/* Space for NUM_CARGO real cargos and 2 pseudo cargos, CT_DEFAULT and CT_PURCHASE */
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6473
diff changeset
   109
static const SpriteGroup *_engine_custom_sprites[TOTAL_NUM_ENGINES][NUM_CARGO + 2];
3924
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   110
static const GRFFile *_engine_grf[TOTAL_NUM_ENGINES];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   111
3693
af2ee9b328e6 (svn r4629) - NewGRF: constify more code that deals with sprite groups, now that ref counting is gone.
peter1138
parents: 3686
diff changeset
   112
void SetCustomEngineSprites(EngineID engine, byte cargo, const SpriteGroup *group)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   113
{
6474
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6473
diff changeset
   114
	assert(engine < lengthof(_engine_custom_sprites));
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6473
diff changeset
   115
	assert(cargo < lengthof(*_engine_custom_sprites));
5338
5b48218d8bd2 (svn r7503) -Codechange: [NewGRF] Add bounds checking for spriteset cargo types. (NewCargo support will change this rule a bit...)
peter1138
parents: 5175
diff changeset
   116
6452
fc8ca2b46277 (svn r8863) -Fix: prefix engine_custom_sprites with _
peter1138
parents: 6448
diff changeset
   117
	if (_engine_custom_sprites[engine][cargo] != NULL) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5338
diff changeset
   118
		grfmsg(6, "SetCustomEngineSprites: engine %d cargo %d already has group -- replacing", engine, cargo);
2491
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   119
	}
6452
fc8ca2b46277 (svn r8863) -Fix: prefix engine_custom_sprites with _
peter1138
parents: 6448
diff changeset
   120
	_engine_custom_sprites[engine][cargo] = group;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   121
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   122
2491
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   123
/**
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   124
 * Unload all engine sprite groups.
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   125
 */
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6502
diff changeset
   126
void UnloadCustomEngineSprites()
2491
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   127
{
6474
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6473
diff changeset
   128
	memset(_engine_custom_sprites, 0, sizeof(_engine_custom_sprites));
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6473
diff changeset
   129
	memset(_engine_grf, 0, sizeof(_engine_grf));
2491
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   130
}
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   131
3924
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   132
/**
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   133
 * Tie a GRFFile entry to an engine, to allow us to retrieve GRF parameters
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   134
 * etc during a game.
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   135
 * @param engine Engine ID to tie the GRFFile to.
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   136
 * @param file   Pointer of GRFFile to tie.
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   137
 */
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   138
void SetEngineGRF(EngineID engine, const GRFFile *file)
3648
1574c89384cb (svn r4559) - NewGRF: keep a record of which grf an engine is defined in. Will be used in the future.
peter1138
parents: 3630
diff changeset
   139
{
1574c89384cb (svn r4559) - NewGRF: keep a record of which grf an engine is defined in. Will be used in the future.
peter1138
parents: 3630
diff changeset
   140
	assert(engine < TOTAL_NUM_ENGINES);
3924
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   141
	_engine_grf[engine] = file;
3648
1574c89384cb (svn r4559) - NewGRF: keep a record of which grf an engine is defined in. Will be used in the future.
peter1138
parents: 3630
diff changeset
   142
}
1574c89384cb (svn r4559) - NewGRF: keep a record of which grf an engine is defined in. Will be used in the future.
peter1138
parents: 3630
diff changeset
   143
3924
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   144
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   145
/**
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   146
 * Retrieve the GRFFile tied to an engine
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   147
 * @param engine Engine ID to retrieve.
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   148
 * @return Pointer to GRFFile.
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   149
 */
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   150
const GRFFile *GetEngineGRF(EngineID engine)
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   151
{
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   152
	assert(engine < TOTAL_NUM_ENGINES);
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   153
	return _engine_grf[engine];
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   154
}
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   155
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   156
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   157
/**
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   158
 * Retrieve the GRF ID of the GRFFile tied to an engine
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   159
 * @param engine Engine ID to retrieve.
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   160
 * @return 32 bit GRFID value.
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   161
 */
3648
1574c89384cb (svn r4559) - NewGRF: keep a record of which grf an engine is defined in. Will be used in the future.
peter1138
parents: 3630
diff changeset
   162
uint32 GetEngineGRFID(EngineID engine)
1574c89384cb (svn r4559) - NewGRF: keep a record of which grf an engine is defined in. Will be used in the future.
peter1138
parents: 3630
diff changeset
   163
{
1574c89384cb (svn r4559) - NewGRF: keep a record of which grf an engine is defined in. Will be used in the future.
peter1138
parents: 3630
diff changeset
   164
	assert(engine < TOTAL_NUM_ENGINES);
3924
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   165
	return _engine_grf[engine]->grfid;
3648
1574c89384cb (svn r4559) - NewGRF: keep a record of which grf an engine is defined in. Will be used in the future.
peter1138
parents: 3630
diff changeset
   166
}
1574c89384cb (svn r4559) - NewGRF: keep a record of which grf an engine is defined in. Will be used in the future.
peter1138
parents: 3630
diff changeset
   167
1574c89384cb (svn r4559) - NewGRF: keep a record of which grf an engine is defined in. Will be used in the future.
peter1138
parents: 3630
diff changeset
   168
2708
9d1a8d5dc3ea (svn r3252) - NewGRF: Map new train subtypes to old types for rail vehicles.
peter1138
parents: 2639
diff changeset
   169
static int MapOldSubType(const Vehicle *v)
9d1a8d5dc3ea (svn r3252) - NewGRF: Map new train subtypes to old types for rail vehicles.
peter1138
parents: 2639
diff changeset
   170
{
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6574
diff changeset
   171
	if (v->type != VEH_TRAIN) return v->subtype;
2708
9d1a8d5dc3ea (svn r3252) - NewGRF: Map new train subtypes to old types for rail vehicles.
peter1138
parents: 2639
diff changeset
   172
	if (IsTrainEngine(v)) return 0;
9d1a8d5dc3ea (svn r3252) - NewGRF: Map new train subtypes to old types for rail vehicles.
peter1138
parents: 2639
diff changeset
   173
	if (IsFreeWagon(v)) return 4;
9d1a8d5dc3ea (svn r3252) - NewGRF: Map new train subtypes to old types for rail vehicles.
peter1138
parents: 2639
diff changeset
   174
	return 2;
9d1a8d5dc3ea (svn r3252) - NewGRF: Map new train subtypes to old types for rail vehicles.
peter1138
parents: 2639
diff changeset
   175
}
9d1a8d5dc3ea (svn r3252) - NewGRF: Map new train subtypes to old types for rail vehicles.
peter1138
parents: 2639
diff changeset
   176
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   177
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   178
/* TTDP style aircraft movement states for GRF Action 2 Var 0xE2 */
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   179
enum {
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   180
	AMS_TTDP_HANGAR,
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   181
	AMS_TTDP_TO_HANGAR,
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   182
	AMS_TTDP_TO_PAD1,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   183
	AMS_TTDP_TO_PAD2,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   184
	AMS_TTDP_TO_PAD3,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   185
	AMS_TTDP_TO_ENTRY_2_AND_3,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   186
	AMS_TTDP_TO_ENTRY_2_AND_3_AND_H,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   187
	AMS_TTDP_TO_JUNCTION,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   188
	AMS_TTDP_LEAVE_RUNWAY,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   189
	AMS_TTDP_TO_INWAY,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   190
	AMS_TTDP_TO_RUNWAY,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   191
	AMS_TTDP_TO_OUTWAY,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   192
	AMS_TTDP_WAITING,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   193
	AMS_TTDP_TAKEOFF,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   194
	AMS_TTDP_TO_TAKEOFF,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   195
	AMS_TTDP_CLIMBING,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   196
	AMS_TTDP_FLIGHT_APPROACH,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   197
	AMS_TTDP_UNUSED_0x11,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   198
	AMS_TTDP_FLIGHT_TO_TOWER,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   199
	AMS_TTDP_UNUSED_0x13,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   200
	AMS_TTDP_FLIGHT_FINAL,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   201
	AMS_TTDP_FLIGHT_DESCENT,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   202
	AMS_TTDP_BRAKING,
3920
771542d40c45 (svn r5047) - NewGRF: fix typo of AIRPORT in enum
peter1138
parents: 3893
diff changeset
   203
	AMS_TTDP_HELI_TAKEOFF_AIRPORT,
771542d40c45 (svn r5047) - NewGRF: fix typo of AIRPORT in enum
peter1138
parents: 3893
diff changeset
   204
	AMS_TTDP_HELI_TO_TAKEOFF_AIRPORT,
771542d40c45 (svn r5047) - NewGRF: fix typo of AIRPORT in enum
peter1138
parents: 3893
diff changeset
   205
	AMS_TTDP_HELI_LAND_AIRPORT,
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   206
	AMS_TTDP_HELI_TAKEOFF_HELIPORT,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   207
	AMS_TTDP_HELI_TO_TAKEOFF_HELIPORT,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   208
	AMS_TTDP_HELI_LAND_HELIPORT,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   209
};
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   210
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   211
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   212
/**
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   213
 * Map OTTD aircraft movement states to TTDPatch style movement states
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   214
 * (VarAction 2 Variable 0xE2)
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   215
 */
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   216
static byte MapAircraftMovementState(const Vehicle *v)
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   217
{
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   218
	const Station *st = GetStation(v->u.air.targetairport);
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   219
	if (st->airport_tile == 0) return AMS_TTDP_FLIGHT_TO_TOWER;
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   220
6738
72d1a2997952 (svn r10683) [NewGRF_ports] -Revert: Too eager to un-const... global search/replace removed too many. Restores necessary ones... for the moment ;)
richk
parents: 6734
diff changeset
   221
	const AirportFTAClass *afc = st->Airport();
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   222
	uint16 amdflag = afc->MovingData(v->u.air.pos)->flag;
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   223
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   224
	switch (v->u.air.state) {
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   225
		case HANGAR:
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   226
			/* The international airport is a special case as helicopters can land in
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   227
			 * front of the hanger. Helicopters also change their air.state to
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   228
			 * AMED_HELI_LOWER some time before actually descending. */
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   229
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   230
			/* This condition only occurs for helicopters, during descent,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   231
			 * to a landing by the hanger of an international airport. */
3920
771542d40c45 (svn r5047) - NewGRF: fix typo of AIRPORT in enum
peter1138
parents: 3893
diff changeset
   232
			if (amdflag & AMED_HELI_LOWER) return AMS_TTDP_HELI_LAND_AIRPORT;
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   233
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   234
			/* This condition only occurs for helicopters, before starting descent,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   235
			 * to a landing by the hanger of an international airport. */
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   236
			if (amdflag & AMED_SLOWTURN) return AMS_TTDP_FLIGHT_TO_TOWER;
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   237
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   238
			/* The final two conditions apply to helicopters or aircraft.
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   239
			 * Has reached hanger? */
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   240
			if (amdflag & AMED_EXACTPOS) return AMS_TTDP_HANGAR;
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   241
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   242
			/* Still moving towards hanger. */
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   243
			return AMS_TTDP_TO_HANGAR;
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   244
6825
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   245
		case FIRST_TERMINAL: // TERM 1
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   246
			if (amdflag & AMED_EXACTPOS) return AMS_TTDP_TO_PAD1;
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   247
			return AMS_TTDP_TO_JUNCTION;
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   248
6825
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   249
		case FIRST_TERMINAL + 1: // TERM 2
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   250
			if (amdflag & AMED_EXACTPOS) return AMS_TTDP_TO_PAD2;
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   251
			return AMS_TTDP_TO_ENTRY_2_AND_3_AND_H;
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   252
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   253
		case TAKEOFF: // Moving to takeoff position.
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   254
			return AMS_TTDP_TO_OUTWAY;
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   255
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   256
		case STARTTAKEOFF: // Accelerating down runway.
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   257
			return AMS_TTDP_TAKEOFF;
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   258
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   259
		case ENDTAKEOFF: // Ascent
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   260
			return AMS_TTDP_CLIMBING;
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   261
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   262
		case HELITAKEOFF: // Helicopter is moving to take off position.
6857
5012c47e576b (svn r10960) [NewGRF_ports] -Change: Remove delta_z from the FSMport class. Will need to replace code at places marked with TODO.
richk
parents: 6854
diff changeset
   263
			//TODO: airport->delta_z no longer used. need to get actual height of individual tile in layout
5012c47e576b (svn r10960) [NewGRF_ports] -Change: Remove delta_z from the FSMport class. Will need to replace code at places marked with TODO.
richk
parents: 6854
diff changeset
   264
			//TODO: AMED_HELI_RAISE no longer used. decide based on height differences from v->zpos to target layout height
5012c47e576b (svn r10960) [NewGRF_ports] -Change: Remove delta_z from the FSMport class. Will need to replace code at places marked with TODO.
richk
parents: 6854
diff changeset
   265
			if (afc->MovingData(v->u.air.pos)->z == 0) {
6346
4aad704385e1 (svn r8743) -Fix
tron
parents: 6175
diff changeset
   266
				return amdflag & AMED_HELI_RAISE ?
4aad704385e1 (svn r8743) -Fix
tron
parents: 6175
diff changeset
   267
					AMS_TTDP_HELI_TAKEOFF_AIRPORT : AMS_TTDP_TO_JUNCTION;
4aad704385e1 (svn r8743) -Fix
tron
parents: 6175
diff changeset
   268
			} else {
4aad704385e1 (svn r8743) -Fix
tron
parents: 6175
diff changeset
   269
				return AMS_TTDP_HELI_TAKEOFF_HELIPORT;
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   270
			}
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   271
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   272
		case FLYING:
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   273
			return amdflag & AMED_HOLD ? AMS_TTDP_FLIGHT_APPROACH : AMS_TTDP_FLIGHT_TO_TOWER;
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   274
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   275
		case LANDING: // Descent
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   276
			return AMS_TTDP_FLIGHT_DESCENT;
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   277
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   278
		case ENDLANDING: // On the runway braking
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   279
			if (amdflag & AMED_BRAKE) return AMS_TTDP_BRAKING;
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   280
			/* Landed - moving off runway */
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   281
			return AMS_TTDP_TO_INWAY;
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   282
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   283
		case HELILANDING:
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   284
		case HELIENDLANDING: // Helicoptor is decending.
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   285
			if (amdflag & AMED_HELI_LOWER) {
6857
5012c47e576b (svn r10960) [NewGRF_ports] -Change: Remove delta_z from the FSMport class. Will need to replace code at places marked with TODO.
richk
parents: 6854
diff changeset
   286
				//TODO: airport->delta_z no longer used. need to get actual height of individual tile in layout
5012c47e576b (svn r10960) [NewGRF_ports] -Change: Remove delta_z from the FSMport class. Will need to replace code at places marked with TODO.
richk
parents: 6854
diff changeset
   287
				//return afc->delta_z == 0 ?
5012c47e576b (svn r10960) [NewGRF_ports] -Change: Remove delta_z from the FSMport class. Will need to replace code at places marked with TODO.
richk
parents: 6854
diff changeset
   288
				//	AMS_TTDP_HELI_LAND_AIRPORT : AMS_TTDP_HELI_LAND_HELIPORT;
5012c47e576b (svn r10960) [NewGRF_ports] -Change: Remove delta_z from the FSMport class. Will need to replace code at places marked with TODO.
richk
parents: 6854
diff changeset
   289
				return AMS_TTDP_HELI_LAND_AIRPORT;
6346
4aad704385e1 (svn r8743) -Fix
tron
parents: 6175
diff changeset
   290
			} else {
4aad704385e1 (svn r8743) -Fix
tron
parents: 6175
diff changeset
   291
				return AMS_TTDP_FLIGHT_TO_TOWER;
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   292
			}
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   293
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   294
		default:
6825
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   295
			if (FIRST_TERMINAL <= v->u.air.state && v->u.air.state <= LAST_TERMINAL) {
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   296
				/* TTDPatch only has 3 terminals, so treat these states the same */
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   297
				return (amdflag & AMED_EXACTPOS) ? AMS_TTDP_TO_PAD3 : AMS_TTDP_TO_ENTRY_2_AND_3_AND_H;
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   298
			}
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   299
			if (FIRST_HELIPAD <= v->u.air.state && v->u.air.state <= LAST_HELIPAD) {
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   300
				if (amdflag & AMED_HELI_LOWER) return AMS_TTDP_HELI_LAND_AIRPORT; // Descending.
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   301
				if (amdflag & AMED_SLOWTURN)   return AMS_TTDP_FLIGHT_TO_TOWER;   // Still hasn't started descent.
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   302
				return AMS_TTDP_TO_JUNCTION; // On the ground.
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   303
			}
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   304
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   305
			return AMS_TTDP_HANGAR;
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   306
	}
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   307
}
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   308
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   309
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   310
/* TTDP style aircraft movement action for GRF Action 2 Var 0xE6 */
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   311
enum {
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   312
	AMA_TTDP_IN_HANGAR,
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   313
	AMA_TTDP_ON_PAD1,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   314
	AMA_TTDP_ON_PAD2,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   315
	AMA_TTDP_ON_PAD3,
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   316
	AMA_TTDP_HANGAR_TO_PAD1,
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   317
	AMA_TTDP_HANGAR_TO_PAD2,
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   318
	AMA_TTDP_HANGAR_TO_PAD3,
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   319
	AMA_TTDP_LANDING_TO_PAD1,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   320
	AMA_TTDP_LANDING_TO_PAD2,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   321
	AMA_TTDP_LANDING_TO_PAD3,
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   322
	AMA_TTDP_PAD1_TO_HANGAR,
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   323
	AMA_TTDP_PAD2_TO_HANGAR,
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   324
	AMA_TTDP_PAD3_TO_HANGAR,
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   325
	AMA_TTDP_PAD1_TO_TAKEOFF,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   326
	AMA_TTDP_PAD2_TO_TAKEOFF,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   327
	AMA_TTDP_PAD3_TO_TAKEOFF,
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   328
	AMA_TTDP_HANGAR_TO_TAKOFF,
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   329
	AMA_TTDP_LANDING_TO_HANGAR,
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   330
	AMA_TTDP_IN_FLIGHT,
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   331
};
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   332
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   333
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   334
/**
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   335
 * Map OTTD aircraft movement states to TTDPatch style movement actions
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   336
 * (VarAction 2 Variable 0xE6)
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   337
 * This is not fully supported yet but it's enough for Planeset.
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   338
 */
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   339
static byte MapAircraftMovementAction(const Vehicle *v)
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   340
{
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   341
	switch (v->u.air.state) {
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   342
		case HANGAR:
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   343
			return (v->cur_speed > 0) ? AMA_TTDP_LANDING_TO_HANGAR : AMA_TTDP_IN_HANGAR;
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   344
6825
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   345
		case FIRST_TERMINAL:
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   346
		case FIRST_HELIPAD:
10184
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   347
			return (v->current_order.IsType(OT_LOADING)) ? AMA_TTDP_ON_PAD1 : AMA_TTDP_LANDING_TO_PAD1;
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   348
6825
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   349
		case FIRST_TERMINAL + 1:
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   350
		case FIRST_HELIPAD + 1:
10184
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   351
			return (v->current_order.IsType(OT_LOADING)) ? AMA_TTDP_ON_PAD2 : AMA_TTDP_LANDING_TO_PAD2;
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   352
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   353
		case TAKEOFF:      // Moving to takeoff position
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   354
		case STARTTAKEOFF: // Accelerating down runway
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   355
		case ENDTAKEOFF:   // Ascent
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   356
		case HELITAKEOFF:
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   357
			/* @todo Need to find which terminal (or hanger) we've come from. How? */
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   358
			return AMA_TTDP_PAD1_TO_TAKEOFF;
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   359
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   360
		case FLYING:
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   361
			return AMA_TTDP_IN_FLIGHT;
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   362
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   363
		case LANDING:    // Descent
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   364
		case ENDLANDING: // On the runway braking
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   365
		case HELILANDING:
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   366
		case HELIENDLANDING:
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   367
			/* @todo Need to check terminal we're landing to. Is it known yet? */
10184
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   368
			return (v->current_order.IsType(OT_GOTO_DEPOT)) ?
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   369
				AMA_TTDP_LANDING_TO_HANGAR : AMA_TTDP_LANDING_TO_PAD1;
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   370
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   371
		default:
6825
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   372
			if (FIRST_TERMINAL <= v->u.air.state && v->u.air.state <= LAST_HELIPAD) {
10184
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   373
				return (v->current_order.IsType(OT_LOADING)) ? AMA_TTDP_ON_PAD3 : AMA_TTDP_LANDING_TO_PAD3;
6825
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   374
			}
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   375
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   376
			return AMA_TTDP_IN_HANGAR;
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   377
	}
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   378
}
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   379
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   380
3703
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   381
/* TTDP airport types. Used to map our types to TTDPatch's */
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   382
enum {
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   383
	ATP_TTDP_SMALL,
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   384
	ATP_TTDP_LARGE,
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   385
	ATP_TTDP_HELIPORT,
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   386
	ATP_TTDP_OILRIG,
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   387
};
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   388
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   389
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   390
/* Vehicle Resolver Functions */
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   391
static inline const Vehicle *GRV(const ResolverObject *object)
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   392
{
10184
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   393
	switch (object->scope) {
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   394
		default: NOT_REACHED();
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   395
		case VSG_SCOPE_SELF: return object->u.vehicle.self;
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   396
		case VSG_SCOPE_PARENT: return object->u.vehicle.parent;
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   397
		case VSG_SCOPE_RELATIVE: {
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   398
			const Vehicle *v = NULL;
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   399
			switch (GB(object->count, 6, 2)) {
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   400
				default: NOT_REACHED();
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   401
				case 0x00: // count back (away from the engine), starting at this vehicle
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   402
				case 0x01: // count forward (toward the engine), starting at this vehicle
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   403
					v = object->u.vehicle.self;
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   404
					break;
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   405
				case 0x02: // count back, starting at the engine
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   406
					v = object->u.vehicle.parent;
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   407
					break;
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   408
				case 0x03: { // count back, starting at the first vehicle in this chain of vehicles with the same ID, as for vehicle variable 41
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   409
					const Vehicle *self = object->u.vehicle.self;
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   410
					for (const Vehicle *u = self->First(); u != self; u = u->Next()) {
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   411
						if (u->engine_type != self->engine_type) {
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   412
							v = NULL;
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   413
						} else {
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   414
							if (v == NULL) v = u;
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   415
						}
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   416
					}
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   417
					if (v == NULL) v = self;
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   418
				} break;
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   419
			}
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   420
			uint32 count = GB(object->count, 0, 4);
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   421
			if (count == 0) count = GetRegister(0x100);
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   422
			while (v != NULL && count-- != 0) v = (GB(object->count, 6, 2) == 0x01) ? v->Previous() : v->Next();
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   423
			return v;
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   424
		}
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   425
	}
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   426
}
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   427
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   428
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   429
static uint32 VehicleGetRandomBits(const ResolverObject *object)
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   430
{
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   431
	return GRV(object) == NULL ? 0 : GRV(object)->random_bits;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   432
}
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   433
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   434
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   435
static uint32 VehicleGetTriggers(const ResolverObject *object)
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   436
{
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   437
	return GRV(object) == NULL ? 0 : GRV(object)->waiting_triggers;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   438
}
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   439
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   440
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   441
static void VehicleSetTriggers(const ResolverObject *object, int triggers)
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   442
{
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   443
	/* Evil cast to get around const-ness. This used to be achieved by an
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   444
	 * innocent looking function pointer cast... Currently I cannot see a
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   445
	 * way of avoiding this without removing consts deep within gui code.
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   446
	 */
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   447
	Vehicle *v = (Vehicle*)GRV(object);
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   448
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   449
	/* This function must only be called when processing triggers -- any
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   450
	 * other time is an error. */
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   451
	assert(object->trigger != 0);
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   452
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   453
	if (v != NULL) v->waiting_triggers = triggers;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   454
}
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   455
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   456
4057
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
   457
static uint32 GetGRFParameter(EngineID engine_type, byte parameter)
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
   458
{
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
   459
	const GRFFile *file = GetEngineGRF(engine_type);
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
   460
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
   461
	if (parameter >= file->param_end) return 0;
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
   462
	return file->param[parameter];
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
   463
}
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
   464
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
   465
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   466
static uint8 LiveryHelper(EngineID engine, const Vehicle *v)
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   467
{
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   468
	const Livery *l;
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   469
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   470
	if (v == NULL) {
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   471
		l = GetEngineLivery(engine, _current_player, INVALID_ENGINE, NULL);
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   472
	} else if (v->type == VEH_TRAIN) {
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   473
		l = GetEngineLivery((v->u.rail.first_engine != INVALID_ENGINE && (IsArticulatedPart(v) || UsesWagonOverride(v))) ? v->u.rail.first_engine : v->engine_type, v->owner, v->u.rail.first_engine, v);
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   474
	} else {
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   475
		l = GetEngineLivery(v->engine_type, v->owner, INVALID_ENGINE, v);
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   476
	}
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   477
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   478
	return l->colour1 + l->colour2 * 16;
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   479
}
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   480
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   481
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3870
diff changeset
   482
static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   483
{
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   484
	const Vehicle *v = GRV(object);
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   485
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   486
	if (v == NULL) {
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   487
		/* Vehicle does not exist, so we're in a purchase list */
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   488
		switch (variable) {
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   489
			case 0x43: return _current_player | (LiveryHelper(object->u.vehicle.self_type, NULL) << 24); // Owner information
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   490
			case 0x46: return 0;               // Motion counter
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   491
			case 0x48: return GetEngine(object->u.vehicle.self_type)->flags; // Vehicle Type Info
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   492
			case 0xC4: return Clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR; // Build year
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   493
			case 0xDA: return INVALID_VEHICLE; // Next vehicle
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   494
			case 0x7F: return GetGRFParameter(object->u.vehicle.self_type, parameter); // Read GRF parameter
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   495
		}
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3870
diff changeset
   496
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3870
diff changeset
   497
		*available = false;
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   498
		return UINT_MAX;
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   499
	}
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   500
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   501
	/* Calculated vehicle parameters */
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   502
	switch (variable) {
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   503
		case 0x40: // Get length of consist
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   504
		case 0x41: // Get length of same consecutive wagons
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   505
			{
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   506
				const Vehicle* u;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   507
				byte chain_before = 0;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   508
				byte chain_after  = 0;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   509
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   510
				for (u = v->First(); u != v; u = u->Next()) {
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   511
					chain_before++;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   512
					if (variable == 0x41 && u->engine_type != v->engine_type) chain_before = 0;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   513
				}
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   514
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   515
				while (u->Next() != NULL && (variable == 0x40 || u->Next()->engine_type == v->engine_type)) {
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   516
					chain_after++;
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   517
					u = u->Next();
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   518
				}
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   519
5174
cc6593dedd42 (svn r7284) -Fix (r2361): off by one when calculating vehicle newgrf variable 41 result, partly blamed by vague documentation... (thanks lakie)
peter1138
parents: 5172
diff changeset
   520
				return chain_before | chain_after << 8 | (chain_before + chain_after + (variable == 0x41)) << 16;
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   521
			}
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   522
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   523
		case 0x42: { // Consist cargo information
3843
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   524
			const Vehicle *u;
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   525
			byte cargo_classes = 0;
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   526
			uint8 common_cargo_best = 0;
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   527
			uint8 common_cargos[NUM_CARGO];
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   528
			uint8 common_subtype_best = 0;
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   529
			uint8 common_subtypes[256];
3862
898c8212afa1 (svn r4896) - NewGRF: add support for vehicle property 0x25 (user defined data) used by variable 0x42.
peter1138
parents: 3848
diff changeset
   530
			byte user_def_data = 0;
6439
99a5807852b1 (svn r8849) -Codechange: Replace hardcoded global/climate cargo mapping tables with dynamically generated data. Change associated code to use new functions.
peter1138
parents: 6417
diff changeset
   531
			CargoID common_cargo_type = CT_PASSENGERS;
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   532
			uint8 common_subtype = 0;
3843
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   533
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   534
			/* Reset our arrays */
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   535
			memset(common_cargos, 0, sizeof(common_cargos));
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   536
			memset(common_subtypes, 0, sizeof(common_subtypes));
3843
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   537
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   538
			for (u = v; u != NULL; u = u->Next()) {
6878
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   539
				if (v->type == VEH_TRAIN) user_def_data |= u->u.rail.user_def_data;
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   540
3843
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   541
				/* Skip empty engines */
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   542
				if (u->cargo_cap == 0) continue;
6439
99a5807852b1 (svn r8849) -Codechange: Replace hardcoded global/climate cargo mapping tables with dynamically generated data. Change associated code to use new functions.
peter1138
parents: 6417
diff changeset
   543
99a5807852b1 (svn r8849) -Codechange: Replace hardcoded global/climate cargo mapping tables with dynamically generated data. Change associated code to use new functions.
peter1138
parents: 6417
diff changeset
   544
				cargo_classes |= GetCargo(u->cargo_type)->classes;
99a5807852b1 (svn r8849) -Codechange: Replace hardcoded global/climate cargo mapping tables with dynamically generated data. Change associated code to use new functions.
peter1138
parents: 6417
diff changeset
   545
				common_cargos[u->cargo_type]++;
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   546
				common_subtypes[u->cargo_subtype]++;
3843
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   547
			}
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   548
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   549
			/* Pick the most common cargo type */
6439
99a5807852b1 (svn r8849) -Codechange: Replace hardcoded global/climate cargo mapping tables with dynamically generated data. Change associated code to use new functions.
peter1138
parents: 6417
diff changeset
   550
			for (CargoID cargo = 0; cargo < NUM_CARGO; cargo++) {
3843
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   551
				if (common_cargos[cargo] > common_cargo_best) {
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   552
					common_cargo_best = common_cargos[cargo];
6439
99a5807852b1 (svn r8849) -Codechange: Replace hardcoded global/climate cargo mapping tables with dynamically generated data. Change associated code to use new functions.
peter1138
parents: 6417
diff changeset
   553
					common_cargo_type = GetCargo(cargo)->bitnum;
3843
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   554
				}
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   555
			}
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   556
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   557
			for (uint i = 0; i < lengthof(common_subtypes); i++) {
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   558
				if (common_subtypes[i] > common_subtype_best) {
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   559
					common_subtype_best = common_subtypes[i];
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   560
					common_subtype = i;
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   561
				}
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   562
			}
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   563
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   564
			return cargo_classes | (common_cargo_type << 8) | (common_subtype << 16) | (user_def_data << 24);
3843
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   565
		}
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   566
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   567
		case 0x43: // Player information
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   568
			return v->owner | (GetPlayer(v->owner)->is_ai ? 0x10000 : 0) | (LiveryHelper(v->engine_type, v) << 24);
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   569
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   570
		case 0x44: // Aircraft information
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6574
diff changeset
   571
			if (v->type != VEH_AIRCRAFT) return UINT_MAX;
3703
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   572
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   573
			{
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   574
				const Vehicle *w = v->Next();
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   575
				uint16 altitude = v->z_pos - w->z_pos; // Aircraft height - shadow height
3703
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   576
				byte airporttype;
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   577
6823
afccaf7e9674 (svn r10906) [NewGRF_ports] -Codechange: remove oilrig FTA/FSM stuff from the code as that is already exported to a newgrf.
rubidium
parents: 6743
diff changeset
   578
				const FSMportsSpec *fps = GetStation(v->u.air.targetairport)->fsmportsspeclist[1].spec;
afccaf7e9674 (svn r10906) [NewGRF_ports] -Codechange: remove oilrig FTA/FSM stuff from the code as that is already exported to a newgrf.
rubidium
parents: 6743
diff changeset
   579
afccaf7e9674 (svn r10906) [NewGRF_ports] -Codechange: remove oilrig FTA/FSM stuff from the code as that is already exported to a newgrf.
rubidium
parents: 6743
diff changeset
   580
				if (fps->flags & (AirportFTAClass::AIRPLANES | AirportFTAClass::SEAPLANES)) {
afccaf7e9674 (svn r10906) [NewGRF_ports] -Codechange: remove oilrig FTA/FSM stuff from the code as that is already exported to a newgrf.
rubidium
parents: 6743
diff changeset
   581
					airporttype = (fps->flags & AirportFTAClass::SHORT_STRIP) ? ATP_TTDP_SMALL : ATP_TTDP_LARGE;
6854
92ca286e9466 (svn r10957) [NewGRF_ports] -Codechange: reduce the dependency on AT_XXX enums and airport_type.
rubidium
parents: 6837
diff changeset
   582
				} else if (fps->portFSM == AirportFTAClass::oil_rig) {
6823
afccaf7e9674 (svn r10906) [NewGRF_ports] -Codechange: remove oilrig FTA/FSM stuff from the code as that is already exported to a newgrf.
rubidium
parents: 6743
diff changeset
   583
					airporttype = ATP_TTDP_OILRIG;
afccaf7e9674 (svn r10906) [NewGRF_ports] -Codechange: remove oilrig FTA/FSM stuff from the code as that is already exported to a newgrf.
rubidium
parents: 6743
diff changeset
   584
				} else {
afccaf7e9674 (svn r10906) [NewGRF_ports] -Codechange: remove oilrig FTA/FSM stuff from the code as that is already exported to a newgrf.
rubidium
parents: 6743
diff changeset
   585
					airporttype = ATP_TTDP_HELIPORT;
3703
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   586
				}
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   587
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   588
				return (altitude << 8) | airporttype;
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   589
			}
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   590
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   591
		case 0x45: { // Curvature info
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   592
			/* Format: xxxTxBxF
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   593
			 * F - previous wagon to current wagon, 0 if vehicle is first
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   594
			 * B - current wagon to next wagon, 0 if wagon is last
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   595
			 * T - previous wagon to next wagon, 0 in an S-bend
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   596
			 */
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   597
			if (v->type != VEH_TRAIN) return 0;
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   598
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   599
			const Vehicle *u_p = v->Previous();
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   600
			const Vehicle *u_n = v->Next();
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   601
			DirDiff f = (u_p == NULL) ?  DIRDIFF_SAME : DirDifference(u_p->direction, v->direction);
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   602
			DirDiff b = (u_n == NULL) ?  DIRDIFF_SAME : DirDifference(v->direction, u_n->direction);
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   603
			DirDiff t = ChangeDirDiff(f, b);
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   604
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   605
			return ((t > DIRDIFF_REVERSE ? t | 8 : t) << 16) |
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   606
			       ((b > DIRDIFF_REVERSE ? b | 8 : b) <<  8) |
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   607
			       ( f > DIRDIFF_REVERSE ? f | 8 : f);
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   608
		}
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   609
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   610
		case 0x46: // Motion counter
4656
acffecd6f484 (svn r6532) - Feature: Add support for NewGRF sound effects. Currently sound priority isn't supported.
peter1138
parents: 4331
diff changeset
   611
			return v->motion_counter;
3723
e999035b1172 (svn r4696) - NewGRF: add support for vehicle variable 0x60, count vehicle type occurance.
peter1138
parents: 3720
diff changeset
   612
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   613
		case 0x47: { // Vehicle cargo info
3848
8cc088ddcfce (svn r4872) - NewGRF: add support for vehicle variable 0x47 (mart3p)
peter1138
parents: 3845
diff changeset
   614
			/* Format: ccccwwtt
8cc088ddcfce (svn r4872) - NewGRF: add support for vehicle variable 0x47 (mart3p)
peter1138
parents: 3845
diff changeset
   615
			 * tt - the cargo type transported by the vehicle,
8cc088ddcfce (svn r4872) - NewGRF: add support for vehicle variable 0x47 (mart3p)
peter1138
parents: 3845
diff changeset
   616
			 *     translated if a translation table has been installed.
8cc088ddcfce (svn r4872) - NewGRF: add support for vehicle variable 0x47 (mart3p)
peter1138
parents: 3845
diff changeset
   617
			 * ww - cargo unit weight in 1/16 tons, same as cargo prop. 0F.
8cc088ddcfce (svn r4872) - NewGRF: add support for vehicle variable 0x47 (mart3p)
peter1138
parents: 3845
diff changeset
   618
			 * cccc - the cargo class value of the cargo transported by the vehicle.
8cc088ddcfce (svn r4872) - NewGRF: add support for vehicle variable 0x47 (mart3p)
peter1138
parents: 3845
diff changeset
   619
			 */
6417
26acff62d001 (svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
peter1138
parents: 6358
diff changeset
   620
			const CargoSpec *cs = GetCargo(v->cargo_type);
3848
8cc088ddcfce (svn r4872) - NewGRF: add support for vehicle variable 0x47 (mart3p)
peter1138
parents: 3845
diff changeset
   621
6473
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6452
diff changeset
   622
			return (cs->classes << 16) | (cs->weight << 8) | GetEngineGRF(v->engine_type)->cargo_map[v->cargo_type];
3848
8cc088ddcfce (svn r4872) - NewGRF: add support for vehicle variable 0x47 (mart3p)
peter1138
parents: 3845
diff changeset
   623
		}
8cc088ddcfce (svn r4872) - NewGRF: add support for vehicle variable 0x47 (mart3p)
peter1138
parents: 3845
diff changeset
   624
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   625
		case 0x48: return GetEngine(v->engine_type)->flags; // Vehicle Type Info
4058
019da48e79d3 (svn r5338) - NewGRF: add support for vehicle variable 48, vehicle type info (more mart3p)
peter1138
parents: 4057
diff changeset
   626
3723
e999035b1172 (svn r4696) - NewGRF: add support for vehicle variable 0x60, count vehicle type occurance.
peter1138
parents: 3720
diff changeset
   627
		/* Variables which use the parameter */
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   628
		case 0x60: // Count consist's engine ID occurance
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6574
diff changeset
   629
			if (v->type != VEH_TRAIN) return v->engine_type == parameter;
3723
e999035b1172 (svn r4696) - NewGRF: add support for vehicle variable 0x60, count vehicle type occurance.
peter1138
parents: 3720
diff changeset
   630
e999035b1172 (svn r4696) - NewGRF: add support for vehicle variable 0x60, count vehicle type occurance.
peter1138
parents: 3720
diff changeset
   631
			{
e999035b1172 (svn r4696) - NewGRF: add support for vehicle variable 0x60, count vehicle type occurance.
peter1138
parents: 3720
diff changeset
   632
				uint count = 0;
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   633
				for (; v != NULL; v = v->Next()) {
3723
e999035b1172 (svn r4696) - NewGRF: add support for vehicle variable 0x60, count vehicle type occurance.
peter1138
parents: 3720
diff changeset
   634
					if (v->engine_type == parameter) count++;
e999035b1172 (svn r4696) - NewGRF: add support for vehicle variable 0x60, count vehicle type occurance.
peter1138
parents: 3720
diff changeset
   635
				}
e999035b1172 (svn r4696) - NewGRF: add support for vehicle variable 0x60, count vehicle type occurance.
peter1138
parents: 3720
diff changeset
   636
				return count;
e999035b1172 (svn r4696) - NewGRF: add support for vehicle variable 0x60, count vehicle type occurance.
peter1138
parents: 3720
diff changeset
   637
			}
3925
0b0c1fc5535e (svn r5060) - NewGRF: add support for variable 7F (retrieve GRF parameter) for vehicles
peter1138
parents: 3924
diff changeset
   638
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   639
		case 0x7F: return GetGRFParameter(v->engine_type, parameter); // Read GRF parameter
6502
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   640
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   641
		case 0xFE:
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   642
		case 0xFF: {
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   643
			uint16 modflags = 0;
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   644
6878
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   645
			if (v->type == VEH_TRAIN) {
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   646
				const Vehicle *u = IsTrainWagon(v) && HasBit(v->vehicle_flags, VRF_POWEREDWAGON) ? v->First() : v;
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   647
				RailType railtype = GetRailType(v->tile);
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   648
				bool powered = IsTrainEngine(v) || (IsTrainWagon(v) && HasBit(v->vehicle_flags, VRF_POWEREDWAGON));
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   649
				bool has_power = powered && HasPowerOnRail(u->u.rail.railtype, railtype);
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   650
				bool is_electric = powered && u->u.rail.railtype == RAILTYPE_ELECTRIC;
6502
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   651
6878
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   652
				if (has_power) SetBit(modflags, 5);
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   653
				if (is_electric && !has_power) SetBit(modflags, 6);
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   654
				if (HasBit(v->u.rail.flags, VRF_TOGGLE_REVERSE)) SetBit(modflags, 8);
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   655
			}
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   656
			if (HasBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE)) SetBit(modflags, 10);
6502
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   657
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   658
			return variable == 0xFE ? modflags : GB(modflags, 8, 8);
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   659
		}
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   660
	}
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   661
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   662
	/* General vehicle properties */
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   663
	switch (variable - 0x80) {
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   664
		case 0x00: return v->type;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   665
		case 0x01: return MapOldSubType(v);
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   666
		case 0x04: return v->index;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   667
		case 0x05: return GB(v->index, 8, 8);
10184
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   668
		case 0x0A: return v->current_order.Pack();
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   669
		case 0x0B: return GB(v->current_order.Pack(), 8, 8);
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   670
		case 0x0C: return v->num_orders;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   671
		case 0x0D: return v->cur_order_index;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   672
		case 0x10: return v->load_unload_time_rem;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   673
		case 0x11: return GB(v->load_unload_time_rem, 8, 8);
4331
11de01553605 (svn r6013) -Fix: some newgrf properties returned the date in the new format where the newgrf's expect the original format. Thanks to michi_cc for finding these and providing the initial patch.
rubidium
parents: 4322
diff changeset
   674
		case 0x12: return max(v->date_of_last_service - DAYS_TILL_ORIGINAL_BASE_YEAR, 0);
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   675
		case 0x13: return GB(max(v->date_of_last_service - DAYS_TILL_ORIGINAL_BASE_YEAR, 0), 8, 8);
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   676
		case 0x14: return v->service_interval;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   677
		case 0x15: return GB(v->service_interval, 8, 8);
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   678
		case 0x16: return v->last_station_visited;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   679
		case 0x17: return v->tick_counter;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   680
		case 0x18: return v->max_speed;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   681
		case 0x19: return GB(v->max_speed, 8, 8);
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   682
		case 0x1A: return v->x_pos;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   683
		case 0x1B: return GB(v->x_pos, 8, 8);
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   684
		case 0x1C: return v->y_pos;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   685
		case 0x1D: return GB(v->y_pos, 8, 8);
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   686
		case 0x1E: return v->z_pos;
4056
30ceffc75059 (svn r5336) - NewGRF: draw custom helicopter rotor sprites in vehicle info window, ensuring the correct direction is used (inspiration from mart3p)
peter1138
parents: 4055
diff changeset
   687
		case 0x1F: return object->info_view ? DIR_W : v->direction;
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   688
		case 0x28: return v->cur_image;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   689
		case 0x29: return GB(v->cur_image, 8, 8);
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   690
		case 0x32: return v->vehstatus;
5175
509e0c13ed8a (svn r7285) -Fix (r7282): Our vehstatus is a byte, not a word.
peter1138
parents: 5174
diff changeset
   691
		case 0x33: return 0; // non-existent high byte of vehstatus
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   692
		case 0x34: return v->cur_speed;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   693
		case 0x35: return GB(v->cur_speed, 8, 8);
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   694
		case 0x36: return v->subspeed;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   695
		case 0x37: return v->acceleration;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   696
		case 0x39: return v->cargo_type;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   697
		case 0x3A: return v->cargo_cap;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   698
		case 0x3B: return GB(v->cargo_cap, 8, 8);
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   699
		case 0x3C: return v->cargo.Count();
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   700
		case 0x3D: return GB(v->cargo.Count(), 8, 8);
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   701
		case 0x3E: return v->cargo.Source();
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   702
		case 0x3F: return v->cargo.DaysInTransit();
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   703
		case 0x40: return v->age;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   704
		case 0x41: return GB(v->age, 8, 8);
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   705
		case 0x42: return v->max_age;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   706
		case 0x43: return GB(v->max_age, 8, 8);
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   707
		case 0x44: return Clamp(v->build_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR;
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   708
		case 0x45: return v->unitnumber;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   709
		case 0x46: return v->engine_type;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   710
		case 0x47: return GB(v->engine_type, 8, 8);
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   711
		case 0x48: return v->spritenum;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   712
		case 0x49: return v->day_counter;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   713
		case 0x4A: return v->breakdowns_since_last_service;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   714
		case 0x4B: return v->breakdown_ctr;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   715
		case 0x4C: return v->breakdown_delay;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   716
		case 0x4D: return v->breakdown_chance;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   717
		case 0x4E: return v->reliability;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   718
		case 0x4F: return GB(v->reliability, 8, 8);
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   719
		case 0x50: return v->reliability_spd_dec;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   720
		case 0x51: return GB(v->reliability_spd_dec, 8, 8);
6878
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   721
		case 0x52: return ClampToI32(v->GetDisplayProfitThisYear());
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   722
		case 0x53: return GB(ClampToI32(v->GetDisplayProfitThisYear()),  8, 24);
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   723
		case 0x54: return GB(ClampToI32(v->GetDisplayProfitThisYear()), 16, 16);
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   724
		case 0x55: return GB(ClampToI32(v->GetDisplayProfitThisYear()), 24,  8);
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   725
		case 0x56: return ClampToI32(v->GetDisplayProfitLastYear());
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   726
		case 0x57: return GB(ClampToI32(v->GetDisplayProfitLastYear()),  8, 24);
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   727
		case 0x58: return GB(ClampToI32(v->GetDisplayProfitLastYear()), 16, 16);
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   728
		case 0x59: return GB(ClampToI32(v->GetDisplayProfitLastYear()), 24,  8);
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   729
		case 0x5A: return v->Next() == NULL ? INVALID_VEHICLE : v->Next()->index;
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   730
		case 0x5C: return ClampToI32(v->value);
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   731
		case 0x5D: return GB(ClampToI32(v->value),  8, 24);
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   732
		case 0x5E: return GB(ClampToI32(v->value), 16, 16);
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   733
		case 0x5F: return GB(ClampToI32(v->value), 24,  8);
3870
766d7bd6c299 (svn r4910) - NewGRF: add and initialize cargo subtype for vehicle visual variations
peter1138
parents: 3866
diff changeset
   734
		case 0x72: return v->cargo_subtype;
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   735
		case 0x7A: return v->random_bits;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   736
		case 0x7B: return v->waiting_triggers;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   737
	}
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   738
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   739
	/* Vehicle specific properties */
3014
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   740
	switch (v->type) {
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6574
diff changeset
   741
		case VEH_TRAIN:
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   742
			switch (variable - 0x80) {
3014
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   743
				case 0x62: return v->u.rail.track;
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   744
				case 0x66: return v->u.rail.railtype;
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   745
				case 0x73: return v->u.rail.cached_veh_length;
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   746
				case 0x74: return v->u.rail.cached_power;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   747
				case 0x75: return GB(v->u.rail.cached_power,  8, 24);
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   748
				case 0x76: return GB(v->u.rail.cached_power, 16, 16);
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   749
				case 0x77: return GB(v->u.rail.cached_power, 24,  8);
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   750
				case 0x7C: return v->First()->index;
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   751
				case 0x7D: return GB(v->First()->index, 8, 8);
4050
b03689c406ff (svn r5320) - NewGRF: make sets using TTDPatch's train reversing hack/feature happier (and consistent) by returning 0 for the flag it uses.
peter1138
parents: 4023
diff changeset
   752
				case 0x7F: return 0; // Used for vehicle reversing hack in TTDP
3014
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   753
			}
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   754
			break;
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   755
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6574
diff changeset
   756
		case VEH_ROAD:
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   757
			switch (variable - 0x80) {
3014
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   758
				case 0x62: return v->u.road.state;
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   759
				case 0x64: return v->u.road.blocked_ctr;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   760
				case 0x65: return GB(v->u.road.blocked_ctr, 8, 8);
3014
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   761
				case 0x66: return v->u.road.overtaking;
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   762
				case 0x67: return v->u.road.overtaking_ctr;
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   763
				case 0x68: return v->u.road.crashed_ctr;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   764
				case 0x69: return GB(v->u.road.crashed_ctr, 8, 8);
3014
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   765
			}
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   766
			break;
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   767
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6574
diff changeset
   768
		case VEH_AIRCRAFT:
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   769
			switch (variable - 0x80) {
3702
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   770
				case 0x62: return MapAircraftMovementState(v);  // Current movement state
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   771
				case 0x63: return v->u.air.targetairport;       // Airport to which the action refers
b4ba84e5beef (svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
peter1138
parents: 3696
diff changeset
   772
				case 0x66: return MapAircraftMovementAction(v); // Current movement action
3014
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   773
			}
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   774
			break;
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   775
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   776
		default: break;
3014
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   777
	}
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   778
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5338
diff changeset
   779
	DEBUG(grf, 1, "Unhandled vehicle property 0x%X, type 0x%X", variable, v->type);
3014
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   780
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3870
diff changeset
   781
	*available = false;
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   782
	return UINT_MAX;
3014
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   783
}
fbbc1ea2a1c9 (svn r3594) - NewGRF: Add support for some vehicle specific properties and a give a debug message for unknown variables.
peter1138
parents: 2982
diff changeset
   784
426
bd6f3c2cad9f (svn r625) Almost complete support for deterministic variational vehicle spritegroups. (pasky)
tron
parents: 414
diff changeset
   785
3734
f929883c5ae0 (svn r4714) - NewGRF: simplify evaluation of 'real' sprite groups.
peter1138
parents: 3731
diff changeset
   786
static const SpriteGroup *VehicleResolveReal(const ResolverObject *object, const SpriteGroup *group)
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   787
{
3720
755978f398d9 (svn r4691) - Codechange: don't use unnamed unions as GCC 2.95.ancient won't compile it. Needed for our MorphOS user ;)
peter1138
parents: 3706
diff changeset
   788
	const Vehicle *v = object->u.vehicle.self;
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   789
	uint totalsets;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   790
	uint set;
426
bd6f3c2cad9f (svn r625) Almost complete support for deterministic variational vehicle spritegroups. (pasky)
tron
parents: 414
diff changeset
   791
6878
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   792
	if (v == NULL) {
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   793
		if (group->g.real.num_loading > 0) return group->g.real.loading[0];
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   794
		if (group->g.real.num_loaded  > 0) return group->g.real.loaded[0];
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   795
		return NULL;
7d1ff2f621c7 (svn r12351) [NewGRF_ports] -Sync: with trunk r12051:12350.
richk
parents: 6872
diff changeset
   796
	}
3734
f929883c5ae0 (svn r4714) - NewGRF: simplify evaluation of 'real' sprite groups.
peter1138
parents: 3731
diff changeset
   797
10184
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   798
	bool in_motion = !v->First()->current_order.IsType(OT_LOADING);
445
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
   799
3734
f929883c5ae0 (svn r4714) - NewGRF: simplify evaluation of 'real' sprite groups.
peter1138
parents: 3731
diff changeset
   800
	totalsets = in_motion ? group->g.real.num_loaded : group->g.real.num_loading;
445
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
   801
6872
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
   802
	if (v->cargo.Count() >= v->cargo_cap || totalsets == 1) {
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   803
		set = totalsets - 1;
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   804
	} else if (v->cargo.Empty() || totalsets == 2) {
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   805
		set = 0;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   806
	} else {
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   807
		set = v->cargo.Count() * (totalsets - 2) / max((uint16)1, v->cargo_cap) + 1;
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   808
	}
426
bd6f3c2cad9f (svn r625) Almost complete support for deterministic variational vehicle spritegroups. (pasky)
tron
parents: 414
diff changeset
   809
3734
f929883c5ae0 (svn r4714) - NewGRF: simplify evaluation of 'real' sprite groups.
peter1138
parents: 3731
diff changeset
   810
	return in_motion ? group->g.real.loaded[set] : group->g.real.loading[set];
426
bd6f3c2cad9f (svn r625) Almost complete support for deterministic variational vehicle spritegroups. (pasky)
tron
parents: 414
diff changeset
   811
}
bd6f3c2cad9f (svn r625) Almost complete support for deterministic variational vehicle spritegroups. (pasky)
tron
parents: 414
diff changeset
   812
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   813
4057
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
   814
static inline void NewVehicleResolver(ResolverObject *res, EngineID engine_type, const Vehicle *v)
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   815
{
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   816
	res->GetRandomBits = &VehicleGetRandomBits;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   817
	res->GetTriggers   = &VehicleGetTriggers;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   818
	res->SetTriggers   = &VehicleSetTriggers;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   819
	res->GetVariable   = &VehicleGetVariable;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   820
	res->ResolveReal   = &VehicleResolveReal;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   821
3720
755978f398d9 (svn r4691) - Codechange: don't use unnamed unions as GCC 2.95.ancient won't compile it. Needed for our MorphOS user ;)
peter1138
parents: 3706
diff changeset
   822
	res->u.vehicle.self   = v;
6870
ca3fd1fbe311 (svn r11219) [NewGRF_ports] -Sync: with trunk r11035:11218.
rubidium
parents: 6868
diff changeset
   823
	res->u.vehicle.parent = (v != NULL) ? v->First() : v;
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   824
4057
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
   825
	res->u.vehicle.self_type = engine_type;
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
   826
4056
30ceffc75059 (svn r5336) - NewGRF: draw custom helicopter rotor sprites in vehicle info window, ensuring the correct direction is used (inspiration from mart3p)
peter1138
parents: 4055
diff changeset
   827
	res->info_view = false;
30ceffc75059 (svn r5336) - NewGRF: draw custom helicopter rotor sprites in vehicle info window, ensuring the correct direction is used (inspiration from mart3p)
peter1138
parents: 4055
diff changeset
   828
6743
cabfaa4a0295 (svn r10766) [NewGRF_ports] -Sync: with trunk r10651-10765
richk
parents: 6738
diff changeset
   829
	res->callback        = CBID_NO_CALLBACK;
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   830
	res->callback_param1 = 0;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   831
	res->callback_param2 = 0;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   832
	res->last_value      = 0;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   833
	res->trigger         = 0;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   834
	res->reseed          = 0;
10184
fcf5fb2548eb (svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
richk
parents: 6878
diff changeset
   835
	res->count           = 0;
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   836
}
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   837
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   838
4901
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   839
/** Retrieve the SpriteGroup for the specified vehicle.
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   840
 * If the vehicle is not specified, the purchase list group for the engine is
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   841
 * chosen. For trains, an additional engine override lookup is performed.
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   842
 * @param engine    Engine type of the vehicle.
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   843
 * @param v         The vehicle itself.
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   844
 * @param use_cache Use cached override
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   845
 * @returns         The selected SpriteGroup for the vehicle.
4901
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   846
 */
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   847
static const SpriteGroup *GetVehicleSpriteGroup(EngineID engine, const Vehicle *v, bool use_cache = true)
4901
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   848
{
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   849
	const SpriteGroup *group;
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   850
	CargoID cargo;
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   851
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   852
	if (v == NULL) {
6474
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6473
diff changeset
   853
		cargo = CT_PURCHASE;
4901
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   854
	} else {
6474
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6473
diff changeset
   855
		cargo = v->cargo_type;
4901
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   856
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6574
diff changeset
   857
		if (v->type == VEH_TRAIN) {
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   858
			/* We always use cached value, except for callbacks because the override spriteset
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   859
			 * to use may be different than the one cached. It happens for callback 0x15 (refit engine),
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   860
			 * as v->cargo_type is temporary changed to the new type */
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   861
			group = use_cache ? v->u.rail.cached_override : GetWagonOverrideSpriteSet(v->engine_type, v->cargo_type, v->u.rail.first_engine);
4901
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   862
			if (group != NULL) return group;
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   863
		}
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   864
	}
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   865
6452
fc8ca2b46277 (svn r8863) -Fix: prefix engine_custom_sprites with _
peter1138
parents: 6448
diff changeset
   866
	group = _engine_custom_sprites[engine][cargo];
4901
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   867
	if (group != NULL) return group;
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   868
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   869
	/* Fall back to the default set if the selected cargo type is not defined */
6474
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6473
diff changeset
   870
	return _engine_custom_sprites[engine][CT_DEFAULT];
4901
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   871
}
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   872
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   873
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   874
SpriteID GetCustomEngineSprite(EngineID engine, const Vehicle *v, Direction direction)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   875
{
2242
27fa4807cd61 (svn r2762) Simplify a loop, remove an unused variable and add many consts
tron
parents: 2204
diff changeset
   876
	const SpriteGroup *group;
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   877
	ResolverObject object;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   878
4057
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
   879
	NewVehicleResolver(&object, engine, v);
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   880
4901
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   881
	group = Resolve(GetVehicleSpriteGroup(engine, v), &object);
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   882
	if (group == NULL || group->type != SGT_RESULT) return 0;
3668
d7ed0a867b49 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3648
diff changeset
   883
d7ed0a867b49 (svn r4583) - NewGRF: Revamp sprite group loading to support advanced varadjusts and variable size. These are not yet processed, however.
peter1138
parents: 3648
diff changeset
   884
	return group->g.result.sprite + (direction % group->g.result.num_sprites);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   885
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   886
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   887
4056
30ceffc75059 (svn r5336) - NewGRF: draw custom helicopter rotor sprites in vehicle info window, ensuring the correct direction is used (inspiration from mart3p)
peter1138
parents: 4055
diff changeset
   888
SpriteID GetRotorOverrideSprite(EngineID engine, const Vehicle *v, bool info_view)
3695
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   889
{
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   890
	const SpriteGroup *group;
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   891
	ResolverObject object;
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   892
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   893
	assert(engine >= AIRCRAFT_ENGINES_INDEX);
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   894
	assert(engine < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES);
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   895
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   896
	/* Only valid for helicopters */
4023
b65af90447d2 (svn r5262) Add symbolic names for the aircraft subtypes. not perfect, but better than raw numbers
tron
parents: 3925
diff changeset
   897
	assert(!(AircraftVehInfo(engine)->subtype & AIR_CTOL));
3695
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   898
4057
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
   899
	NewVehicleResolver(&object, engine, v);
3695
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   900
4056
30ceffc75059 (svn r5336) - NewGRF: draw custom helicopter rotor sprites in vehicle info window, ensuring the correct direction is used (inspiration from mart3p)
peter1138
parents: 4055
diff changeset
   901
	object.info_view = info_view;
30ceffc75059 (svn r5336) - NewGRF: draw custom helicopter rotor sprites in vehicle info window, ensuring the correct direction is used (inspiration from mart3p)
peter1138
parents: 4055
diff changeset
   902
6872
1c4a4a609f85 (svn r11950) [NewGRF_ports] -Sync with trunk r11566:11949.
rubidium
parents: 6871
diff changeset
   903
	group = GetWagonOverrideSpriteSet(engine, CT_DEFAULT, engine);
3695
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   904
	group = Resolve(group, &object);
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   905
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   906
	if (group == NULL || group->type != SGT_RESULT) return 0;
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   907
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   908
	if (v == NULL) return group->g.result.sprite;
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   909
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   910
	return group->g.result.sprite + (info_view ? 0 : (v->Next()->Next()->u.air.state % group->g.result.num_sprites));
3695
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   911
}
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   912
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   913
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   914
/**
1908
bc48a30aba72 (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1904
diff changeset
   915
 * Check if a wagon is currently using a wagon override
bc48a30aba72 (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1904
diff changeset
   916
 * @param v The wagon to check
bc48a30aba72 (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1904
diff changeset
   917
 * @return true if it is using an override, false otherwise
bc48a30aba72 (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1904
diff changeset
   918
 */
2548
97ada3bd2702 (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2530
diff changeset
   919
bool UsesWagonOverride(const Vehicle* v)
97ada3bd2702 (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2530
diff changeset
   920
{
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6574
diff changeset
   921
	assert(v->type == VEH_TRAIN);
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   922
	return v->u.rail.cached_override != NULL;
1908
bc48a30aba72 (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1904
diff changeset
   923
}
bc48a30aba72 (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1904
diff changeset
   924
bc48a30aba72 (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1904
diff changeset
   925
/**
3390
f910bc27153e (svn r4198) - NewGRF: Rename GetCallBackResult() to GetVehicleCallback(), as other types will exist later, and use separate parameters instead of bitshifting.
peter1138
parents: 3348
diff changeset
   926
 * Evaluate a newgrf callback for vehicles
f910bc27153e (svn r4198) - NewGRF: Rename GetCallBackResult() to GetVehicleCallback(), as other types will exist later, and use separate parameters instead of bitshifting.
peter1138
parents: 3348
diff changeset
   927
 * @param callback The callback to evalute
f910bc27153e (svn r4198) - NewGRF: Rename GetCallBackResult() to GetVehicleCallback(), as other types will exist later, and use separate parameters instead of bitshifting.
peter1138
parents: 3348
diff changeset
   928
 * @param param1   First parameter of the callback
f910bc27153e (svn r4198) - NewGRF: Rename GetCallBackResult() to GetVehicleCallback(), as other types will exist later, and use separate parameters instead of bitshifting.
peter1138
parents: 3348
diff changeset
   929
 * @param param2   Second parameter of the callback
f910bc27153e (svn r4198) - NewGRF: Rename GetCallBackResult() to GetVehicleCallback(), as other types will exist later, and use separate parameters instead of bitshifting.
peter1138
parents: 3348
diff changeset
   930
 * @param engine   Engine type of the vehicle to evaluate the callback for
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   931
 * @param v        The vehicle to evaluate the callback for, or NULL if it doesnt exist yet
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   932
 * @return The value the callback returned, or CALLBACK_FAILED if it failed
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   933
 */
6743
cabfaa4a0295 (svn r10766) [NewGRF_ports] -Sync: with trunk r10651-10765
richk
parents: 6738
diff changeset
   934
uint16 GetVehicleCallback(CallbackID callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v)
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   935
{
2242
27fa4807cd61 (svn r2762) Simplify a loop, remove an unused variable and add many consts
tron
parents: 2204
diff changeset
   936
	const SpriteGroup *group;
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   937
	ResolverObject object;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   938
4057
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
   939
	NewVehicleResolver(&object, engine, v);
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   940
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   941
	object.callback        = callback;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   942
	object.callback_param1 = param1;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
   943
	object.callback_param2 = param2;
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   944
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   945
	group = Resolve(GetVehicleSpriteGroup(engine, v, false), &object);
4811
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
   946
	if (group == NULL || group->type != SGT_CALLBACK) return CALLBACK_FAILED;
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   947
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   948
	return group->g.callback.result;
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   949
}
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   950
3726
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   951
/**
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   952
 * Evaluate a newgrf callback for vehicles with a different vehicle for parent scope.
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   953
 * @param callback The callback to evalute
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   954
 * @param param1   First parameter of the callback
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   955
 * @param param2   Second parameter of the callback
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   956
 * @param engine   Engine type of the vehicle to evaluate the callback for
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   957
 * @param v        The vehicle to evaluate the callback for, or NULL if it doesnt exist yet
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   958
 * @param parent   The vehicle to use for parent scope
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   959
 * @return The value the callback returned, or CALLBACK_FAILED if it failed
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   960
 */
6743
cabfaa4a0295 (svn r10766) [NewGRF_ports] -Sync: with trunk r10651-10765
richk
parents: 6738
diff changeset
   961
uint16 GetVehicleCallbackParent(CallbackID callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v, const Vehicle *parent)
3726
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   962
{
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   963
	const SpriteGroup *group;
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   964
	ResolverObject object;
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   965
4057
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
   966
	NewVehicleResolver(&object, engine, v);
3726
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   967
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   968
	object.callback        = callback;
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   969
	object.callback_param1 = param1;
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   970
	object.callback_param2 = param2;
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   971
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   972
	object.u.vehicle.parent = parent;
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   973
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   974
	group = Resolve(GetVehicleSpriteGroup(engine, v, false), &object);
4811
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
   975
	if (group == NULL || group->type != SGT_CALLBACK) return CALLBACK_FAILED;
3726
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   976
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   977
	return group->g.callback.result;
a446208c7296 (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
peter1138
parents: 3724
diff changeset
   978
}
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   979
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   980
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   981
/* Callback 36 handlers */
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   982
uint GetVehicleProperty(const Vehicle *v, uint8 property, uint orig_value)
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   983
{
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   984
	uint16 callback = GetVehicleCallback(CBID_VEHICLE_MODIFY_PROPERTY, property, 0, v->engine_type, v);
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   985
	if (callback != CALLBACK_FAILED) return callback;
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   986
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   987
	return orig_value;
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   988
}
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   989
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   990
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   991
uint GetEngineProperty(EngineID engine, uint8 property, uint orig_value)
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   992
{
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   993
	uint16 callback = GetVehicleCallback(CBID_VEHICLE_MODIFY_PROPERTY, property, 0, engine, NULL);
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   994
	if (callback != CALLBACK_FAILED) return callback;
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   995
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   996
	return orig_value;
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   997
}
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   998
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   999
3680
4901a7af8ffc (svn r4600) - NewGRF: minor code style tidy up
peter1138
parents: 3668
diff changeset
  1000
static void DoTriggerVehicle(Vehicle *v, VehicleTrigger trigger, byte base_random_bits, bool first)
445
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1001
{
2242
27fa4807cd61 (svn r2762) Simplify a loop, remove an unused variable and add many consts
tron
parents: 2204
diff changeset
  1002
	const SpriteGroup *group;
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
  1003
	ResolverObject object;
445
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1004
	byte new_random_bits;
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1005
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
  1006
	/* We can't trigger a non-existent vehicle... */
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
  1007
	assert(v != NULL);
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
  1008
4057
36ceb8e7cbd2 (svn r5337) - NewGRF: pass the engine type to the engine resolver, to allow support for variable 7F for unbuilt vehicles (mart3p)
peter1138
parents: 4056
diff changeset
  1009
	NewVehicleResolver(&object, v->engine_type, v);
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
  1010
	object.callback = CBID_RANDOM_TRIGGER;
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
  1011
	object.trigger = trigger;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
  1012
4901
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
  1013
	group = Resolve(GetVehicleSpriteGroup(v->engine_type, v), &object);
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
  1014
	if (group == NULL) return;
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
  1015
542
2f35c4770b06 (svn r939) -Fix: Fixed compiler errors
truelight
parents: 507
diff changeset
  1016
	new_random_bits = Random();
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
  1017
	v->random_bits &= ~object.reseed;
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3684
diff changeset
  1018
	v->random_bits |= (first ? new_random_bits : base_random_bits) & object.reseed;
445
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1019
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1020
	switch (trigger) {
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1021
		case VEHICLE_TRIGGER_NEW_CARGO:
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1022
			/* All vehicles in chain get ANY_NEW_CARGO trigger now.
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1023
			 * So we call it for the first one and they will recurse. */
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1024
			/* Indexing part of vehicle random bits needs to be
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1025
			 * same for all triggered vehicles in the chain (to get
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1026
			 * all the random-cargo wagons carry the same cargo,
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1027
			 * i.e.), so we give them all the NEW_CARGO triggered
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1028
			 * vehicle's portion of random bits. */
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1029
			assert(first);
6870
ca3fd1fbe311 (svn r11219) [NewGRF_ports] -Sync: with trunk r11035:11218.
rubidium
parents: 6868
diff changeset
  1030
			DoTriggerVehicle(v->First(), VEHICLE_TRIGGER_ANY_NEW_CARGO, new_random_bits, false);
445
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1031
			break;
3680
4901a7af8ffc (svn r4600) - NewGRF: minor code style tidy up
peter1138
parents: 3668
diff changeset
  1032
445
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1033
		case VEHICLE_TRIGGER_DEPOT:
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1034
			/* We now trigger the next vehicle in chain recursively.
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1035
			 * The random bits portions may be different for each
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1036
			 * vehicle in chain. */
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
  1037
			if (v->Next() != NULL) DoTriggerVehicle(v->Next(), trigger, 0, true);
445
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1038
			break;
3680
4901a7af8ffc (svn r4600) - NewGRF: minor code style tidy up
peter1138
parents: 3668
diff changeset
  1039
445
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1040
		case VEHICLE_TRIGGER_EMPTY:
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1041
			/* We now trigger the next vehicle in chain
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1042
			 * recursively.  The random bits portions must be same
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1043
			 * for each vehicle in chain, so we give them all
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1044
			 * first chained vehicle's portion of random bits. */
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
  1045
			if (v->Next() != NULL) DoTriggerVehicle(v->Next(), trigger, first ? new_random_bits : base_random_bits, false);
445
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1046
			break;
3680
4901a7af8ffc (svn r4600) - NewGRF: minor code style tidy up
peter1138
parents: 3668
diff changeset
  1047
445
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1048
		case VEHICLE_TRIGGER_ANY_NEW_CARGO:
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1049
			/* Now pass the trigger recursively to the next vehicle
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1050
			 * in chain. */
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1051
			assert(!first);
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
  1052
			if (v->Next() != NULL) DoTriggerVehicle(v->Next(), VEHICLE_TRIGGER_ANY_NEW_CARGO, base_random_bits, false);
445
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1053
			break;
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
  1054
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
  1055
		case VEHICLE_TRIGGER_CALLBACK_32:
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
  1056
			/* Do not do any recursion */
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
  1057
			break;
445
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1058
	}
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1059
}
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1060
3680
4901a7af8ffc (svn r4600) - NewGRF: minor code style tidy up
peter1138
parents: 3668
diff changeset
  1061
void TriggerVehicle(Vehicle *v, VehicleTrigger trigger)
445
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1062
{
2589
28c7b9b212af (svn r3126) Autoreplace: Only the first vehicle in a chain should be marked as entering a depot, so call moved out of DoVehicleTrigger loop.
peter1138
parents: 2574
diff changeset
  1063
	if (trigger == VEHICLE_TRIGGER_DEPOT) {
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
  1064
		/* store that the vehicle entered a depot this tick */
3680
4901a7af8ffc (svn r4600) - NewGRF: minor code style tidy up
peter1138
parents: 3668
diff changeset
  1065
		VehicleEnteredDepotThisTick(v);
2589
28c7b9b212af (svn r3126) Autoreplace: Only the first vehicle in a chain should be marked as entering a depot, so call moved out of DoVehicleTrigger loop.
peter1138
parents: 2574
diff changeset
  1066
	}
28c7b9b212af (svn r3126) Autoreplace: Only the first vehicle in a chain should be marked as entering a depot, so call moved out of DoVehicleTrigger loop.
peter1138
parents: 2574
diff changeset
  1067
3680
4901a7af8ffc (svn r4600) - NewGRF: minor code style tidy up
peter1138
parents: 3668
diff changeset
  1068
	DoTriggerVehicle(v, trigger, 0, true);
445
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1069
}
0e3fa3da3899 (svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
tron
parents: 433
diff changeset
  1070
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
  1071
/* Functions for changing the order of vehicle purchase lists
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
  1072
 * This is currently only implemented for rail vehicles. */
4811
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1073
static EngineID _engine_list_order[NUM_TRAIN_ENGINES];
4812
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1074
static byte _engine_list_position[NUM_TRAIN_ENGINES];
2971
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1075
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6502
diff changeset
  1076
void ResetEngineListOrder()
2971
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1077
{
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1078
	EngineID i;
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1079
4811
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1080
	for (i = 0; i < NUM_TRAIN_ENGINES; i++) {
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1081
		_engine_list_order[i] = i;
4812
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1082
		_engine_list_position[i] = i;
4811
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1083
	}
2971
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1084
}
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1085
4812
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1086
/**
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1087
 * Get the EngineID at position pos.
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1088
 * Used when drawing a(n unsorted) list of engines.
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1089
 * @param pos List position/
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1090
 * @return The EngineID at the requested position.
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1091
 */
2971
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1092
EngineID GetRailVehAtPosition(EngineID pos)
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1093
{
4812
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1094
	if (pos < NUM_TRAIN_ENGINES) return _engine_list_order[pos];
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1095
	return pos;
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1096
}
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1097
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1098
/**
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1099
 * Get the list position of an engine.
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1100
 * Used when sorting a list of engines.
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1101
 * @param engine ID of the engine.
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1102
 * @return The list position of the engine.
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1103
 */
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1104
uint16 ListPositionOfEngine(EngineID engine)
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1105
{
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1106
	if (engine < NUM_TRAIN_ENGINES) return _engine_list_position[engine];
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1107
	return engine;
2971
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1108
}
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1109
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1110
void AlterRailVehListOrder(EngineID engine, EngineID target)
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1111
{
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1112
	EngineID i;
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1113
	bool moving = false;
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1114
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1115
	if (engine == target) return;
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1116
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
  1117
	/* First, remove our ID from the list. */
2971
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1118
	for (i = 0; i < NUM_TRAIN_ENGINES - 1; i++) {
4811
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1119
		if (_engine_list_order[i] == engine) moving = true;
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1120
		if (moving) _engine_list_order[i] = _engine_list_order[i + 1];
2971
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1121
	}
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1122
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
  1123
	/* Now, insert it again, before the target engine. */
2971
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1124
	for (i = NUM_TRAIN_ENGINES - 1; i > 0; i--) {
4811
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1125
		_engine_list_order[i] = _engine_list_order[i - 1];
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1126
		if (_engine_list_order[i] == target) {
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1127
			_engine_list_order[i - 1] = engine;
2971
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1128
			break;
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1129
		}
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1130
	}
4812
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1131
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
  1132
	/* Update the engine list position (a reverse of engine list order) */
4812
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1133
	for (i = 0; i < NUM_TRAIN_ENGINES; i++) {
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1134
		_engine_list_position[_engine_list_order[i]] = i;
dab5a9855b72 (svn r6736) - Add a function to get the list position of an engine ID, for use with sorting. This is basically a reversed version of GetRailVehAtPosition()
peter1138
parents: 4811
diff changeset
  1135
	}
2971
9b62397dbd56 (svn r3546) - NewGRF feature: Implement rail vehicle 'property' 0x1A: allows shuffling order of rail vehicle purchase list (and replace vehicle list)
peter1138
parents: 2962
diff changeset
  1136
}