src/newgrf_engine.cpp
author rubidium
Mon, 03 Dec 2007 23:39:38 +0000
branchNewGRF_ports
changeset 6871 5a9dc001e1ad
parent 6870 ca3fd1fbe311
child 6872 1c4a4a609f85
permissions -rw-r--r--
(svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
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"
2163
637ec3c361f5 (svn r2673) Include functions.h directly, not globally via openttd.h
tron
parents: 2159
diff changeset
     9
#include "functions.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    10
#include "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
    11
#include "train.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
    12
#include "player.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
    13
#include "station.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
    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"
4261
2ec8f5a9747b (svn r5887) -Cleanup: move date related functions, defines and variables to date.[ch]
rubidium
parents: 4059
diff changeset
    21
#include "date.h"
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    22
#include "helpers.hpp"
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
    23
#include "cargotype.h"
3843
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
    24
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
    25
3785
1becd6b333fe (svn r4781) - NewGRF: give _traininfo_vehicle_pitch a proper declaration
peter1138
parents: 3739
diff changeset
    26
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
    27
int _traininfo_vehicle_width = 29;
3785
1becd6b333fe (svn r4781) - NewGRF: give _traininfo_vehicle_pitch a proper declaration
peter1138
parents: 3739
diff changeset
    28
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    29
struct WagonOverride {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    30
	byte *train_id;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    31
	int trains;
4869
cded5f3a83c9 (svn r6795) - NewGRF: Add support for cargo-specific wagon overrides.
peter1138
parents: 4832
diff changeset
    32
	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
    33
	const SpriteGroup *group;
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    34
};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    35
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    36
struct WagonOverrides {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    37
	int overrides_count;
1477
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1475
diff changeset
    38
	WagonOverride *overrides;
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    39
};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    40
1477
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1475
diff changeset
    41
static WagonOverrides _engine_wagon_overrides[TOTAL_NUM_ENGINES];
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1475
diff changeset
    42
4869
cded5f3a83c9 (svn r6795) - NewGRF: Add support for cargo-specific wagon overrides.
peter1138
parents: 4832
diff changeset
    43
void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, byte *train_id, int trains)
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
	WagonOverrides *wos;
2174a73b11c9 (svn r1981) Typedef some structs and enums
tron
parents: 1475
diff changeset
    46
	WagonOverride *wo;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    47
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
    48
	assert(engine < TOTAL_NUM_ENGINES);
6483
5d2df05c88dd (svn r8903) -Regression (r8891): CT_PURCHASE does apply to aircraft overrides...
peter1138
parents: 6474
diff changeset
    49
	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
    50
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    51
	wos = &_engine_wagon_overrides[engine];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    52
	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
    53
	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
    54
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    55
	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
    56
	/* 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
    57
	 * 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
    58
	 * --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
    59
	wo->group = group;
4869
cded5f3a83c9 (svn r6795) - NewGRF: Add support for cargo-specific wagon overrides.
peter1138
parents: 4832
diff changeset
    60
	wo->cargo = cargo;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    61
	wo->trains = trains;
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
    62
	wo->train_id = MallocT<byte>(trains);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    63
	memcpy(wo->train_id, train_id, trains);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    64
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    65
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
    66
const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, byte overriding_engine)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    67
{
2242
27fa4807cd61 (svn r2762) Simplify a loop, remove an unused variable and add many consts
tron
parents: 2204
diff changeset
    68
	const WagonOverrides *wos = &_engine_wagon_overrides[engine];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    69
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
    70
	/* 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
    71
	 * 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
    72
	 * 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
    73
	 * that. --pasky */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    74
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
    75
	for (int 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
    76
		const WagonOverride *wo = &wos->overrides[i];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    77
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
    78
		if (wo->cargo != cargo && wo->cargo != CT_DEFAULT) continue;
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
    79
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
    80
		for (int j = 0; j < wo->trains; j++) {
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
    81
			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
    82
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    83
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    84
	return NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    85
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    86
2491
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
    87
/**
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
    88
 * Unload all wagon override sprite groups.
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
    89
 */
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6502
diff changeset
    90
void UnloadWagonOverrides()
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
	WagonOverrides *wos;
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
    93
	WagonOverride *wo;
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
    94
	EngineID engine;
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
    95
	int i;
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
    96
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
    97
	for (engine = 0; engine < TOTAL_NUM_ENGINES; engine++) {
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
    98
		wos = &_engine_wagon_overrides[engine];
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
    99
		for (i = 0; i < wos->overrides_count; i++) {
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   100
			wo = &wos->overrides[i];
3595
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents: 3390
diff changeset
   101
			wo->group = NULL;
2491
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   102
			free(wo->train_id);
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   103
		}
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   104
		free(wos->overrides);
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   105
		wos->overrides_count = 0;
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   106
		wos->overrides = NULL;
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   107
	}
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   108
}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   109
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
   110
/* 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
   111
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
   112
static const GRFFile *_engine_grf[TOTAL_NUM_ENGINES];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   113
3693
af2ee9b328e6 (svn r4629) - NewGRF: constify more code that deals with sprite groups, now that ref counting is gone.
peter1138
parents: 3686
diff changeset
   114
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
   115
{
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
   116
	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
   117
	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
   118
6452
fc8ca2b46277 (svn r8863) -Fix: prefix engine_custom_sprites with _
peter1138
parents: 6448
diff changeset
   119
	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
   120
		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
   121
	}
6452
fc8ca2b46277 (svn r8863) -Fix: prefix engine_custom_sprites with _
peter1138
parents: 6448
diff changeset
   122
	_engine_custom_sprites[engine][cargo] = group;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   123
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   124
2491
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   125
/**
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   126
 * Unload all engine sprite groups.
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   127
 */
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6502
diff changeset
   128
void UnloadCustomEngineSprites()
2491
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   129
{
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
   130
	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
   131
	memset(_engine_grf, 0, sizeof(_engine_grf));
2491
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   132
}
dfe9542f783e (svn r3017) -NewGRF: Implement sprite group unreferencing and unloading.
peter1138
parents: 2490
diff changeset
   133
3695
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   134
static const SpriteGroup *heli_rotor_custom_sprites[NUM_AIRCRAFT_ENGINES];
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   135
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   136
/** Load a rotor override sprite group for an aircraft */
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   137
void SetRotorOverrideSprites(EngineID engine, const SpriteGroup *group)
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   138
{
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   139
	assert(engine >= AIRCRAFT_ENGINES_INDEX);
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   140
	assert(engine < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES);
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   141
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   142
	if (heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX] != NULL) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5338
diff changeset
   143
		grfmsg(6, "SetRotorOverrideSprites: engine %d already has group -- replacing.", engine);
3695
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   144
	}
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   145
	heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX] = group;
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   146
}
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   147
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   148
/** Unload all rotor override sprite groups */
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6502
diff changeset
   149
