newgrf.c
author tron
Fri, 23 Sep 2005 06:34:06 +0000
changeset 2446 92efeca5839c
parent 2445 6304552c6492
child 2456 2317dd6f4b19
permissions -rw-r--r--
(svn r2972) Fix the speed of the AI
2186
db48cf29b983 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     1
/* $Id$ */
db48cf29b983 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     2
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
     3
#include "stdafx.h"
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
     4
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
     5
#include <stdarg.h>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
     6
1891
862800791170 (svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents: 1883
diff changeset
     7
#include "openttd.h"
1299
39c06aba09aa (svn r1803) Move debugging stuff into files of it's own
tron
parents: 1183
diff changeset
     8
#include "debug.h"
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
     9
#include "gfx.h"
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    10
#include "fileio.h"
2163
b17b313113a0 (svn r2673) Include functions.h directly, not globally via openttd.h
tron
parents: 2159
diff changeset
    11
#include "functions.h"
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    12
#include "engine.h"
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
    13
#include "spritecache.h"
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    14
#include "station.h"
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    15
#include "sprite.h"
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    16
#include "newgrf.h"
2159
f6284cf5fab0 (svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents: 2013
diff changeset
    17
#include "variables.h"
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    18
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    19
/* TTDPatch extended GRF format codec
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    20
 * (c) Petr Baudis 2004 (GPL'd)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    21
 * Changes by Florian octo Forster are (c) by the OpenTTD development team.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    22
 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    23
 * Contains portions of documentation by TTDPatch team.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    24
 * Thanks especially to Josef Drexler for the documentation as well as a lot
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    25
 * of help at #tycoon. Also thanks to Michael Blunck for is GRF files which
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    26
 * served as subject to the initial testing of this codec. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    27
455
b151d55203bf (svn r665) code fixes for newgrf.c/newgrf.h
dominik
parents: 452
diff changeset
    28
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
    29
uint16 _custom_sprites_base;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
    30
static int _skip_sprites; // XXX
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
    31
static uint _file_index; // XXX
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    32
extern int _traininfo_vehicle_pitch;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    33
2340
e18ef06bc59a (svn r2866) Move all functions and tables which aren't directly involved in managing the sprite heap to a new file gfxinit.c.
tron
parents: 2336
diff changeset
    34
static GRFFile *_cur_grffile;
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
    35
GRFFile *_first_grffile;
478
3a161108a15d (svn r745) Added newgrf GUI (in options menu)\nThe interface currently only displays the installed grf sets, you can't (de)activate them through the gui yet
dominik
parents: 455
diff changeset
    36
int _grffile_count;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    37
static int _cur_spriteid;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    38
static int _cur_stage;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    39
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    40
/* 32 * 8 = 256 flags. Apparently TTDPatch uses this many.. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    41
static uint32 _ttdpatch_flags[8];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    42
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    43
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
    44
typedef enum grfspec_feature {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    45
	GSF_TRAIN,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    46
	GSF_ROAD,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    47
	GSF_SHIP,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    48
	GSF_AIRCRAFT,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    49
	GSF_STATION,
2438
f0bf4adbd620 (svn r2964) Fix: newgrf: Include missing grf feature canal.
peter1138
parents: 2421
diff changeset
    50
	GSF_CANAL,
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    51
	GSF_BRIDGE,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    52
	GSF_TOWNHOUSE,
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
    53
} grfspec_feature;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    54
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    55
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    56
typedef void (*SpecialSpriteHandler)(byte *buf, int len);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    57
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    58
static const int _vehcounts[4] = {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    59
	/* GSF_TRAIN */    NUM_TRAIN_ENGINES,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    60
	/* GSF_ROAD */     NUM_ROAD_ENGINES,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    61
	/* GSF_SHIP */     NUM_SHIP_ENGINES,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    62
	/* GSF_AIRCRAFT */ NUM_AIRCRAFT_ENGINES
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    63
};
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    64
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    65
static const int _vehshifts[4] = {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    66
	/* GSF_TRAIN */    0,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    67
	/* GSF_ROAD */     ROAD_ENGINES_INDEX,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    68
	/* GSF_SHIP */     SHIP_ENGINES_INDEX,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    69
	/* GSF_AIRCRAFT */ AIRCRAFT_ENGINES_INDEX,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    70
};
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    71
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    72
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    73
/* Debugging messages policy:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    74
 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    75
 * These should be the severities used for direct DEBUG() calls
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    76
 * (there is room for exceptions, but you have to have a good cause):
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    77
 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    78
 * 0..2 - dedicated to grfmsg()
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    79
 * 3
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    80
 * 4
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    81
 * 5
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    82
 * 6 - action handler entry reporting - one per action
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    83
 * 7 - basic action progress reporting - in loops, only single one allowed
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    84
 * 8 - more detailed progress reporting - less important stuff, in deep loops etc
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    85
 * 9 - extremely detailed progress reporting - detailed reports inside of deep loops and so
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    86
 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    87
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    88
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
    89
typedef enum grfmsg_severity {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    90
	GMS_NOTICE,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    91
	GMS_WARN,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    92
	GMS_ERROR,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    93
	GMS_FATAL,
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
    94
} grfmsg_severity;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    95
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
    96
static void CDECL grfmsg(grfmsg_severity severity, const char *str, ...)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
    97
{
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
    98
	static const char* const severitystr[] = {
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
    99
		"Notice",
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   100
		"Warning",
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   101
		"Error",
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   102
		"Fatal"
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   103
	};
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   104
	int export_severity = 0;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   105
	char buf[1024];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   106
	va_list va;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   107
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   108
	va_start(va, str);
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   109
	vsnprintf(buf, sizeof(buf), str, va);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   110
	va_end(va);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   111
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   112
	export_severity = 2 - (severity == GMS_FATAL ? 2 : severity);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   113
	DEBUG(grf, export_severity) ("[%s][%s] %s", _cur_grffile->filename, severitystr[severity], buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   114
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   115
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   116
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   117
#define check_length(real, wanted, where) \
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   118
do { \
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   119
	if (real < wanted) { \
1439
2571a8ab42f6 (svn r1943) Show the sprite ID in the check_length() error message. Also show the correct sprite ID in the spriteskip notice.
pasky
parents: 1329
diff changeset
   120
		grfmsg(GMS_ERROR, "%s/%d: Invalid special sprite length %d (expected %d)!", \
2571a8ab42f6 (svn r1943) Show the sprite ID in the check_length() error message. Also show the correct sprite ID in the spriteskip notice.
pasky
parents: 1329
diff changeset
   121
		       where, _cur_spriteid - _cur_grffile->sprite_offset, real, wanted); \
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   122
		return; \
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   123
	} \
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   124
} while (0)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   125
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   126
500
8e52f7797b48 (svn r793) Merge INLINE -> inline replacement (revision 376)
tron
parents: 490
diff changeset
   127
static inline byte grf_load_byte(byte **buf)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   128
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   129
	return *(*buf)++;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   130
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   131
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   132
static uint16 grf_load_word(byte **buf)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   133
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   134
	uint16 val;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   135
	byte *p = *buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   136
	val = p[0];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   137
	val |= p[1] << 8;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   138
	*buf = p + 2;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   139
	return val;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   140
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   141
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   142
static uint16 grf_load_extended(byte** buf)
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   143
{
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   144
	uint16 val;
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   145
	val = grf_load_byte(buf);
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   146
	if (val == 0xFF) val = grf_load_word(buf);
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   147
	return val;
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   148
}
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
   149
2324
23ac249f4c70 (svn r2850) [newgrf] Patch from peter1139
miham
parents: 2204
diff changeset
   150
static uint32 grf_load_dword(byte **buf)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   151
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   152
	uint32 val;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   153
	byte *p = *buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   154
	val = p[0];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   155
	val |= p[1] << 8;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   156
	val |= p[2] << 16;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   157
	val |= p[3] << 24;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   158
	*buf = p + 4;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   159
	return val;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   160
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   161
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   162
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   163
static GRFFile *GetFileByGRFID(uint32 grfid)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   164
{
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   165
	GRFFile *file;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   166
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   167
	for (file = _first_grffile; file != NULL; file = file->next) {
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   168
		if (file->grfid == grfid) break;
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   169
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   170
	return file;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   171
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   172
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   173
static GRFFile *GetFileByFilename(const char *filename)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   174
{
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   175
	GRFFile *file;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   176
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   177
	for (file = _first_grffile; file != NULL; file = file->next) {
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   178
		if (strcmp(file->filename, filename) == 0) break;
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   179
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   180
	return file;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   181
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   182
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   183
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   184
typedef bool (*VCI_Handler)(uint engine, int numinfo, int prop, byte **buf, int len);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   185
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   186
#define FOR_EACH_OBJECT for (i = 0; i < numinfo; i++)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   187
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   188
static void dewagonize(int condition, int engine)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   189
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   190
	EngineInfo *ei = &_engine_info[engine];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   191
	RailVehicleInfo *rvi = &_rail_vehicle_info[engine];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   192
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   193
	if (condition != 0) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   194
		ei->unk2 &= ~0x80;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   195
		rvi->flags &= ~2;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   196
	} else {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   197
		ei->unk2 |= 0x80;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   198
		rvi->flags |= 2;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   199
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   200
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   201
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   202
static bool RailVehicleChangeInfo(uint engine, int numinfo, int prop, byte **bufp, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   203
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   204
	EngineInfo *ei = &_engine_info[engine];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   205
	RailVehicleInfo *rvi = &_rail_vehicle_info[engine];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   206
	byte *buf = *bufp;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   207
	int i;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   208
	bool ret = false;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   209
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   210
	switch (prop) {
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   211
		case 0x05: { /* Track type */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   212
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   213
				uint8 tracktype = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   214
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   215
				ei[i].railtype_climates &= 0xf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   216
				ei[i].railtype_climates |= tracktype << 4;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   217
			}
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   218
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   219
		case 0x08: { /* AI passenger service */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   220
			/* TODO */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   221
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   222
				grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   223
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   224
			ret = true;
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   225
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   226
		case 0x09: { /* Speed */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   227
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   228
				uint16 speed = grf_load_word(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   229
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   230
				rvi[i].max_speed = speed;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   231
				dewagonize(speed, engine + i);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   232
			}
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   233
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   234
		case 0x0B: { /* Power */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   235
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   236
				uint16 power = grf_load_word(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   237
1894
c76c6bc57121 (svn r2400) - Fix: [newgrf] Load power for dual-headed engines correctly
hackykid
parents: 1891
diff changeset
   238
				if (rvi[i].flags & RVI_MULTIHEAD)
c76c6bc57121 (svn r2400) - Fix: [newgrf] Load power for dual-headed engines correctly
hackykid
parents: 1891
diff changeset
   239
					power /= 2;
c76c6bc57121 (svn r2400) - Fix: [newgrf] Load power for dual-headed engines correctly
hackykid
parents: 1891
diff changeset
   240
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   241
				rvi[i].power = power;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   242
				dewagonize(power, engine + i);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   243
			}
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   244
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   245
		case 0x0D: { /* Running cost factor */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   246
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   247
				uint8 runcostfact = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   248
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   249
				rvi[i].running_cost_base = runcostfact;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   250
				dewagonize(runcostfact, engine + i);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   251
			}
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   252
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   253
		case 0x0E: { /* Running cost base */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   254
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   255
				uint32 base = grf_load_dword(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   256
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   257
				switch (base) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   258
				case 0x4C30:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   259
					rvi[i].engclass = 0;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   260
					break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   261
				case 0x4C36:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   262
					rvi[i].engclass = 1;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   263
					break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   264
				case 0x4C3C:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   265
					rvi[i].engclass = 2;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   266
					break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   267
				}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   268
				dewagonize(base, engine + i);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   269
			}
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   270
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   271
		case 0x12: { /* Sprite ID */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   272
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   273
				uint8 spriteid = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   274
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   275
				if (spriteid == 0xFD && rvi[i].image_index != 0xFD)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   276
					_engine_original_sprites[engine + i] = rvi[i].image_index;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   277
				rvi[i].image_index = spriteid;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   278
			}
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   279
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   280
		case 0x13: { /* Dual-headed */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   281
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   282
				uint8 dual = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   283
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   284
				if (dual != 0) {
1894
c76c6bc57121 (svn r2400) - Fix: [newgrf] Load power for dual-headed engines correctly
hackykid
parents: 1891
diff changeset
   285
					if (!(rvi[i].flags & RVI_MULTIHEAD)) // adjust power if needed
c76c6bc57121 (svn r2400) - Fix: [newgrf] Load power for dual-headed engines correctly
hackykid
parents: 1891
diff changeset
   286
						rvi[i].power /= 2;
c76c6bc57121 (svn r2400) - Fix: [newgrf] Load power for dual-headed engines correctly
hackykid
parents: 1891
diff changeset
   287
					rvi[i].flags |= RVI_MULTIHEAD;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   288
				} else {
1894
c76c6bc57121 (svn r2400) - Fix: [newgrf] Load power for dual-headed engines correctly
hackykid
parents: 1891
diff changeset
   289
					if (rvi[i].flags & RVI_MULTIHEAD) // adjust power if needed
c76c6bc57121 (svn r2400) - Fix: [newgrf] Load power for dual-headed engines correctly
hackykid
parents: 1891
diff changeset
   290
						rvi[i].power *= 2;
c76c6bc57121 (svn r2400) - Fix: [newgrf] Load power for dual-headed engines correctly
hackykid
parents: 1891
diff changeset
   291
					rvi[i].flags &= ~RVI_MULTIHEAD;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   292
				}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   293
			}
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   294
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   295
		case 0x14: { /* Cargo capacity */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   296
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   297
				uint8 capacity = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   298
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   299
				rvi[i].capacity = capacity;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   300
			}
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   301
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   302
		case 0x15: { /* Cargo type */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   303
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   304
				uint8 ctype = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   305
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   306
				rvi[i].cargo_type = ctype;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   307
			}
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   308
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   309
		case 0x16: { /* Weight */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   310
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   311
				uint8 weight = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   312
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   313
				rvi[i].weight = weight;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   314
			}
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   315
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   316
		case 0x17: { /* Cost factor */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   317
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   318
				uint8 cfactor = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   319
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   320
				rvi[i].base_cost = cfactor;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   321
			}
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   322
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   323
		case 0x18: { /* AI rank */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   324
			/* TODO: _railveh_score should be merged to _rail_vehicle_info. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   325
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   326
				grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   327
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   328
			ret = true;
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   329
		} break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   330
		case 0x19: { /* Engine traction type */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   331
			/* TODO: What do the individual numbers mean?
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   332
			 * XXX: And in what base are they, in fact? --pasky */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   333
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   334
				uint8 traction = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   335
				int engclass;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   336
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   337
				if (traction <= 0x07)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   338
					engclass = 0;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   339
				else if (traction <= 0x27)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   340
					engclass = 1;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   341
				else if (traction <= 0x31)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   342
					engclass = 2;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   343
				else
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   344
					break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   345
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   346
				rvi[i].engclass = engclass;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   347
			}
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   348
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   349
		case 0x1B: { /* Powered wagons power bonus */
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   350
			FOR_EACH_OBJECT {
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   351
				uint16 wag_power = grf_load_word(&buf);
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   352
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   353
				rvi[i].pow_wag_power = wag_power;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   354
			}
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   355
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   356
		case 0x1D: { /* Refit cargo */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   357
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   358
				uint32 refit_mask = grf_load_dword(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   359
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   360
				_engine_refit_masks[engine + i] = refit_mask;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   361
			}
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   362
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   363
		case 0x1E: { /* Callback */
1895
0d499b71a782 (svn r2401) - Fix: [newgrf] Finish up callback mechanism, implement 'refit capacity' callback slightly more correct.
hackykid
parents: 1894
diff changeset
   364
			FOR_EACH_OBJECT {
0d499b71a782 (svn r2401) - Fix: [newgrf] Finish up callback mechanism, implement 'refit capacity' callback slightly more correct.
hackykid
parents: 1894
diff changeset
   365
				byte callbacks = grf_load_byte(&buf);
1922
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1908
diff changeset
   366
1895
0d499b71a782 (svn r2401) - Fix: [newgrf] Finish up callback mechanism, implement 'refit capacity' callback slightly more correct.
hackykid
parents: 1894
diff changeset
   367
				rvi[i].callbackmask = callbacks;
0d499b71a782 (svn r2401) - Fix: [newgrf] Finish up callback mechanism, implement 'refit capacity' callback slightly more correct.
hackykid
parents: 1894
diff changeset
   368
			}
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   369
		} break;
1922
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1908
diff changeset
   370
		case 0x21: { /* Shorter vehicle */
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1908
diff changeset
   371
			FOR_EACH_OBJECT {
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1908
diff changeset
   372
				byte shorten_factor = grf_load_byte(&buf);
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1908
diff changeset
   373
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1908
diff changeset
   374
				rvi[i].shorten_factor = shorten_factor;
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1908
diff changeset
   375
			}
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1908
diff changeset
   376
		} break;
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   377
		case 0x22: { /* Visual effect */
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   378
			// see note in engine.h about rvi->visual_effect
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   379
			FOR_EACH_OBJECT {
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   380
				byte visual = grf_load_byte(&buf);
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   381
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   382
				rvi[i].visual_effect = visual;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   383
			}
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   384
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   385
		case 0x23: { /* Powered wagons weight bonus */
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   386
			FOR_EACH_OBJECT {
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   387
				byte wag_weight = grf_load_byte(&buf);
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   388
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   389
				rvi[i].pow_wag_weight = wag_weight;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   390
			}
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   391
		} break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   392
		/* TODO */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   393
		/* Fall-through for unimplemented one byte long properties. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   394
		case 0x1A:	/* Sort order */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   395
		case 0x1C:	/* Refit cost */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   396
		case 0x1F:	/* Tractive effort */
1871
274df24ccd3c (svn r2377) - Fix: [newgrf] Ignore action 0 prop 0x20 (air drag)
orudge
parents: 1862
diff changeset
   397
		case 0x20:	/* Air drag */
1872
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   398
		case 0x24:	/* High byte of vehicle weight */
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   399
		case 0x25:	/* User-defined bit mask to set when checking veh. var. 42 */
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   400
		case 0x26:	/* Retire vehicle early */
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   401
			{
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   402
			/* TODO */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   403
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   404
				grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   405
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   406
			ret = true;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   407
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   408
		default:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   409
			ret = true;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   410
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   411
	*bufp = buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   412
	return ret;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   413
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   414
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   415
static bool RoadVehicleChangeInfo(uint engine, int numinfo, int prop, byte **bufp, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   416
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   417
	RoadVehicleInfo *rvi = &_road_vehicle_info[engine];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   418
	byte *buf = *bufp;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   419
	int i;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   420
	bool ret = false;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   421
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   422
	switch (prop) {
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   423
		case 0x08: { /* Speed */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   424
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   425
				uint8 speed = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   426
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   427
				rvi[i].max_speed = speed; // ?? units
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   428
			}
1968
ce695508b976 (svn r2474) - Fix: [newgrf] Some road vehicle action 0 properties were loaded as the wrong type (int8,int16,int32) causing undefined results. (like cargo types being wrong)
hackykid
parents: 1922
diff changeset
   429
		} break;
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   430
		case 0x09: { /* Running cost factor */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   431
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   432
				uint8 runcost = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   433
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   434
				rvi[i].running_cost = runcost;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   435
			}
1968
ce695508b976 (svn r2474) - Fix: [newgrf] Some road vehicle action 0 properties were loaded as the wrong type (int8,int16,int32) causing undefined results. (like cargo types being wrong)
hackykid
parents: 1922
diff changeset
   436
		} break;
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   437
		case 0x0A: { /* Running cost base */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   438
			/* TODO: I have no idea. --pasky */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   439
			FOR_EACH_OBJECT {
1968
ce695508b976 (svn r2474) - Fix: [newgrf] Some road vehicle action 0 properties were loaded as the wrong type (int8,int16,int32) causing undefined results. (like cargo types being wrong)
hackykid
parents: 1922
diff changeset
   440
				grf_load_dword(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   441
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   442
			ret = true;
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   443
		} break;
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   444
		case 0x0E: { /* Sprite ID */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   445
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   446
				uint8 spriteid = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   447
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   448
				if (spriteid == 0xFF)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   449
					spriteid = 0xFD; // cars have different custom id in the GRF file
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   450
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   451
				// This is currently not used but there's no reason
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   452
				// in not having it here for the future.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   453
				if (spriteid == 0xFD && rvi[i].image_index != 0xFD)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   454
					_engine_original_sprites[ROAD_ENGINES_INDEX + engine + i] = rvi[i].image_index;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   455
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   456
				rvi[i].image_index = spriteid;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   457
			}
1968
ce695508b976 (svn r2474) - Fix: [newgrf] Some road vehicle action 0 properties were loaded as the wrong type (int8,int16,int32) causing undefined results. (like cargo types being wrong)
hackykid
parents: 1922
diff changeset
   458
		} break;
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   459
		case 0x0F: { /* Cargo capacity */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   460
			FOR_EACH_OBJECT {
1968
ce695508b976 (svn r2474) - Fix: [newgrf] Some road vehicle action 0 properties were loaded as the wrong type (int8,int16,int32) causing undefined results. (like cargo types being wrong)
hackykid
parents: 1922
diff changeset
   461
				uint16 capacity = grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   462
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   463
				rvi[i].capacity = capacity;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   464
			}
1968
ce695508b976 (svn r2474) - Fix: [newgrf] Some road vehicle action 0 properties were loaded as the wrong type (int8,int16,int32) causing undefined results. (like cargo types being wrong)
hackykid
parents: 1922
diff changeset
   465
		} break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   466
		case 0x10: { /* Cargo type */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   467
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   468
				uint8 cargo = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   469
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   470
				rvi[i].cargo_type = cargo;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   471
			}
1968
ce695508b976 (svn r2474) - Fix: [newgrf] Some road vehicle action 0 properties were loaded as the wrong type (int8,int16,int32) causing undefined results. (like cargo types being wrong)
hackykid
parents: 1922
diff changeset
   472
		} break;
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   473
		case 0x11: { /* Cost factor */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   474
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   475
				uint8 cost_factor = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   476
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   477
				rvi[i].base_cost = cost_factor; // ?? is it base_cost?
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   478
			}
1968
ce695508b976 (svn r2474) - Fix: [newgrf] Some road vehicle action 0 properties were loaded as the wrong type (int8,int16,int32) causing undefined results. (like cargo types being wrong)
hackykid
parents: 1922
diff changeset
   479
		} break;
1908
2fa391fed79a (svn r2414) - Feature: [newgrf] Implement powered wagons, and the callback that goes with it.
hackykid
parents: 1895
diff changeset
   480
		case 0x12: { /* SFX */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   481
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   482
				uint8 sfx = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   483
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   484
				rvi[i].sfx = sfx;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   485
			}
1968
ce695508b976 (svn r2474) - Fix: [newgrf] Some road vehicle action 0 properties were loaded as the wrong type (int8,int16,int32) causing undefined results. (like cargo types being wrong)
hackykid
parents: 1922
diff changeset
   486
		} break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   487
		case 0x13:      /* Power in 10hp */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   488
		case 0x14:      /* Weight in 1/4 tons */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   489
		case 0x15:      /* Speed in mph*0.8 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   490
			/* TODO: Support for road vehicles realistic power
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   491
			 * computations (called rvpower in TTDPatch) is just
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   492
			 * missing in OTTD yet. --pasky */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   493
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   494
				grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   495
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   496
			ret = true;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   497
			break;
1968
ce695508b976 (svn r2474) - Fix: [newgrf] Some road vehicle action 0 properties were loaded as the wrong type (int8,int16,int32) causing undefined results. (like cargo types being wrong)
hackykid
parents: 1922
diff changeset
   498
		case 0x16: { /* Cargos available for refitting */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   499
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   500
				uint32 refit_mask = grf_load_dword(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   501
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   502
				_engine_refit_masks[ROAD_ENGINES_INDEX + engine + i] = refit_mask;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   503
			}
1968
ce695508b976 (svn r2474) - Fix: [newgrf] Some road vehicle action 0 properties were loaded as the wrong type (int8,int16,int32) causing undefined results. (like cargo types being wrong)
hackykid
parents: 1922
diff changeset
   504
		} break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   505
		case 0x17:      /* Callback */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   506
		case 0x18:      /* Tractive effort */
1872
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   507
		case 0x19:      /* Air drag */
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   508
		case 0x1A:      /* Refit cost */
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   509
		case 0x1B:      /* Retire vehicle early */
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   510
			{
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   511
			/* TODO */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   512
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   513
				grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   514
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   515
			ret = true;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   516
			break;
1873
2b7f22c71e48 (svn r2379) - Fix: [newgrf] Note to self, check thoroughly before committing!
orudge
parents: 1872
diff changeset
   517
		}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   518
		default:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   519
			ret = true;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   520
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   521
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   522
	*bufp = buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   523
	return ret;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   524
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   525
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   526
static bool ShipVehicleChangeInfo(uint engine, int numinfo, int prop, byte **bufp, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   527
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   528
	ShipVehicleInfo *svi = &_ship_vehicle_info[engine];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   529
	byte *buf = *bufp;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   530
	int i;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   531
	bool ret = false;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   532
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   533
	//printf("e %x prop %x?\n", engine, prop);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   534
	switch (prop) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   535
		case 0x08: {	/* Sprite ID */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   536
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   537
				uint8 spriteid = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   538
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   539
				if (spriteid == 0xFF)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   540
					spriteid = 0xFD; // ships have different custom id in the GRF file
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   541
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   542
				// This is currently not used but there's no reason
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   543
				// in not having it here for the future.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   544
				if (spriteid == 0xFD && svi[i].image_index != 0xFD)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   545
					_engine_original_sprites[SHIP_ENGINES_INDEX + engine + i] = svi[i].image_index;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   546
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   547
				svi[i].image_index = spriteid;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   548
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   549
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   550
		case 0x09: {	/* Refittable */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   551
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   552
				uint8 refittable = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   553
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   554
				svi[i].refittable = refittable;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   555
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   556
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   557
		case 0x0A: {	/* Cost factor */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   558
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   559
				uint8 cost_factor = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   560
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   561
				svi[i].base_cost = cost_factor; // ?? is it base_cost?
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   562
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   563
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   564
		case 0x0B: {	/* Speed */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   565
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   566
				uint8 speed = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   567
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   568
				svi[i].max_speed = speed; // ?? units
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   569
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   570
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   571
		case 0x0C: { /* Cargo type */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   572
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   573
				uint8 cargo = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   574
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   575
				// XXX: Need to consult this with patchman yet.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   576
#if 0
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   577
				// Documentation claims this is already the
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   578
				// per-landscape cargo type id, but newships.grf
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   579
				// assume otherwise.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   580
				cargo = local_cargo_id_ctype[cargo];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   581
#endif
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   582
				svi[i].cargo_type = cargo;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   583
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   584
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   585
		case 0x0D: {	/* Cargo capacity */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   586
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   587
				uint16 capacity = grf_load_word(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   588
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   589
				svi[i].capacity = capacity;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   590
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   591
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   592
		case 0x0F: {	/* Running cost factor */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   593
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   594
				uint8 runcost = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   595
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   596
				svi[i].running_cost = runcost;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   597
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   598
		} break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   599
		case 0x10: {	/* SFX */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   600
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   601
				uint8 sfx = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   602
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   603
				svi[i].sfx = sfx;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   604
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   605
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   606
		case 0x11: {	/* Cargos available for refitting */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   607
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   608
				uint32 refit_mask = grf_load_dword(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   609
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   610
				_engine_refit_masks[SHIP_ENGINES_INDEX + engine + i] = refit_mask;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   611
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   612
		}	break;
1872
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   613
		case 0x12: /* Callback */
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   614
		case 0x13: /* Refit cost */
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   615
		case 0x14: /* Ocean speed fraction */
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   616
		case 0x15: /* Canal speed fraction */
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   617
		case 0x16: /* Retire vehicle early */
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   618
		{
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   619
			/* TODO */
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   620
			FOR_EACH_OBJECT {
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   621
				grf_load_byte(&buf);
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   622
			}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   623
			ret = true;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   624
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   625
		default:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   626
			ret = true;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   627
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   628
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   629
	*bufp = buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   630
	return ret;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   631
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   632
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   633
static bool AircraftVehicleChangeInfo(uint engine, int numinfo, int prop, byte **bufp, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   634
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   635
	AircraftVehicleInfo *avi = &_aircraft_vehicle_info[engine];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   636
	byte *buf = *bufp;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   637
	int i;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   638
	bool ret = false;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   639
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   640
	//printf("e %x prop %x?\n", engine, prop);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   641
	switch (prop) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   642
		case 0x08: {	/* Sprite ID */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   643
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   644
				uint8 spriteid = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   645
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   646
				if (spriteid == 0xFF)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   647
					spriteid = 0xFD; // ships have different custom id in the GRF file
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   648
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   649
				// This is currently not used but there's no reason
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   650
				// in not having it here for the future.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   651
				if (spriteid == 0xFD && avi[i].image_index != 0xFD)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   652
					_engine_original_sprites[AIRCRAFT_ENGINES_INDEX + engine + i] = avi[i].image_index;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   653
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   654
				avi[i].image_index = spriteid;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   655
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   656
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   657
		case 0x09: {	/* Helicopter */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   658
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   659
				uint8 heli = grf_load_byte(&buf);
1180
4150adacc060 (svn r1682) - Fix: [newgrf] Helicopters from grf sets are now correctly recognized
dominik
parents: 922
diff changeset
   660
				avi[i].subtype &= ~0x01; // remove old property
1183
9044bf94026b (svn r1685) - Fix: [newgrf] airplanes from grf sets are not treated as helicopters, as introduced in r1682
dominik
parents: 1180
diff changeset
   661
				avi[i].subtype |= (heli == 0) ? 0 : 1;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   662
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   663
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   664
		case 0x0A: {	/* Large */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   665
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   666
				uint8 large = grf_load_byte(&buf);
1180
4150adacc060 (svn r1682) - Fix: [newgrf] Helicopters from grf sets are now correctly recognized
dominik
parents: 922
diff changeset
   667
				avi[i].subtype &= ~0x02; // remove old property
1183
9044bf94026b (svn r1685) - Fix: [newgrf] airplanes from grf sets are not treated as helicopters, as introduced in r1682
dominik
parents: 1180
diff changeset
   668
				avi[i].subtype |= (large == 1) ? 2 : 0;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   669
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   670
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   671
		case 0x0B: {	/* Cost factor */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   672
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   673
				uint8 cost_factor = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   674
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   675
				avi[i].base_cost = cost_factor; // ?? is it base_cost?
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   676
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   677
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   678
		case 0x0C: {	/* Speed */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   679
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   680
				uint8 speed = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   681
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   682
				avi[i].max_speed = speed; // ?? units
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   683
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   684
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   685
		case 0x0D: {	/* Acceleration */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   686
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   687
				uint8 accel = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   688
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   689
				avi[i].acceleration = accel;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   690
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   691
		} break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   692
		case 0x0E: {	/* Running cost factor */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   693
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   694
				uint8 runcost = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   695
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   696
				avi[i].running_cost = runcost;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   697
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   698
		} break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   699
		case 0x0F: {	/* Passenger capacity */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   700
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   701
				uint16 capacity = grf_load_word(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   702
922
10035216cbaf (svn r1410) Replaced all occurences of 'passanger' by 'passenger' in the code
celestar
parents: 542
diff changeset
   703
				avi[i].passenger_capacity = capacity;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   704
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   705
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   706
		case 0x11: {	/* Mail capacity */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   707
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   708
				uint8 capacity = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   709
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   710
				avi[i].mail_capacity = capacity;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   711
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   712
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   713
		case 0x12: {	/* SFX */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   714
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   715
				uint8 sfx = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   716
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   717
				avi[i].sfx = sfx;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   718
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   719
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   720
		case 0x13: {	/* Cargos available for refitting */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   721
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   722
				uint32 refit_mask = grf_load_dword(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   723
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   724
				_engine_refit_masks[AIRCRAFT_ENGINES_INDEX + engine + i] = refit_mask;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   725
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   726
		}	break;
1872
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   727
		case 0x14: /* Callback */
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   728
		case 0x15: /* Refit cost */
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   729
		case 0x16: /* Retire vehicle early */
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   730
		{
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   731
			/* TODO */
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   732
			FOR_EACH_OBJECT {
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   733
				grf_load_byte(&buf);
4041ff29ee8e (svn r2378) - Fix: [newgrf] Further property stubs, help prevents subsequent incorrect reading of newgrf data
orudge
parents: 1871
diff changeset
   734
			}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   735
			ret = true;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   736
		}	break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   737
		default:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   738
			ret = true;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   739
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   740
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   741
	*bufp = buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   742
	return ret;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   743
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   744
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   745
static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   746
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   747
	byte *buf = *bufp;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   748
	int i;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   749
	int ret = 0;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   750
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   751
	/* This is one single huge TODO. It doesn't handle anything more than
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   752
	 * just waypoints for now. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   753
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   754
	//printf("sci %d %d [0x%02x]\n", stid, numinfo, prop);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   755
	switch (prop) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   756
		case 0x08:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   757
		{	/* Class ID */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   758
			FOR_EACH_OBJECT {
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   759
				StationSpec *stat = &_cur_grffile->stations[stid + i];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   760
				uint32 classid;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   761
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   762
				/* classid, for a change, is always little-endian */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   763
				classid = *(buf++) << 24;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   764
				classid |= *(buf++) << 16;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   765
				classid |= *(buf++) << 8;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   766
				classid |= *(buf++);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   767
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   768
				switch (classid) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   769
					case 'DFLT':
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   770
						stat->sclass = STAT_CLASS_DFLT;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   771
						break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   772
					case 'WAYP':
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   773
						stat->sclass = STAT_CLASS_WAYP;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   774
						break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   775
					default:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   776
						/* TODO: No support for custom
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   777
						 * classes for now, so stuff
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   778
						 * everything to the single
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   779
						 * default one. --pasky */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   780
						stat->sclass = STAT_CLASS_DFLT;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   781
						//stat->sclass = STAT_CLASS_CUSTOM;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   782
						break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   783
				}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   784
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   785
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   786
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   787
		case 0x09:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   788
		{	/* Define sprite layout */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   789
			FOR_EACH_OBJECT {
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   790
				StationSpec *stat = &_cur_grffile->stations[stid + i];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   791
				int t;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   792
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   793
				stat->tiles = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   794
				for (t = 0; t < stat->tiles; t++) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   795
					DrawTileSprites *dts = &stat->renderdata[t];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   796
					int seq_count = 0;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   797
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   798
					if (t >= 8) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   799
						grfmsg(GMS_WARN, "StationChangeInfo: Sprite %d>=8, skipping.", t);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   800
						grf_load_dword(&buf); // at least something
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   801
						continue;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   802
					}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   803
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   804
					dts->ground_sprite = grf_load_dword(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   805
					if (!dts->ground_sprite) {
536
03d80fecb999 (svn r907) Sprinkle holy ANSI water:
tron
parents: 500
diff changeset
   806
						static const DrawTileSeqStruct empty = {0x80, 0, 0, 0, 0, 0, 0};
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   807
						dts->seq = &empty;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   808
						continue;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   809
					}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   810
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   811
					dts->seq = NULL;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   812
					while (buf < *bufp + len) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   813
						DrawTileSeqStruct *dtss;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   814
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   815
						// no relative bounding box support
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   816
						dts->seq = realloc((void*)dts->seq, ++seq_count * sizeof(DrawTileSeqStruct));
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   817
						dtss = (DrawTileSeqStruct*) &dts->seq[seq_count - 1];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   818
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   819
						dtss->delta_x = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   820
						if ((byte) dtss->delta_x == 0x80) break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   821
						dtss->delta_y = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   822
						dtss->delta_z = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   823
						dtss->width = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   824
						dtss->height = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   825
						dtss->unk = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   826
						dtss->image = grf_load_dword(&buf) - 0x42d;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   827
					}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   828
				}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   829
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   830
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   831
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   832
		case 0x0a:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   833
		{	/* Copy sprite layout */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   834
			FOR_EACH_OBJECT {
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   835
				StationSpec *stat = &_cur_grffile->stations[stid + i];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   836
				byte srcid = grf_load_byte(&buf);
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   837
				StationSpec *srcstat = &_cur_grffile->stations[srcid];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   838
				int t;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   839
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   840
				stat->tiles = srcstat->tiles;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   841
				for (t = 0; t < stat->tiles; t++) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   842
					DrawTileSprites *dts = &stat->renderdata[t];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   843
					DrawTileSprites *sdts = &srcstat->renderdata[t];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   844
					DrawTileSeqStruct const *sdtss = sdts->seq;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   845
					int seq_count = 0;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   846
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   847
					dts->ground_sprite = sdts->ground_sprite;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   848
					if (!dts->ground_sprite) {
536
03d80fecb999 (svn r907) Sprinkle holy ANSI water:
tron
parents: 500
diff changeset
   849
						static const DrawTileSeqStruct empty = {0x80, 0, 0, 0, 0, 0, 0};
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   850
						dts->seq = &empty;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   851
						continue;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   852
					}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   853
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   854
					dts->seq = NULL;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   855
					while (1) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   856
						DrawTileSeqStruct *dtss;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   857
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   858
						// no relative bounding box support
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   859
						dts->seq = realloc((void*)dts->seq, ++seq_count * sizeof(DrawTileSeqStruct));
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   860
						dtss = (DrawTileSeqStruct*) &dts->seq[seq_count - 1];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   861
						*dtss = *sdtss;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   862
						if ((byte) dtss->delta_x == 0x80) break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   863
						sdtss++;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   864
					}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   865
				}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   866
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   867
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   868
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   869
		case 0x0b:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   870
		{	/* Callback */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   871
			/* TODO */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   872
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   873
				grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   874
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   875
			ret = 1;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   876
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   877
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   878
		case 0x0C:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   879
		{	/* Platforms number */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   880
			FOR_EACH_OBJECT {
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   881
				StationSpec *stat = &_cur_grffile->stations[stid + i];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   882
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   883
				stat->allowed_platforms = ~grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   884
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   885
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   886
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   887
		case 0x0D:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   888
		{	/* Platforms length */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   889
			FOR_EACH_OBJECT {
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   890
				StationSpec *stat = &_cur_grffile->stations[stid + i];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   891
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   892
				stat->allowed_lengths = ~grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   893
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   894
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   895
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   896
		case 0x0e:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   897
		{	/* Define custom layout */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   898
			FOR_EACH_OBJECT {
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
   899
				StationSpec *stat = &_cur_grffile->stations[stid + i];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   900
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   901
				while (buf < *bufp + len) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   902
					byte length = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   903
					byte number = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   904
					StationLayout layout;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   905
					int l, p;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   906
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   907
					if (length == 0 || number == 0) break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   908
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   909
					//debug("l %d > %d ?", length, stat->lengths);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   910
					if (length > stat->lengths) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   911
						stat->platforms = realloc(stat->platforms, length);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   912
						memset(stat->platforms + stat->lengths, 0, length - stat->lengths);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   913
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   914
						stat->layouts = realloc(stat->layouts, length * sizeof(*stat->layouts));
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   915
						memset(stat->layouts + stat->lengths, 0,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   916
						       (length - stat->lengths) * sizeof(*stat->layouts));
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   917
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   918
						stat->lengths = length;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   919
					}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   920
					l = length - 1; // index is zero-based
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   921
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   922
					//debug("p %d > %d ?", number, stat->platforms[l]);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   923
					if (number > stat->platforms[l]) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   924
						stat->layouts[l] = realloc(stat->layouts[l],
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   925
						                               number * sizeof(**stat->layouts));
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   926
						// We expect NULL being 0 here, but C99 guarantees that.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   927
						memset(stat->layouts[l] + stat->platforms[l], 0,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   928
						       (number - stat->platforms[l]) * sizeof(**stat->layouts));
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   929
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   930
						stat->platforms[l] = number;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   931
					}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   932
542
de27e74b11bd (svn r939) -Fix: Fixed compiler errors
truelight
parents: 536
diff changeset
   933
					p = 0;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   934
					layout = malloc(length * number);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   935
					for (l = 0; l < length; l++)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   936
						for (p = 0; p < number; p++)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   937
							layout[l * number + p] = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   938
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   939
					l--;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   940
					p--;
542
de27e74b11bd (svn r939) -Fix: Fixed compiler errors
truelight
parents: 536
diff changeset
   941
					assert(p >= 0);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   942
					free(stat->layouts[l][p]);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   943
					stat->layouts[l][p] = layout;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   944
				}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   945
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   946
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   947
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   948
		case 0x0f:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   949
		{	/* Copy custom layout */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   950
			/* TODO */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   951
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   952
				grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   953
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   954
			ret = 1;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   955
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   956
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   957
		case 0x10:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   958
		{	/* Little/lots cargo threshold */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   959
			/* TODO */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   960
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   961
				grf_load_word(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   962
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   963
			ret = 1;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   964
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   965
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   966
		case 0x11:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   967
		{	/* Pylon placement */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   968
			/* TODO; makes sense only for electrified tracks */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   969
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   970
				grf_load_word(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   971
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   972
			ret = 1;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   973
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   974
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   975
		case 0x12:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   976
		{	/* Cargo types for random triggers */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   977
			/* TODO */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   978
			FOR_EACH_OBJECT {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   979
				grf_load_dword(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   980
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   981
			ret = 1;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   982
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   983
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   984
		default:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   985
			ret = 1;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   986
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   987
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   988
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   989
	*bufp = buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   990
	return ret;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   991
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   992
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   993
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   994
/* Action 0x00 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   995
static void VehicleChangeInfo(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   996
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   997
	byte *bufend = buf + len;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   998
	int i;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
   999
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1000
	/* <00> <feature> <num-props> <num-info> <id> (<property <new-info>)...
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1001
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1002
	 * B feature       0, 1, 2 or 3 for trains, road vehicles, ships or planes
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1003
	 *                 4 for defining new train station sets
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1004
	 * B num-props     how many properties to change per vehicle/station
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1005
	 * B num-info      how many vehicles/stations to change
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1006
	 * B id            ID of first vehicle/station to change, if num-info is
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1007
	 *                 greater than one, this one and the following
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1008
	 *                 vehicles/stations will be changed
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1009
	 * B property      what property to change, depends on the feature
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1010
	 * V new-info      new bytes of info (variable size; depends on properties) */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1011
	/* TODO: Bridges, town houses. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1012
2438
f0bf4adbd620 (svn r2964) Fix: newgrf: Include missing grf feature canal.
peter1138
parents: 2421
diff changeset
  1013
	static const VCI_Handler handler[] = {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1014
		/* GSF_TRAIN */    RailVehicleChangeInfo,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1015
		/* GSF_ROAD */     RoadVehicleChangeInfo,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1016
		/* GSF_SHIP */     ShipVehicleChangeInfo,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1017
		/* GSF_AIRCRAFT */ AircraftVehicleChangeInfo,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1018
		/* GSF_STATION */  StationChangeInfo,
2438
f0bf4adbd620 (svn r2964) Fix: newgrf: Include missing grf feature canal.
peter1138
parents: 2421
diff changeset
  1019
		/* GSF_CANAL */    NULL,
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1020
		/* GSF_BRIDGE */   NULL,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1021
		/* GSF_TOWNHOUSE */NULL,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1022
	};
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1023
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1024
	uint8 feature;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1025
	uint8 numprops;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1026
	uint8 numinfo;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1027
	byte engine;
542
de27e74b11bd (svn r939) -Fix: Fixed compiler errors
truelight
parents: 536
diff changeset
  1028
	EngineInfo *ei = NULL;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1029
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1030
	if (len == 1) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1031
		DEBUG(grf, 8) ("Silently ignoring one-byte special sprite 0x00.");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1032
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1033
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1034
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1035
	check_length(len, 6, "VehicleChangeInfo");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1036
	feature = buf[1];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1037
	numprops = buf[2];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1038
	numinfo = buf[3];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1039
	engine = buf[4];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1040
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1041
	DEBUG(grf, 6) ("VehicleChangeInfo: Feature %d, %d properties, to apply to %d+%d",
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1042
	               feature, numprops, engine, numinfo);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1043
2440
d0c69700c72e (svn r2966) Fix: newgrf: Replace special case with a check for the existence of a handler in VehicleChangeInfo.
peter1138
parents: 2439
diff changeset
  1044
	if (feature >= lengthof(handler) || handler[feature] == NULL) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1045
		grfmsg(GMS_WARN, "VehicleChangeInfo: Unsupported feature %d, skipping.", feature);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1046
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1047
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1048
2439
b4962381b5b5 (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  1049
	if (feature <= GSF_AIRCRAFT) {
b4962381b5b5 (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  1050
		if (engine + numinfo > _vehcounts[feature]) {
b4962381b5b5 (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  1051
			grfmsg(GMS_ERROR, "VehicleChangeInfo: Last engine ID %d out of bounds (max %d), skipping.", engine + numinfo, _vehcounts[feature]);
b4962381b5b5 (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  1052
			return;
b4962381b5b5 (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  1053
		}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1054
		ei = &_engine_info[engine + _vehshifts[feature]];
2439
b4962381b5b5 (svn r2965) Fix: newgrf: Add bounds checking to VehicleChangeInfo for vehicles and change
peter1138
parents: 2438
diff changeset
  1055
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1056
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1057
	buf += 5;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1058
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1059
	while (numprops-- && buf < bufend) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1060
		uint8 prop = grf_load_byte(&buf);
2421
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1061
		bool ignoring = false;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1062
2421
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1063
		switch (feature) {
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1064
			case GSF_TRAIN:
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1065
			case GSF_ROAD:
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1066
			case GSF_SHIP:
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1067
			case GSF_AIRCRAFT:
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1068
				/* Common properties for vehicles */
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1069
				switch (prop) {
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1070
					case 0x00: { /* Introduction date */
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1071
						FOR_EACH_OBJECT {
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1072
							uint16 date = grf_load_word(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1073
2421
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1074
							ei[i].base_intro = date;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1075
						}
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1076
					}	break;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1077
					case 0x02: { /* Decay speed */
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1078
						FOR_EACH_OBJECT {
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1079
							uint8 decay = grf_load_byte(&buf);
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1080
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1081
							ei[i].unk2 &= 0x80;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1082
							ei[i].unk2 |= decay & 0x7f;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1083
						}
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1084
					}	break;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1085
					case 0x03: { /* Vehicle life */
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1086
						FOR_EACH_OBJECT {
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1087
							uint8 life = grf_load_byte(&buf);
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1088
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1089
							ei[i].lifelength = life;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1090
						}
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1091
					}	break;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1092
					case 0x04: { /* Model life */
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1093
						FOR_EACH_OBJECT {
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1094
							uint8 life = grf_load_byte(&buf);
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1095
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1096
							ei[i].base_life = life;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1097
						}
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1098
					}	break;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1099
					case 0x06: { /* Climates available */
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1100
						FOR_EACH_OBJECT {
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1101
							uint8 climates = grf_load_byte(&buf);
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1102
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1103
							ei[i].railtype_climates &= 0xf0;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1104
							ei[i].railtype_climates |= climates;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1105
						}
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1106
					}	break;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1107
					case 0x07: { /* Loading speed */
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1108
						/* TODO */
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1109
						/* Hyronymus explained me what does
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1110
						 * this mean and insists on having a
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1111
						 * credit ;-). --pasky */
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1112
						/* TODO: This needs to be supported by
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1113
						 * LoadUnloadVehicle() first. */
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1114
						FOR_EACH_OBJECT {
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1115
							grf_load_byte(&buf);
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1116
						}
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1117
						ignoring = true;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1118
						break;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1119
					}
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1120
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1121
					default:
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1122
						if (handler[feature](engine, numinfo, prop, &buf, bufend - buf))
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1123
							ignoring = true;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1124
						break;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1125
				}
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1126
				break;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1127
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1128
			default:
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1129
				if (handler[feature](engine, numinfo, prop, &buf, bufend - buf))
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1130
					ignoring = true;
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1131
				break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1132
		}
2421
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1133
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1134
		if (ignoring)
8bc8ff3a5eb5 (svn r2947) Reorder some code to prepare for future enhancements and get rid of some gotos (peter1138)
tron
parents: 2400
diff changeset
  1135
			grfmsg(GMS_NOTICE, "VehicleChangeInfo: Ignoring property %x (not implemented).", prop);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1136
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1137
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1138
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1139
#undef FOR_EACH_OBJECT
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1140
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1141
/**
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1142
 * Creates a spritegroup representing a callback result
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1143
 * @param value The value that was used to represent this callback result
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1144
 * @return A spritegroup representing that callback result
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1145
 */
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1146
SpriteGroup NewCallBackResult(uint16 value)
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1147
{
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1148
	SpriteGroup group;
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1149
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1150
	group.type = SGT_CALLBACK;
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1151
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1152
	// Old style callback results have the highest byte 0xFF so signify it is a callback result
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1153
	// New style ones only have the highest bit set (allows 15-bit results, instead of just 8)
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1154
	if ((value >> 8) == 0xFF)
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1155
		value &= 0xFF;
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1156
	else
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1157
		value &= ~0x8000;
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1158
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1159
	group.g.callback.result = value;
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1160
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1161
	return group;
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1162
}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1163
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1164
/* Action 0x01 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1165
static void NewSpriteSet(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1166
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1167
	/* <01> <feature> <num-sets> <num-ent>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1168
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1169
	 * B feature       feature to define sprites for
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1170
	 *                 0, 1, 2, 3: veh-type, 4: train stations
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1171
	 * B num-sets      number of sprite sets
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1172
	 * E num-ent       how many entries per sprite set
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1173
	 *                 For vehicles, this is the number of different
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1174
	 *                         vehicle directions in each sprite set
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1175
	 *                         Set num-dirs=8, unless your sprites are symmetric.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1176
	 *                         In that case, use num-dirs=4.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1177
	 *                 For stations, must be 12 (hex) for the eighteen
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1178
	 *                         different sprites that make up a station */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1179
	/* TODO: No stations support. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1180
	uint8 feature;
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1181
	uint num_sets;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1182
	uint num_ents;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1183
	uint i;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1184
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1185
	check_length(len, 4, "NewSpriteSet");
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1186
	buf++;
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1187
	feature  = grf_load_byte(&buf);
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1188
	num_sets = grf_load_byte(&buf);
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1189
	num_ents = grf_load_extended(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1190
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1191
	_cur_grffile->spriteset_start = _cur_spriteid;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1192
	_cur_grffile->spriteset_feature = feature;
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1193
	_cur_grffile->spriteset_numsets = num_sets;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1194
	_cur_grffile->spriteset_numents = num_ents;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1195
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1196
	DEBUG(grf, 7) (
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1197
		"New sprite set at %d of type %d, "
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1198
		"consisting of %d sets with %d views each (total %d)",
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1199
		_cur_spriteid, feature, num_sets, num_ents, num_sets * num_ents
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1200
	);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1201
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1202
	for (i = 0; i < num_sets * num_ents; i++) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1203
		LoadNextSprite(_cur_spriteid++, _file_index);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1204
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1205
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1206
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1207
/* Action 0x02 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1208
static void NewSpriteGroup(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1209
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1210
	byte *bufend = buf + len;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1211
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1212
	/* <02> <feature> <set-id> <type/num-entries> <feature-specific-data...>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1213
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1214
	 * B feature       see action 1
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1215
	 * B set-id        ID of this particular definition
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1216
	 * B type/num-entries
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1217
	 *                 if 80 or greater, this is a randomized or variational
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1218
	 *                 list definition, see below
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1219
	 *                 otherwise it specifies a number of entries, the exact
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1220
	 *                 meaning depends on the feature
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1221
	 * V feature-specific-data (huge mess, don't even look it up --pasky) */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1222
	/* TODO: No 0x80-types (ugh). */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1223
	/* TODO: Also, empty sprites aren't handled for now. Need to investigate
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1224
	 * the "opacity" rules for these, that is which sprite to fall back to
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1225
	 * when. --pasky */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1226
	uint8 feature;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1227
	uint8 setid;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1228
	/* XXX: For stations, these two are "little cargo" and "lotsa cargo" sets. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1229
	uint8 numloaded;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1230
	uint8 numloading;
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
  1231
	SpriteGroup *group;
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
  1232
	RealSpriteGroup *rg;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1233
	byte *loaded_ptr;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1234
	byte *loading_ptr;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1235
	int i;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1236
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1237
	check_length(len, 5, "NewSpriteGroup");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1238
	feature = buf[1];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1239
	setid = buf[2];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1240
	numloaded = buf[3];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1241
	numloading = buf[4];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1242
2444
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1243
	if (setid >= _cur_grffile->spritegroups_count) {
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1244
		_cur_grffile->spritegroups_count = setid + 1;
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1245
		_cur_grffile->spritegroups = realloc(_cur_grffile->spritegroups, _cur_grffile->spritegroups_count * sizeof(*_cur_grffile->spritegroups));
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1246
	}
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1247
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1248
	if (numloaded == 0x81 || numloaded == 0x82) {
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
  1249
		DeterministicSpriteGroup *dg;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1250
		uint16 groupid;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1251
		int i;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1252
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1253
		// Ok, this is gonna get a little wild, so hold your breath...
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1254
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1255
		/* This stuff is getting actually evaluated in
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1256
		 * EvalDeterministicSpriteGroup(). */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1257
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1258
		buf += 4; len -= 4;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1259
		check_length(len, 6, "NewSpriteGroup 0x81/0x82");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1260
2444
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1261
		group = calloc(1, sizeof(*group));
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1262
		group->type = SGT_DETERMINISTIC;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1263
		dg = &group->g.determ;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1264
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1265
		/* XXX: We don't free() anything, assuming that if there was
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1266
		 * some action here before, it got associated by action 3.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1267
		 * We should perhaps keep some refcount? --pasky */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1268
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1269
		dg->var_scope = numloaded == 0x82 ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1270
		dg->variable = grf_load_byte(&buf);
2445
6304552c6492 (svn r2971) - Newgrf: Support loading VarAction2 parameter for variables 0x60-0x7F. This parameter isn't used yet.
peter1138
parents: 2444
diff changeset
  1271
		/* Variables 0x60 - 0x7F include an extra parameter */
6304552c6492 (svn r2971) - Newgrf: Support loading VarAction2 parameter for variables 0x60-0x7F. This parameter isn't used yet.
peter1138
parents: 2444
diff changeset
  1272
		if (IS_BYTE_INSIDE(dg->variable, 0x60, 0x80))
6304552c6492 (svn r2971) - Newgrf: Support loading VarAction2 parameter for variables 0x60-0x7F. This parameter isn't used yet.
peter1138
parents: 2444
diff changeset
  1273
			dg->parameter = grf_load_byte(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1274
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1275
		dg->shift_num = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1276
		dg->and_mask = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1277
		dg->operation = dg->shift_num >> 6; /* w00t */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1278
		dg->shift_num &= 0x3F;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1279
		if (dg->operation != DSG_OP_NONE) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1280
			dg->add_val = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1281
			dg->divmod_val = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1282
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1283
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1284
		/* (groupid & 0x8000) means this is callback result. */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1285
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1286
		dg->num_ranges = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1287
		dg->ranges = calloc(dg->num_ranges, sizeof(*dg->ranges));
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1288
		for (i = 0; i < dg->num_ranges; i++) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1289
			groupid = grf_load_word(&buf);
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1290
			if (groupid & 0x8000) {
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1291
				dg->ranges[i].group = NewCallBackResult(groupid);
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1292
			} else if (groupid >= _cur_grffile->spritegroups_count) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1293
				/* This doesn't exist for us. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1294
				grf_load_word(&buf); // skip range
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1295
				i--; dg->num_ranges--;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1296
				continue;
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1297
			} else {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1298
			/* XXX: If multiple surreal sets attach a surreal
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1299
			 * set this way, we are in trouble. */
2444
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1300
				dg->ranges[i].group = *_cur_grffile->spritegroups[groupid];
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1301
			}
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1302
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1303
			dg->ranges[i].low = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1304
			dg->ranges[i].high = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1305
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1306
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1307
		groupid = grf_load_word(&buf);
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1308
		if (groupid & 0x8000) {
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1309
			dg->default_group = malloc(sizeof(*dg->default_group));
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1310
			*dg->default_group = NewCallBackResult(groupid);
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1311
		} else if (groupid >= _cur_grffile->spritegroups_count) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1312
			/* This spritegroup stinks. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1313
			free(dg->ranges), dg->ranges = NULL;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1314
			grfmsg(GMS_WARN, "NewSpriteGroup(%02x:0x%x): Default groupid %04x is cargo callback or unknown, ignoring spritegroup.", setid, numloaded, groupid);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1315
			return;
1883
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1316
		} else {
ad68cd0a0a25 (svn r2389) - Feature: [newgrf] Implement the mechanism for handling newgrf callbacks.
hackykid
parents: 1873
diff changeset
  1317
			dg->default_group = malloc(sizeof(*dg->default_group));
2444
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1318
			memcpy(dg->default_group, _cur_grffile->spritegroups[groupid], sizeof(*dg->default_group));
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1319
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1320
2444
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1321
		_cur_grffile->spritegroups[setid] = group;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1322
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1323
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1324
	} else if (numloaded == 0x80 || numloaded == 0x83) {
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
  1325
		RandomizedSpriteGroup *rg;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1326
		int i;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1327
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1328
		/* This stuff is getting actually evaluated in
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1329
		 * EvalRandomizedSpriteGroup(). */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1330
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1331
		buf += 4;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1332
		len -= 4;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1333
		check_length(len, 6, "NewSpriteGroup 0x80/0x83");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1334
2444
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1335
		group = calloc(1, sizeof(*group));
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1336
		group->type = SGT_RANDOMIZED;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1337
		rg = &group->g.random;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1338
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1339
		/* XXX: We don't free() anything, assuming that if there was
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1340
		 * some action here before, it got associated by action 3.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1341
		 * We should perhaps keep some refcount? --pasky */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1342
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1343
		rg->var_scope = numloaded == 0x83 ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1344
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1345
		rg->triggers = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1346
		rg->cmp_mode = rg->triggers & 0x80;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1347
		rg->triggers &= 0x7F;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1348
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1349
		rg->lowest_randbit = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1350
		rg->num_groups = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1351
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1352
		rg->groups = calloc(rg->num_groups, sizeof(*rg->groups));
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1353
		for (i = 0; i < rg->num_groups; i++) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1354
			uint16 groupid = grf_load_word(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1355
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1356
			if (groupid & 0x8000 || groupid >= _cur_grffile->spritegroups_count) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1357
				/* This doesn't exist for us. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1358
				i--;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1359
				rg->num_groups--;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1360
				continue;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1361
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1362
			/* XXX: If multiple surreal sets attach a surreal
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1363
			 * set this way, we are in trouble. */
2444
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1364
			rg->groups[i] = *_cur_grffile->spritegroups[groupid];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1365
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1366
2444
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1367
		_cur_grffile->spritegroups[setid] = group;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1368
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1369
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1370
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1371
	if (!_cur_grffile->spriteset_start) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1372
		grfmsg(GMS_ERROR, "NewSpriteGroup: No sprite set to work on! Skipping.");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1373
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1374
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1375
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1376
	if (_cur_grffile->spriteset_feature != feature) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1377
		grfmsg(GMS_ERROR, "NewSpriteGroup: Group feature %x doesn't match set feature %x! Playing it risky and trying to use it anyway.", feature, _cur_grffile->spriteset_feature);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1378
		// return; // XXX: we can't because of MB's newstats.grf --pasky
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1379
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1380
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1381
	check_length(bufend - buf, 5, "NewSpriteGroup");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1382
	buf += 5;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1383
	check_length(bufend - buf, 2 * numloaded, "NewSpriteGroup");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1384
	loaded_ptr = buf;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1385
	loading_ptr = buf + 2 * numloaded;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1386
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1387
	if (numloaded > 16) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1388
		grfmsg(GMS_WARN, "NewSpriteGroup: More than 16 sprites in group %x, skipping the rest.", setid);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1389
		numloaded = 16;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1390
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1391
	if (numloading > 16) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1392
		grfmsg(GMS_WARN, "NewSpriteGroup: More than 16 sprites in group %x, skipping the rest.", setid);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1393
		numloading = 16;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1394
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1395
2444
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1396
	group = calloc(1, sizeof(*group));
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1397
	group->type = SGT_REAL;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1398
	rg = &group->g.real;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1399
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1400
	rg->sprites_per_set = _cur_grffile->spriteset_numents;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1401
	rg->loaded_count  = numloaded;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1402
	rg->loading_count = numloading;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1403
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1404
	DEBUG(grf, 6) ("NewSpriteGroup: New SpriteGroup 0x%02hhx, %u views, %u loaded, %u loading, sprites %u - %u",
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1405
			setid, rg->sprites_per_set, rg->loaded_count, rg->loading_count,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1406
			_cur_grffile->spriteset_start - _cur_grffile->sprite_offset,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1407
			_cur_grffile->spriteset_start + (_cur_grffile->spriteset_numents * (numloaded + numloading)) - _cur_grffile->sprite_offset);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1408
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1409
	for (i = 0; i < numloaded; i++) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1410
		uint16 spriteset_id = grf_load_word(&loaded_ptr);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1411
		rg->loaded[i] = _cur_grffile->spriteset_start + spriteset_id * _cur_grffile->spriteset_numents;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1412
		DEBUG(grf, 8) ("NewSpriteGroup: + rg->loaded[%i]  = %u (subset %u)", i, rg->loaded[i], spriteset_id);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1413
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1414
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1415
	for (i = 0; i < numloading; i++) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1416
		uint16 spriteset_id = grf_load_word(&loading_ptr);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1417
		rg->loading[i] = _cur_grffile->spriteset_start + spriteset_id * _cur_grffile->spriteset_numents;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1418
		DEBUG(grf, 8) ("NewSpriteGroup: + rg->loading[%i] = %u (subset %u)", i, rg->loading[i], spriteset_id);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1419
	}
2444
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1420
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1421
	_cur_grffile->spritegroups[setid] = group;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1422
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1423
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1424
/* Action 0x03 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1425
static void NewVehicle_SpriteGroupMapping(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1426
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1427
	/* <03> <feature> <n-id> <ids>... <num-cid> [<cargo-type> <cid>]... <def-cid>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1428
	 * id-list	:= [<id>] [id-list]
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1429
	 * cargo-list	:= <cargo-type> <cid> [cargo-list]
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1430
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1431
	 * B feature       see action 0
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1432
	 * B n-id          bits 0-6: how many IDs this definition applies to
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1433
	 *                 bit 7: if set, this is a wagon override definition (see below)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1434
	 * B ids           the IDs for which this definition applies
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1435
	 * B num-cid       number of cargo IDs (sprite group IDs) in this definition
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1436
	 *                 can be zero, in that case the def-cid is used always
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1437
	 * B cargo-type    type of this cargo type (e.g. mail=2, wood=7, see below)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1438
	 * W cid           cargo ID (sprite group ID) for this type of cargo
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1439
	 * W def-cid       default cargo ID (sprite group ID) */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1440
	/* TODO: Bridges, town houses. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1441
	/* TODO: Multiple cargo support could be useful even for trains/cars -
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1442
	 * cargo id 0xff is used for showing images in the build train list. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1443
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1444
	static byte *last_engines;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1445
	static int last_engines_count;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1446
	uint8 feature;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1447
	uint8 idcount;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1448
	bool wagover;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1449
	uint8 cidcount;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1450
	int c, i;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1451
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1452
	check_length(len, 7, "VehicleMapSpriteGroup");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1453
	feature = buf[1];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1454
	idcount = buf[2] & 0x7F;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1455
	wagover = (buf[2] & 0x80) == 0x80;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1456
	check_length(len, 3 + idcount, "VehicleMapSpriteGroup");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1457
	cidcount = buf[3 + idcount];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1458
	check_length(len, 4 + idcount + cidcount * 3, "VehicleMapSpriteGroup");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1459
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1460
	DEBUG(grf, 6) ("VehicleMapSpriteGroup: Feature %d, %d ids, %d cids, wagon override %d.",
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1461
			feature, idcount, cidcount, wagover);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1462
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1463
	if (feature > GSF_STATION) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1464
		grfmsg(GMS_WARN, "VehicleMapSpriteGroup: Unsupported feature %d, skipping.", feature);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1465
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1466
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1467
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1468
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1469
	if (feature == GSF_STATION) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1470
		// We do things differently for stations.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1471
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1472
		for (i = 0; i < idcount; i++) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1473
			uint8 stid = buf[3 + i];
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
  1474
			StationSpec *stat = &_cur_grffile->stations[stid];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1475
			byte *bp = &buf[4 + idcount];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1476
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1477
			for (c = 0; c < cidcount; c++) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1478
				uint8 ctype = grf_load_byte(&bp);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1479
				uint16 groupid = grf_load_word(&bp);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1480
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1481
				if (groupid >= _cur_grffile->spritegroups_count) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1482
					grfmsg(GMS_WARN, "VehicleMapSpriteGroup: Spriteset %x out of range %x, skipping.",
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1483
					       groupid, _cur_grffile->spritegroups_count);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1484
					return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1485
				}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1486
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1487
				if (ctype != 0xFF) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1488
					/* TODO: No support for any other cargo. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1489
					continue;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1490
				}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1491
2444
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1492
				stat->spritegroup[1] = *_cur_grffile->spritegroups[groupid];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1493
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1494
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1495
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1496
		{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1497
			byte *bp = buf + 4 + idcount + cidcount * 3;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1498
			uint16 groupid = grf_load_word(&bp);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1499
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1500
			if (groupid >= _cur_grffile->spritegroups_count) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1501
				grfmsg(GMS_WARN, "VehicleMapSpriteGroup: Spriteset %x out of range %x, skipping.",
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1502
				       groupid, _cur_grffile->spritegroups_count);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1503
				return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1504
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1505
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1506
			for (i = 0; i < idcount; i++) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1507
				uint8 stid = buf[3 + i];
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
  1508
				StationSpec *stat = &_cur_grffile->stations[stid];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1509
2444
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1510
				stat->spritegroup[0] = *_cur_grffile->spritegroups[groupid];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1511
				stat->grfid = _cur_grffile->grfid;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1512
				SetCustomStation(stid, stat);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1513
				stat->sclass = STAT_CLASS_NONE;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1514
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1515
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1516
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1517
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1518
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1519
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1520
	/* If ``n-id'' (or ``idcount'') is zero, this is a ``feature
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1521
	 * callback''. I have no idea how this works, so we will ignore it for
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1522
	 * now.  --octo */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1523
	if (idcount == 0) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1524
		grfmsg(GMS_NOTICE, "NewMapping: Feature callbacks not implemented yet.");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1525
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1526
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1527
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1528
	// FIXME: Tropicset contains things like:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1529
	// 03 00 01 19 01 00 00 00 00 - this is missing one 00 at the end,
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1530
	// what should we exactly do with that? --pasky
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1531
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1532
	if (!_cur_grffile->spriteset_start || !_cur_grffile->spritegroups) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1533
		grfmsg(GMS_WARN, "VehicleMapSpriteGroup: No sprite set to work on! Skipping.");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1534
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1535
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1536
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1537
	if (!wagover && last_engines_count != idcount) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1538
		last_engines = realloc(last_engines, idcount);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1539
		last_engines_count = idcount;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1540
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1541
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1542
	if (wagover) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1543
		if (last_engines_count == 0) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1544
			grfmsg(GMS_ERROR, "VehicleMapSpriteGroup: WagonOverride: No engine to do override with.");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1545
			return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1546
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1547
		DEBUG(grf, 6) ("VehicleMapSpriteGroup: WagonOverride: %u engines, %u wagons.",
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1548
				last_engines_count, idcount);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1549
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1550
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1551
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1552
	for (i = 0; i < idcount; i++) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1553
		uint8 engine_id = buf[3 + i];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1554
		uint8 engine = engine_id + _vehshifts[feature];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1555
		byte *bp = &buf[4 + idcount];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1556
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1557
		if (engine_id > _vehcounts[feature]) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1558
			grfmsg(GMS_ERROR, "Id %u for feature %x is out of bounds.",
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1559
					engine_id, feature);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1560
			return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1561
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1562
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1563
		DEBUG(grf, 7) ("VehicleMapSpriteGroup: [%d] Engine %d...", i, engine);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1564
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1565
		for (c = 0; c < cidcount; c++) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1566
			uint8 ctype = grf_load_byte(&bp);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1567
			uint16 groupid = grf_load_word(&bp);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1568
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1569
			DEBUG(grf, 8) ("VehicleMapSpriteGroup: * [%d] Cargo type %x, group id %x", c, ctype, groupid);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1570
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1571
			if (groupid >= _cur_grffile->spritegroups_count) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1572
				grfmsg(GMS_WARN, "VehicleMapSpriteGroup: Spriteset %x out of range %x, skipping.", groupid, _cur_grffile->spritegroups_count);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1573
				return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1574
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1575
1802
da61740cc1e7 (svn r2306) - CodeChange: Check the last commands; refits. This needed an extensive rewrite and global/local-cargo ID juggling and bitmasking. However with this done it looks better as well and is compatible with newgrf handling. Big thanks to HackyKid for doing most of the work. This also closes patch "[ 1199277 ] Command checks"
Darkvater
parents: 1611
diff changeset
  1576
			if (ctype == GC_INVALID) ctype = GC_PURCHASE;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1577
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1578
			if (wagover) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1579
				// TODO: No multiple cargo types per vehicle yet. --pasky
2444
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1580
				SetWagonOverrideSprites(engine, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1581
			} else {
2444
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1582
				SetCustomEngineSprites(engine, ctype, _cur_grffile->spritegroups[groupid]);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1583
				last_engines[i] = engine;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1584
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1585
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1586
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1587
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1588
	{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1589
		byte *bp = buf + 4 + idcount + cidcount * 3;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1590
		uint16 groupid = grf_load_word(&bp);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1591
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1592
		DEBUG(grf, 8) ("-- Default group id %x", groupid);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1593
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1594
		for (i = 0; i < idcount; i++) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1595
			uint8 engine = buf[3 + i] + _vehshifts[feature];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1596
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1597
			// Don't tell me you don't love duplicated code!
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1598
			if (groupid >= _cur_grffile->spritegroups_count) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1599
				grfmsg(GMS_WARN, "VehicleMapSpriteGroup: Spriteset %x out of range %x, skipping.", groupid, _cur_grffile->spritegroups_count);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1600
				return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1601
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1602
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1603
			if (wagover) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1604
				// TODO: No multiple cargo types per vehicle yet. --pasky
2444
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1605
				SetWagonOverrideSprites(engine, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1606
			} else {
2444
5998cd7b06e7 (svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
peter1138
parents: 2442
diff changeset
  1607
				SetCustomEngineSprites(engine, GC_DEFAULT, _cur_grffile->spritegroups[groupid]);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1608
				last_engines[i] = engine;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1609
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1610
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1611
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1612
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1613
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1614
/* Action 0x04 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1615
static void VehicleNewName(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1616
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1617
	/* <04> <veh-type> <language-id> <num-veh> <offset> <data...>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1618
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1619
	 * B veh-type      see action 0
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1620
	 * B language-id   language ID with bit 7 cleared (see below)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1621
	 * B num-veh       number of vehicles which are getting a new name
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1622
	 * B/W offset      number of the first vehicle that gets a new name
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1623
	 * S data          new texts, each of them zero-terminated, after
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1624
	 *                 which the next name begins. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1625
	/* TODO: No support for changing non-vehicle text. Perhaps we shouldn't
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1626
	 * implement it at all, but it could be useful for some "modpacks"
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1627
	 * (completely new scenarios changing all graphics and logically also
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1628
	 * factory names etc). We should then also support all languages (by
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1629
	 * name), not only the original four ones. --pasky */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1630
	/* TODO: Support for custom station class/type names. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1631
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1632
	uint8 feature;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1633
	uint8 lang;
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1634
	uint8 num;
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1635
	uint16 id;
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1636
	uint16 endid;
1329
6988419aa6f0 (svn r1833) byte -> char transition: the rest
tron
parents: 1299
diff changeset
  1637
	const char* name;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1638
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1639
	check_length(len, 6, "VehicleNewName");
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1640
	buf++;
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1641
	feature  = grf_load_byte(&buf);
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1642
	lang     = grf_load_byte(&buf);
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1643
	num      = grf_load_byte(&buf);
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1644
	id       = (lang & 0x80) ? grf_load_word(&buf) : grf_load_byte(&buf);
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1645
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1646
	if (feature > 3) {
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1647
		DEBUG(grf, 7) ("VehicleNewName: Unsupported feature %d, skipping", feature);
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1648
		return;
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1649
	}
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1650
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1651
	id      += _vehshifts[feature];
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1652
	endid    = id + num;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1653
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1654
	DEBUG(grf, 6) ("VehicleNewName: About to rename engines %d..%d (feature %d) in language 0x%x.",
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1655
	               id, endid, feature, lang);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1656
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1657
	if (lang & 0x80) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1658
		grfmsg(GMS_WARN, "VehicleNewName: No support for changing in-game texts. Skipping.");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1659
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1660
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1661
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1662
	if (!(lang & 3)) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1663
		/* XXX: If non-English name, silently skip it. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1664
		DEBUG(grf, 7) ("VehicleNewName: Skipping non-English name.");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1665
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1666
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1667
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1668
	name = (const char*)buf;
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1669
	len -= (lang & 0x80) ? 6 : 5;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1670
	for (; id < endid && len > 0; id++) {
1329
6988419aa6f0 (svn r1833) byte -> char transition: the rest
tron
parents: 1299
diff changeset
  1671
		int ofs = strlen(name) + 1;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1672
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1673
		if (ofs < 128) {
1329
6988419aa6f0 (svn r1833) byte -> char transition: the rest
tron
parents: 1299
diff changeset
  1674
			DEBUG(grf, 8) ("VehicleNewName: %d <- %s", id, name);
6988419aa6f0 (svn r1833) byte -> char transition: the rest
tron
parents: 1299
diff changeset
  1675
			SetCustomEngineName(id, name);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1676
		} else {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1677
			DEBUG(grf, 7) ("VehicleNewName: Too long a name (%d)", ofs);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1678
		}
1329
6988419aa6f0 (svn r1833) byte -> char transition: the rest
tron
parents: 1299
diff changeset
  1679
		name += ofs;
6988419aa6f0 (svn r1833) byte -> char transition: the rest
tron
parents: 1299
diff changeset
  1680
		len -= ofs;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1681
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1682
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1683
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1684
/* Action 0x05 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1685
static void GraphicsNew(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1686
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1687
	/* <05> <graphics-type> <num-sprites> <other data...>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1688
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1689
	 * B graphics-type What set of graphics the sprites define.
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1690
	 * E num-sprites   How many sprites are in this set?
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1691
	 * V other data    Graphics type specific data.  Currently unused. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1692
	/* TODO */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1693
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1694
	uint8 type;
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1695
	uint16 num;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1696
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1697
	check_length(len, 2, "GraphicsNew");
2346
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1698
	buf++;
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1699
	type = grf_load_byte(&buf);
2a1d9f47f38c (svn r2872) -Feature: [NewGRF] Add support for "extended bytes"
tron
parents: 2345
diff changeset
  1700
	num  = grf_load_extended(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1701
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1702
	grfmsg(GMS_NOTICE, "GraphicsNew: Custom graphics (type %x) sprite block of length %d (unimplemented, ignoring).\n",
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1703
	       type, num);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1704
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1705
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1706
/* Action 0x06 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1707
static void CfgApply(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1708
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1709
	/* <06> <param-num> <param-size> <offset> ... <FF>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1710
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1711
	 * B param-num     Number of parameter to substitute (First = "zero")
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1712
	 *                 Ignored if that parameter was not specified in newgrf.cfg
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1713
	 * B param-size    How many bytes to replace.  If larger than 4, the
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1714
	 *                 bytes of the following parameter are used.  In that
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1715
	 *                 case, nothing is applied unless *all* parameters
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1716
	 *                 were specified.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1717
	 * B offset        Offset into data from beginning of next sprite
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1718
	 *                 to place where parameter is to be stored. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1719
	/* TODO */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1720
	grfmsg(GMS_NOTICE, "CfgApply: Ignoring (not implemented).\n");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1721
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1722
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1723
/* Action 0x07 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1724
/* Action 0x09 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1725
static void SkipIf(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1726
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1727
	/* <07/09> <param-num> <param-size> <condition-type> <value> <num-sprites>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1728
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1729
	 * B param-num
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1730
	 * B param-size
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1731
	 * B condition-type
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1732
	 * V value
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1733
	 * B num-sprites */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1734
	/* TODO: More params. More condition types. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1735
	uint8 param;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1736
	uint8 paramsize;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1737
	uint8 condtype;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1738
	uint8 numsprites;
2336
be477602455a (svn r2862) Return a proper version number, when testing the TTDPatch version in the SkipIf action. Pretend to be version 2.0.1 alpha 49 for now.
tron
parents: 2324
diff changeset
  1739
	uint32 param_val = 0;
be477602455a (svn r2862) Return a proper version number, when testing the TTDPatch version in the SkipIf action. Pretend to be version 2.0.1 alpha 49 for now.
tron
parents: 2324
diff changeset
  1740
	uint32 cond_val = 0;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1741
	bool result;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1742
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1743
	check_length(len, 6, "SkipIf");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1744
	param = buf[1];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1745
	paramsize = buf[2];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1746
	condtype = buf[3];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1747
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1748
	if (condtype < 2) {
1611
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  1749
		/* Always 1 for bit tests, the given value should be ignored. */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1750
		paramsize = 1;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1751
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1752
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1753
	buf += 4;
1611
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  1754
	switch (paramsize) {
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  1755
		case 4: cond_val = grf_load_dword(&buf); break;
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  1756
		case 2: cond_val = grf_load_word(&buf);  break;
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  1757
		case 1: cond_val = grf_load_byte(&buf);  break;
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  1758
		default: break;
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  1759
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1760
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1761
	switch (param) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1762
		case 0x83:    /* current climate, 0=temp, 1=arctic, 2=trop, 3=toyland */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1763
			param_val = _opt.landscape;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1764
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1765
		case 0x84:    /* .grf loading stage, 0=initialization, 1=activation */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1766
			param_val = _cur_stage;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1767
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1768
		case 0x85:    /* TTDPatch flags, only for bit tests */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1769
			param_val = _ttdpatch_flags[cond_val / 0x20];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1770
			cond_val %= 0x20;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1771
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1772
		case 0x86:    /* road traffic side, bit 4 clear=left, set=right */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1773
			param_val = _opt.road_side << 4;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1774
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1775
		case 0x88: {  /* see if specified GRFID is active */
1611
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  1776
			param_val = (GetFileByGRFID(cond_val) != NULL);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1777
		}	break;
2336
be477602455a (svn r2862) Return a proper version number, when testing the TTDPatch version in the SkipIf action. Pretend to be version 2.0.1 alpha 49 for now.
tron
parents: 2324
diff changeset
  1778
be477602455a (svn r2862) Return a proper version number, when testing the TTDPatch version in the SkipIf action. Pretend to be version 2.0.1 alpha 49 for now.
tron
parents: 2324
diff changeset
  1779
		case 0x8B: { /* TTDPatch version */
be477602455a (svn r2862) Return a proper version number, when testing the TTDPatch version in the SkipIf action. Pretend to be version 2.0.1 alpha 49 for now.
tron
parents: 2324
diff changeset
  1780
			uint major    = 2;
be477602455a (svn r2862) Return a proper version number, when testing the TTDPatch version in the SkipIf action. Pretend to be version 2.0.1 alpha 49 for now.
tron
parents: 2324
diff changeset
  1781
			uint minor    = 0;
be477602455a (svn r2862) Return a proper version number, when testing the TTDPatch version in the SkipIf action. Pretend to be version 2.0.1 alpha 49 for now.
tron
parents: 2324
diff changeset
  1782
			uint revision = 10; // special case: 2.0.1 is 2.0.10
be477602455a (svn r2862) Return a proper version number, when testing the TTDPatch version in the SkipIf action. Pretend to be version 2.0.1 alpha 49 for now.
tron
parents: 2324
diff changeset
  1783
			uint build    = 49;
be477602455a (svn r2862) Return a proper version number, when testing the TTDPatch version in the SkipIf action. Pretend to be version 2.0.1 alpha 49 for now.
tron
parents: 2324
diff changeset
  1784
			param_val = (major << 24) | (minor << 20) | (revision << 16) | (build * 10);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1785
			break;
2336
be477602455a (svn r2862) Return a proper version number, when testing the TTDPatch version in the SkipIf action. Pretend to be version 2.0.1 alpha 49 for now.
tron
parents: 2324
diff changeset
  1786
		}
be477602455a (svn r2862) Return a proper version number, when testing the TTDPatch version in the SkipIf action. Pretend to be version 2.0.1 alpha 49 for now.
tron
parents: 2324
diff changeset
  1787
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1788
		case 0x8D:    /* TTD Version, 00=DOS, 01=Windows */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1789
			param_val = 1;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1790
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1791
		case 0x8E:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1792
			param_val = _traininfo_vehicle_pitch;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1793
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1794
		/* TODO */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1795
		case 0x8F:    /* Track type cost multipliers */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1796
		default:
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  1797
			if (param < 0x80) {
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  1798
				/* Parameter. */
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  1799
				param_val = _cur_grffile->param[param];
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1800
			} else {
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  1801
				/* In-game variable. */
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  1802
				grfmsg(GMS_WARN, "Unsupported in-game variable 0x%02X. Ignoring test.", param);
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  1803
				return;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1804
			}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1805
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1806
1606
d15a9fdea49e (svn r2110) - Fix: Fixed test for various flags (e.g. newtrains in usset). result is bool so !! any non-zero values before assigning them to it - they apparently didn't fit. ;-)
pasky
parents: 1542
diff changeset
  1807
	DEBUG(grf, 7) ("Test condtype %d, param %x, condval %x", condtype, param_val, cond_val);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1808
	switch (condtype) {
1606
d15a9fdea49e (svn r2110) - Fix: Fixed test for various flags (e.g. newtrains in usset). result is bool so !! any non-zero values before assigning them to it - they apparently didn't fit. ;-)
pasky
parents: 1542
diff changeset
  1809
		case 0: result = !!(param_val & (1 << cond_val));
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1810
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1811
		case 1: result = !(param_val & (1 << cond_val));
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1812
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1813
		/* TODO: For the following, make it to work with paramsize>1. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1814
		case 2: result = (param_val == cond_val);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1815
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1816
		case 3: result = (param_val != cond_val);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1817
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1818
		case 4: result = (param_val < cond_val);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1819
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1820
		case 5: result = (param_val > cond_val);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1821
			break;
1606
d15a9fdea49e (svn r2110) - Fix: Fixed test for various flags (e.g. newtrains in usset). result is bool so !! any non-zero values before assigning them to it - they apparently didn't fit. ;-)
pasky
parents: 1542
diff changeset
  1822
		case 6: result = !!param_val; /* GRFID is active (only for param-num=88) */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1823
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1824
		case 7: result = !param_val; /* GRFID is not active (only for param-num=88) */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1825
			break;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1826
		default:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1827
			grfmsg(GMS_WARN, "Unsupported test %d. Ignoring.", condtype);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1828
			return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1829
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1830
1607
fd027776f222 (svn r2111) So, result is bool therefore no need for this horrible == 0 thing.
pasky
parents: 1606
diff changeset
  1831
	if (!result) {
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1832
		grfmsg(GMS_NOTICE, "Not skipping sprites, test was false.");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1833
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1834
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1835
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1836
	numsprites = grf_load_byte(&buf);
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1837
	grfmsg(GMS_NOTICE, "Skipping %d sprites, test was true.", numsprites);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1838
	_skip_sprites = numsprites;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1839
	if (_skip_sprites == 0) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1840
		/* Zero means there are no sprites to skip, so
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1841
		 * we use -1 to indicate that all further
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1842
		 * sprites should be skipped. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1843
		_skip_sprites = -1;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1844
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1845
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1846
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1847
static void GRFInfo(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1848
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1849
	/* <08> <version> <grf-id> <name> <info>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1850
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1851
	 * B version       newgrf version, currently 06
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1852
	 * 4*B grf-id      globally unique ID of this .grf file
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1853
	 * S name          name of this .grf set
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1854
	 * S info          string describing the set, and e.g. author and copyright */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1855
	/* TODO: Check version. (We should have own versioning done somehow.) */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1856
	uint8 version;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1857
	uint32 grfid;
1329
6988419aa6f0 (svn r1833) byte -> char transition: the rest
tron
parents: 1299
diff changeset
  1858
	const char *name;
6988419aa6f0 (svn r1833) byte -> char transition: the rest
tron
parents: 1299
diff changeset
  1859
	const char *info;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1860
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1861
	check_length(len, 9, "GRFInfo");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1862
	version = buf[1];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1863
	/* this is de facto big endian - grf_load_dword() unsuitable */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1864
	grfid = buf[2] << 24 | buf[3] << 16 | buf[4] << 8 | buf[5];
1329
6988419aa6f0 (svn r1833) byte -> char transition: the rest
tron
parents: 1299
diff changeset
  1865
	name = (const char*)(buf + 6);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1866
	info = name + strlen(name) + 1;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1867
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1868
	_cur_grffile->grfid = grfid;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1869
	_cur_grffile->flags |= 0x0001; /* set active flag */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1870
2013
c83b52340eee (svn r2521) -Codechange: Removed trailing "\n"s from DEBUG statements
celestar
parents: 1968
diff changeset
  1871
	DEBUG(grf, 1) ("[%s] Loaded GRFv%d set %08lx - %s:\n%s",
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1872
	               _cur_grffile->filename, version, grfid, name, info);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1873
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1874
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1875
static void SpriteReplace(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1876
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1877
	/* <0A> <num-sets> <set1> [<set2> ...]
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1878
	 * <set>: <num-sprites> <first-sprite>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1879
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1880
	 * B num-sets      How many sets of sprites to replace.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1881
	 * Each set:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1882
	 * B num-sprites   How many sprites are in this set
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1883
	 * W first-sprite  First sprite number to replace */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1884
	uint8 num_sets;
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1885
	uint i;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1886
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1887
	buf++; /* skip action byte */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1888
	num_sets = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1889
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1890
	for (i = 0; i < num_sets; i++) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1891
		uint8 num_sprites = grf_load_byte(&buf);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1892
		uint16 first_sprite = grf_load_word(&buf);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1893
		uint j;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1894
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1895
		grfmsg(GMS_NOTICE,
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1896
			"SpriteReplace: [Set %d] Changing %d sprites, beginning with %d",
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1897
			i, num_sprites, first_sprite
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1898
		);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1899
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1900
		for (j = 0; j < num_sprites; j++) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  1901
			LoadNextSprite(first_sprite + j, _file_index); // XXX
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1902
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1903
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1904
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1905
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1906
static void GRFError(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1907
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1908
	/* <0B> <severity> <language-id> <message-id> [<message...> 00] [<data...>] 00 [<parnum>]
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1909
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1910
	 * B severity      00: notice, contine loading grf file
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1911
	 *                 01: warning, continue loading grf file
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1912
	 *                 02: error, but continue loading grf file, and attempt
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1913
	 *                     loading grf again when loading or starting next game
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1914
	 *                 03: error, abort loading and prevent loading again in
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1915
	 *                     the future (only when restarting the patch)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1916
	 * B language-id   see action 4, use 1F for built-in error messages
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1917
	 * B message-id    message to show, see below
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1918
	 * S message       for custom messages (message-id FF), text of the message
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1919
	 *                 not present for built-in messages.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1920
	 * V data          additional data for built-in (or custom) messages
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1921
	 * B parnum        see action 6, only used with built-in message 03 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1922
	/* TODO: For now we just show the message, sometimes incomplete and never translated. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1923
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1924
	static const char * const msgstr[4] = {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1925
		"Requires at least pseudo-TTDPatch version %s.",
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1926
		"This file is for %s version of TTD.",
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1927
		"Designed to be used with %s.",
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1928
		"Invalid parameter %s.",
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1929
	};
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1930
	uint8 severity;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1931
	uint8 msgid;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1932
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1933
	check_length(len, 6, "GRFError");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1934
	severity = buf[1];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1935
	msgid = buf[3];
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1936
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1937
	// Undocumented TTDPatch feature.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1938
	if ((severity & 0x80) == 0 && _cur_stage == 0)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1939
		return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1940
	severity &= 0x7F;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1941
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1942
	if (msgid == 0xFF) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1943
		grfmsg(severity, "%s", buf+4);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1944
	} else {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1945
		grfmsg(severity, msgstr[msgid], buf+4);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1946
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1947
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1948
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1949
static void GRFComment(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1950
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1951
	/* <0C> [<ignored...>]
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1952
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1953
	 * V ignored       Anything following the 0C is ignored */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1954
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1955
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1956
/* Action 0x0D */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1957
static void ParamSet(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1958
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1959
	/* <0D> <target> <operation> <source1> <source2> [<data>]
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1960
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1961
	 * B target        parameter number where result is stored
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1962
	 * B operation     operation to perform, see below
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1963
	 * B source1       first source operand
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1964
	 * B source2       second source operand
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1965
	 * D data          data to use in the calculation, not necessary
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1966
	 *                 if both source1 and source2 refer to actual parameters
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1967
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1968
	 * Operations
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1969
	 * 00      Set parameter equal to source1
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1970
	 * 01      Addition, source1 + source2
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1971
	 * 02      Subtraction, source1 - source2
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1972
	 * 03      Unsigned multiplication, source1 * source2 (both unsigned)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1973
	 * 04      Signed multiplication, source1 * source2 (both signed)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1974
	 * 05      Unsigned bit shift, source1 by source2 (source2 taken to be a
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1975
	 *         signed quantity; left shift if positive and right shift if
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1976
	 *         negative, source1 is unsigned)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1977
	 * 06      Signed bit shift, source1 by source2
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1978
	 *         (source2 like in 05, and source1 as well)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1979
	 */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1980
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1981
	byte target;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1982
	byte oper;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  1983
	uint32 src1;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  1984
	uint32 src2;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  1985
	uint32 data = 0;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  1986
	uint32 res;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1987
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1988
	check_length(len, 5, "ParamSet");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1989
	buf++;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1990
	target = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1991
	oper = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1992
	src1 = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1993
	src2 = grf_load_byte(&buf);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1994
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  1995
	if (len >= 8) data = grf_load_dword(&buf);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1996
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1997
	/* You can add 80 to the operation to make it apply only if the target
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1998
	 * is not defined yet.  In this respect, a parameter is taken to be
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  1999
	 * defined if any of the following applies:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2000
	 * - it has been set to any value in the newgrf(w).cfg parameter list
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2001
	 * - it OR A PARAMETER WITH HIGHER NUMBER has been set to any value by
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2002
	 *   an earlier action D */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2003
	if (oper & 0x80) {
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2004
		if (_cur_grffile->param_end < target)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2005
			oper &= 0x7F;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2006
		else
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2007
			return;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2008
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2009
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2010
	/* The source1 and source2 operands refer to the grf parameter number
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2011
	 * like in action 6 and 7.  In addition, they can refer to the special
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2012
	 * variables available in action 7, or they can be FF to use the value
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2013
	 * of <data>.  If referring to parameters that are undefined, a value
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2014
	 * of 0 is used instead.  */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2015
	if (src1 == 0xFF) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2016
		src1 = data;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2017
	} else {
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2018
		src1 = _cur_grffile->param_end >= src1 ? _cur_grffile->param[src1] : 0;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2019
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2020
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2021
	if (src2 == 0xFF) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2022
		src2 = data;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2023
	} else {
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2024
		src2 = _cur_grffile->param_end >= src2 ? _cur_grffile->param[src2] : 0;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2025
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2026
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2027
	/* TODO: You can access the parameters of another GRF file by using
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2028
	 * source2=FE, source1=the other GRF's parameter number and data=GRF
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2029
	 * ID.  This is only valid with operation 00 (set).  If the GRF ID
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2030
	 * cannot be found, a value of 0 is used for the parameter value
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2031
	 * instead. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2032
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2033
	switch (oper) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2034
		case 0x00:
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2035
			res = src1;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2036
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2037
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2038
		case 0x01:
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2039
			res = src1 + src2;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2040
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2041
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2042
		case 0x02:
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2043
			res = src1 - src2;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2044
			break;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2045
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2046
		case 0x03:
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2047
			res = src1 * src2;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2048
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2049
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2050
		case 0x04:
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2051
			res = (int32)src1 * (int32)src2;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2052
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2053
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2054
		case 0x05:
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2055
			if ((int32)src2 < 0)
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2056
				res = src1 >> -(int32)src2;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2057
			else
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2058
				res = src1 << src2;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2059
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2060
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2061
		case 0x06:
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2062
			if ((int32)src2 < 0)
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2063
				res = (int32)src1 >> -(int32)src2;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2064
			else
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2065
				res = (int32)src1 << src2;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2066
			break;
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2067
2442
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2068
		case 0x07: /* Bitwise AND */
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2069
			res = src1 & src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2070
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2071
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2072
		case 0x08: /* Bitwise OR */
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2073
			res = src1 | src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2074
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2075
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2076
		case 0x09: /* Unsigned division */
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2077
			if (src2 == 0) {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2078
				res = src1;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2079
			} else {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2080
				res = src1 / src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2081
			}
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2082
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2083
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2084
		case 0x0A: /* Signed divison */
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2085
			if (src2 == 0) {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2086
				res = src1;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2087
			} else {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2088
				res = (int32)src1 / (int32)src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2089
			}
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2090
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2091
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2092
		case 0x0B: /* Unsigned modulo */
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2093
			if (src2 == 0) {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2094
				res = src1;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2095
			} else {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2096
				res = src1 % src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2097
			}
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2098
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2099
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2100
		case 0x0C: /* Signed modulo */
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2101
			if (src2 == 0) {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2102
				res = src1;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2103
			} else {
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2104
				res = (int32)src1 % (int32)src2;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2105
			}
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2106
			break;
341a127f3d8c (svn r2968) -Newgrf: Implement current set of action D (ParamSet) operations.
peter1138
parents: 2440
diff changeset
  2107
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2108
		default:
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2109
			grfmsg(GMS_ERROR, "ParamSet: Unknown operation %d, skipping.", oper);
2345
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2110
			return;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2111
	}
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2112
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2113
	switch (target) {
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2114
		case 0x8E: // Y-Offset for train sprites
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2115
			_traininfo_vehicle_pitch = res;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2116
			break;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2117
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2118
		// TODO implement
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2119
		case 0x8F: // Rail track type cost factors
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2120
		case 0x93: // Tile refresh offset to left
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2121
		case 0x94: // Tile refresh offset to right
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2122
		case 0x95: // Tile refresh offset upwards
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2123
		case 0x96: // Tile refresh offset downwards
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2124
		case 0x97: // Snow line height
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2125
		case 0x99: // Global ID offset
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2126
			DEBUG(grf, 7) ("ParamSet: Skipping unimplemented target 0x%02X", target);
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2127
			break;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2128
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2129
		default:
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2130
			if (target < 0x80) {
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2131
				_cur_grffile->param[target] = res;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2132
				if (target + 1U > _cur_grffile->param_end) _cur_grffile->param_end = target + 1;
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2133
			} else {
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2134
				DEBUG(grf, 7) ("ParamSet: Skipping unknown target 0x%02X", target);
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2135
			}
f7251bd99942 (svn r2871) -Feature/Fix: Per GRF parameter lists
tron
parents: 2342
diff changeset
  2136
			break;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2137
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2138
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2139
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2140
static void GRFInhibit(byte *buf, int len)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2141
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2142
	/* <0E> <num> <grfids...>
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2143
	 *
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2144
	 * B num           Number of GRFIDs that follow
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2145
	 * D grfids        GRFIDs of the files to deactivate */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2146
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2147
	byte num;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2148
	int i;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2149
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2150
	check_length(len, 1, "GRFInhibit");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2151
	buf++, len--;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2152
	num = grf_load_byte(&buf); len--;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2153
	check_length(len, 4 * num, "GRFInhibit");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2154
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2155
	for (i = 0; i < num; i++) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2156
		uint32 grfid = grf_load_dword(&buf);
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
  2157
		GRFFile *file = GetFileByGRFID(grfid);
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2158
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2159
		/* Unset activation flag */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2160
		if (file != NULL) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2161
			grfmsg(GMS_NOTICE, "GRFInhibit: Deactivating file ``%s''", file->filename);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2162
			file->flags &= 0xFFFE;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2163
		}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2164
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2165
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2166
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2167
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2168
static void InitializeGRFSpecial(void)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2169
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2170
	/* FIXME: We should rather reflect reality in _ttdpatch_flags[]. */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2171
1862
81167a570902 (svn r2368) - Fix: Add 'multihead' TTDPatch option to OpenTTD newgrf flags-emulation (DBSETXLW doesn't complain about it anymore)
Darkvater
parents: 1802
diff changeset
  2172
	_ttdpatch_flags[0] = (1 << 0x1B); /* multihead */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2173
	_ttdpatch_flags[1] = (1 << 0x08)  /* mammothtrains */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2174
	                   | (1 << 0x0B)  /* subsidiaries */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2175
	                   | (1 << 0x14)  /* bridgespeedlimits */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2176
	                   | (1 << 0x16)  /* eternalgame */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2177
	                   | (1 << 0x17)  /* newtrains */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2178
	                   | (1 << 0x18)  /* newrvs */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2179
	                   | (1 << 0x19)  /* newships */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2180
	                   | (1 << 0x1A)  /* newplanes */
1862
81167a570902 (svn r2368) - Fix: Add 'multihead' TTDPatch option to OpenTTD newgrf flags-emulation (DBSETXLW doesn't complain about it anymore)
Darkvater
parents: 1802
diff changeset
  2181
			               | (1 << 0x1B); /* signalsontrafficside */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2182
	                   /* Uncomment following if you want to fool the GRF file.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2183
	                    * Some GRF files will refuse to load without this
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2184
	                    * but you can still squeeze something from them even
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2185
	                    * without the support - i.e. USSet. --pasky */
1862
81167a570902 (svn r2368) - Fix: Add 'multihead' TTDPatch option to OpenTTD newgrf flags-emulation (DBSETXLW doesn't complain about it anymore)
Darkvater
parents: 1802
diff changeset
  2186
			               //| (1 << 0x1C); /* electrifiedrailway */
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2187
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2188
	_ttdpatch_flags[2] = (1 << 0x0D)  /* buildonslopes */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2189
	                   | (1 << 0x16)  /* canals */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2190
	                   | (1 << 0x17); /* newstartyear */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2191
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2192
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2193
static void InitNewGRFFile(const char* filename, int sprite_offset)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2194
{
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
  2195
	GRFFile *newfile;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2196
489
a419f732c8ef (svn r771) Do not give a file new {struct GRFFile} if it was already loaded once. Eliminates those double entries in the newgrf manager and also some possible memory leaks.
pasky
parents: 478
diff changeset
  2197
	newfile = GetFileByFilename(filename);
490
03e2d2abeec7 (svn r772) Whoops, I know. Do not consider pointer to be a boolean value. Sorry 'bout that, sirs.
pasky
parents: 489
diff changeset
  2198
	if (newfile != NULL) {
489
a419f732c8ef (svn r771) Do not give a file new {struct GRFFile} if it was already loaded once. Eliminates those double entries in the newgrf manager and also some possible memory leaks.
pasky
parents: 478
diff changeset
  2199
		/* We already loaded it once. */
a419f732c8ef (svn r771) Do not give a file new {struct GRFFile} if it was already loaded once. Eliminates those double entries in the newgrf manager and also some possible memory leaks.
pasky
parents: 478
diff changeset
  2200
		newfile->sprite_offset = sprite_offset;
a419f732c8ef (svn r771) Do not give a file new {struct GRFFile} if it was already loaded once. Eliminates those double entries in the newgrf manager and also some possible memory leaks.
pasky
parents: 478
diff changeset
  2201
		_cur_grffile = newfile;
a419f732c8ef (svn r771) Do not give a file new {struct GRFFile} if it was already loaded once. Eliminates those double entries in the newgrf manager and also some possible memory leaks.
pasky
parents: 478
diff changeset
  2202
		return;
a419f732c8ef (svn r771) Do not give a file new {struct GRFFile} if it was already loaded once. Eliminates those double entries in the newgrf manager and also some possible memory leaks.
pasky
parents: 478
diff changeset
  2203
	}
a419f732c8ef (svn r771) Do not give a file new {struct GRFFile} if it was already loaded once. Eliminates those double entries in the newgrf manager and also some possible memory leaks.
pasky
parents: 478
diff changeset
  2204
1477
9389baf2bf3c (svn r1981) Typedef some structs and enums
tron
parents: 1439
diff changeset
  2205
	newfile = calloc(1, sizeof(*newfile));
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2206
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2207
	if (newfile == NULL)
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2208
		error ("Out of memory");
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2209
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2210
	newfile->filename = strdup(filename);
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2211
	newfile->sprite_offset = sprite_offset;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2212
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2213
	if (_first_grffile == NULL) {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2214
		_cur_grffile = newfile;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2215
		_first_grffile = newfile;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2216
	} else {
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2217
		_cur_grffile->next = newfile;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2218
		_cur_grffile = newfile;
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2219
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2220
}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2221
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2222
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2223
/* Here we perform initial decoding of some special sprites (as are they
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2224
 * described at http://www.ttdpatch.net/src/newgrf.txt, but this is only a very
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2225
 * partial implementation yet). */
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2226
/* XXX: We consider GRF files trusted. It would be trivial to exploit OTTD by
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2227
 * a crafted invalid GRF file. We should tell that to the user somehow, or
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2228
 * better make this more robust in the future. */
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2229
static void DecodeSpecialSprite(const char* filename, uint num, uint stage)
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2230
{
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2231
	/* XXX: There is a difference between staged loading in TTDPatch and
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2232
	 * here.  In TTDPatch, for some reason actions 1 and 2 are carried out
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2233
	 * during stage 0, whilst action 3 is carried out during stage 1 (to
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2234
	 * "resolve" cargo IDs... wtf). This is a little problem, because cargo
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2235
	 * IDs are valid only within a given set (action 1) block, and may be
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2236
	 * overwritten after action 3 associates them. But overwriting happens
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2237
	 * in an earlier stage than associating, so...  We just process actions
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2238
	 * 1 and 2 in stage 1 now, let's hope that won't get us into problems.
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2239
	 * --pasky */
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2240
	uint32 action_mask = (stage == 0) ? 0x0001FF40 : 0x0001FFBF;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2241
	static const SpecialSpriteHandler handlers[] = {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2242
		/* 0x00 */ VehicleChangeInfo,
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2243
		/* 0x01 */ NewSpriteSet,
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2244
		/* 0x02 */ NewSpriteGroup,
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2245
		/* 0x03 */ NewVehicle_SpriteGroupMapping,
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2246
		/* 0x04 */ VehicleNewName,
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2247
		/* 0x05 */ GraphicsNew,
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2248
		/* 0x06 */ CfgApply,
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2249
		/* 0x07 */ SkipIf,
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2250
		/* 0x08 */ GRFInfo,
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2251
		/* 0x09 */ SkipIf,
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2252
		/* 0x0A */ SpriteReplace,
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2253
		/* 0x0B */ GRFError,
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2254
		/* 0x0C */ GRFComment,
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2255
		/* 0x0D */ ParamSet,
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2256
		/* 0x0E */ GRFInhibit,
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2257
		/* 0x0F */ NULL, // TODO implement
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2258
		/* 0x10 */ NULL  // TODO implement
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2259
	};
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2260
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2261
	byte* buf = malloc(num);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2262
	byte action;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2263
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2264
	if (buf == NULL) error("DecodeSpecialSprite: Could not allocate memory");
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2265
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2266
	FioReadBlock(buf, num);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2267
	action = buf[0];
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2268
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2269
	if (action >= lengthof(handlers)) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2270
		DEBUG(grf, 7) ("Skipping unknown action 0x%02X", action);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2271
		free(buf);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2272
		return;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2273
	}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2274
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2275
	if (!HASBIT(action_mask, action)) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2276
		DEBUG(grf, 7) ("Skipping action 0x%02X in stage %d", action, stage);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2277
		free(buf);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2278
		return;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2279
	}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2280
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2281
	if (handlers[action] == NULL) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2282
		DEBUG(grf, 7) ("Skipping unsupported Action 0x%02X", action);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2283
		free(buf);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2284
		return;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2285
	}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2286
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2287
	DEBUG(grf, 7) ("Handling action 0x%02X in stage %d", action, stage);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2288
	handlers[action](buf, num);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2289
	free(buf);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2290
}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2291
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2292
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2293
static void LoadNewGRFFile(const char* filename, uint file_index, uint stage)
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2294
{
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2295
	uint16 num;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2296
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2297
	/* A .grf file is activated only if it was active when the game was
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2298
	 * started.  If a game is loaded, only its active .grfs will be
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2299
	 * reactivated, unless "loadallgraphics on" is used.  A .grf file is
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2300
	 * considered active if its action 8 has been processed, i.e. its
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2301
	 * action 8 hasn't been skipped using an action 7.
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2302
	 *
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2303
	 * During activation, only actions 0, 1, 2, 3, 4, 5, 7, 8, 9, 0A and 0B are
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2304
	 * carried out.  All others are ignored, because they only need to be
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2305
	 * processed once at initialization.  */
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2306
	if (stage != 0) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2307
		_cur_grffile = GetFileByFilename(filename);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2308
		if (_cur_grffile == NULL) error("File ``%s'' lost in cache.\n", filename);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2309
		if (!(_cur_grffile->flags & 0x0001)) return;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2310
	}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2311
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2312
	FioOpenFile(file_index, filename);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2313
	_file_index = file_index; // XXX
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2314
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2315
	DEBUG(grf, 7) ("Reading NewGRF-file '%s'", filename);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2316
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2317
	/* Skip the first sprite; we don't care about how many sprites this
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2318
	 * does contain; newest TTDPatches and George's longvehicles don't
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2319
	 * neither, apparently. */
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2320
	if (FioReadWord() == 4 && FioReadByte() == 0xFF) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2321
		FioReadDword();
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2322
	} else {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2323
		error("Custom .grf has invalid format.");
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2324
	}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2325
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2326
	_skip_sprites = 0; // XXX
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2327
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2328
	while ((num = FioReadWord()) != 0) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2329
		byte type = FioReadByte();
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2330
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2331
		if (type == 0xFF) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2332
			if (_skip_sprites == 0) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2333
				DecodeSpecialSprite(filename, num, stage);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2334
				continue;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2335
			} else {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2336
				FioSkipBytes(num);
1611
32dced48929a (svn r2115) Spring cleaning, no functional changes
tron
parents: 1607
diff changeset
  2337
			}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2338
		} else {
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2339
			if (_skip_sprites == 0) DEBUG(grf, 7) ("Skipping unexpected sprite");
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2340
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2341
			FioSkipBytes(7);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2342
			num -= 8;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2343
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2344
			if (type & 2) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2345
				FioSkipBytes(num);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2346
			} else {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2347
				while (num > 0) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2348
					int8 i = FioReadByte();
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2349
					if (i >= 0) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2350
						num -= i;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2351
						FioSkipBytes(i);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2352
					} else {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2353
						i = -(i >> 3);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2354
						num -= i;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2355
						FioReadByte();
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2356
					}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2357
				}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2358
			}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2359
		}
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2360
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2361
		if (_skip_sprites > 0) _skip_sprites--;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2362
	}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2363
}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2364
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2365
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2366
void LoadNewGRF(uint load_index, uint file_index)
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2367
{
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2368
	static bool initialized = false; // XXX yikes
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2369
	uint stage;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2370
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2371
	if (!initialized) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2372
		InitializeGRFSpecial();
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2373
		initialized = true;
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2374
	}
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2375
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2376
	/* Load newgrf sprites
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2377
	 * in each loading stage, (try to) open each file specified in the config
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2378
	 * and load information from it. */
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2379
	_custom_sprites_base = load_index;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2380
	for (stage = 0; stage < 2; stage++) {
2400
2b258097156f (svn r2926) -Fix: Use the same file slots in both initialisation stages when loading a patch grf
tron
parents: 2346
diff changeset
  2381
		uint slot = file_index;
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2382
		uint j;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2383
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2384
		_cur_stage = stage;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2385
		_cur_spriteid = load_index;
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2386
		for (j = 0; j != lengthof(_newgrf_files) && _newgrf_files[j] != NULL; j++) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2387
			if (!FiosCheckFileExists(_newgrf_files[j])) {
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2388
				// TODO: usrerror()
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2389
				error("NewGRF file missing: %s", _newgrf_files[j]);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2390
			}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2391
			if (stage == 0) InitNewGRFFile(_newgrf_files[j], _cur_spriteid);
2400
2b258097156f (svn r2926) -Fix: Use the same file slots in both initialisation stages when loading a patch grf
tron
parents: 2346
diff changeset
  2392
			LoadNewGRFFile(_newgrf_files[j], slot++, stage);
2342
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2393
			DEBUG(spritecache, 2) ("Currently %i sprites are loaded", load_index);
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2394
		}
aae24c9661ba (svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents: 2340
diff changeset
  2395
	}
452
14dfdf98b719 (svn r662) [newgrf] Moved grfspecial.c to newgrf.c/newgrf.h
dominik
parents:
diff changeset
  2396
}