void UnloadRotorOverrideSprites()
3695
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   150
{
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   151
	EngineID engine;
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   152
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   153
	/* Starting at AIRCRAFT_ENGINES_INDEX may seem pointless, but it means
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   154
	 * the context of EngineID is correct */
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   155
	for (engine = AIRCRAFT_ENGINES_INDEX; engine < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES; engine++) {
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   156
		heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX] = NULL;
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   157
	}
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   158
}
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   159
3924
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   160
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   161
/**
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   162
 * 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
   163
 * 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
   164
 * @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
   165
 * @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
   166
 */
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   167
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
   168
{
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
   169
	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
   170
	_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
   171
}
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
   172
3924
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   173
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   174
/**
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   175
 * 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
   176
 * @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
   177
 * @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
   178
 */
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   179
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
   180
{
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   181
	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
   182
	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
   183
}
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   184
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   185
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   186
/**
de86db4fbd1e (svn r5059) - NewGRF: store a GRFFile pointer reference for each pointer, instead of just the GRF ID.
peter1138
parents: 3920
diff changeset
   187
 * 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
   188
 * @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
   189
 * @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
   190
 */
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
   191
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
   192
{
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
   193
	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
   194
	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
   195
}
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
   196
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
   197
2708
9d1a8d5dc3ea (svn r3252) - NewGRF: Map new train subtypes to old types for rail vehicles.
peter1138
parents: 2639
diff changeset
   198
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
   199
{
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
   200
	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
   201
	if (IsTrainEngine(v)) return 0;
9d1a8d5dc3ea (svn r3252) - NewGRF: Map new train subtypes to old types for rail vehicles.
peter1138
parents: 2639
diff changeset
   202
	if (IsFreeWagon(v)) return 4;
9d1a8d5dc3ea (svn r3252) - NewGRF: Map new train subtypes to old types for rail vehicles.
peter1138
parents: 2639
diff changeset
   203
	return 2;
9d1a8d5dc3ea (svn r3252) - NewGRF: Map new train subtypes to old types for rail vehicles.
peter1138
parents: 2639
diff changeset
   204
}
9d1a8d5dc3ea (svn r3252) - NewGRF: Map new train subtypes to old types for rail vehicles.
peter1138
parents: 2639
diff changeset
   205
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
   206
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
   207
/* 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
   208
enum {
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   209
	AMS_TTDP_HANGAR,
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   210
	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
   211
	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
   212
	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
   213
	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
   214
	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
   215
	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
   216
	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
   217
	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
   218
	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
   219
	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
   220
	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
   221
	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
   222
	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
   223
	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
   224
	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
   225
	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
   226
	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
   227
	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
   228
	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
   229
	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
   230
	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
   231
	AMS_TTDP_BRAKING,
3920
771542d40c45 (svn r5047) - NewGRF: fix typo of AIRPORT in enum
peter1138
parents: 3893
diff changeset
   232
	AMS_TTDP_HELI_TAKEOFF_AIRPORT,
771542d40c45 (svn r5047) - NewGRF: fix typo of AIRPORT in enum
peter1138
parents: 3893
diff changeset
   233
	AMS_TTDP_HELI_TO_TAKEOFF_AIRPORT,
771542d40c45 (svn r5047) - NewGRF: fix typo of AIRPORT in enum
peter1138
parents: 3893
diff changeset
   234
	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
   235
	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
   236
	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
   237
	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
   238
};
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
   239
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
   240
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
/**
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
   242
 * 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
   243
 * (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
   244
 */
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
   245
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
   246
{
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
	const Station *st = GetStation(v->u.air.targetairport);
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   248
	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
   249
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
   250
	const AirportFTAClass *afc = st->Airport();
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   251
	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
   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
	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
   254
		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
   255
			/* 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
   256
			 * 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
   257
			 * 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
   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
			/* 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
   260
			 * 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
   261
			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
   262
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
   263
			/* 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
   264
			 * 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
   265
			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
   266
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   267
			/* 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
   268
			 * Has reached hanger? */
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   269
			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
   270
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   271
			/* Still moving towards hanger. */
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   272
			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
   273
6825
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   274
		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
   275
			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
   276
			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
   277
6825
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   278
		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
   279
			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
   280
			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
   281
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
		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
   283
			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
   284
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
		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
   286
			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
   287
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
   288
		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
   289
			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
   290
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
   291
		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
   292
			//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
   293
			//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
   294
			if (afc->MovingData(v->u.air.pos)->z == 0) {
6346
4aad704385e1 (svn r8743) -Fix
tron
parents: 6175
diff changeset
   295
				return amdflag & AMED_HELI_RAISE ?
4aad704385e1 (svn r8743) -Fix
tron
parents: 6175
diff changeset
   296
					AMS_TTDP_HELI_TAKEOFF_AIRPORT : AMS_TTDP_TO_JUNCTION;
4aad704385e1 (svn r8743) -Fix
tron
parents: 6175
diff changeset
   297
			} else {
4aad704385e1 (svn r8743) -Fix
tron
parents: 6175
diff changeset
   298
				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
   299
			}
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
   300
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
   301
		case FLYING:
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   302
			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
   303
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
   304
		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
   305
			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
   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
		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
   308
			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
   309
			/* 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
   310
			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
   311
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
   312
		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
   313
		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
   314
			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
   315
				//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
   316
				//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
   317
				//	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
   318
				return AMS_TTDP_HELI_LAND_AIRPORT;
6346
4aad704385e1 (svn r8743) -Fix
tron
parents: 6175
diff changeset
   319
			} else {
4aad704385e1 (svn r8743) -Fix
tron
parents: 6175
diff changeset
   320
				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
   321
			}
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
   322
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
   323
		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
   324
			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
   325
				/* 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
   326
				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
   327
			}
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   328
			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
   329
				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
   330
				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
   331
				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
   332
			}
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   333
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   334
			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
   335
	}
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
}
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
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
/* 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
   340
enum {
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   341
	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
   342
	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
   343
	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
   344
	AMA_TTDP_ON_PAD3,
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   345
	AMA_TTDP_HANGAR_TO_PAD1,
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   346
	AMA_TTDP_HANGAR_TO_PAD2,
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   347
	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
   348
	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
   349
	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
   350
	AMA_TTDP_LANDING_TO_PAD3,
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   351
	AMA_TTDP_PAD1_TO_HANGAR,
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   352
	AMA_TTDP_PAD2_TO_HANGAR,
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   353
	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
   354
	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
   355
	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
   356
	AMA_TTDP_PAD3_TO_TAKEOFF,
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   357
	AMA_TTDP_HANGAR_TO_TAKOFF,
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   358
	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
   359
	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
   360
};
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
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
/**
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
 * 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
   365
 * (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
   366
 * 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
   367
 */
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
   368
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
   369
{
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
	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
   371
		case HANGAR:
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   372
			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
   373
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
		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
   375
		case FIRST_HELIPAD:
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
   376
			return (v->current_order.type == OT_LOADING) ? AMA_TTDP_ON_PAD1 : 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
   377
6825
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   378
		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
   379
		case FIRST_HELIPAD + 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
   380
			return (v->current_order.type == OT_LOADING) ? AMA_TTDP_ON_PAD2 : 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
   381
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
   382
		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
   383
		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
   384
		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
   385
		case HELITAKEOFF:
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   386
			/* @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
   387
			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
   388
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
   389
		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
   390
			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
   391
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
   392
		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
   393
		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
   394
		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
   395
		case HELIENDLANDING:
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   396
			/* @todo Need to check terminal we're landing to. Is it known yet? */
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
   397
			return (v->current_order.type == OT_GOTO_DEPOT) ?
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   398
				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
   399
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
   400
		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
   401
			if (FIRST_TERMINAL <= 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
   402
				return (v->current_order.type == OT_LOADING) ? AMA_TTDP_ON_PAD3 : AMA_TTDP_LANDING_TO_PAD3;
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   403
			}
c6ec828eeb0d (svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
rubidium
parents: 6823
diff changeset
   404
4055
2507869fbafe (svn r5335) - Newgrf: correct spelling of hangar
peter1138
parents: 4050
diff changeset
   405
			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
   406
	}
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
   407
}
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
   408
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
   409
3703
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   410
/* 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
   411
enum {
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   412
	ATP_TTDP_SMALL,
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   413
	ATP_TTDP_LARGE,
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   414
	ATP_TTDP_HELIPORT,
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   415
	ATP_TTDP_OILRIG,
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   416
};
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   417
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   418
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
   419
/* 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
   420
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
   421
{
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
   422
	return object->scope == VSG_SCOPE_SELF ? object->u.vehicle.self : object->u.vehicle.parent;
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
   423
}
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
   424
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
   425
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
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
   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
	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
   429
}
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
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
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
   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
	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
   435
}
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
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
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
   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
	/* 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
   441
	 * 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
   442
	 * 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
   443
	 */
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
	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
   445
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
	/* 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
   447
	 * 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
   448
	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
   449
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
	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
   451
}
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
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
   454
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
   455
{
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
   456
	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
   457
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
	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
   459
	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
   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
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
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   463
static uint8 LiveryHelper(EngineID engine, const Vehicle *v)
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   464
{
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   465
	const Livery *l;
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   466
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   467
	if (v == NULL) {
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   468
		l = GetEngineLivery(engine, _current_player, INVALID_ENGINE, NULL);
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   469
	} else if (v->type == VEH_TRAIN) {
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   470
		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
   471
	} else {
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   472
		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
   473
	}
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   474
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   475
	return l->colour1 + l->colour2 * 16;
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
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3870
diff changeset
   479
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
   480
{
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
   481
	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
   482
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
	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
   484
		/* 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
   485
		switch (variable) {
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   486
			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
   487
			case 0x46: return 0;               // Motion counter
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   488
			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
   489
			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
   490
			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
   491
			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
   492
		}
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3870
diff changeset
   493
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3870
diff changeset
   494
		*available = false;
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   495
		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
   496
	}
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
   497
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
   498
	/* 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
   499
	switch (variable) {
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   500
		case 0x40: // Get length of consist
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   501
		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
   502
			{
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
   503
				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
   504
				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
   505
				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
   506
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   507
				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
   508
					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
   509
					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
   510
				}
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
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   512
				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
   513
					chain_after++;
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   514
					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
   515
				}
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
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
   517
				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
   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
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   520
		case 0x42: { // Consist cargo information
3843
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   521
			const Vehicle *u;
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   522
			byte cargo_classes = 0;
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   523
			uint8 common_cargo_best = 0;
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   524
			uint8 common_cargos[NUM_CARGO];
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   525
			uint8 common_subtype_best = 0;
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   526
			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
   527
			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
   528
			CargoID common_cargo_type = CT_PASSENGERS;
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   529
			uint8 common_subtype = 0;
3843
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   530
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   531
			/* Reset our arrays */
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   532
			memset(common_cargos, 0, sizeof(common_cargos));
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   533
			memset(common_subtypes, 0, sizeof(common_subtypes));
3843
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   534
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   535
			for (u = v; u != NULL; u = u->Next()) {
3843
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   536
				/* Skip empty engines */
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   537
				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
   538
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
   539
				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
   540
				common_cargos[u->cargo_type]++;
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   541
				if (v->type == VEH_TRAIN) user_def_data |= u->u.rail.user_def_data;
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   542
				common_subtypes[u->cargo_subtype]++;
3843
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   543
			}
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   544
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   545
			/* 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
   546
			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
   547
				if (common_cargos[cargo] > common_cargo_best) {
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   548
					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
   549
					common_cargo_type = GetCargo(cargo)->bitnum;
3843
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   550
				}
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   551
			}
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   552
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   553
			for (uint i = 0; i < lengthof(common_subtypes); i++) {
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   554
				if (common_subtypes[i] > common_subtype_best) {
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   555
					common_subtype_best = common_subtypes[i];
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   556
					common_subtype = i;
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   557
				}
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   558
			}
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   559
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   560
			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
   561
		}
931e6e89dfb2 (svn r4867) - NewGRF: implement partial support for engine variable 0x42
peter1138
parents: 3785
diff changeset
   562
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   563
		case 0x43: // Player information
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   564
			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
   565
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   566
		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
   567
			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
   568
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   569
			{
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   570
				const Vehicle *w = v->Next();
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   571
				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
   572
				byte airporttype;
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   573
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
   574
				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
   575
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
   576
				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
   577
					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
   578
				} 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
   579
					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
   580
				} 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
   581
					airporttype = ATP_TTDP_HELIPORT;
3703
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   582
				}
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   583
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   584
				return (altitude << 8) | airporttype;
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   585
			}
7a63c0e05948 (svn r4644) - NewGRF: support for variable 0x44, aircraft information. (mart3p)
peter1138
parents: 3702
diff changeset
   586
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   587
		case 0x45: { // Curvature info
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   588
			/* Format: xxxTxBxF
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   589
			 * 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
   590
			 * 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
   591
			 * 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
   592
			 */
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   593
			if (v->type != VEH_TRAIN) return 0;
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   594
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   595
			const Vehicle *u_p = v->Previous();
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   596
			const Vehicle *u_n = v->Next();
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   597
			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
   598
			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
   599
			DirDiff t = ChangeDirDiff(f, b);
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   600
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   601
			return ((t > DIRDIFF_REVERSE ? t | 8 : t) << 16) |
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   602
			       ((b > DIRDIFF_REVERSE ? b | 8 : b) <<  8) |
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   603
			       ( f > DIRDIFF_REVERSE ? f | 8 : f);
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
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   606
		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
   607
			return v->motion_counter;
3723
e999035b1172 (svn r4696) - NewGRF: add support for vehicle variable 0x60, count vehicle type occurance.
peter1138
parents: 3720
diff changeset
   608
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   609
		case 0x47: { // Vehicle cargo info
3848
8cc088ddcfce (svn r4872) - NewGRF: add support for vehicle variable 0x47 (mart3p)
peter1138
parents: 3845
diff changeset
   610
			/* Format: ccccwwtt
8cc088ddcfce (svn r4872) - NewGRF: add support for vehicle variable 0x47 (mart3p)
peter1138
parents: 3845
diff changeset
   611
			 * tt - the cargo type transported by the vehicle,
8cc088ddcfce (svn r4872) - NewGRF: add support for vehicle variable 0x47 (mart3p)
peter1138
parents: 3845
diff changeset
   612
			 *     translated if a translation table has been installed.
8cc088ddcfce (svn r4872) - NewGRF: add support for vehicle variable 0x47 (mart3p)
peter1138
parents: 3845
diff changeset
   613
			 * 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
   614
			 * 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
   615
			 */
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
   616
			const CargoSpec *cs = GetCargo(v->cargo_type);
3848
8cc088ddcfce (svn r4872) - NewGRF: add support for vehicle variable 0x47 (mart3p)
peter1138
parents: 3845
diff changeset
   617
6473
03480a0f016e (svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
peter1138
parents: 6452
diff changeset
   618
			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
   619
		}
8cc088ddcfce (svn r4872) - NewGRF: add support for vehicle variable 0x47 (mart3p)
peter1138
parents: 3845
diff changeset
   620
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   621
		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
   622
3723
e999035b1172 (svn r4696) - NewGRF: add support for vehicle variable 0x60, count vehicle type occurance.
peter1138
parents: 3720
diff changeset
   623
		/* Variables which use the parameter */
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   624
		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
   625
			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
   626
e999035b1172 (svn r4696) - NewGRF: add support for vehicle variable 0x60, count vehicle type occurance.
peter1138
parents: 3720
diff changeset
   627
			{
e999035b1172 (svn r4696) - NewGRF: add support for vehicle variable 0x60, count vehicle type occurance.
peter1138
parents: 3720
diff changeset
   628
				uint count = 0;
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   629
				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
   630
					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
   631
				}
e999035b1172 (svn r4696) - NewGRF: add support for vehicle variable 0x60, count vehicle type occurance.
peter1138
parents: 3720
diff changeset
   632
				return count;
e999035b1172 (svn r4696) - NewGRF: add support for vehicle variable 0x60, count vehicle type occurance.
peter1138
parents: 3720
diff changeset
   633
			}
3925
0b0c1fc5535e (svn r5060) - NewGRF: add support for variable 7F (retrieve GRF parameter) for vehicles
peter1138
parents: 3924
diff changeset
   634
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   635
		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
   636
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   637
		case 0xFE:
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   638
		case 0xFF: {
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   639
			uint16 modflags = 0;
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   640
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
   641
			/* @todo: There are some other bits that should be implemented:
6502
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   642
			 *   bit 5: Whether the rail vehicle is powered or not (mostly useful for wagons).
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   643
			 *   bit 6: This is an electrically powered rail vehicle which is running on normal rail.
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   644
			 *   bit 8: (Maybe?) Toggled whenever the train reverses.
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   645
			 */
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   646
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   647
			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
   648
7ca154aca2b7 (svn r8946) -Feature: [NewGRF] Add support for vehicle variables 0xFE and 0xFF bit 10,
maedhros
parents: 6499
diff changeset
   649
			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
   650
		}
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
   651
	}
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
   652
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
   653
	/* 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
   654
	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
   655
		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
   656
		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
   657
		case 0x04: return v->index;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   658
		case 0x05: return GB(v->index, 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
   659
		case 0x0A: return PackOrder(&v->current_order);
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   660
		case 0x0B: return GB(PackOrder(&v->current_order), 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
   661
		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
   662
		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
   663
		case 0x10: return v->load_unload_time_rem;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   664
		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
   665
		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
   666
		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
   667
		case 0x14: return v->service_interval;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   668
		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
   669
		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
   670
		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
   671
		case 0x18: return v->max_speed;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   672
		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
   673
		case 0x1A: return v->x_pos;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   674
		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
   675
		case 0x1C: return v->y_pos;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   676
		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
   677
		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
   678
		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
   679
		case 0x28: return v->cur_image;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   680
		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
   681
		case 0x32: return v->vehstatus;
5175
509e0c13ed8a (svn r7285) -Fix (r7282): Our vehstatus is a byte, not a word.
peter1138
parents: 5174
diff changeset
   682
		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
   683
		case 0x34: return v->cur_speed;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   684
		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
   685
		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
   686
		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
   687
		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
   688
		case 0x3A: return v->cargo_cap;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   689
		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
   690
		case 0x3C: return v->cargo.Count();
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   691
		case 0x3D: return GB(v->cargo.Count(), 8, 8);
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   692
		case 0x3E: return v->cargo.Source();
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   693
		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
   694
		case 0x40: return v->age;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   695
		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
   696
		case 0x42: return v->max_age;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   697
		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
   698
		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
   699
		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
   700
		case 0x46: return v->engine_type;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   701
		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
   702
		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
   703
		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
   704
		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
   705
		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
   706
		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
   707
		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
   708
		case 0x4E: return v->reliability;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   709
		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
   710
		case 0x50: return v->reliability_spd_dec;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   711
		case 0x51: return GB(v->reliability_spd_dec, 8, 8);
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   712
		case 0x52: return ClampToI32(v->profit_this_year);
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   713
		case 0x53: return GB(ClampToI32(v->profit_this_year),  8, 24);
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   714
		case 0x54: return GB(ClampToI32(v->profit_this_year), 16, 16);
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   715
		case 0x55: return GB(ClampToI32(v->profit_this_year), 24,  8);
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   716
		case 0x56: return ClampToI32(v->profit_last_year);
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   717
		case 0x57: return GB(ClampToI32(v->profit_last_year),  8, 24);
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   718
		case 0x58: return GB(ClampToI32(v->profit_last_year), 16, 16);
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   719
		case 0x59: return GB(ClampToI32(v->profit_last_year), 24,  8);
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   720
		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
   721
		case 0x5C: return ClampToI32(v->value);
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   722
		case 0x5D: return GB(ClampToI32(v->value),  8, 24);
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   723
		case 0x5E: return GB(ClampToI32(v->value), 16, 16);
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   724
		case 0x5F: return GB(ClampToI32(v->value), 24,  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
   725
		case 0x60: return v->string_id;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   726
		case 0x61: return GB(v->string_id, 8, 8);
3870
766d7bd6c299 (svn r4910) - NewGRF: add and initialize cargo subtype for vehicle visual variations
peter1138
parents: 3866
diff changeset
   727
		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
   728
		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
   729
		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
   730
	}
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
   731
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
   732
	/* 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
   733
	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
   734
		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
   735
			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
   736
				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
   737
				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
   738
				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
   739
				case 0x74: return v->u.rail.cached_power;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   740
				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
   741
				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
   742
				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
   743
				case 0x7C: return v->First()->index;
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   744
				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
   745
				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
   746
			}
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
   747
			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
   748
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
   749
		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
   750
			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
   751
				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
   752
				case 0x64: return v->u.road.blocked_ctr;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   753
				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
   754
				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
   755
				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
   756
				case 0x68: return v->u.road.crashed_ctr;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4901
diff changeset
   757
				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
   758
			}
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
			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
   760
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
   761
		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
   762
			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
   763
				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
   764
				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
   765
				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
   766
			}
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
			break;
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   768
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   769
		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
   770
	}
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
   771
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5338
diff changeset
   772
	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
   773
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3870
diff changeset
   774
	*available = false;
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   775
	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
   776
}
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
426
bd6f3c2cad9f (svn r625) Almost complete support for deterministic variational vehicle spritegroups. (pasky)
tron
parents: 414
diff changeset
   778
3734
f929883c5ae0 (svn r4714) - NewGRF: simplify evaluation of 'real' sprite groups.
peter1138
parents: 3731
diff changeset
   779
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
   780
{
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
   781
	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
   782
	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
   783
	uint set;
426
bd6f3c2cad9f (svn r625) Almost complete support for deterministic variational vehicle spritegroups. (pasky)
tron
parents: 414
diff changeset
   784
3739
f9c405bf3e9d (svn r4721) - NewGRF: use loading sprites rather than loaded when there is no vehicle (fixes issue with purchase list)
peter1138
parents: 3734
diff changeset
   785
	if (v == NULL) return group->g.real.loading[0];
3734
f929883c5ae0 (svn r4714) - NewGRF: simplify evaluation of 'real' sprite groups.
peter1138
parents: 3731
diff changeset
   786
6870
ca3fd1fbe311 (svn r11219) [NewGRF_ports] -Sync: with trunk r11035:11218.
rubidium
parents: 6868
diff changeset
   787
	bool in_motion = v->First()->current_order.type != 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
   788
3734
f929883c5ae0 (svn r4714) - NewGRF: simplify evaluation of 'real' sprite groups.
peter1138
parents: 3731
diff changeset
   789
	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
   790
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   791
	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
   792
		set = totalsets - 1;
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   793
	} 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
   794
		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
   795
	} else {
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   796
		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
   797
	}
426
bd6f3c2cad9f (svn r625) Almost complete support for deterministic variational vehicle spritegroups. (pasky)
tron
parents: 414
diff changeset
   798
3734
f929883c5ae0 (svn r4714) - NewGRF: simplify evaluation of 'real' sprite groups.
peter1138
parents: 3731
diff changeset
   799
	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
   800
}
bd6f3c2cad9f (svn r625) Almost complete support for deterministic variational vehicle spritegroups. (pasky)
tron
parents: 414
diff changeset
   801
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
   802
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
   803
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
   804
{
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
	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
   806
	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
   807
	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
   808
	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
   809
	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
   810
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
   811
	res->u.vehicle.self   = v;
6870
ca3fd1fbe311 (svn r11219) [NewGRF_ports] -Sync: with trunk r11035:11218.
rubidium
parents: 6868
diff changeset
   812
	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
   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
	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
   815
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
   816
	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
   817
6743
cabfaa4a0295 (svn r10766) [NewGRF_ports] -Sync: with trunk r10651-10765
richk
parents: 6738
diff changeset
   818
	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
   819
	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
   820
	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
   821
	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
   822
	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
   823
	res->reseed          = 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
   824
}
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
   825
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
   826
4901
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   827
/** 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
   828
 * 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
   829
 * 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
   830
 * @param engine    Engine type of the vehicle.
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   831
 * @param v         The vehicle itself.
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   832
 * @param use_cache Use cached override
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   833
 * @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
   834
 */
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   835
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
   836
{
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   837
	const SpriteGroup *group;
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   838
	CargoID cargo;
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   839
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   840
	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
   841
		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
   842
	} 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
   843
		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
   844
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
   845
		if (v->type == VEH_TRAIN) {
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   846
			/* 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
   847
			 * 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
   848
			 * 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
   849
			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
   850
			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
   851
		}
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   852
	}
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   853
6452
fc8ca2b46277 (svn r8863) -Fix: prefix engine_custom_sprites with _
peter1138
parents: 6448
diff changeset
   854
	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
   855
	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
   856
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   857
	/* 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
   858
	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
   859
}
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   860
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   861
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
   862
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
   863
{
2242
27fa4807cd61 (svn r2762) Simplify a loop, remove an unused variable and add many consts
tron
parents: 2204
diff changeset
   864
	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
   865
	ResolverObject object;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   866
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
   867
	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
   868
4901
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
   869
	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
   870
	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
   871
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
   872
	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
   873
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   874
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
   875
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
   876
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
   877
{
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   878
	const SpriteGroup *group;
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   879
	ResolverObject object;
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   880
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   881
	assert(engine >= AIRCRAFT_ENGINES_INDEX);
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   882
	assert(engine < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES);
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   883
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   884
	/* 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
   885
	assert(!(AircraftVehInfo(engine)->subtype & AIR_CTOL));
3695
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   886
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
   887
	NewVehicleResolver(&object, engine, v);
3695
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   888
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
   889
	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
   890
3695
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   891
	group = heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX];
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   892
	group = Resolve(group, &object);
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   893
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   894
	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
   895
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   896
	if (v == NULL) return group->g.result.sprite;
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   897
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
   898
	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
   899
}
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   900
aae28fa7190e (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
peter1138
parents: 3693
diff changeset
   901
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   902
/**
1908
bc48a30aba72 (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1904
diff changeset
   903
 * 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
   904
 * @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
   905
 * @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
   906
 */
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
   907
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
   908
{
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
   909
	assert(v->type == VEH_TRAIN);
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   910
	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
   911
}
bc48a30aba72 (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1904
diff changeset
   912
bc48a30aba72 (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1904
diff changeset
   913
/**
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
   914
 * 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
   915
 * @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
   916
 * @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
   917
 * @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
   918
 * @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
   919
 * @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
   920
 * @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
   921
 */
6743
cabfaa4a0295 (svn r10766) [NewGRF_ports] -Sync: with trunk r10651-10765
richk
parents: 6738
diff changeset
   922
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
   923
{
2242
27fa4807cd61 (svn r2762) Simplify a loop, remove an unused variable and add many consts
tron
parents: 2204
diff changeset
   924
	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
   925
	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
   926
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
   927
	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
   928
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
   929
	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
   930
	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
   931
	object.callback_param2 = param2;
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   932
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   933
	group = Resolve(GetVehicleSpriteGroup(engine, v, false), &object);
4811
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
   934
	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
   935
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   936
	return group->g.callback.result;
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   937
}
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   938
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
   939
/**
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
   940
 * 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
   941
 * @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
   942
 * @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
   943
 * @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
   944
 * @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
   945
 * @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
   946
 * @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
   947
 * @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
   948
 */
6743
cabfaa4a0295 (svn r10766) [NewGRF_ports] -Sync: with trunk r10651-10765
richk
parents: 6738
diff changeset
   949
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
   950
{
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
	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
   952
	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
   953
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
   954
	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
   955
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
	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
   957
	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
   958
	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
   959
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
	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
   961
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
   962
	group = Resolve(GetVehicleSpriteGroup(engine, v, false), &object);
4811
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
   963
	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
   964
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
	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
   966
}
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   967
6719
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   968
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   969
/* Callback 36 handlers */
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   970
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
   971
{
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   972
	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
   973
	if (callback != CALLBACK_FAILED) return callback;
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   974
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   975
	return orig_value;
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   976
}
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   977
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   978
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   979
uint GetEngineProperty(EngineID engine, uint8 property, uint orig_value)
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
	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
   982
	if (callback != CALLBACK_FAILED) return callback;
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
	return orig_value;
4cc327ad39d5 (svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
richk
parents: 6715
diff changeset
   985
}
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
3680
4901a7af8ffc (svn r4600) - NewGRF: minor code style tidy up
peter1138
parents: 3668
diff changeset
   988
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
   989
{
2242
27fa4807cd61 (svn r2762) Simplify a loop, remove an unused variable and add many consts
tron
parents: 2204
diff changeset
   990
	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
   991
	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
   992
	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
   993
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
   994
	/* 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
   995
	assert(v != NULL);
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
   996
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
   997
	NewVehicleResolver(&object, v->engine_type, v);
6720
35756db7e577 (svn r10560) [NewGRF_ports] -Sync: with trunk r10027-10559
richk
parents: 6719
diff changeset
   998
	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
   999
	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
  1000
4901
3f661c8faa1a (svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
peter1138
parents: 4869
diff changeset
  1001
	group = Resolve(GetVehicleSpriteGroup(v->engine_type, v), &object);
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
  1002
	if (group == NULL) return;
1883
3b02000cfbe0 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1881
diff changeset
  1003
542
2f35c4770b06 (svn r939) -Fix: Fixed compiler errors
truelight
parents: 507
diff changeset
  1004
	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
  1005
	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
  1006
	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
  1007
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
  1008
	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
  1009
		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
  1010
			/* 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
  1011
			 * 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
  1012
			/* 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
  1013
			 * 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
  1014
			 * 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
  1015
			 * 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
  1016
			 * 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
  1017
			assert(first);
6870
ca3fd1fbe311 (svn r11219) [NewGRF_ports] -Sync: with trunk r11035:11218.
rubidium
parents: 6868
diff changeset
  1018
			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
  1019
			break;
3680
4901a7af8ffc (svn r4600) - NewGRF: minor code style tidy up
peter1138
parents: 3668
diff changeset
  1020
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
  1021
		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
  1022
			/* 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
  1023
			 * 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
  1024
			 * vehicle in chain. */
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
  1025
			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
  1026
			break;
3680
4901a7af8ffc (svn r4600) - NewGRF: minor code style tidy up
peter1138
parents: 3668
diff changeset
  1027
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
  1028
		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
  1029
			/* 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
  1030
			 * 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
  1031
			 * 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
  1032
			 * first chained vehicle's portion of random bits. */
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
  1033
			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
  1034
			break;
3680
4901a7af8ffc (svn r4600) - NewGRF: minor code style tidy up
peter1138
parents: 3668
diff changeset
  1035
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
  1036
		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
  1037
			/* 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
  1038
			 * 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
  1039
			assert(!first);
6868
7eb395287b3d (svn r11037) [NewGRF_ports] -Sync: with trunk r10844:11035.
rubidium
parents: 6857
diff changeset
  1040
			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
  1041
			break;
6871
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
  1042
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
  1043
		case VEHICLE_TRIGGER_CALLBACK_32:
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
  1044
			/* Do not do any recursion */
5a9dc001e1ad (svn r11566) [NewGRF_ports] -Sync: with trunk r11218:r11565.
rubidium
parents: 6870
diff changeset
  1045
			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
  1046
	}
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
  1047
}
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
3680
4901a7af8ffc (svn r4600) - NewGRF: minor code style tidy up
peter1138
parents: 3668
diff changeset
  1049
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
  1050
{
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
  1051
	if (trigger == VEHICLE_TRIGGER_DEPOT) {
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
  1052
		/* store that the vehicle entered a depot this tick */
3680
4901a7af8ffc (svn r4600) - NewGRF: minor code style tidy up
peter1138
parents: 3668
diff changeset
  1053
		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
  1054
	}
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
  1055
3680
4901a7af8ffc (svn r4600) - NewGRF: minor code style tidy up
peter1138
parents: 3668
diff changeset
  1056
	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
  1057
}
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
3604
d28877422030 (svn r4496) - NewGRF: switch custom engine names from storing a char* to using the new StringID based text system. Vehicle name
peter1138
parents: 3595
diff changeset
  1059
StringID _engine_custom_names[TOTAL_NUM_ENGINES];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1060
3604
d28877422030 (svn r4496) - NewGRF: switch custom engine names from storing a char* to using the new StringID based text system. Vehicle name
peter1138
parents: 3595
diff changeset
  1061
void SetCustomEngineName(EngineID engine, StringID name)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1062
{
3614
2c75299f54bd (svn r4510) - NewGRF bounds checking:
peter1138
parents: 3607
diff changeset
  1063
	assert(engine < lengthof(_engine_custom_names));
3604
d28877422030 (svn r4496) - NewGRF: switch custom engine names from storing a char* to using the new StringID based text system. Vehicle name
peter1138
parents: 3595
diff changeset
  1064
	_engine_custom_names[engine] = name;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1065
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1066
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6502
diff changeset
  1067
void UnloadCustomEngineNames()
1474
d83520edcda6 (svn r1978) - Fix: Plug some memleaks; thanks Valgrind
Darkvater
parents: 1329
diff changeset
  1068
{
3604
d28877422030 (svn r4496) - NewGRF: switch custom engine names from storing a char* to using the new StringID based text system. Vehicle name
peter1138
parents: 3595
diff changeset
  1069
	EngineID i;
d28877422030 (svn r4496) - NewGRF: switch custom engine names from storing a char* to using the new StringID based text system. Vehicle name
peter1138
parents: 3595
diff changeset
  1070
	for (i = 0; i < TOTAL_NUM_ENGINES; i++) {
d28877422030 (svn r4496) - NewGRF: switch custom engine names from storing a char* to using the new StringID based text system. Vehicle name
peter1138
parents: 3595
diff changeset
  1071
		_engine_custom_names[i] = 0;
1474
d83520edcda6 (svn r1978) - Fix: Plug some memleaks; thanks Valgrind
Darkvater
parents: 1329
diff changeset
  1072
	}
d83520edcda6 (svn r1978) - Fix: Plug some memleaks; thanks Valgrind
Darkvater
parents: 1329
diff changeset
  1073
}
d83520edcda6 (svn r1978) - Fix: Plug some memleaks; thanks Valgrind
Darkvater
parents: 1329
diff changeset
  1074
2477
d454d5152386 (svn r3003) Change int, uint, uin16 and byte to EngineID where appropriate, plus some related changes (mostly casts)
tron
parents: 2469
diff changeset
  1075
StringID GetCustomEngineName(EngineID engine)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1076
{
3604
d28877422030 (svn r4496) - NewGRF: switch custom engine names from storing a char* to using the new StringID based text system. Vehicle name
peter1138
parents: 3595
diff changeset
  1077
	return _engine_custom_names[engine] == 0 ? _engine_name_strings[engine] : _engine_custom_names[engine];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1078
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1079
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
  1080
/* 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
  1081
 * This is currently only implemented for rail vehicles. */
4811
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1082
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
  1083
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
  1084
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6502
diff changeset
  1085
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
  1086
{
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
  1087
	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
  1088
4811
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1089
	for (i = 0; i < NUM_TRAIN_ENGINES; i++) {
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1090
		_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
  1091
		_engine_list_position[i] = i;
4811
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1092
	}
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
  1093
}
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
  1094
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
  1095
/**
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
 * 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
  1097
 * 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
  1098
 * @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
  1099
 * @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
  1100
 */
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
  1101
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
  1102
{
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
  1103
	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
  1104
	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
  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
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
/**
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
  1108
 * 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
  1109
 * 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
  1110
 * @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
  1111
 * @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
  1112
 */
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
  1113
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
  1114
{
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
  1115
	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
  1116
	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
  1117
}
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
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
  1119
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
  1120
{
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
	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
  1122
	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
  1123
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
	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
  1125
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
  1126
	/* 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
  1127
	for (i = 0; i < NUM_TRAIN_ENGINES - 1; i++) {
4811
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1128
		if (_engine_list_order[i] == engine) moving = true;
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1129
		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
  1130
	}
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
  1131
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
  1132
	/* 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
  1133
	for (i = NUM_TRAIN_ENGINES - 1; i > 0; i--) {
4811
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1134
		_engine_list_order[i] = _engine_list_order[i - 1];
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1135
		if (_engine_list_order[i] == target) {
5149ead9b1d5 (svn r6735) - Codestyle: Just some tidying up...
peter1138
parents: 4656
diff changeset
  1136
			_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
  1137
			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
  1138
		}
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
  1139
	}
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
  1140
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6585
diff changeset
  1141
	/* 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
  1142
	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
  1143
		_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
  1144
	}
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
  1145
}